自学内容网 自学内容网

MySQL【三】

多表联合查询

SELECT 字段列表 FROM 表1 [别名1] , 表2 [别名2] WHERE 连接条件表达式 [AND 查询条件表达式 ];

① 要进行联合查询的表都要放在FROM子句中,表名之间用逗号分开,比如FROM s , sc。
② 为了书写方便,可以为表起别名,别名一经定义,在整个查询语句中就只能使用表的别名而不能再使用表名。
③ 连接的条件放在WHERE子句中,格式为:表1.字段=表2.字段。

连接查询—内连接查询

SELECT 字段列表 FROM 表1 [别名1] [INNER] JOIN 表2 [别名2] [ON 表1.字段=表2.字段] [ WHERE 条件表达式 ];

当连接条件由两张表相同名称且类型系统的字段相连接时,可以使用USING(字段名)来连接。

########## 查询每个学生的学号、姓名、选修课程号、课程名及成绩 ##########
select s.sno,sname,sc.cno,cname,score from s join sc on s.sno = sc.sno 
join c on sc.cno = c.cno;

左外连接查询

SELECT 字段列表 FROM 表1 [别名1] LEFT [OUTER] JOIN 表2 [别名2] [ON 表1.字段=表2.字段] [ WHERE 查询条件表达式 ];

在内连接的基础上,结果集中还包括左表(表1)中不满足条件的记录行。当左表中不满足条件的记录与右表(表2)记录进行组合时,右表相应列值为NULL。

右外连接查询

SELECT 字段列表 FROM 表1 [别名1] RIGHT [OUTER] JOIN 表2 [别名2] [ON 表1.字段=表2.字段] [ WHERE 查询条件表达式 ];

在内连接的基础上,结果集中还包括右表(表2)中不满足条件的记录行。当右表中不满足条件的记录与左表(表1)记录进行组合时,左表相应列值为NULL。

########## 查询所有课程的被选情况(包括从未被选修的课程),要求显示选课的学生学号、课程编号、课程名和成绩 ##########
SELECT s.sno, c.cno, cname, score
FROM s
RIGHT JOIN (
    c LEFT JOIN sc ON c.cno = sc.cno
) ON s.sno = sc.sno;

交叉连接查询

SELECT 字段列表 FROM 表1 [别名1] CROSS JOIN 表2 [别名2]

交叉连接无任何连接条件,也不能带WHERE子句。

########## 查询所有学生的可能选课组合,结果集包括学号、姓名、课程号及课程名 ##########
select s.sno,sname,c.cno,cname from s cross join c;

子查询

########## 查询学号为's003'学生的选修课程号和课程名 ##########
select c.cno,cname 
from (select sc.cno from s join sc on s.sno = sc.sno where s.sno = 's003') as sub
join c on sub.cno = c.cno; 

UNION 联合查询(删除重复行)

SELECT语句1 UNION[ALL] SELECT语句2 [UNION [ALL]< SELECT语句3>][...n]

########## 查询来自'北京'或'上海'的学生学号、姓名、所在院系和家庭地址 ##########
select s.sno,sname,dept,addr from s where addr = '北京' union select s.sno ,sname ,dept,addr from s where addr = '上海';

原文地址:https://blog.csdn.net/y_noora/article/details/143687846

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!