如何拆解,首先我们先考虑条件:“选修了“数据库系统原理”和“软件工程导论”这两门课程的学生”,先用 WHERE 语句按照条件查询出来,然后再去 JOIN 其他表展示剩下的数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
SELECT s.student_id, s.student_name, c.course_name, g.grades FROM students_info s JOIN grades_info g ON s.student_id = g.student_id JOIN courses_info c ON g.course_id = c.course_id WHERE s.student_id IN ( SELECT student_id FROM grades_info JOIN courses_info ON grades_info.course_id = courses_info.course_id WHERE course_name ='数据库原理' ) AND s.student_id IN ( SELECT student_id FROM grades_info JOIN courses_info ON grades_info.course_id = courses_info.course_id WHERE course_name ='软件工程' );
求出每门课的课程号、选课人数。
用 COUNT 去统计,这里使用左链接显示没有人选的科目
1 2 3 4 5 6 7
SELECT c.course_id, c.course_name, COUNT(g.student_id) AS number_of_students FROM courses_info c LEFTJOIN grades_info g ON c.course_id = g.course_id GROUPBY c.course_id, c.course_name;
查询所有学生的选修课程情况和成绩,若学生没有选修任何课程,也要包含在其中。
也是左链接,同理。
1 2 3 4 5 6 7 8 9
SELECT c.course_id, c.course_name, s.student_id, s.student_name FROM grades_info g RIGHTJOIN courses_info c ON g.course_id = c.course_id LEFTJOIN students_info s ON g.student_id = s.student_id
查询被选修了的课程的选修情况和所有开设课程名,包括没有被选修的课程
1 2 3 4 5 6 7 8
SELECT c.course_name, GROUP_CONCAT(s.student_name) AS students_enrolled FROM courses_info c LEFTJOIN grades_info g ON c.course_id = g.course_id LEFTJOIN students_info s ON g.student_id = s.student_id GROUPBY c.course_name ORDERBY c.course_name;
在学生信息表中,查询年龄比“王林”大的学生的学号,姓名,年龄
用 YEAR()函数转换为 int 再相减
1 2 3 4 5 6 7
SELECT s1.student_id, s1.student_name, YEAR(CURRENT_DATE) -YEAR(s1.birthday) AS age FROM students_info s1 LEFTJOIN students_info s2 ON s1.student_id != s2.student_id WHERE s2.student_name ='王林'AND s1.birthday > s2.birthday
这里用 CREATE OR REPLACE 修改视图,然后 FROM 这边可以从一个查询结果里的表选取,用 AS t 重新命名为 t,这里就可以体现出数据库查询思路了,由简单再到复杂,将复杂的语句拆开成几个部分,实现了各个部分再合并。
1 2 3 4 5 6 7 8 9 10
CREATEOR REPLACE VIEW student_view3 AS SELECT t.major_name,COUNT(t.student_id) AS numbers FROM (SELECT m.major_name, s.student_id FROM students_info AS s JOIN major_info AS m ON s.major_id = m.major_id) AS t JOIN grades_info AS g ON t.student_id = g.student_id JOIN courses_info AS c ON c.course_id = g.course_id WHERE c.course_name = "数据库原理" GROUPBY t.major_name;