当前位置:   article > 正文

sql减法语句_SQL入门之多表查询

sql减法语句

表的运算

1、表的加法(UNION),表的减法(EXCEPT),表的交集(INTERSECT);

2、表运算的注意事项:作为运算对象的表的列数必须相同;类型必须相同;可以使用任何select子句,但是order by只能在最后一次使用;默认结果不包含重复行,但是如果想保留重复行需要在后面加入ALL关键字。

联结

简单来说,联结就是将其他表中的列添加过来。一般我们期望得到的数据都是分散在多张表的,使用联结就可以从多张表中获取数据了。

下面使用teacher表和course表来说明以下几种联结方式:

1、交叉联结,又叫笛卡尔积,意义不大,使用场景极为少见。

2、Left join(左联结)A left join B表示从A表中取出完整的表记录,然后再匹配B表,在B表找不到匹配项的记录,对应B表的字段会显示NULL;下面对course表和teacher表左联结:

  1. SELECT
  2. CS.教师号,
  3. CS.课程号,
  4. CS.课程名称,
  5. TC.教师姓名
  6. FROM
  7. course AS CS
  8. LEFT JOIN teacher AS TC ON CS.教师号 = TC.教师号;

0f2892bb37bb14803c404bb00a3ac314.png

3、Right join(右联结)A right join B表示从B表中取出完整的表记录,然后再匹配A表,在A表找不到匹配项的记录,对应A表的字段会显示NULL;下面对course表和teacher表右联结:

  1. SELECT
  2. CS.教师号,
  3. CS.课程号,
  4. CS.课程名称,
  5. TC.教师姓名
  6. FROM
  7. course AS CS
  8. RIGHT JOIN teacher AS TC ON CS.教师号 = TC.教师号;

ba2fc3cb25c6759bef5ebd48a5faa180.png

4、Inner join(内联结)A inner join B表示显示A表和B表共有的字段对应的记录。下面对course表和teacher表内联结:

  1. SELECT
  2. CS.教师号,
  3. CS.课程号,
  4. CS.课程名称,
  5. TC.教师姓名
  6. FROM
  7. course AS CS
  8. INNER JOIN teacher AS TC ON CS.教师号 = TC.教师号;

b5299536fa7af0a7d444400f9ebe04e7.png

5、Full join:MySQL不支持全联结,需要使用左右联结UNION构造。下面对course表和teacher表做全联结:

  1. (SELECT
  2. CS.教师号,
  3. CS.课程号,
  4. CS.课程名称,
  5. TC.教师姓名
  6. FROM
  7. course AS CS
  8. LEFT JOIN teacher AS TC ON CS.教师号 = TC.教师号)
  9. UNION
  10. (SELECT
  11. TC.教师号,
  12. CS.课程号,
  13. CS.课程名称,
  14. TC.教师姓名
  15. FROM
  16. course AS CS
  17. RIGHT JOIN teacher AS TC ON CS.教师号 = TC.教师号)

4553425db56b062d9071d412bd1117cf.png

6、一张图读懂sql联结

00b8a57f7c747e184c64224544927714.png

练习题

第一部分:sqlzoo练习题:https://sqlzoo.net/wiki/The_JOIN_operation/zh

练习整体比较简单,仅对踩过坑的几点在此说明:

第11题For every match involving 'POL', show the matchid, date and the number of goals scored.要求既要显示matchid又要显示date,我开始只是使用了matchid做group by的条件,这样会报错:‘a.mdate' isn't in GROUP BY,所以这个时候需要将a.mdate也要写入group by才能pass。重新复习下group by存在的时候select子句中只能使用group by中的列名称以及聚合函数。

  1. SELECT
  2. a.id,
  3. a.mdate,
  4. count(b.player)
  5. FROM
  6. game AS a
  7. INNER JOIN goal AS b ON a.id = b.matchid
  8. WHERE
  9. (team1 = 'POL' OR team2 = 'POL')
  10. GROUP BY
  11. a.id,
  12. a.mdate

第13题考察的是case语句,后续使用的多了,会单独写总结:

  1. SELECT
  2. a.mdate,
  3. a.team1,
  4. sum(
  5. CASE
  6. WHEN b.teamid = a.team1 THEN
  7. 1
  8. ELSE
  9. 0
  10. END
  11. ) AS score1,
  12. a.team2,
  13. sum(
  14. CASE
  15. WHEN b.teamid = a.team2 THEN
  16. 1
  17. ELSE
  18. 0
  19. END
  20. ) AS score2
  21. FROM
  22. game AS a
  23. LEFT JOIN goal AS b ON a.id = b.matchid
  24. GROUP BY
  25. a.id,
  26. a.mdate,
  27. a.team1,
  28. a.team2;

第二部分:针对student表,teacher表,score表和course表,做如下练习题:

  • 查询所有学生的学号、姓名、选课数、总成绩
  • 查询平均成绩大于85的所有学生的学号、姓名和平均成绩
  • 查询学生的选课情况:学号,姓名,课程号,课程名称
  • 查询出每门课程的及格人数和不及格
  • /*使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分数段人数,课程号和课程名称*/
  1. -- 查询所有学生的学号、姓名、选课数、总成绩,保存为视图,方便后续使用
  2. CREATE VIEW score_stu_view (
  3. 出生日期,
  4. 姓名,
  5. 学号,
  6. 性别,
  7. 成绩,
  8. 课程号
  9. ) AS SELECT
  10. stu.出生日期,
  11. stu.姓名,
  12. stu.学号,
  13. stu.性别,
  14. sc.成绩,
  15. sc.课程号
  16. FROM
  17. student AS stu
  18. INNER JOIN score AS sc ON stu.学号 = sc.学号;
  19. SELECT
  20. 学号,
  21. 姓名,
  22. COUNT(课程号) AS 选课数,
  23. SUM(成绩) AS 总成绩
  24. FROM
  25. score_stu_view
  26. GROUP BY
  27. 学号;
  28. -- 查询平均成绩大于85的所有学生的学号、姓名和平均成绩
  29. SELECT
  30. 学号,
  31. 姓名,
  32. AVG(成绩) AS 平均成绩
  33. FROM
  34. score_stu_view
  35. GROUP BY
  36. 学号
  37. HAVING
  38. 平均成绩 > 85;
  39. -- 查询学生的选课情况:学号,姓名,课程号,课程名称
  40. CREATE VIEW course_score_view(姓名,学号,成绩,课程号,课程名称) AS SELECT
  41. stu.姓名,
  42. stu.学号,
  43. sc.成绩,
  44. sc.课程号,cs.课程名称
  45. FROM
  46. student AS stu
  47. INNER JOIN score AS sc ON stu.学号 =sc.学号
  48. INNER JOIN course AS cs ON sc.课程号 =cs.课程号;
  49. -- 查询出每门课程的及格人数和不及格
  50. SELECT
  51. 课程号,
  52. sum(
  53. CASE
  54. WHEN 成绩 >= 60 THEN
  55. 1
  56. ELSE
  57. 0
  58. END
  59. ) AS 及格人数,
  60. sum(CASE WHEN 成绩 < 60 THEN 1 ELSE 0 END) AS 不及格人数
  61. FROM
  62. course_score_view
  63. GROUP BY
  64. 课程号;
  65. /*使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分数段人数,
  66. 课程号和课程名称*/
  67. SELECT
  68. 课程号,
  69. 课程名称,
  70. sum(
  71. CASE
  72. WHEN 成绩 > 85
  73. AND 成绩 <= 100 THEN
  74. 1
  75. ELSE
  76. 0
  77. END
  78. ) AS 一等,
  79. sum(
  80. CASE
  81. WHEN 成绩 > 70
  82. AND 成绩 <= 85 THEN
  83. 1
  84. ELSE
  85. 0
  86. END
  87. ) AS 二等,
  88. sum(
  89. CASE
  90. WHEN 成绩 >= 60
  91. AND 成绩 <= 70 THEN
  92. 1
  93. ELSE
  94. 0
  95. END
  96. ) AS 三等,
  97. sum(CASE WHEN 成绩 < 60 THEN 1 ELSE 0 END) AS 不及格
  98. FROM
  99. course_score_view
  100. GROUP BY
  101. 课程号;

备注:本文示例代码使用的表

108240cfd9043e35f54753dad5fdcef3.png
course表

60dc1750eff2197127281689812ec69c.png
teacher表

338cb2af7bdbbf8072ed3b6ddff7b9d1.png
score表

29b6685b1062b522f0a73be31af8afd8.png
student表
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/470853
推荐阅读
相关标签
  

闽ICP备14008679号