1.简单查询
练习一:查询姓猴的学生名单
![0349a58917059a5d94f6504e1f55d7fb.png](https://i-blog.csdnimg.cn/blog_migrate/a3c7f639790f7da667ec3c6141134cdc.png)
练习二:查询姓名中最后一个字是猴的学生名单
![6a9f5db00589be7694d41323da138a8e.png](https://i-blog.csdnimg.cn/blog_migrate/38a690e8ae39268ddc27f0f970e11d48.png)
练习三:查询姓名中带猴的学生名单
![8081c24d69244e2dc7cfbbc2911246a3.png](https://i-blog.csdnimg.cn/blog_migrate/7f92b6643a6fa93f1687b0e83d8c7925.png)
练习四:查询姓孟老师的个数
![6d640b092c698be7c595a453a1d44ca3.png](https://i-blog.csdnimg.cn/blog_migrate/07978940664ec7311e188cf80784635e.png)
2.汇总分析
练习五:查询课程编号为‘0002’的总成绩
![079e5efbbf22f765d13951443b1d19d6.png](https://i-blog.csdnimg.cn/blog_migrate/c2b845d3350832a2c2bba3efcf46e1df.png)
练习六:查询选了课程的学生人数
![d6184aa308624458efc59e90a56798ca.png](https://i-blog.csdnimg.cn/blog_migrate/06375d60305f581eb99bc3fe85fe1b0a.png)
练习七:查询各科成绩最高和最低的分
![5e749a78ecdadb52b6f38cf018d539f5.png](https://i-blog.csdnimg.cn/blog_migrate/2af590f9e00eecdff54f9e73ff80544f.jpeg)
练习八:查询每门课程被选修的学生人数
![4e0fd43f9ad5c3944b36488dcf077d6b.png](https://i-blog.csdnimg.cn/blog_migrate/b1fba8ef2ee19b5ca6cc1893a33cdbaa.jpeg)
练习九:查询男生女生人数
![7d71fc1ea86b17efc78b981bd90f01c5.png](https://i-blog.csdnimg.cn/blog_migrate/17e788b113db494bf631fa1e6c180ab4.png)
练习十:查询平均成绩大于60分学生的学号和平均成绩
![04df44f12533289600806df6298b4974.png](https://i-blog.csdnimg.cn/blog_migrate/a27928fdd13a4d70b6b5a3397a24878f.png)
练习十一:查询至少选修两门课程的学生学号
![ee8b233abf1c9875764b5c788bf8bf84.png](https://i-blog.csdnimg.cn/blog_migrate/786e37ea4e77ff23b926d48cd0fcd8fc.png)
练习十二:查询同名同姓学生名单并统计同名人数
![62e7ce5ac8bb4121c4eea6c3f189be6b.png](https://i-blog.csdnimg.cn/blog_migrate/21ea41ccf0458debda4506143581fc44.png)
练习十三:查询不及格的课程并按照课程号从大到小排列
![910b76c0e72fa4e9c6cf4a920522f937.png](https://i-blog.csdnimg.cn/blog_migrate/f73cc0c57d94c2c2f1f4ef87275bc670.png)
练习十四:查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列
![fe212a65a0757505f2192fc92af407d6.png](https://i-blog.csdnimg.cn/blog_migrate/bd190058d978bdc2ed9a4caa31c1c7ad.jpeg)
练习十五:检索课程编号为“0004”且分数小于60的学生学号,结果按按分数降序排列
![3c3e510b8853029891ec9e3efad38cc3.png](https://i-blog.csdnimg.cn/blog_migrate/40e27633d72ac99fd94cf996102bd5d7.png)
练习十六:统计每门课程的学生选修人数(超过2人的课程才统计),要求输出课程号和选修人数,查询结果按人数降序排序,若人数相同,按课程号升序排序
![854c5319ad6d81b1ccad5266728d8019.png](https://i-blog.csdnimg.cn/blog_migrate/3fce624996e6169ca34f315ba5b98060.jpeg)
练习十七:查询两门以上不及格课程的同学的学号及其平均成绩
![f1f36387329de13641d275bff207090c.png](https://i-blog.csdnimg.cn/blog_migrate/fc9db26f18bd297efd6f296dfe55d57f.png)
三.复杂查询
练习十八:查询所有课程成绩小于60分学生的学号、姓名
思路:1.查询所有学生的学号,姓名。2.条件是:所有课程的成绩小于60
![4e29855d0d8daa1229b0a7c083a129cf.png](https://i-blog.csdnimg.cn/blog_migrate/344438276ec6cfb107a244e487e799c3.png)
练习十九:查询没有学全所有课的学生的学号、姓名
![e5d15e10d274da8188064bf0bc12fce8.png](https://i-blog.csdnimg.cn/blog_migrate/922683f1dc745714dda39e97972b9e32.png)
练习二十:查询出只选修了两门课程的全部学生的学号和姓名
![491720ebf83e984a6e3a55c3bd96c809.png](https://i-blog.csdnimg.cn/blog_migrate/e31d1471222a0aaffed8e4147540772e.png)
练习二十一:1990年出生的学生名单
![431dd1026ce4b62f86a295cb30591413.png](https://i-blog.csdnimg.cn/blog_migrate/47fa35cf05096092fce1e204525fdd25.png)
![732a17ed96a60ba40fe719bc902878f2.png](https://i-blog.csdnimg.cn/blog_migrate/087bc3bc6d07957f0a4b232fb75fbf24.jpeg)
面试题补充:
![2e7c45b30dc94e349ed833b4cd58ea1c.png](https://i-blog.csdnimg.cn/blog_migrate/53bde574c686c59443c87b8936a8c2dd.jpeg)
练习二十二:分组取每组最大值,按课程号分组取求成绩最大值所在行的数据
![43dd0acd48ae7284dda4e0b15a7cd1c9.png](https://i-blog.csdnimg.cn/blog_migrate/b44078fa1688ca4749e76fcc4388d599.png)
练习二十三:按课程号分组取成绩最小值所在行的数据
![905e9b56cd9d49da94047616798da7c3.png](https://i-blog.csdnimg.cn/blog_migrate/c62ecdb344d1ab93d6e93541bf3a077d.png)
案例:练习二十四:查询各科成绩前两名的记录(topN系列问题)
第1步,先查出有哪些组,按课程号分组。
查询有哪些课程号。
![35bb943bddf00179ed72f5a6182b1768.png](https://i-blog.csdnimg.cn/blog_migrate/2b93d0848616eac1f1f3f16504b0f144.png)
(分别求出各个组的前两名)求课程号'0001' 这一组里成绩前2名。
![4a5d4fc5172c1a1124703f9a59ca065b.png](https://i-blog.csdnimg.cn/blog_migrate/f066b93352a200ef8496b5af1fe4d1e1.png)
写出其他组的(其他课程号)取出成绩前2名的sql
![978431749f484e123f2514ec7698ac34.png](https://i-blog.csdnimg.cn/blog_migrate/0848e3c8e249f82f350c3a873ed1ed74.png)
![2c8af2c20396cc915f14d76f0d280fba.png](https://i-blog.csdnimg.cn/blog_migrate/b515b43777f26b2ac28718af882fd8bb.png)
使用union all 将每组选出的数据合并到一起,UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值。UNION 操作符用于合并两个或多个 SELECT 语句的结果集。默认地,UNION 操作符选取不同的值。如果允许重复的值,使用 UNION ALL。请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同
(SELECT *
from score
WHERE 课程号='0001'
ORDER BY 成绩 DESC
LIMIT 2)
UNION ALL
(SELECT *
FROM score
WHERE 课程号='0002'
ORDER BY 成绩 DESC
LIMIT 2)
UNION ALL
(SELECT *
FROM score
WHERE 课程号='0003'
ORDER BY 成绩 DESC
limit 2)
![88640269809e295e13acefabbe637f2d.png](https://i-blog.csdnimg.cn/blog_migrate/1d9e680e968e8ce445be6f4f6d90de6b.jpeg)
MySQL中的UNION
UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如
select * from gc_dfys unionselect * from ls_jg_dfys
这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。
使用Union,则所有返回的行都是唯一的,如同对整个结果集合使用了DISTINCT。
MySQL中的UNION ALL
UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL,如下:
select * from gc_dfys union all select * from ls_jg_dfys
如果使用ORDER BY或LIMIT子句来对全部UNION结果进行分类或限制,则应对单个地SELECT语句加圆括号,并把ORDER BY或LIMIT放到最后一个的后面
例如
(SELECT a FROM tbl_name WHERE a=10 AND B=1)
UNION
(SELECT a FROM tbl_name WHERE a=11 AND B=2)
ORDER BY a LIMIT 10;
四.多表查询
练习二十五:查询所有学生的学号、姓名、选课数、总成绩
![505bf571661674c828a63e3bcd93e33b.png](https://i-blog.csdnimg.cn/blog_migrate/1af13dfcbd04e5defad98036744cccc3.jpeg)
练习二十六:查询平均成绩大于85的所有学生的学号、姓名和平均成绩
![48247677123423a88a095dba2080f387.png](https://i-blog.csdnimg.cn/blog_migrate/54ea4e7d9fbd708184f2bc14917a4dca.jpeg)
练习二十七:查询学生的选课情况:学号,姓名,课程号,课程名称
![15d489f939d4dd94f799cbcb7ffabaa7.png](https://i-blog.csdnimg.cn/blog_migrate/2fdd98144314a40658e2e04e821ef829.jpeg)
-- 考察case表达式
练习二十八:查询出每门课程的及格人数和不及格人数
![5d14f088618751cac023958dea660a1e.png](https://i-blog.csdnimg.cn/blog_migrate/c60817879eda43672aa0bb4f74be1044.jpeg)
练习二十九:使用分段[100-85],[85-70],[70-60],[‹60]来统计各科成绩,分别统计:各分数段人数,课程号和课程名称
![97b02fa1e355328156f044d4f39a787f.png](https://i-blog.csdnimg.cn/blog_migrate/79eb10f5938ed488bbc374297726afbd.jpeg)
练习三十:查询课程编号为0003且课程成绩在80分以上的学生的学号和姓名
![401ff8a0484a3cb1671553eabf459b8d.png](https://i-blog.csdnimg.cn/blog_migrate/34ea4d6baff482351c35391cd482230f.png)
练习三十一:面试题:行列如何互换的问题
下面是学生的成绩表(表名score,列名:学号、课程号、成绩)
![1fd145d2a3a850b9f8a7f22a1fd15840.png](https://i-blog.csdnimg.cn/blog_migrate/b50a252669acc03113090a681f049a07.png)
使用sql实现将该表行转列为下面的表结构
![aeeb24f13ad44c97c8ac85126ff51c56.png](https://i-blog.csdnimg.cn/blog_migrate/3b0648177a4728b0a96535c8acbda488.png)
第1步,使用常量列输出目标表的结构
![6442a36d8f970f2fa03a47f90b1274fb.png](https://i-blog.csdnimg.cn/blog_migrate/c58b3a6a81f64fff6aa457629d57e655.jpeg)
第2步,使用case表达式,替换常量列为对应的成绩/分组,并使用最大值函数max取出上图每个方块里的最大值
![682820d39e8d6787ce194d9c438387f8.png](https://i-blog.csdnimg.cn/blog_migrate/67bce9676d1f96259a66f0cfc52a1ffb.jpeg)
课上练习题共三十一道,结束。