一、傳統的集合運算
前提:
關系R 和 關系S 具有相同的屬性個數。
1、並 ∪
R∪S=
2、差 −
R−S=
3、交 ∩
R∩S=
4、笛卡爾積 ×
(n * m)
R×S=
二、專門的關系運算
選擇σ、投影 π 關系運算、自連接
均用Student、Coures、SC 表來演示
# 自連接 /*以Course表為例*/ -- 查詢每一門課的間接先修課(即先修課的先修課) select fist.Cno, second.Cpno from Coures as fist, Coures as second where fist.Cpno = second.Cno;
1、選擇σ
目的:
選出滿足條件的 諸元組 ∧ ∨ ¬
# 【選擇σ】 不改變屬性列個數 因此用 select *
-- 比較運算符的SQL表示
select *
from Student
where Sage < 20;
/*延展: [10,20] --> where Sage between 10 and 20; */
-- 邏輯運算符的SQL表示
¬ not
∧ and
∨ or
例:σSage<20 (Student)
2、投影 π
目的:
選出滿足條件的若干 屬性列
select Sname,Sdept
from Student;
πSname,Sdept (Student)
3、連接 θ 💖 ⋈
目的:
從兩個關系R、S的笛卡爾積中選取 屬性間滿足一定條件的元組
①關系表
②連接運算
1、內連接
2、自然連接
3、外連接
③SQL語句
1、using關鍵字:連接查詢時如果是同名字段作為連接條件,using可以代替on出現(比on更好)
- using是針對同名字段(using(id) === A.id = B.id)
- using關鍵字使用后會自動合並對應字段為一個
- using可以同時使用多個字段作為條件
2、自然連接:包含自然內連接和自然外連接
- 自然內連接:
natural join
- 自然外連接:
natural left/right join
- 自然連接條件匹配模式:自動尋找相同字段名作為連接條件(字段名相同)
#交叉連接
select *
from r2 cross join s2;
/*類似於:(笛卡爾積)
select *
from r2, s2;
*/
-- -------------------------------
#內連接
-- 非等值連接
/*
select *
from r2, s2
where r2.C < s2.E;
*/
select *
from r2 inner join s2 on r2.C < s2.E;
-- 等值連接
/*
select *
from r2,s2
where r2.B = s2.B;
*/
select *
from r2 inner join s2 on r2.B = s2.B;
-- -------------------------------
#自然連接
select *
from r2 natural join s2;
/*類似於使用using:
select *
from r2 inner join s2 using(B);
*/
-- -------------------------------
#外連接
-- 左外連接
/*
select *
from r2 left join s2 on r2.B = s2.B;
或者;
select *
from r2 natural left join s2;
*/
select *
from r2 left join s2 using(B);
-- 右外連接
/*
select *
from r2 right join s2 on r2.B = s2.B;
或者:
select *
from r2 natural right join s2;
*/
select *
from r2 right join s2 using(B);
其他:
自連接內容,詳見《5、DQL語言(重點)》
4、除 ÷
-- 方式1
select A
from r3 natural join s3
GROUP BY r3.A
HAVING count(r3.A) = (
SELECT count(*)
FROM s3
);
-- 方式2
select A
from r3 left join s3 using(B,C) /*使用left join 是因為MySQL不支持💖完全外連接*/
GROUP BY r3.A
HAVING count(r3.A) = (
SELECT count(*)
FROM s3
);
三、配套SQL文件下載
本篇文章制作不易,期待你們的小星星😄。
點擊右上角 GitHub 圖標即可查看下載