数据库学习笔记(1)——内连接、左(右)连接、全连接
一、JOIN、LEFT JOIN 、RIGHT JOIN 和 FULL JOIN
1、涉及的三张表
???? 1)学员表(学号、姓名、单位、年龄)????? S(sno,sname,sdepart,sage)
???? 2)课程(课程编号、课程名)?????????????? C(cno,cname)
???? 3)成绩表(学号、课程编号、成绩)??? SC(sno,sname,grade)
?
2、表中的数据
??? 1)SELECT * FROM S
?

?
?注:S表中sno=4 的员工在SC表中没有对应记录。
?
?? 2)SELECT * FROM C

?
?3)SELECT * FROM SC

?
注:SC表中sno=5在S表中没有对应记录。
?
3、区别与联系
1)连接(内连接)
--JOIN(INNER JOIN) 只返回两张表连接列的匹配项
SELECT * FROM S JOIN? SC ON S.sno=SC.sno
SELECT * FROM S INNER JOIN SC ON S.sno=SC.sno
?

2)左连接
--LEFT JOIN? 左连接? 即使右表中没有匹配,也从左表返回所有的行
SELECT * FROM S LEFT JOIN SC ON S.sno=SC.sno

3)右连接
--RIGHT JOIN 右连接? 即使左表中没有匹配,也从右表返回所有的行
SELECT * FROM S RIGHT JOIN SC ON S.sno=SC.sno

4)全连接
--FULL JOIN? 返回两张表中的行 LEFT JOIN+RIGHT JOIN
SELECT * FROM S FULL JOIN SC ON S.sno=SC.sno
?

二、GROUP BY 的用法
--GROUP BY 的用法 用于结合合计函数,根据一个或多个列对结果集进行分组
--查询每个学员选修的课程数
SELECT sno,选修课程数=count(cno)FROM SC GROUP BY sno
?

三、HAVING 的用法
-- HAVING 的用法(增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用)
--查询选修课程数大于2的员工号
--1.错误
SELECT? sno,选修课程数=COUNT(cno) FROM SC GROUP BY sno WHERE COUNT(cno)>2
--2.正确
SELECT? sno,选修课程数=COUNT(cno) FROM SC GROUP BY sno HAVING COUNT(cno)>2
?
![]()