2026-01-22

Oracle 的特殊 SQL 紀錄

最近因為工作需要,去接觸老系統的資料庫

該資料庫是 Oracle 11,裡面有很多特殊的 SQL 語法。

在此紀錄一下

PS: 這裡另外以 MySQL 的語法做對照

用途 Oracle 11 MySQL
查找資料庫所有 table
SELECT OWNER,
       TABLE_NAME
FROM all_tables
WHERE OWNER = 'my_db'
USE my_db; 
SHOW TABLES;
查找指定 table 的所有欄位
SELECT *
FROM all_tab_cols
WHERE OWNER = 'my_db'
  AND TABLE_NAME = 'my_table'
SHOW columns
FROM my_table
或是
SELECT TABLE_SCHEMA,
       TABLE_NAME,
       COLUMN_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA= 'my_db'
  AND TABLE_NAME= 'my_table'
找指定 table 的 primary key
SELECT t.OWNER,
       t.TABLE_NAME
FROM all_tables t
LEFT JOIN all_constraints c ON t.TABLE_NAME = c.TABLE_NAME AND c.OWNER = t.OWNER AND c.CONSTRAINT_TYPE = 'P'
WHERE t.TABLE_NAME = 'my_table'
  AND t.OWNER = 'my_db'
SHOW columns
FROM my_table
查找結果中,KEY 值為 PRI 就是了。或者以以下 SQL:

SELECT TABLE_SCHEMA,
       TABLE_NAME,
       COLUMN_NAME,
       COLUMN_KEY
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA= 'my_db'
  AND TABLE_NAME= 'my_table'
  AND COLUMN_KEY = 'PRI';
以日期為條件
SELECT *
FROM my_table
WHERE col > DATE '2020-01-02'
SELECT *
FROM my_table
WHERE col > '2020-01-02'
查找變數、function 的值,例如查找當前時間(CURRENT_TIMESTAMP)
SELECT CURRENT_TIMESTAMP FROM dual
SELECT CURRENT_TIMESTAMP
標示欄位、表格名……等 Oracle 使用雙引號(")來標示
SELECT 'a' AS "my col"
FROM dual
MySQL 使用重音號(`,backticks)來標示
SELECT 'a' AS `my col`
IF() function Oracle 11 沒法使用 IF() function,得用 CASE WHEN 的方式處理
多字串相加 Oracle 11 可以使用複數個 CONCAT function 處理,也可以以以下方式:
SELECT 'a' || 'b' || 'c' || 'd' FROM dual
SELECT CONCAT('a', 'b', 'c', 'd')

沒有留言:

張貼留言