本课目标
掌握MySQL的多表查询
SQL语句的综合应用
通过各个表之间共同列的关联性(例如:外键)来查询的
分类:
使用比较运算符根据每个表的通用列中的值匹配连个表中的行
如果两个表中邮箱通道字段名,必须在列名前加表名,否则将出现错误
#查询考试信息
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;
左外连接:左表的记录将会全部表示出来,而右表只会显示符合匹配条件的记录
#带条件的连接
#条件写在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;