最近因為工作需要,去接觸老系統的資料庫
該資料庫是 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')
|
沒有留言:
張貼留言