歡迎來到 SQL資料庫百科全書

「SQL資料庫百科全書」提供基礎、資料定義、進階 SQL 指令教學,包含一般、MySQL、Oracle範例,搭配表格和表結構圖,適合初學者與專業人士。我們還提供MySQL和Oracle在Windows、Linux、MacOS的安裝指南,步驟詳細,點擊左側目錄,立即開啟您的SQL學習之旅!無論是資料庫新手還是資深開發者,這裡都有您需要的知識與實務指引。

資料庫安裝說明書

簡介

本節提供MySQL和Oracle在Windows、Linux、MacOS的安裝指南,包含步驟、模擬截圖、參數表格和注意事項,幫助您配置資料庫環境。

MySQL 安裝 - Windows

簡介

在Windows 10/11安裝MySQL 8.0,適用64位系統。

安裝步驟

  1. 下載:訪問MySQL官網,選Windows版本(~400MB)。

    --------------------
    | Download MySQL 8.0 |
    | [Windows x64]     |
    | [Download Button] |
    --------------------
  2. 運行:雙擊mysql-installer-web-community-8.0.x.msi,選「Developer Default」,點Next。

    --------------------
    | Setup Type       |
    | [x] Developer    |
    | [Next Button]    |
    --------------------
  3. 依賴項:檢查環境(如.NET Framework),點「Execute」安裝缺少項目。

  4. 配置:選「Standalone」,埠3306,點Next。

    --------------------
    | Port: [3306]     |
    | [Standalone]     |
    | [Next Button]    |
    --------------------
  5. 密碼:設根用戶密碼(如「MySQL2025!」),點Next。

  6. 安裝:點「Execute」,完成後勾選「Start MySQL」,點Finish。

  7. 驗證:命令提示字元輸入mysql -u root -p,檢查mysql>提示符。

    mysql> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    +--------------------+

參數

參數
版本MySQL 8.0
路徑C:\Program Files\MySQL
3306
用戶root

注意

  • 需2GB空間。
  • 防火牆允許3306埠。
  • 忘記密碼用mysqld --skip-grant-tables重設。

結構

mysql.user
+------------+---------+
| user       | VARCHAR |
| host       | VARCHAR |
| password   | VARCHAR |
+------------+---------+
MySQL 安裝 - Linux

簡介

在Ubuntu 22.04安裝MySQL 8.0,適用Linux發行版。

安裝步驟

  1. 更新sudo apt update && sudo apt upgrade

    --------------------
    | $ sudo apt update |
    | [Progress Bar]    |
    | Hit:1 http://...  |
    --------------------
  2. 安裝sudo apt install mysql-server

  3. 啟動sudo systemctl start mysql && sudo systemctl enable mysql

  4. 安全sudo mysql_secure_installation,設密碼,移除不安全選項。

    --------------------
    | Root password     |
    | [Input Field]     |
    | [Y/n] Remove...?  |
    --------------------
  5. 驗證mysql -u root -p,檢查資料庫。

    mysql> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    +--------------------+

參數

參數
版本MySQL 8.0
路徑/var/lib/mysql
3306
服務mysql

注意

  • 需root權限。
  • 檢查/etc/mysql配置。
  • 允許3306埠。

結構

mysql.user
+------------+---------+
| user       | VARCHAR |
| host       | VARCHAR |
| password   | VARCHAR |
+------------+---------+
MySQL 安裝 - MacOS

簡介

在MacOS Ventura 13安裝MySQL 8.0,使用Homebrew。

安裝步驟

  1. Homebrew/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

    --------------------
    | $ curl -fsSL ...  |
    | [Installing]      |
    | ==> Success       |
    --------------------
  2. 安裝brew install mysql

  3. 啟動brew services start mysql

  4. 密碼mysql_secure_installation

    --------------------
    | Set password?     |
    | [Y/n] [Input]     |
    | [Continue]        |
    --------------------
  5. 驗證mysql -u root -p

    mysql> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    +--------------------+

參數

參數
版本MySQL 8.0
路徑/usr/local/Cellar/mysql
3306
服務mysql

注意

  • 更新Homebrew。
  • 檢查/usr/local/etc/my.cnf

結構

mysql.user
+------------+---------+
| user       | VARCHAR |
| host       | VARCHAR |
| password   | VARCHAR |
+------------+---------+
Oracle 安裝 - Windows

簡介

在Windows 10/11安裝Oracle 21c XE。

安裝步驟

  1. 下載:訪問Oracle官網,選21c XE(~2GB)。

    --------------------
    | Oracle 21c XE     |
    | [Windows x64]     |
    | [Download Button] |
    --------------------
  2. 解壓:解壓oracle-database-xe-21c.zip至C:\oracle。

  3. 運行:雙擊setup.exe,選路徑C:\app\oracle,點Next。

    --------------------
    | Destination       |
    | [C:\app\oracle]   |
    | [Next Button]     |
    --------------------
  4. 密碼:為SYS/SYSTEM設密碼(如「Oracle2025!」),點Next。

  5. 安裝:點Install,約15分鐘,自動啟動。

  6. 驗證sqlplus / as sysdba

    SQL> SELECT * FROM v$version;
    BANNER
    Oracle Database 21c Express Edition

參數

參數
版本Oracle 21c XE
路徑C:\app\oracle
1521
服務XE

注意

  • 需10GB空間。
  • 關閉防毒軟體。
  • 檢查TNS監聽器(lsnrctl status)。

結構

dba_users
+------------+---------+
| username   | VARCHAR |
| user_id    | NUMBER  |
| created    | DATE    |
+------------+---------+
Oracle 安裝 - Linux

簡介

在Oracle Linux 8安裝Oracle 21c XE,透過RPM。

安裝步驟

  1. 下載:下載oracle-database-xe-21c-1.0-1.x86_64.rpm

    --------------------
    | Oracle 21c RPM    |
    | [Linux x64]       |
    | [Download Button] |
    --------------------
  2. 依賴sudo dnf install -y oracle-database-preinstall-21c

  3. 安裝sudo rpm -ivh oracle-database-xe-21c-1.0-1.x86_64.rpm

  4. 配置sudo /etc/init.d/oracle-xe-21c configure

    --------------------
    | SYS password      |
    | [Input Field]     |
    | [Continue]        |
    --------------------
  5. 驗證sqlplus / as sysdba

    SQL> SELECT * FROM v$version;
    BANNER
    Oracle Database 21c Express Edition

參數

參數
版本Oracle 21c XE
路徑/opt/oracle
1521
服務XE

注意

  • 需root權限。
  • 12GB空間。
  • ORACLE_HOME=/opt/oracle/product/21c/dbhomeXE

結構

dba_users
+------------+---------+
| username   | VARCHAR |
| user_id    | NUMBER  |
| created    | DATE    |
+------------+---------+
Oracle 安裝 - MacOS

簡介

在MacOS Ventura 13用Docker安裝Oracle 21c XE。

安裝步驟

  1. Docker:下載Docker Desktop

    --------------------
    | Docker Desktop    |
    | [MacOS] [500MB]   |
    | [Download Button] |
    --------------------
  2. 啟動:打開Docker Desktop。

  3. 映像docker pull gvenzl/oracle-xe:21-slim

  4. 容器docker run -d -p 1521:1521 -e ORACLE_PASSWORD=Oracle2025 gvenzl/oracle-xe:21-slim

    --------------------
    | $ docker run ...  |
    | [Container ID]    |
    | Port 1521         |
    --------------------
  5. 驗證docker exec -it [container_id] sqlplus sys/Oracle2025@//localhost:1521/XE as sysdba

    SQL> SELECT * FROM v$version;
    BANNER
    Oracle Database 21c Express Edition

參數

參數
版本Oracle 21c XE
映像gvenzl/oracle-xe:21-slim
1521
服務XE

注意

  • 4GB記憶體分配。
  • 檢查1521埠。
  • 容器需docker start [container_id]重啟。

結構

dba_users
+------------+---------+
| username   | VARCHAR |
| user_id    | NUMBER  |
| created    | DATE    |
+------------+---------+
資料庫正規化說明書

簡介

資料庫正規化(Normalization)是設計資料庫的過程,透過消除冗餘資料和確保資料一致性,提升儲存效率和查詢正確性。本節詳細說明第一至第五階正規化(1NF 至 5NF),每階包含定義、規則、範例、表格和圖示,適合初學者與進階使用者。

第一階正規化(1NF)

定義

第一階正規化(1NF)要求表格中的每個欄位值為原子值(不可再分),且每列有唯一主鍵,無重複群組。

規則

  • 每個欄位包含單一值。
  • 無多值屬性或重複群組。
  • 每列由主鍵唯一識別。

範例

未正規化表格:學生選課表,課程欄包含多值。

學生ID姓名課程
1張三數學,物理
2李四化學,生物

1NF 表格:拆分課程為單一行。

學生ID姓名課程
1張三數學
1張三物理
2李四化學
2李四生物

圖示

未正規化
+------------+--------+--------------+
| 學生ID     | 姓名   | 課程         |
+------------+--------+--------------+
| 1          | 張三   | 數學,物理    |
| 2          | 李四   | 化學,生物    |
+------------+--------+--------------+

1NF
+------------+--------+--------+
| 學生ID     | 姓名   | 課程   |
+------------+--------+--------+
| 1          | 張三   | 數學   |
| 1          | 張三   | 物理   |
| 2          | 李四   | 化學   |
| 2          | 李四   | 生物   |
+------------+--------+--------+

注意

  • 主鍵可為單欄(如學生ID+課程)。
  • 1NF 可能增加行數,影響儲存效率,需後續正規化。
第二階正規化(2NF)

定義

第二階正規化(2NF)要求表格符合 1NF,且所有非主鍵欄位完全依賴主鍵(無部分依賴)。

規則

  • 符合 1NF。
  • 非主鍵欄位不可僅依賴主鍵的一部分(複合主鍵情況)。

範例

1NF 表格:學生選課含部分依賴。

學生ID課程ID姓名課程名稱
1101張三數學
1102張三物理
2103李四化學

問題:姓名僅依賴學生ID,課程名稱僅依賴課程ID。

2NF 表格:拆為學生表和選課表。

學生ID姓名
1張三
2李四
學生ID課程ID課程名稱
1101數學
1102物理
2103化學

圖示

1NF
+------------+----------+--------+------------+
| 學生ID     | 課程ID   | 姓名   | 課程名稱   |
+------------+----------+--------+------------+
| 1          | 101      | 張三   | 數學       |
| 1          | 102      | 張三   | 物理       |
| 2          | 103      | 李四   | 化學       |
+------------+----------+--------+------------+

2NF
學生
+------------+--------+
| 學生ID     | 姓名   |
+------------+--------+
| 1          | 張三   |
| 2          | 李四   |
+------------+--------+

選課
+------------+----------+------------+
| 學生ID     | 課程ID   | 課程名稱   |
+------------+----------+------------+
| 1          | 101      | 數學       |
| 1          | 102      | 物理       |
| 2          | 103      | 化學       |
+------------+----------+------------+

注意

  • 僅適用複合主鍵表格。
  • 減少冗餘(如姓名重複)。
第三階正規化(3NF)

定義

第三階正規化(3NF)要求表格符合 2NF,且非主鍵欄位無傳遞依賴(即不依賴其他非主鍵欄位)。

規則

  • 符合 2NF。
  • 非主鍵欄位直接依賴主鍵。

範例

2NF 表格:選課表含傳遞依賴。

學生ID課程ID課程名稱教師
1101數學王老師
1102物理陳老師

問題:教師依賴課程名稱,非主鍵(學生ID+課程ID)。

3NF 表格:拆為選課表和課程表。

學生ID課程ID
1101
1102
課程ID課程名稱教師
101數學王老師
102物理陳老師

圖示

2NF
+------------+----------+------------+----------+
| 學生ID     | 課程ID   | 課程名稱   | 教師     |
+------------+----------+------------+----------+
| 1          | 101      | 數學       | 王老師   |
| 1          | 102      | 物理       | 陳老師   |
+------------+----------+------------+----------+

3NF
選課
+------------+----------+
| 學生ID     | 課程ID   |
+------------+----------+
| 1          | 101      |
| 1          | 102      |
+------------+----------+

課程
+----------+------------+----------+
| 課程ID   | 課程名稱   | 教師     |
+----------+------------+----------+
| 101      | 數學       | 王老師   |
| 102      | 物理       | 陳老師   |
+----------+------------+----------+

注意

  • 3NF 減少更新異常。
  • 實務中多止於 3NF。
第四階正規化(4NF)

定義

第四階正規化(4NF)要求表格符合 3NF,且無多值依賴(非主鍵欄位間獨立)。

規則

  • 符合 3NF。
  • 消除非平凡多值依賴。

範例

3NF 表格:學生興趣和課程多值依賴。

學生ID興趣課程
1音樂數學
1音樂物理
1運動數學
1運動物理

問題:興趣和課程獨立於學生ID,需拆分。

4NF 表格:分為學生興趣表和學生課程表。

學生ID興趣
1音樂
1運動
學生ID課程
1數學
1物理

圖示

3NF
+------------+--------+--------+
| 學生ID     | 興趣   | 課程   |
+------------+--------+--------+
| 1          | 音樂   | 數學   |
| 1          | 音樂   | 物理   |
| 1          | 運動   | 數學   |
| 1          | 運動   | 物理   |
+------------+--------+--------+

4NF
學生興趣
+------------+--------+
| 學生ID     | 興趣   |
+------------+--------+
| 1          | 音樂   |
| 1          | 運動   |
+------------+--------+

學生課程
+------------+--------+
| 學生ID     | 課程   |
+------------+--------+
| 1          | 數學   |
| 1          | 物理   |
+------------+--------+

注意

  • 4NF 罕用,僅在複雜多值關係時應用。
  • 拆分可能增加查詢複雜度。
第五階正規化(5NF)

定義

第五階正規化(5NF)要求表格符合 4NF,且無聯接依賴(不可透過較小表格聯接重構)。

規則

  • 符合 4NF。
  • 表格分解後,聯接不產生偽資料。

範例

4NF 表格:代理商、產品、公司關係。

代理商產品公司
A1P1C1
A1P2C1
A2P1C2

問題:聯接依賴導致分解後需三表。

5NF 表格:拆為代理商-產品、產品-公司、代理商-公司。

代理商產品
A1P1
A1P2
A2P1
產品公司
P1C1
P2C1
P1C2
代理商公司
A1C1
A2C2

圖示

4NF
+----------+--------+--------+
| 代理商   | 產品   | 公司   |
+----------+--------+--------+
| A1       | P1     | C1     |
| A1       | P2     | C1     |
| A2       | P1     | C2     |
+----------+--------+--------+

5NF
代理商-產品
+----------+--------+
| 代理商   | 產品   |
+----------+--------+
| A1       | P1     |
| A1       | P2     |
| A2       | P1     |
+----------+--------+

產品-公司
+--------+--------+
| 產品   | 公司   |
+--------+--------+
| P1     | C1     |
| P2     | C1     |
| P1     | C2     |
+--------+--------+

代理商-公司
+----------+--------+
| 代理商   | 公司   |
+----------+--------+
| A1       | C1     |
| A2       | C2     |
+----------+--------+

注意

  • 5NF 極少使用,僅在高度複雜關係時必要。
  • 需權衡查詢性能。
資料庫效能提升標準作業流程

簡介

資料庫效能提升是確保快速查詢和穩定運行的關鍵。本節針對 MySQL 和 Oracle,介紹三種方法:資料庫配置優化、正規化調整、SQL 語法優化。每部分包含詳細步驟、範例、表格和圖示,幫助您提升效能。

MySQL 配置優化

簡介

透過調整 MySQL 配置參數,提升查詢速度和資源利用率,適用於高流量應用。

步驟

  1. 檢查硬體:確認 CPU、記憶體(建議 16GB+)、SSD。

  2. 調整緩衝區:編輯 /etc/my.cnf,設置 innodb_buffer_pool_size 為記憶體的 60%-70%。

    [mysqld]
    innodb_buffer_pool_size=4G
  3. 查詢快取:啟用 query_cache_size=64M(MySQL 8.0 前)。

  4. 連線數:設置 max_connections=500

  5. 驗證:重啟 sudo systemctl restart mysql,用 SHOW VARIABLES LIKE 'innodb_buffer%' 檢查。

    +--------------------------+---------+
    | Variable_name            | Value   |
    +--------------------------+---------+
    | innodb_buffer_pool_size  | 4G      |
    +--------------------------+---------+

參數

參數建議值說明
innodb_buffer_pool_size4G-8G記憶體快取資料
query_cache_size64M快取查詢結果
max_connections500最大連線數

圖示

MySQL 配置
+------------------+       +------------------+
| 硬體 (16GB RAM) | ----> | Buffer Pool (4G) |
+------------------+       +------------------+
                           | Query Cache      |
                           +------------------+
                           | Connections (500)|
                           +------------------+

注意

  • 避免過高緩衝,保留作業系統記憶體。
  • MySQL 8.0 移除 query_cache,改用索引。
Oracle 配置優化

簡介

調整 Oracle 參數,提升大規模資料庫性能,適用企業應用。

步驟

  1. 硬體:確保 32GB+ 記憶體,NVMe SSD。

  2. SGA 調整:用 sqlplus / as sysdba,設置 ALTER SYSTEM SET sga_target=8G;

  3. PGA:設置 ALTER SYSTEM SET pga_aggregate_target=2G;

  4. 並行:啟用 ALTER SYSTEM SET parallel_max_servers=16;

  5. 驗證SHOW PARAMETER sga_target;

    NAME            TYPE    VALUE
    --------------- ------- --------
    sga_target      big integer 8G

參數

參數建議值說明
sga_target8G系統全域區域
pga_aggregate_target2G程序全域區域
parallel_max_servers16並行執行

圖示

Oracle 配置
+------------------+       +------------------+
| 硬體 (32GB RAM) | ----> | SGA (8G)         |
+------------------+       +------------------+
                           | PGA (2G)         |
                           +------------------+
                           | Parallel (16)    |
                           +------------------+

注意

  • 檢查 spfile 持久化參數。
  • 高並行需 CPU 支援。
正規化調整效能

簡介

正規化減少冗餘,但過度正規化可能增加聯接成本。本節說明如何平衡正規化與效能。

步驟

  1. 分析:檢查表格聯接次數,找出頻繁查詢。

  2. 反正規化:合併常用表格,減少 JOIN。例如,將課程名稱併入選課表。

    SELECT s.student_id, c.course_name
    FROM students s JOIN courses c ON s.course_id = c.course_id;

    改為:

    student_idcourse_name
    1數學
  3. 索引:為合併表加索引:CREATE INDEX idx_student_course ON students(course_name);

  4. 驗證:用 EXPLAIN 檢查查詢計劃。

    MySQL> EXPLAIN SELECT course_name FROM students;
    +----+-------------+---------+-------+
    | id | select_type | table   | type  |
    +----+-------------+---------+-------+
    | 1  | SIMPLE      | students| index |
    +----+-------------+---------+-------+

範例

正規化:學生和課程分開,需 JOIN。

student_idcourse_id
1101
course_idcourse_name
101數學

反正規化:合併減少查詢。

student_idcourse_name
1數學

圖示

正規化
學生                課程
+------------+       +------------+
| student_id |<----->| course_id  |
| course_id  |       | course_name|
+------------+       +------------+

反正規化
學生
+------------+------------+
| student_id | course_name|
+------------+------------+

注意

  • 反正規化增加儲存,需監控。
  • 僅對高頻查詢反正規化。
SQL 語法優化

簡介

優化 SQL 語法可減少執行時間,適用 MySQL 和 Oracle。

步驟

  1. 索引:為 WHERE 和 JOIN 欄位加索引:CREATE INDEX idx_salary ON employees(salary);

  2. 精簡查詢:僅選必要欄位。

    -- 慢
    SELECT * FROM employees WHERE salary > 50000;
    -- 快
    SELECT name, salary FROM employees WHERE salary > 50000;
  3. 避免函數:不在索引欄位用函數。

    -- 慢
    SELECT name FROM employees WHERE YEAR(hire_date) = 2023;
    -- 快
    SELECT name FROM employees WHERE hire_date >= '2023-01-01' AND hire_date < '2024-01-01';
  4. 子查詢改 JOIN

    -- 慢
    SELECT name FROM employees WHERE dept_id IN (SELECT dept_id FROM departments WHERE location = 'Taipei');
    -- 快
    SELECT e.name FROM employees e JOIN departments d ON e.dept_id = d.dept_id WHERE d.location = 'Taipei';
  5. 驗證:用 EXPLAIN PLAN(Oracle)或 EXPLAIN(MySQL)。

    MySQL> EXPLAIN SELECT name FROM employees WHERE salary > 50000;
    +----+-------------+---------+-------+
    | id | select_type | table   | type  |
    +----+-------------+---------+-------+
    | 1  | SIMPLE      | employees| range |
    +----+-------------+---------+-------+

範例

未優化:全表掃描。

SELECT * FROM employees WHERE UPPER(name) = 'ZHANGSAN';

優化:索引查詢。

SELECT name, salary FROM employees WHERE name = 'ZhangSan';
CREATE INDEX idx_name ON employees(name);

圖示

未優化
+------------------+
| 全表掃描 (慢)    |
| employees (10M)   |
+------------------+

優化
+------------------+
| 索引查詢 (快)    |
| idx_name --------+
+------------------+

注意

  • 索引過多增加寫入成本。
  • 定期用 ANALYZE TABLE 更新統計。
基礎查詢
SQL SELECT - 查詢資料表資料

語法

SELECT 檢索資料表資料。

SELECT column1, column2 FROM table_name WHERE condition;

範例

一般

查詢員工姓名和入職日期。

SELECT name, hire_date FROM employees WHERE department = 'HR';
namehire_date
張三2023-01-01
李四2023-02-01

MySQL

查詢高薪員工,限10筆。

SELECT name, salary FROM employees WHERE salary > 50000 LIMIT 10;
namesalary
王五60000.00

Oracle

查詢前5名員工。

SELECT name, department FROM employees WHERE ROWNUM <= 5;
namedepartment
趙六IT

結構

employees
+------------+---------+
| id         | INT     |
| name       | VARCHAR |
| hire_date  | DATE    |
| salary     | DECIMAL |
| department | VARCHAR |
+------------+---------+
SQL DISTINCT - 去除重複值

語法

DISTINCT 去除重複行。

SELECT DISTINCT column1 FROM table_name;

範例

一般

查詢不重複部門。

SELECT DISTINCT department FROM employees;
department
HR
IT

MySQL

查詢不重複職位。

SELECT DISTINCT job_title FROM employees;
job_title
Manager
Developer

Oracle

查詢不重複城市。

SELECT DISTINCT city FROM locations;
city
Taipei
Kaohsiung

結構

employees
+------------+---------+
| id         | INT     |
| department | VARCHAR |
| job_title  | VARCHAR |
+------------+---------+
SQL WHERE - 篩選資料

語法

WHERE 篩選符合條件的資料。

SELECT column1 FROM table_name WHERE condition;

範例

一般

查詢高薪員工。

SELECT name, salary FROM employees WHERE salary > 50000;
namesalary
張三60000.00
李四55000.00

MySQL

查詢2023年入職員工。

SELECT name, hire_date FROM employees WHERE YEAR(hire_date) = 2023;
namehire_date
王五2023-03-01

Oracle

查詢IT部門員工。

SELECT name, department FROM employees WHERE department = 'IT';
namedepartment
趙六IT

結構

employees
+------------+---------+
| id         | INT     |
| name       | VARCHAR |
| salary     | DECIMAL |
| hire_date  | DATE    |
| department | VARCHAR |
+------------+---------+
SQL AND OR - 邏輯條件

語法

AND/OR 組合條件。

SELECT column FROM table WHERE condition1 AND/OR condition2;

範例

一般

查詢IT部門高薪員工。

SELECT name, salary FROM employees WHERE department = 'IT' AND salary > 50000;
namesalary
趙六60000.00

MySQL

查詢HR或Sales員工。

SELECT name FROM employees WHERE department = 'HR' OR department = 'Sales';
name
張三
李四

Oracle

查詢高薪或管理職。

SELECT name FROM employees WHERE salary > 70000 OR job_title = 'Manager';
name
陳七

結構

employees
+------------+---------+
| id         | INT     |
| name       | VARCHAR |
| salary     | DECIMAL |
| department | VARCHAR |
| job_title  | VARCHAR |
+------------+---------+
SQL IN - 匹配多值

語法

IN 指定多值,簡化條件。

SELECT column FROM table WHERE column IN (value1, value2);

範例

一般

查詢HR和IT部門員工。

SELECT name, department FROM employees WHERE department IN ('HR', 'IT');
namedepartment
張三HR
趙六IT

MySQL

查詢特定職位員工。

SELECT name, job_title FROM employees WHERE job_title IN ('Manager', 'Developer');
namejob_title
陳七Manager
王五Developer

Oracle

查詢特定城市客戶。

SELECT name, city FROM customers WHERE city IN ('Taipei', 'Kaohsiung');
namecity
林八Taipei

結構

employees
+------------+---------+
| id         | INT     |
| name       | VARCHAR |
| department | VARCHAR |
| job_title  | VARCHAR |
+------------+---------+
SQL BETWEEN - 範圍篩選

語法

BETWEEN 篩選範圍內資料。

SELECT column FROM table WHERE column BETWEEN value1 AND value2;

範例

一般

查詢薪資40000-60000的員工。

SELECT name, salary FROM employees WHERE salary BETWEEN 40000 AND 60000;
namesalary
李四55000.00

MySQL

查詢2023年入職員工。

SELECT name, hire_date FROM employees WHERE hire_date BETWEEN '2023-01-01' AND '2023-12-31';
namehire_date
王五2023-03-01

Oracle

查詢訂單金額範圍。

SELECT order_id, amount FROM orders WHERE amount BETWEEN 1000 AND 5000;
order_idamount
1013000.00

結構

employees
+------------+---------+
| id         | INT     |
| name       | VARCHAR |
| salary     | DECIMAL |
| hire_date  | DATE    |
+------------+---------+
SQL 萬用字元 - 模式匹配

語法

萬用字元(%, _)與 LIKE 搭配用於模式匹配。

SELECT column FROM table WHERE column LIKE pattern;

範例

一般

查詢姓名以「張」開頭的員工。

SELECT name FROM employees WHERE name LIKE '張%';
name
張三

MySQL

查詢部門含「Sale」的記錄。

SELECT name, department FROM employees WHERE department LIKE '%Sale%';
namedepartment
李四Sales

Oracle

查詢產品名稱第二字為「P」。

SELECT prod_name FROM products WHERE prod_name LIKE '_P%';
prod_name
Apple

結構

employees
+------------+---------+
| id         | INT     |
| name       | VARCHAR |
| department | VARCHAR |
+------------+---------+
SQL LIKE - 模式匹配查詢

語法

LIKE 搭配萬用字元篩選資料。

SELECT column FROM table WHERE column LIKE pattern;

範例

一般

查詢職位含「Manager」的員工。

SELECT name, job_title FROM employees WHERE job_title LIKE '%Manager%';
namejob_title
陳七Manager

MySQL

查詢電子郵件以「@example.com」結尾的客戶。

SELECT name, email FROM customers WHERE email LIKE '%@example.com';
nameemail
林八lin@example.com

Oracle

查詢城市以「Tai」開頭。

SELECT city FROM locations WHERE city LIKE 'Tai%';
city
Taipei

結構

customers
+-------+---------+
| id    | INT     |
| name  | VARCHAR |
| email | VARCHAR |
+-------+---------+
SQL ORDER BY - 排序結果

語法

ORDER BY 對結果排序,支援ASC/DESC。

SELECT column FROM table ORDER BY column [ASC|DESC];

範例

一般

按薪資降序查詢員工。

SELECT name, salary FROM employees ORDER BY salary DESC;
namesalary
趙六60000.00
李四55000.00

MySQL

按入職日期升序查詢。

SELECT name, hire_date FROM employees ORDER BY hire_date ASC;
namehire_date
張三2023-01-01

Oracle

按部門和薪資排序。

SELECT name, department, salary FROM employees ORDER BY department ASC, salary DESC;
namedepartmentsalary
張三HR55000.00

結構

employees
+------------+---------+
| id         | INT     |
| name       | VARCHAR |
| salary     | DECIMAL |
| hire_date  | DATE    |
| department | VARCHAR |
+------------+---------+
SQL 函數 - 資料處理

語法

SQL函數處理資料,如聚合或字串操作。

SELECT function(column) FROM table;

範例

一般

計算平均薪資。

SELECT AVG(salary) AS avg_salary FROM employees;
avg_salary
55000.00

MySQL

合併姓名和部門。

SELECT CONCAT(name, ' - ', department) AS info FROM employees;
info
張三 - HR

Oracle

計算訂單總數。

SELECT COUNT(*) AS total_orders FROM orders;
total_orders
100

結構

employees
+------------+---------+
| id         | INT     |
| name       | VARCHAR |
| salary     | DECIMAL |
| department | VARCHAR |
+------------+---------+
SQL 平均值 - 計算平均

語法

AVG 計算數值欄位平均值。

SELECT AVG(column) FROM table;

範例

一般

計算員工平均薪資。

SELECT AVG(salary) AS avg_salary FROM employees;
avg_salary
55000.00

MySQL

計算IT部門平均薪資。

SELECT AVG(salary) AS avg_it_salary FROM employees WHERE department = 'IT';
avg_it_salary
60000.00

Oracle

計算訂單平均金額。

SELECT AVG(amount) AS avg_amount FROM orders;
avg_amount
3500.00

結構

employees
+------------+---------+
| id         | INT     |
| salary     | DECIMAL |
| department | VARCHAR |
+------------+---------+
SQL COUNT - 計數記錄

語法

COUNT 計算符合條件的記錄數。

SELECT COUNT(column) FROM table WHERE condition;

範例

一般

計算員工總數。

SELECT COUNT(*) AS total_employees FROM employees;
total_employees
50

MySQL

計算HR部門員工數。

SELECT COUNT(*) AS hr_count FROM employees WHERE department = 'HR';
hr_count
10

Oracle

計算有效訂單數。

SELECT COUNT(*) AS order_count FROM orders WHERE status = 'Active';
order_count
20

結構

employees
+------------+---------+
| id         | INT     |
| department | VARCHAR |
+------------+---------+
SQL 最大值 - 查找最大值

語法

MAX 查找欄位最大值。

SELECT MAX(column) FROM table;

範例

一般

查找最高薪資。

SELECT MAX(salary) AS max_salary FROM employees;
max_salary
60000.00

MySQL

查找IT部門最高薪資。

SELECT MAX(salary) AS max_it_salary FROM employees WHERE department = 'IT';
max_it_salary
60000.00

Oracle

查找最大訂單金額。

SELECT MAX(amount) AS max_amount FROM orders;
max_amount
5000.00

結構

employees
+------------+---------+
| id         | INT     |
| salary     | DECIMAL |
| department | VARCHAR |
+------------+---------+
SQL 最小值 - 查找最小值

語法

MIN 查找欄位最小值。

SELECT MIN(column) FROM table;

範例

一般

查找最低薪資。

SELECT MIN(salary) AS min_salary FROM employees;
min_salary
40000.00

MySQL

查找HR部門最低薪資。

SELECT MIN(salary) AS min_hr_salary FROM employees WHERE department = 'HR';
min_hr_salary
45000.00

Oracle

查找最小訂單金額。

SELECT MIN(amount) AS min_amount FROM orders;
min_amount
1000.00

結構

employees
+------------+---------+
| id         | INT     |
| salary     | DECIMAL |
| department | VARCHAR |
+------------+---------+
SQL 總合 - 計算總和

語法

SUM 計算數值欄位總和。

SELECT SUM(column) FROM table;

範例

一般

計算員工薪資總和。

SELECT SUM(salary) AS total_salary FROM employees;
total_salary
2750000.00

MySQL

計算IT部門薪資總和。

SELECT SUM(salary) AS total_it_salary FROM employees WHERE department = 'IT';
total_it_salary
600000.00

Oracle

計算訂單總金額。

SELECT SUM(amount) AS total_amount FROM orders;
total_amount
100000.00

結構

employees
+------------+---------+
| id         | INT     |
| salary     | DECIMAL |
| department | VARCHAR |
+------------+---------+
SQL GROUP BY - 分組資料

語法

GROUP BY 按欄位分組,與聚合函數搭配。

SELECT column, AGGREGATE(column2) FROM table GROUP BY column;

範例

一般

按部門計算平均薪資。

SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department;
departmentavg_salary
HR50000.00
IT60000.00

MySQL

按職位計算人數。

SELECT job_title, COUNT(*) AS count FROM employees GROUP BY job_title;
job_titlecount
Manager5
Developer10

Oracle

按年份計算訂單總額。

SELECT TO_CHAR(order_date, 'YYYY') AS year, SUM(amount) AS total FROM orders GROUP BY TO_CHAR(order_date, 'YYYY');
yeartotal
202350000.00

結構

employees
+------------+---------+
| id         | INT     |
| department | VARCHAR |
| job_title  | VARCHAR |
| salary     | DECIMAL |
+------------+---------+
SQL HAVING - 篩選分組

語法

HAVING 篩選 GROUP BY 結果。

SELECT column, AGGREGATE(column2) FROM table GROUP BY column HAVING condition;

範例

一般

查詢平均薪資大於55000的部門。

SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department HAVING AVG(salary) > 55000;
departmentavg_salary
IT60000.00

MySQL

查詢人數大於5的職位。

SELECT job_title, COUNT(*) AS count FROM employees GROUP BY job_title HAVING COUNT(*) > 5;
job_titlecount
Developer10

Oracle

查詢訂單總額大於10000的年份。

SELECT TO_CHAR(order_date, 'YYYY') AS year, SUM(amount) AS total FROM orders GROUP BY TO_CHAR(order_date, 'YYYY') HAVING SUM(amount) > 10000;
yeartotal
202350000.00

結構

employees
+------------+---------+
| id         | INT     |
| department | VARCHAR |
| job_title  | VARCHAR |
| salary     | DECIMAL |
+------------+---------+
SQL 別名 - 欄位或表別名

語法

別名(AS)為欄位或表指定臨時名稱。

SELECT column AS alias_name FROM table;

範例

一般

為薪資取別名。

SELECT salary AS employee_salary FROM employees;
employee_salary
55000.00

MySQL

為表取別名並查詢。

SELECT e.name AS emp_name FROM employees AS e WHERE e.department = 'HR';
emp_name
張三

Oracle

為計算欄位取別名。

SELECT COUNT(*) AS order_count FROM orders AS o;
order_count
100

結構

employees
+------------+---------+
| id         | INT     |
| name       | VARCHAR |
| salary     | DECIMAL |
| department | VARCHAR |
+------------+---------+
SQL AS - 指定別名

語法

AS 為欄位、表或子查詢指定別名。

SELECT column AS alias_name FROM table;

範例

一般

為部門名稱取別名。

SELECT department AS dept_name FROM employees;
--------------------
| dept_name       |
| HR              |
| IT              |
--------------------
dept_name
HR
IT

MySQL

為計算欄位取別名,查詢員工總數。

SELECT COUNT(*) AS emp_count FROM employees AS e;
--------------------
| emp_count       |
| 50              |
--------------------
emp_count
50

Oracle

為子查詢取別名,查詢部門名稱。

SELECT dept_name FROM (SELECT department AS dept_name FROM employees) AS dept;
--------------------
| dept_name       |
| HR              |
| IT              |
--------------------
dept_name
HR
IT

結構

employees
+------------+---------+
| id         | INT     |
| department | VARCHAR |
+------------+---------+
SQL 表格連接 - 合併多表資料

語法

JOIN 合併多個表的資料,通常使用 INNER JOIN 來匹配條件。

SELECT table1.column1, table2.column2 
FROM table1 
INNER JOIN table2 ON table1.key = table2.key;

範例

一般

查詢員工及其部門名稱。

SELECT e.name, d.dept_name 
FROM employees e 
INNER JOIN departments d ON e.dept_id = d.dept_id;
--------------------
| name    | dept_name  |
| 張三    | HR         |
| 趙六    | IT         |
--------------------
namedept_name
張三HR
趙六IT

MySQL

查詢訂單及其客戶名稱。

SELECT o.order_id, c.name 
FROM orders o 
INNER JOIN customers c ON o.cust_id = c.id;
--------------------
| order_id | name     |
| 101      | 林八     |
| 102      | 陳七     |
--------------------
order_idname
101林八
102陳七

Oracle

查詢員工及其主管名稱。

SELECT e1.name AS employee, e2.name AS manager 
FROM employees e1 
INNER JOIN employees e2 ON e1.manager_id = e2.id;
--------------------
| employee | manager  |
| 李四     | 張三     |
| 王五     | 趙六     |
--------------------
employeemanager
李四張三
王五趙六

結構

employees
+------------+---------+
| id         | INT     |
| name       | VARCHAR |
| dept_id    | INT     |
| manager_id | INT     |
+------------+---------+
departments
+---------+---------+
| dept_id | INT     |
| dept_name | VARCHAR |
+---------+---------+
SQL 外部連接 - 包含未匹配資料

語法

OUTER JOIN 包含未匹配的資料,常用 LEFT OUTER JOINRIGHT OUTER JOIN

SELECT table1.column1, table2.column2 
FROM table1 
LEFT OUTER JOIN table2 ON table1.key = table2.key;

範例

一般

查詢所有員工及其部門名稱(包括未分配部門的員工)。

SELECT e.name, d.dept_name 
FROM employees e 
LEFT OUTER JOIN departments d ON e.dept_id = d.dept_id;
--------------------
| name    | dept_name  |
| 張三    | HR         |
| 趙六    | IT         |
| 陳七    | NULL       |
--------------------
namedept_name
張三HR
趙六IT
陳七NULL

MySQL

查詢所有客戶及其訂單(包括無訂單的客戶)。

SELECT c.name, o.order_id 
FROM customers c 
LEFT OUTER JOIN orders o ON c.id = o.cust_id;
--------------------
| name    | order_id   |
| 林八    | 101        |
| 陳七    | NULL       |
--------------------
nameorder_id
林八101
陳七NULL

Oracle

查詢所有部門及其員工(包括無員工的部門)。

SELECT d.dept_name, e.name 
FROM departments d 
RIGHT OUTER JOIN employees e ON d.dept_id = e.dept_id;
--------------------
| dept_name | name     |
| HR        | 張三     |
| IT        | 趙六     |
| NULL      | 陳七     |
--------------------
dept_namename
HR張三
IT趙六
NULL陳七

結構

employees
+------------+---------+
| id         | INT     |
| name       | VARCHAR |
| dept_id    | INT     |
+------------+---------+
departments
+---------+---------+
| dept_id | INT     |
| dept_name | VARCHAR |
+---------+---------+
SQL CONCATENATE - 合併字串

語法

CONCAT|| 用於合併字串(根據資料庫不同)。

SELECT CONCAT(column1, ' ', column2) AS result FROM table;

範例

一般

合併員工姓名和部門。

SELECT CONCAT(name, ' - ', department) AS employee_info FROM employees;
--------------------
| employee_info   |
| 張三 - HR       |
| 趙六 - IT       |
--------------------
employee_info
張三 - HR
趙六 - IT

MySQL

合併客戶姓名和電子郵件。

SELECT CONCAT(name, ' (', email, ')') AS customer_info FROM customers;
--------------------
| customer_info       |
| 林八 (lin@example.com) |
| 陳七 (chen@example.com) |
--------------------
customer_info
林八 (lin@example.com)
陳七 (chen@example.com)

Oracle

使用 || 合併產品名稱和價格(Oracle 不支援 CONCAT 時使用 ||)。

SELECT prod_name || ' - $' || price AS product_info FROM products;
--------------------
| product_info    |
| Apple - $50     |
| Banana - $30    |
--------------------
product_info
Apple - $50
Banana - $30

結構

employees
+------------+---------+
| id         | INT     |
| name       | VARCHAR |
| department | VARCHAR |
+------------+---------+
customers
+-------+---------+
| id    | INT     |
| name  | VARCHAR |
| email | VARCHAR |
+-------+---------+
SQL SUBSTRING - 提取字串片段

語法

SUBSTRING 從字串中提取指定長度的片段(起始位置從 1 開始)。

SELECT SUBSTRING(column, start, length) AS result FROM table;

範例

一般

提取員工姓名的前 3 個字元。

SELECT SUBSTRING(name, 1, 3) AS short_name FROM employees;
--------------------
| short_name      |
| 張三            |
| 趙六            |
--------------------
short_name
張三
趙六

MySQL

提取電子郵件的前 5 個字元。

SELECT SUBSTRING(email, 1, 5) AS email_part FROM customers;
--------------------
| email_part      |
| lin@e           |
| chen@           |
--------------------
email_part
lin@e
chen@

Oracle

提取產品名稱的第 2 到 4 個字元。

SELECT SUBSTR(prod_name, 2, 3) AS name_part FROM products;
--------------------
| name_part       |
| ppl             |
| ana             |
--------------------
name_part
ppl
ana

結構

employees
+------------+---------+
| id         | INT     |
| name       | VARCHAR |
+------------+---------+
customers
+-------+---------+
| id    | INT     |
| email | VARCHAR |
+-------+---------+
products
+------------+---------+
| prod_id    | INT     |
| prod_name  | VARCHAR |
+------------+---------+
SQL TRIM - 移除字串空白

語法

TRIM 移除字串前後的空白(可指定移除其他字元)。

SELECT TRIM(column) AS result FROM table;

範例

一般

移除員工部門名稱前後的空白。

SELECT TRIM(department) AS clean_dept FROM employees;
--------------------
| clean_dept      |
| HR              |
| IT              |
--------------------
clean_dept
HR
IT

MySQL

移除電子郵件前後的空白。

SELECT TRIM(email) AS clean_email FROM customers;
--------------------
| clean_email     |
| lin@example.com |
| chen@example.com|
--------------------
clean_email
lin@example.com
chen@example.com

Oracle

移除產品名稱前後的指定字元(如「-」)。

SELECT TRIM(BOTH '-' FROM prod_name) AS clean_name FROM products;
--------------------
| clean_name      |
| Apple           |
| Banana          |
--------------------
clean_name
Apple
Banana

結構

employees
+------------+---------+
| id         | INT     |
| department | VARCHAR |
+------------+---------+
customers
+-------+---------+
| id    | INT     |
| email | VARCHAR |
+-------+---------+
products
+------------+---------+
| prod_id    | INT     |
| prod_name  | VARCHAR |
+------------+---------+
SQL 長度 - 計算字串長度

語法

LENGTH 計算字串的長度(返回字元數,根據資料庫不同可能使用 LEN)。

SELECT LENGTH(column) AS result FROM table;

範例

一般

計算員工姓名的長度。

SELECT name, LENGTH(name) AS name_length FROM employees;
--------------------
| name    | name_length |
| 張三    | 2           |
| 趙六    | 2           |
--------------------
namename_length
張三2
趙六2

MySQL

計算電子郵件地址的長度。

SELECT email, LENGTH(email) AS email_length FROM customers;
--------------------
| email           | email_length |
| lin@example.com | 15           |
| chen@example.com| 16           |
--------------------
emailemail_length
lin@example.com15
chen@example.com16

Oracle

計算產品名稱的長度。

SELECT prod_name, LENGTH(prod_name) AS name_length FROM products;
--------------------
| prod_name | name_length |
| Apple     | 5           |
| Banana    | 6           |
--------------------
prod_namename_length
Apple5
Banana6

結構

employees
+------------+---------+
| id         | INT     |
| name       | VARCHAR |
+------------+---------+
customers
+-------+---------+
| id    | INT     |
| email | VARCHAR |
+-------+---------+
products
+------------+---------+
| prod_id    | INT     |
| prod_name  | VARCHAR |
+------------+---------+
SQL REPLACE - 替換字串

語法

REPLACE 將字串中的指定部分替換為新值。

SELECT REPLACE(column, 'old', 'new') AS result FROM table;

範例

一般

將員工部門名稱中的「HR」替換為「人力資源」。

SELECT REPLACE(department, 'HR', '人力資源') AS new_dept FROM employees;
--------------------
| new_dept        |
| 人力資源        |
| IT              |
--------------------
new_dept
人力資源
IT

MySQL

將電子郵件中的「example」替換為「mycompany」。

SELECT REPLACE(email, 'example', 'mycompany') AS new_email FROM customers;
--------------------
| new_email         |
| lin@mycompany.com |
| chen@mycompany.com|
--------------------
new_email
lin@mycompany.com
chen@mycompany.com

Oracle

將產品名稱中的「Apple」替換為「Orange」。

SELECT REPLACE(prod_name, 'Apple', 'Orange') AS new_name FROM products;
--------------------
| new_name        |
| Orange          |
| Banana          |
--------------------
new_name
Orange
Banana

結構

employees
+------------+---------+
| id         | INT     |
| department | VARCHAR |
+------------+---------+
customers
+-------+---------+
| id    | INT     |
| email | VARCHAR |
+-------+---------+
products
+------------+---------+
| prod_id    | INT     |
| prod_name  | VARCHAR |
+------------+---------+
資料定義
SQL CREATE TABLE - 建立資料表

語法

CREATE TABLE 建立新資料表。

CREATE TABLE table_name (
    column1 datatype constraint,
    column2 datatype constraint
);

範例

一般

建立員工表。

CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    salary DECIMAL(10,2)
);
欄位型態約束
idINTPRIMARY KEY
nameVARCHAR(50)NOT NULL
salaryDECIMAL(10,2)-

MySQL

建立自動遞增部門表。

CREATE TABLE departments (
    dept_id INT AUTO_INCREMENT PRIMARY KEY,
    dept_name VARCHAR(50) NOT NULL
);
欄位型態約束
dept_idINTAUTO_INCREMENT PRIMARY KEY
dept_nameVARCHAR(50)NOT NULL

Oracle

建立序列產品表。

CREATE SEQUENCE prod_seq START WITH 1;
CREATE TABLE products (
    prod_id NUMBER PRIMARY KEY,
    prod_name VARCHAR2(50),
    price NUMBER(10,2)
);
欄位型態約束
prod_idNUMBERPRIMARY KEY
prod_nameVARCHAR2(50)-
priceNUMBER(10,2)-

結構

products
+------------+---------+
| prod_id    | NUMBER  |
| prod_name  | VARCHAR |
| price      | NUMBER  |
+------------+---------+
SQL Constraint - 資料表限制

語法

CONSTRAINT 定義資料表規則。

CREATE TABLE table_name (
    column datatype CONSTRAINT constraint_name constraint_type
);

範例

一般

建立帶唯一約束的客戶表。

CREATE TABLE customers (
    id INT PRIMARY KEY,
    email VARCHAR(100) CONSTRAINT unique_email UNIQUE
);
欄位型態約束
idINTPRIMARY KEY
emailVARCHAR(100)UNIQUE

MySQL

添加檢查約束。

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    amount DECIMAL(10,2) CONSTRAINT chk_amount CHECK (amount > 0)
);
欄位型態約束
order_idINTPRIMARY KEY
amountDECIMAL(10,2)CHECK (amount > 0)

Oracle

建立帶非空約束的產品表。

CREATE TABLE products (
    prod_id NUMBER PRIMARY KEY,
    prod_name VARCHAR2(50) CONSTRAINT nn_name NOT NULL
);
欄位型態約束
prod_idNUMBERPRIMARY KEY
prod_nameVARCHAR2(50)NOT NULL

結構

customers
+-------+---------+
| id    | INT     |
| email | VARCHAR |
+-------+---------+
SQL 主鍵 - 唯一識別列

語法

PRIMARY KEY 定義唯一識別列。

CREATE TABLE table_name (
    column datatype PRIMARY KEY
);

範例

一般

建立帶主鍵的員工表。

CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(50)
);
欄位型態約束
idINTPRIMARY KEY
nameVARCHAR(50)-

MySQL

建立多列主鍵。

CREATE TABLE order_details (
    order_id INT,
    product_id INT,
    quantity INT,
    PRIMARY KEY (order_id, product_id)
);
欄位型態約束
order_idINTPRIMARY KEY (part)
product_idINTPRIMARY KEY (part)
quantityINT-

Oracle

使用序列生成主鍵。

CREATE SEQUENCE emp_seq START WITH 1;
CREATE TABLE employees (
    id NUMBER PRIMARY KEY,
    name VARCHAR2(50)
);
欄位型態約束
idNUMBERPRIMARY KEY
nameVARCHAR2(50)-

結構

employees
+-------+---------+
| id    | INT     |
| name  | VARCHAR |
+-------+---------+
SQL 外來鍵 - 關聯資料表

語法

FOREIGN KEY 建立表間關聯。

CREATE TABLE table_name (
    column datatype,
    CONSTRAINT fk_name FOREIGN KEY (column) REFERENCES parent_table(parent_column)
);

範例

一般

建立帶外來鍵的訂單表。

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    cust_id INT,
    CONSTRAINT fk_cust FOREIGN KEY (cust_id) REFERENCES customers(id)
);
欄位型態約束
order_idINTPRIMARY KEY
cust_idINTFOREIGN KEY

MySQL

建立帶級聯刪除的外來鍵。

CREATE TABLE order_details (
    detail_id INT PRIMARY KEY,
    order_id INT,
    CONSTRAINT fk_order FOREIGN KEY (order_id) REFERENCES orders(order_id) ON DELETE CASCADE
);
欄位型態約束
detail_idINTPRIMARY KEY
order_idINTFOREIGN KEY (ON DELETE CASCADE)

Oracle

建立帶外來鍵的員工表。

CREATE TABLE employees (
    emp_id NUMBER PRIMARY KEY,
    dept_id NUMBER,
    CONSTRAINT fk_dept FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);
欄位型態約束
emp_idNUMBERPRIMARY KEY
dept_idNUMBERFOREIGN KEY

結構

orders
+----------+-------+
| order_id | INT   |
| cust_id  | INT   |
+----------+-------+
SQL CREATE VIEW - 建立視圖

語法

CREATE VIEW 建立虛擬表。

CREATE VIEW view_name AS SELECT column1, column2 FROM table WHERE condition;

範例

一般

建立高薪員工視圖。

CREATE VIEW high_salary_employees AS
SELECT name, salary FROM employees WHERE salary > 50000;
namesalary
張三60000.00
李四55000.00

MySQL

建立部門員工視圖,限10筆。

CREATE VIEW dept_employees AS
SELECT name, department FROM employees WHERE department = 'IT' LIMIT 10;
namedepartment
趙六IT

Oracle

建立訂單總額視圖。

CREATE VIEW order_totals AS
SELECT order_id, SUM(amount) AS total FROM order_details GROUP BY order_id;
order_idtotal
1013000.00

結構

high_salary_employees
+-------+---------+
| name  | VARCHAR |
| salary| DECIMAL |
+-------+---------+
SQL CREATE INDEX - 建立索引

語法

CREATE INDEX 提升查詢效率。

CREATE INDEX index_name ON table_name (column);

範例

一般

為員工表姓名欄位建立索引。

CREATE INDEX idx_name ON employees (name);
索引名稱欄位
idx_nameemployeesname

MySQL

建立唯一索引。

CREATE UNIQUE INDEX idx_email ON customers (email);
索引名稱欄位
idx_emailcustomersemail

Oracle

建立多列索引。

CREATE INDEX idx_order ON orders (cust_id, order_date);
索引名稱欄位
idx_orderorderscust_id, order_date

結構

employees
+-------+---------+
| id    | INT     |
| name  | VARCHAR |
+-------+---------+
SQL ALTER TABLE - 修改資料表

語法

ALTER TABLE 修改資料表結構。

ALTER TABLE table_name ADD/MODIFY/DROP column datatype;

範例

一般

為員工表添加電子郵件欄位。

ALTER TABLE employees ADD email VARCHAR(100);
欄位型態
idINT
emailVARCHAR(100)

MySQL

修改欄位型態。

ALTER TABLE employees MODIFY salary DECIMAL(12,2);
欄位型態
salaryDECIMAL(12,2)

Oracle

刪除欄位。

ALTER TABLE employees DROP COLUMN email;
欄位型態
idNUMBER

結構

employees
+-------+---------+
| id    | INT     |
| salary| DECIMAL |
+-------+---------+
SQL 添加欄位 - 新增資料表欄位

語法

ADD COLUMN 新增欄位。

ALTER TABLE table_name ADD column datatype;

範例

一般

為員工表添加電話欄位。

ALTER TABLE employees ADD phone VARCHAR(20);
欄位型態
idINT
phoneVARCHAR(20)

MySQL

添加欄位並指定位置。

ALTER TABLE employees ADD address VARCHAR(100) AFTER name;
欄位型態
nameVARCHAR(50)
addressVARCHAR(100)

Oracle

添加日期欄位。

ALTER TABLE employees ADD birth_date DATE;
欄位型態
birth_dateDATE

結構

employees
+------------+---------+
| id         | INT     |
| phone      | VARCHAR |
+------------+---------+
SQL 更改欄位 - 修改欄位型態

語法

MODIFY COLUMN 修改欄位型態或約束。

ALTER TABLE table_name MODIFY column datatype;

範例

一般

修改員工表姓名欄位長度。

ALTER TABLE employees MODIFY name VARCHAR(100);
欄位型態
nameVARCHAR(100)

MySQL

修改薪資欄位型態並添加約束。

ALTER TABLE employees MODIFY salary DECIMAL(12,2) NOT NULL;
欄位型態約束
salaryDECIMAL(12,2)NOT NULL

Oracle

修改欄位型態。

ALTER TABLE employees MODIFY name VARCHAR2(100);
欄位型態
nameVARCHAR2(100)

結構

employees
+-------+---------+
| id    | INT     |
| name  | VARCHAR |
+-------+---------+
SQL 調整欄位 - 更改欄位屬性

語法

ALTER COLUMN 更改欄位屬性(依資料庫而異)。

ALTER TABLE table_name ALTER COLUMN column SET/DROP constraint;

範例

一般

為員工表姓名欄位添加非空約束(通用語法)。

ALTER TABLE employees MODIFY name VARCHAR(50) NOT NULL;
欄位型態約束
nameVARCHAR(50)NOT NULL

MySQL

移除欄位預設值。

ALTER TABLE employees ALTER COLUMN salary DROP DEFAULT;
欄位型態
salaryDECIMAL(10,2)

Oracle

設置欄位預設值。

ALTER TABLE employees MODIFY salary DEFAULT 0;
欄位型態預設值
salaryNUMBER(10,2)0

結構

employees
+-------+---------+
| id    | INT     |
| name  | VARCHAR |
| salary| DECIMAL |
+-------+---------+
SQL 改名欄位 - 重新命名欄位

語法

RENAME COLUMN 更改欄位名稱。

ALTER TABLE table_name RENAME COLUMN old_name TO new_name;

範例

一般

將員工表姓名欄位改名。

ALTER TABLE employees RENAME COLUMN name TO full_name;
舊欄位新欄位
namefull_name

MySQL

改名欄位(MySQL 用 CHANGE)。

ALTER TABLE employees CHANGE name full_name VARCHAR(50);
舊欄位新欄位
namefull_name

Oracle

改名欄位。

ALTER TABLE employees RENAME COLUMN name TO full_name;
舊欄位新欄位
namefull_name

結構

employees
+------------+---------+
| id         | INT     |
| full_name  | VARCHAR |
+------------+---------+
SQL 刪除欄位 - 移除資料表欄位

語法

DROP COLUMN 移除欄位。

ALTER TABLE table_name DROP COLUMN column;

範例

一般

刪除員工表電話欄位。

ALTER TABLE employees DROP COLUMN phone;
欄位型態
idINT

MySQL

刪除地址欄位。

ALTER TABLE employees DROP COLUMN address;
欄位型態
idINT

Oracle

刪除日期欄位。

ALTER TABLE employees DROP COLUMN birth_date;
欄位型態
idNUMBER

結構

employees
+-------+-------+
| id    | INT   |
+-------+-------+
SQL 添加索引 - 新增索引

語法

CREATE INDEX 新增索引。

CREATE INDEX index_name ON table_name (column);

範例

一般

為員工表部門欄位添加索引。

CREATE INDEX idx_dept ON employees (department);
索引名稱欄位
idx_deptemployeesdepartment

MySQL

添加複合索引。

CREATE INDEX idx_name_salary ON employees (name, salary);
索引名稱欄位
idx_name_salaryemployeesname, salary

Oracle

添加唯一索引。

CREATE UNIQUE INDEX idx_email ON customers (email);
索引名稱欄位
idx_emailcustomersemail

結構

employees
+------------+---------+
| id         | INT     |
| department | VARCHAR |
+------------+---------+
SQL 刪除索引 - 移除索引

語法

DROP INDEX 移除索引。

DROP INDEX index_name ON table_name;

範例

一般

刪除員工表部門索引。

DROP INDEX idx_dept ON employees;
索引名稱
idx_deptemployees

MySQL

刪除索引(MySQL 用 DROP INDEX 語法)。

ALTER TABLE employees DROP INDEX idx_name_salary;
索引名稱
idx_name_salaryemployees

Oracle

刪除索引。

DROP INDEX idx_email;
索引名稱
idx_emailcustomers

結構

employees
+------------+---------+
| id         | INT     |
| department | VARCHAR |
+------------+---------+
SQL 添加限制 - 新增約束

語法

ADD CONSTRAINT 新增約束。

ALTER TABLE table_name ADD CONSTRAINT constraint_name constraint_type;

範例

一般

為員工表添加外來鍵約束。

ALTER TABLE employees ADD CONSTRAINT fk_dept FOREIGN KEY (dept_id) REFERENCES departments(dept_id);
約束名稱欄位約束
fk_deptdept_idFOREIGN KEY

MySQL

添加檢查約束。

ALTER TABLE employees ADD CONSTRAINT chk_salary CHECK (salary > 0);
約束名稱欄位約束
chk_salarysalaryCHECK (salary > 0)

Oracle

添加唯一約束。

ALTER TABLE employees ADD CONSTRAINT uk_email UNIQUE (email);
約束名稱欄位約束
uk_emailemailUNIQUE

結構

employees
+--------+---------+
| id     | INT     |
| dept_id| INT     |
+--------+---------+
SQL 刪除限制 - 移除約束

語法

DROP CONSTRAINT 移除約束。

ALTER TABLE table_name DROP CONSTRAINT constraint_name;

範例

一般

刪除員工表外來鍵約束。

ALTER TABLE employees DROP CONSTRAINT fk_dept;
約束名稱
fk_deptemployees

MySQL

刪除檢查約束。

ALTER TABLE employees DROP CONSTRAINT chk_salary;
約束名稱
chk_salaryemployees

Oracle

刪除唯一約束。

ALTER TABLE employees DROP CONSTRAINT uk_email;
約束名稱
uk_emailemployees

結構

employees
+--------+-------+
| id     | INT   |
| dept_id| INT   |
+--------+-------+
SQL DROP TABLE - 刪除資料表

語法

DROP TABLE 刪除資料表。

DROP TABLE table_name;

範例

一般

刪除員工表。

DROP TABLE employees;
操作
employees已刪除

MySQL

刪除表,若存在。

DROP TABLE IF EXISTS departments;
操作
departments已刪除

Oracle

刪除表並清除回收站。

DROP TABLE orders PURGE;
操作
orders已刪除

結構

[表已刪除]
SQL TRUNCATE TABLE - 清空資料表

語法

TRUNCATE TABLE 清空資料表資料。

TRUNCATE TABLE table_name;

範例

一般

清空員工表資料。

TRUNCATE TABLE employees;
操作
employees已清空

MySQL

清空訂單表。

TRUNCATE TABLE orders;
操作
orders已清空

Oracle

清空產品表並重用空間。

TRUNCATE TABLE products REUSE STORAGE;
操作
products已清空

結構

employees
+-------+-------+
| id    | INT   |
| name  | VARCHAR |
+-------+-------+
[資料已清空]
SQL USE - 選擇資料庫

語法

USE 選擇要操作的資料庫(主要用於 MySQL)。

USE database_name;

範例

一般

選擇公司資料庫(通用語法依賴資料庫系統)。

USE company_db;
資料庫操作
company_db已選擇

MySQL

選擇員工資料庫。

USE employee_db;
資料庫操作
employee_db已選擇

Oracle

Oracle 使用模式切換(非 USE 語法)。

ALTER SESSION SET CURRENT_SCHEMA = hr;
模式操作
hr已選擇

結構

[資料庫已選擇]
SQL INSERT INTO - 插入資料

語法

INSERT INTO 插入新記錄。

INSERT INTO table_name (column1, column2) VALUES (value1, value2);

範例

一般

插入員工記錄。

INSERT INTO employees (id, name, salary) VALUES (1, '張三', 50000);
idnamesalary
1張三50000.00

MySQL

插入多筆記錄。

INSERT INTO employees (id, name, salary) VALUES (2, '李四', 55000), (3, '王五', 60000);
idnamesalary
2李四55000.00
3王五60000.00

Oracle

使用序列插入。

INSERT INTO employees (id, name, salary) VALUES (emp_seq.NEXTVAL, '趙六', 65000);
idnamesalary
4趙六65000.00

結構

employees
+-------+---------+
| id    | INT     |
| name  | VARCHAR |
| salary| DECIMAL |
+-------+---------+
SQL UPDATE - 更新資料

語法

UPDATE 更新資料表記錄。

UPDATE table_name SET column1 = value1 WHERE condition;

範例

一般

更新員工薪資。

UPDATE employees SET salary = 60000 WHERE id = 1;
idsalary
160000.00

MySQL

更新多列。

UPDATE employees SET salary = 65000, department = 'IT' WHERE id = 2;
idsalarydepartment
265000.00IT

Oracle

更新符合條件的記錄。

UPDATE employees SET salary = 70000 WHERE department = 'HR';
departmentsalary
HR70000.00

結構

employees
+------------+---------+
| id         | INT     |
| salary     | DECIMAL |
| department | VARCHAR |
+------------+---------+
SQL DELETE FROM - 刪除資料

語法

DELETE FROM 刪除資料表記錄。

DELETE FROM table_name WHERE condition;

範例

一般

刪除特定員工。

DELETE FROM employees WHERE id = 1;
id操作
1已刪除

MySQL

刪除部門員工。

DELETE FROM employees WHERE department = 'HR';
department操作
HR已刪除

Oracle

刪除舊訂單。

DELETE FROM orders WHERE order_date < TO_DATE('2023-01-01', 'YYYY-MM-DD');
條件操作
order_date < 2023-01-01已刪除

結構

employees
+------------+---------+
| id         | INT     |
| department | VARCHAR |
+------------+---------+
進階 SQL
SQL UNION - 合併查詢結果

語法

UNION 合併查詢結果,去重複。

SELECT column1 FROM table1
UNION
SELECT column1 FROM table2;

範例

一般

合併員工和客戶姓名。

SELECT name FROM employees
UNION
SELECT name FROM customers;
name
張三
李四

MySQL

合併部門員工,排序。

SELECT name FROM employees WHERE dept = 'HR'
UNION
SELECT name FROM employees WHERE dept = 'IT'
ORDER BY name;
name
陳七
王五

Oracle

合併訂單產品ID。

SELECT prod_id FROM orders
UNION
SELECT prod_id FROM order_history;
prod_id
1001
1002

結構

orders
+---------+-------+
| prod_id | NUMBER|
| date    | DATE  |
+---------+-------+
SQL UNION ALL - 合併查詢結果(含重複)

語法

UNION ALL 合併查詢結果,保留重複。

SELECT column1 FROM table1
UNION ALL
SELECT column1 FROM table2;

範例

一般

合併員工和客戶姓名,含重複。

SELECT name FROM employees
UNION ALL
SELECT name FROM customers;
name
張三
張三

MySQL

合併部門員工,含重複。

SELECT name FROM employees WHERE dept = 'HR'
UNION ALL
SELECT name FROM employees WHERE dept = 'IT';
name
張三
王五

Oracle

合併訂單產品ID,含重複。

SELECT prod_id FROM orders
UNION ALL
SELECT prod_id FROM order_history;
prod_id
1001
1001

結構

orders
+---------+-------+
| prod_id | NUMBER|
| date    | DATE  |
+---------+-------+
SQL 內嵌視觀表 - 子查詢作為視圖

語法

內嵌視觀表(子查詢)用於 FROM 子句中作為臨時表。

SELECT column FROM (SELECT column FROM table) AS subview;

範例

一般

從高薪員工子查詢中選擇資料。

SELECT name, salary FROM (SELECT name, salary FROM employees WHERE salary > 50000) AS high_salary;
namesalary
張三60000.00

MySQL

使用內嵌視圖查詢部門人數。

SELECT dept, count FROM (SELECT department AS dept, COUNT(*) AS count FROM employees GROUP BY department) AS dept_counts WHERE count > 5;
deptcount
IT10

Oracle

從訂單總額子查詢中選擇資料。

SELECT order_id, total FROM (SELECT order_id, SUM(amount) AS total FROM order_details GROUP BY order_id) WHERE total > 1000;
order_idtotal
1013000.00

結構

high_salary
+-------+---------+
| name  | VARCHAR |
| salary| DECIMAL |
+-------+---------+
SQL INTERSECT - 交集結果

語法

INTERSECT 返回多個查詢的交集(支援於 Oracle)。

SELECT column1 FROM table1
INTERSECT
SELECT column1 FROM table2;

範例

一般

查找員工和客戶共有的姓名(通用語法依賴資料庫)。

SELECT name FROM employees
INTERSECT
SELECT name FROM customers;
name
張三

MySQL

MySQL 不支援 INTERSECT,可用 JOIN 模擬。

SELECT DISTINCT e.name FROM employees e
INNER JOIN customers c ON e.name = c.name;
name
張三

Oracle

查找共有的產品ID。

SELECT prod_id FROM orders
INTERSECT
SELECT prod_id FROM order_history;
prod_id
1001

結構

orders
+---------+-------+
| prod_id | NUMBER|
| date    | DATE  |
+---------+-------+
SQL MINUS - 差集結果

語法

MINUS 返回第一個查詢有但第二個查詢沒有的結果(支援於 Oracle)。

SELECT column1 FROM table1
MINUS
SELECT column1 FROM table2;

範例

一般

查找僅在員工表而不在客戶表的姓名(通用語法依賴資料庫)。

SELECT name FROM employees
MINUS
SELECT name FROM customers;
name
李四

MySQL

MySQL 不支援 MINUS,可用 LEFT JOIN 模擬。

SELECT DISTINCT e.name FROM employees e
LEFT JOIN customers c ON e.name = c.name
WHERE c.name IS NULL;
name
李四

Oracle

查找僅在訂單表中的產品ID。

SELECT prod_id FROM orders
MINUS
SELECT prod_id FROM order_history;
prod_id
1002

結構

orders
+---------+-------+
| prod_id | NUMBER|
| date    | DATE  |
+---------+-------+
SQL LIMIT - 限制結果筆數

語法

LIMIT 限制查詢返回的筆數(支援於 MySQL)。

SELECT column FROM table LIMIT number;

範例

一般

查詢前5名員工(通用語法依賴資料庫)。

SELECT name FROM employees LIMIT 5;
name
張三
李四

MySQL

查詢前5筆高薪員工。

SELECT name, salary FROM employees ORDER BY salary DESC LIMIT 5;
namesalary
趙六60000.00

Oracle

Oracle 使用 FETCH FIRST 模擬 LIMIT。

SELECT name FROM employees FETCH FIRST 5 ROWS ONLY;
name
張三

結構

employees
+-------+---------+
| name  | VARCHAR |
| salary| DECIMAL |
+-------+---------+
SQL 子查詢 - 嵌套查詢

語法

子查詢嵌套在主查詢中,用於 WHERE 或 FROM 子句。

SELECT column FROM table WHERE column = (SELECT column FROM table WHERE condition);

範例

一般

查找薪資高於平均的員工。

SELECT name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);
namesalary
張三60000.00

MySQL

查找部門最高薪資的員工。

SELECT name, salary FROM employees WHERE salary = (SELECT MAX(salary) FROM employees WHERE department = 'IT');
namesalary
趙六60000.00

Oracle

查找有訂單的客戶。

SELECT name FROM customers WHERE id IN (SELECT cust_id FROM orders);
name
林八

結構

employees
+-------+---------+
| name  | VARCHAR |
| salary| DECIMAL |
+-------+---------+
SQL WITH - 通用表達式(CTE)

語法

WITH 定義通用表達式(CTE),簡化複雜查詢。

WITH cte_name AS (SELECT column FROM table) SELECT * FROM cte_name;

範例

一般

使用 CTE 查詢高薪員工。

WITH high_salary AS (SELECT name, salary FROM employees WHERE salary > 50000)
SELECT name, salary FROM high_salary;
namesalary
張三60000.00

MySQL

使用 CTE 查詢部門人數。

WITH dept_counts AS (SELECT department, COUNT(*) AS count FROM employees GROUP BY department)
SELECT department, count FROM dept_counts WHERE count > 5;
departmentcount
IT10

Oracle

使用 CTE 查詢訂單總額。

WITH order_totals AS (SELECT order_id, SUM(amount) AS total FROM order_details GROUP BY order_id)
SELECT order_id, total FROM order_totals WHERE total > 1000;
order_idtotal
1013000.00

結構

high_salary
+-------+---------+
| name  | VARCHAR |
| salary| DECIMAL |
+-------+---------+
SQL EXISTS - 檢查子查詢存在

語法

EXISTS 檢查子查詢是否返回結果。

SELECT column FROM table WHERE EXISTS (SELECT 1 FROM table2 WHERE condition);

範例

一般

查找有訂單的客戶。

SELECT name FROM customers WHERE EXISTS (SELECT 1 FROM orders WHERE orders.cust_id = customers.id);
name
林八

MySQL

查找有高薪員工的部門。

SELECT department FROM employees e1 WHERE EXISTS (SELECT 1 FROM employees e2 WHERE e2.department = e1.department AND e2.salary > 50000);
department
IT

Oracle

查找有歷史訂單的產品。

SELECT prod_name FROM products p WHERE EXISTS (SELECT 1 FROM order_history oh WHERE oh.prod_id = p.prod_id);
prod_name
Apple

結構

customers
+-------+---------+
| id    | INT     |
| name  | VARCHAR |
+-------+---------+
SQL CASE - 條件表達式

語法

CASE 提供條件邏輯,返回不同值。

SELECT CASE WHEN condition THEN result1 ELSE result2 END AS column FROM table;

範例

一般

根據薪資分級員工。

SELECT name, CASE 
    WHEN salary > 60000 THEN '高薪'
    WHEN salary > 40000 THEN '中薪'
    ELSE '低薪'
END AS salary_level FROM employees;
namesalary_level
張三高薪

MySQL

根據部門分類。

SELECT name, CASE department 
    WHEN 'IT' THEN '技術部'
    WHEN 'HR' THEN '人力部'
    ELSE '其他'
END AS dept_type FROM employees;
namedept_type
趙六技術部

Oracle

根據訂單金額分級。

SELECT order_id, CASE 
    WHEN amount > 5000 THEN '大訂單'
    ELSE '小訂單'
END AS order_size FROM orders;
order_idorder_size
101小訂單

結構

employees
+------------+---------+
| name       | VARCHAR |
| salary     | DECIMAL |
| department | VARCHAR |
+------------+---------+
SQL 窗口函數 - 進階分析

語法

窗口函數在指定範圍內計算,如排名、累積總計等。

SELECT column, FUNCTION() OVER (PARTITION BY column ORDER BY column) FROM table;

範例

一般

按部門計算薪資排名。

SELECT name, salary, RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank FROM employees;
namesalaryrank
趙六60000.001

MySQL

計算部門累積薪資(MySQL 8.0+ 支援)。

SELECT name, salary, SUM(salary) OVER (PARTITION BY department ORDER BY salary) AS cumulative_salary FROM employees;
namesalarycumulative_salary
趙六60000.0060000.00

Oracle

按年份計算訂單總額排名。

SELECT TO_CHAR(order_date, 'YYYY') AS year, SUM(amount) AS total, 
RANK() OVER (ORDER BY SUM(amount) DESC) AS rank FROM orders GROUP BY TO_CHAR(order_date, 'YYYY');
yeartotalrank
202350000.001

結構

employees
+------------+---------+
| name       | VARCHAR |
| salary     | DECIMAL |
| department | VARCHAR |
+------------+---------+
SQL SEQUENCE 和 NEXTVAL - 自動編號

語法

SEQUENCENEXTVAL 產生自動編號(支援於 Oracle)。

CREATE SEQUENCE sequence_name START WITH 1;
SELECT sequence_name.NEXTVAL FROM dual;

範例

一般

建立序列並插入員工(通用語法依賴資料庫)。

CREATE SEQUENCE emp_seq START WITH 1;
INSERT INTO employees (id, name) VALUES (emp_seq.NEXTVAL, '張三');
idname
1張三

MySQL

MySQL 使用 AUTO_INCREMENT 模擬。

CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50)
);
INSERT INTO employees (name) VALUES ('李四');
idname
1李四

Oracle

使用序列插入訂單。

CREATE SEQUENCE order_seq START WITH 1;
INSERT INTO orders (order_id, amount) VALUES (order_seq.NEXTVAL, 3000);
order_idamount
13000.00

結構

employees
+-------+---------+
| id    | INT     |
| name  | VARCHAR |
+-------+---------+
SQL 算排名 - 排名計算

語法

RANK 窗口函數計算排名。

SELECT column, RANK() OVER (ORDER BY column) AS rank FROM table;

範例

一般

按薪資排名員工。

SELECT name, salary, RANK() OVER (ORDER BY salary DESC) AS rank FROM employees;
namesalaryrank
趙六60000.001

MySQL

按部門內薪資排名(MySQL 8.0+)。

SELECT name, salary, RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank FROM employees;
namesalaryrank
趙六60000.001

Oracle

按訂單金額排名。

SELECT order_id, amount, RANK() OVER (ORDER BY amount DESC) AS rank FROM orders;
order_idamountrank
1013000.001

結構

employees
+-------+---------+
| name  | VARCHAR |
| salary| DECIMAL |
+-------+---------+
SQL 算中位數 - 中位數計算

語法

中位數計算(依資料庫實現不同)。

SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY column) AS median FROM table;

範例

一般

計算員工薪資中位數(通用語法依賴資料庫)。

SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary) AS median_salary FROM employees;
median_salary
55000.00

MySQL

MySQL 8.0+ 使用窗口函數模擬中位數。

WITH ranked AS (
    SELECT salary, ROW_NUMBER() OVER (ORDER BY salary) AS rn, COUNT(*) OVER () AS cnt
    FROM employees
)
SELECT AVG(salary) AS median_salary
FROM ranked
WHERE rn IN (FLOOR((cnt+1)/2), CEIL((cnt+1)/2));
median_salary
55000.00

Oracle

使用 MEDIAN 函數。

SELECT MEDIAN(amount) AS median_amount FROM orders;
median_amount
3000.00

結構

employees
+-------+---------+
| salary| DECIMAL |
+-------+---------+
SQL 算累積總計 - 累積計算

語法

使用窗口函數計算累積總計。

SELECT column, SUM(column2) OVER (ORDER BY column) AS cumulative_sum FROM table;

範例

一般

按薪資排序計算累積薪資。

SELECT name, salary, SUM(salary) OVER (ORDER BY salary) AS cumulative_salary FROM employees;
namesalarycumulative_salary
李四55000.0055000.00
張三60000.00115000.00

MySQL

按部門計算累積薪資(MySQL 8.0+)。

SELECT name, salary, SUM(salary) OVER (PARTITION BY department ORDER BY salary) AS cumulative_salary FROM employees;
namesalarycumulative_salary
趙六60000.0060000.00

Oracle

按訂單日期計算累積金額。

SELECT order_id, amount, SUM(amount) OVER (ORDER BY order_date) AS cumulative_amount FROM orders;
order_idamountcumulative_amount
1013000.003000.00

結構

employees
+-------+---------+
| name  | VARCHAR |
| salary| DECIMAL |
+-------+---------+
SQL 算總合百分比 - 計算比例

語法

使用窗口函數計算總和百分比。

SELECT column, (column / SUM(column) OVER ()) * 100 AS percent FROM table;

範例

一般

計算員工薪資佔總薪資的百分比。

SELECT name, salary, (salary / SUM(salary) OVER ()) * 100 AS salary_percent FROM employees;
namesalarysalary_percent
張三60000.0020.00

MySQL

按部門計算薪資比例(MySQL 8.0+)。

SELECT name, salary, (salary / SUM(salary) OVER (PARTITION BY department)) * 100 AS dept_percent FROM employees;
namesalarydept_percent
趙六60000.0050.00

Oracle

計算訂單金額比例。

SELECT order_id, amount, (amount / SUM(amount) OVER ()) * 100 AS amount_percent FROM orders;
order_idamountamount_percent
1013000.0030.00

結構

employees
+-------+---------+
| name  | VARCHAR |
| salary| DECIMAL |
+-------+---------+
SQL 算累積總合百分比 - 累積比例

語法

使用窗口函數計算累積總和百分比。

SELECT column, (SUM(column) OVER (ORDER BY column) / SUM(column) OVER ()) * 100 AS cumulative_percent FROM table;

範例

一般

按薪資排序計算累積薪資百分比。

SELECT name, salary, (SUM(salary) OVER (ORDER BY salary) / SUM(salary) OVER ()) * 100 AS cumulative_percent FROM employees;
namesalarycumulative_percent
李四55000.0040.00
張三60000.0080.00

MySQL

按部門計算累積薪資比例(MySQL 8.0+)。

SELECT name, salary, (SUM(salary) OVER (PARTITION BY department ORDER BY salary) / SUM(salary) OVER (PARTITION BY department)) * 100 AS cumulative_percent FROM employees;
namesalarycumulative_percent
趙六60000.0050.00

Oracle

按訂單日期計算累積金額比例。

SELECT order_id, amount, (SUM(amount) OVER (ORDER BY order_date) / SUM(amount) OVER ()) * 100 AS cumulative_percent FROM orders;
order_idamountcumulative_percent
1013000.0030.00

結構

employees
+-------+---------+
| name  | VARCHAR |
| salary| DECIMAL |
+-------+---------+