SQL作用在關(guān)系上的union谅将、intersect漾狼、except運(yùn)算對(duì)應(yīng)數(shù)學(xué)集合論中的并、交戏自、差運(yùn)算邦投。
通用形式:
關(guān)系1 [集合運(yùn)算方式] 關(guān)系2;
1擅笔、并運(yùn)算
示例:
(
SELECT * FROM instructor WHERE name='smith')
UNION
(
SELECT * FROM instructor WHERE dept_name = 'history');
原表
結(jié)果表
與select子句不同志衣,union運(yùn)算自動(dòng)去除重復(fù)的結(jié)果集元組。如果要保留重復(fù)數(shù)據(jù)猛们,則應(yīng)用union all 代替 union念脯。
值得注意的是,參與并運(yùn)算中select的屬性數(shù)目應(yīng)該相同弯淘,否則會(huì)報(bào)以下錯(cuò)誤:
The used SELECT statements have a different number of columns
并運(yùn)算生成的結(jié)果關(guān)系的屬性名是是根據(jù)關(guān)系1而定绿店,例如:
(
SELECT name,salary FROM instructor)
UNION
(
SELECT dept_name,building FROM department);
運(yùn)算結(jié)果表
2、交運(yùn)算:
同理的交運(yùn)算運(yùn)算:intersect 和 intersect all庐橙。
示例:
(
SELECT dept_name
FROM instructor
WHERE name = 'smith'
)intersect(
SELECT dept_name
FROM department
);
3假勿、差運(yùn)算:
差運(yùn)算也有 except 和 except all兩種操作。
所謂差運(yùn)算是取出關(guān)系1中有但關(guān)系2沒(méi)有的元組态鳖。
(
SELECT dept_name
FROM instructor
)EXCEPT (
SELECT dept_name
FROM department
WHERE dept_name = 'biology'
);
注:在MySQL中转培,是沒(méi)有交,差兩種運(yùn)算操作的浆竭,所以的另選他法浸须。
交運(yùn)算(利用連接惨寿,往后會(huì)提到):
SELECT DISTINCT dept_name
FROM instructor
INNER JOIN department USING (dept_name)
差運(yùn)算:
SELECT dept_name
FROM department
LEFT JOIN instructor USING (dept_name)
WHERE instructor.dept_name IS NULL ;
當(dāng)然,也可以分別利用in 和not in 分別實(shí)現(xiàn)上面的兩種集合運(yùn)算删窒,從字面意義也很容易理解裂垦,不過(guò)in和 not in不適用大數(shù)據(jù)集合的運(yùn)算。