DQL命令查询数据(三)

本课目标

掌握MySQL的多表查询

SQL语句的综合应用

多表连接查询

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

分类:

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

内连接

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

DQL命令查询数据(三)_第1张图片

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

#查询考试信息
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;

DQL命令查询数据(三)_第2张图片

#为每个学生制作在校期间每门课程的成绩单,要求每个学生参加每门课程的最后一次考试成绩作为该生本课程的最终成绩。
#成绩单的数据项
#学生姓名
#课程所属的年级名称
#课程名称
#考试日期
#考试成绩
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; 

DQL命令查询数据(三)_第3张图片

DQL命令查询数据(三)_第4张图片

右外连接

不同的 SQL JOIN 对比

DQL命令查询数据(三)_第5张图片

#查询所有课程的信息(某些课程可能还没有被考过)。
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;

你可能感兴趣的:(MySQL数据库,mysql,数据库)