练习一、创建每科课程的平均成绩视图
视图优点:
- 频繁使用的SQL语句可以保存在视图中,特别是在进行汇总以及特别的查询条件导致SQL查询语句特别庞大时候。
- 视图里的数据可以跟随原表的变化自动更新。
- 视图不保存数据,节约设备空间
视图注意事项:
- 不要再视图中再创建视图,这样会降低SQL效率
- 视图中不能使用ORDER BY
- 不能往视图插入数据
练习二、子查询
1.子查询在FROM子句
2.子查询在WHERE子句中(结合in,any,all)
查找每个课程里成绩最高的学生学号、课程号和成绩
查找哪些学生成绩比课程0002全部成绩的任意一个都高
查找成绩大于所有的课程平均成绩的学生学号和成绩
子查询注意事项:
- 子查询结果不能进行运算,如不能使用a > 3*all(b),可以用a/3 > all(b)
- 随着子查询嵌套层数的增加, SQL 语句会变得越来越难读懂,尽量避免使用多层嵌套的子查询
- 子查询的AS和别名在WHERE子句中可以省略
练习三、标量子查询
标量子查询注意事项:
- 标量子查询和上面的子查询区别是:标量子查询结果返回唯一值;不仅可以使用IN、ANY、ALL也可以直接与运算符结合使用
- 标量子查询绝对不能返回多行数据,否则就是普通的子查询
练习四、关联子查询
查找每个课程中大于对应课程平均成绩的学生
关联子查询注意事项:
- 关联条件一定要写在子查询里面,子查询内部设定的关联名称,只能在该子查询内部使用。
练习五、如何用SQL解决业务问题-哪些学生的成绩比课程0002全部成绩的任意一个高呢?
1)把问题翻译成自己理解的话:第1步,查找课程0002的全部成绩;第2步,某个学生成绩大于任意一个第1步骤的成绩
2)分析思路:
子查询:
- SELECT:查询结果【成绩】
- FROM :从哪张表查找数据【成绩表:score】
- WHERE:查询条件【课程号是0002】
- GROUP BY:分组【没有】
- HAVING:对分组结果指定条件【没有】
- ORDER BY 对结果排序【没有】
- LIMIT从查询结果中取出指定行【没有】
外查询:
- SELECT:学号,成绩
- FROM :score
- WHERE:成绩 > ANY(子查询)
3)写SQL语句
SELECT 学号,成绩 FROM score WHRER 成绩 > ANY (SELECT 成绩 FROM score WHERE 课程号='0002');
练习六、SQLZOO
4. Which country has a population that is more than Canada but less than Poland? Show the name and the population.
方法一、采用> <符号
方法一、采用BETWEEN AND
5. Show the name and the population of each country in Europe. Show the population as a percentage of the population of Germany.
注释:采用ROUND函使计算结果四舍五入,采用CONCAT函数,使数据和%相连接。
7. Find the largest country (by area) in each continent, show the continent, the name and the area
注释:用到关联子查询,注意除去NULL值
8. List each continent and the name of the country that comes first alphabetically
注释:查找每个洲的第一个国家名字,按照名字排序,则第一个国家名字最小
10. Some countries have populations more than three times that of any of their neighbours (in the same continent). Give the countries and continents.
注释:查找一个洲内国家是其他国家人口3倍的国家和洲。这里要限制两个关联,洲相同而国家不相同。
学习笔记:
- 当要经常使用某个SQL语句时,可以使用视图
- 当不经常使用SQL语句,可以使用子查询
- 当需要返回单一值时,可以使用标量子查询
- 当需要在每个组内进行比较时候,可以使用关联子查询
5.常用函数: