DQL命令查询数据(三)

发布时间:2024年01月07日

本课目标

掌握MySQL的多表查询

SQL语句的综合应用

多表连接查询

通过各个表之间共同列的关联性(例如:外键)来查询的

分类:

  • 内连接(INNER JOIN) ,可简写为 JOIN
  • 左外连接(LEFT OUTER JOIN),可简写为LEFT JOIN
  • 右外连接(RIGHT OUTER JOIN),可简写为RIGHT JOIN
  • 自连接查询
  • 交叉连接(CROSS JOIN)也称为 笛卡儿乘积连接,基本上用不到。

内连接

使用比较运算符根据每个表的通用列中的值匹配连个表中的行

如果两个表中邮箱通道字段名,必须在列名前加表名,否则将出现错误

#查询考试信息
SELECT S.STUDENTNO,STUDENTNAME,GRADENAME,SUBJECTNAME,STUDENTRESULT,EXAMDATE FROM STUDENT S JOIN RESULT R ON S.STUDENTNO=R.STUDENTNO JOIN GRADE G ON S.GRADEID=G.GRADEID JOIN `SUBJECT` SU ON SU.SUBJECTNO=R.SUBJECTNO ORDER BY G.GRADEID,EXAMDATE DESC,STUDENTRESULT DESC;
#第二种写法
SELECT S.STUDENTNO,STUDENTNAME,GRADENAME,SUBJECTNAME,STUDENTRESULT,EXAMDATE FROM STUDENT S,RESULT R,GRADE G,`SUBJECT` SU WHERE S.STUDENTNO=R.STUDENTNO AND S.GRADEID=G.GRADEID AND SU.SUBJECTNO=R.SUBJECTNO;

#查询1993年以后出生的学生的姓名,电话和年级名称。
SELECT BORNDATE,STUDENTNO,PHONE,GRADENAME FROM STUDENT S JOIN GRADE G ON S.GRADEID=G.GRADEID WHERE YEAR(BORNDATE)>=1993 ORDER BY BORNDATE;

#查询学生的学号、姓名、课程名称和考试成绩。
SELECT S.STUDENTNO,STUDENTNAME,SUBJECTNAME,STUDENTRESULT FROM STUDENT S INNER JOIN RESULT R ON S.STUDENTNO= R.STUDENTNO INNER JOIN `SUBJECT` SU ON SU.SUBJECTNO=R.SUBJECTNO;

#为每个学生制作在校期间每门课程的成绩单,要求每个学生参加每门课程的最后一次考试成绩作为该生本课程的最终成绩。
#成绩单的数据项
#学生姓名
#课程所属的年级名称
#课程名称
#考试日期
#考试成绩
SELECT STUDENTNAME,GRADENAME,SUBJECTNAME,EXAMDATE,STUDENTRESULT
FROM STUDENT S JOIN (
	SELECT R1.*,R.STUDENTRESULT
	FROM RESULT R JOIN (
		SELECT STUDENTNO,SUBJECTNO,MAX(EXAMDATE) EXAMDATE FROM RESULT GROUP BY STUDENTNO,SUBJECTNO
	) R1 ON R.STUDENTNO=R1.STUDENTNO AND R.SUBJECTNO=R1.SUBJECTNO AND R.EXAMDATE=R1.EXAMDATE
) R2 ON S.STUDENTNO=R2.STUDENTNO
JOIN `SUBJECT` SU ON SU.SUBJECTNO=R2.SUBJECTNO
JOIN GRADE G ON S.GRADEID=G.GRADEID
ORDER BY S.STUDENTNO;

左外连接

左外连接:左表的记录将会全部表示出来,而右表只会显示符合匹配条件的记录

  • 匹配,返回到结果集
  • 无匹配,NULL 值返回到结果集
#带条件的连接
#条件写在on后面时,表示先对内容筛选然后再进行连接
#条件写在where中,表示先对表进行连接,然后对连接的结果再做筛选

SELECT S.STUDENTNO,STUDENTNAME,SUBJECTNO,STUDENTRESULT FROM STUDENT S 
LEFT JOIN RESULT R ON S.STUDENTNO=R.STUDENTNO AND SUBJECTNO=3; 


SELECT S.STUDENTNO,STUDENTNAME,SUBJECTNO,STUDENTRESULT FROM STUDENT S 
LEFT JOIN RESULT R ON S.STUDENTNO=R.STUDENTNO WHERE SUBJECTNO=3; 

右外连接

不同的 SQL JOIN 对比

#查询所有课程的信息(某些课程可能还没有被考过)。
SELECT SU.*,T.AVG FROM (
  SELECT S.SUBJECTNO,AVG(STUDENTRESULT) AVG FROM `SUBJECT` S LEFT JOIN RESULT R ON S.SUBJECTNO=R.SUBJECTNO GROUP BY SUBJECTNO
)T JOIN `SUBJECT` SU ON T.SUBJECTNO=SU.SUBJECTNO;

#查询从未考试的课程信息。
SELECT SU.* FROM (
  SELECT S.SUBJECTNO,AVG(STUDENTRESULT) AVG FROM `SUBJECT` S LEFT JOIN RESULT R ON S.SUBJECTNO=R.SUBJECTNO GROUP BY SUBJECTNO 
)T JOIN `SUBJECT` SU ON T.SUBJECTNO=SU.SUBJECTNO WHERE AVG IS NULL;
文章来源:https://blog.csdn.net/wisbhxnhsj/article/details/135433694
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。