SQL - EXCEPT 運算子:初學者的全面指南
你好,有志於SQL的熱情者!今天,我們將踏上一段令人興奮的旅程,進入SQL的世界,特別聚焦於EXCEPT運算子。別擔心你對編程是新手——我將成為你的友好導遊,一步步解釋一切。那麼,我們來一起深入了解吧!
SQL EXCEPT 運算子
EXCEPT 運算子是什麼?
EXCEPT運算子在SQL中就像一根魔杖,讓我們可以比較兩個結果集,並從第一個集合中返回不在第二個集合中的唯一行。這就像找到兩組事物之間的差異。
想像你有兩個水果籃。第一個籃子有蘋果、橙子和香蕉。第二個籃子有橙子和梨。如果我們使用EXCEPT運算子,我們將會得到只是蘋果和香蕉——那些在第一個籃子中但不在第二個籃子中的水果。
基本語法
這是我們通常如何寫一個EXCEPT語句:
SELECT column1, column2, ...
FROM table1
EXCEPT
SELECT column1, column2, ...
FROM table2;
一個簡單的例子
假設我們有兩個表:employees
和 managers
。我們想要找到所有不是經理的員工。
SELECT employee_id, name
FROM employees
EXCEPT
SELECT employee_id, name
FROM managers;
這個查詢將返回所有不在經理表中的員工。挺厲害的,不是嗎?
EXCEPT 與 BETWEEN 運算子
現在,讓我們給事情增加一點趣味,將EXCEPT與BETWEEN運算子結合起來。BETWEEN運算子讓我們可以選擇給定範圍內的值。
示例:找到非高級員工
假設我們想要找到不在高級年齡範圍內的員工(我們假設是50-65歲)。
SELECT employee_id, name, age
FROM employees
EXCEPT
SELECT employee_id, name, age
FROM employees
WHERE age BETWEEN 50 AND 65;
這個查詢將給我們所有不在50到65歲年齡範圍內的員工。這就像在我們公司中找到年輕的射手和超級老將!
EXCEPT 與 IN 運算子
IN運算子讓我們在WHERE子句中指定多個值。當與EXCEPT結合時,它可能非常強大。
示例:不在特定部門的員工
讓我們找到不在IT、HR或財務部的員工。
SELECT employee_id, name, department
FROM employees
EXCEPT
SELECT employee_id, name, department
FROM employees
WHERE department IN ('IT', 'HR', 'Finance');
這個查詢將返回所有在IT、HR和財務部以外的部門工作的員工。這就像在我們公司中找到獨特的雪花!
EXCEPT 與 LIKE 運算子
LIKE運算子在WHERE子句中用於搜索列中指定的模式。當我們將它與EXCEPT結合時,我們可以做些非常酷的事情。
示例:職稱中不含'經理'的員工
讓我們找到所有職稱中不包括'經理'這個詞的員工。
SELECT employee_id, name, job_title
FROM employees
EXCEPT
SELECT employee_id, name, job_title
FROM employees
WHERE job_title LIKE '%Manager%';
這個查詢將給我們所有職稱中不包含'經理'的員工。這就像在我們的企業蜂群中找到所有的工蜂!
把所有東西結合起來
現在我們已經學習了這些不同的運算子,讓我們在更複雜的例子中將它們結合起來。
示例:複雜的員工查詢
讓我們找到所有滿足以下條件的員工:
- 不是經理
- 年齡在25到40歲之間
- 不在IT或HR部門工作
- 職稱中不含'專家'
SELECT employee_id, name, age, department, job_title
FROM employees
EXCEPT
SELECT employee_id, name, age, department, job_title
FROM employees
WHERE employee_id IN (SELECT employee_id FROM managers)
OR age NOT BETWEEN 25 AND 40
OR department IN ('IT', 'HR')
OR job_title LIKE '%Specialist%';
這個查詢可能一開始看起來很複雜,但如果你分解它,它只是我們學過的所有概念的組合!
常見 EXCEPT 方法
這是一個總結我們討論過的方法的表格:
方法 | 描述 | 示例 |
---|---|---|
基本EXCEPT | 找到第一個集合中不在第二個集合中的行 | SELECT * FROM A EXCEPT SELECT * FROM B |
EXCEPT與BETWEEN | 排除在範圍內的行 | ... EXCEPT ... WHERE col BETWEEN x AND y |
EXCEPT與IN | 排除匹配指定值的行 | ... EXCEPT ... WHERE col IN (a, b, c) |
EXCEPT與LIKE | 排除匹配模式的行 | ... EXCEPT ... WHERE col LIKE '%pattern%' |
記住,熟能生巧!嘗試使用這些運算子自己寫查詢。不要害怕犯錯誤——這是我們學習和成長的方式。
我希望這個指南能夠幫助你解開EXCEPT運算子和它的朋友的神秘。SQL可能一開始看起來很令人生畏,但隨著時間和練習,你將能夠像專業人士一樣編寫複雜的查詢。持續編程,保持好奇心,最重要的是,玩得開心!
Credits: Image by storyset