SQL堂上作业八(子查询的扩展)
删除重复记录
我们可以用一些有意思的子句来执行去重操作。
这是原先的表:
SNO SNAME ---------- ---------------------------------------- 20101 张盼 20102 李伟 20103 邱同 20105 xfz 20105 alpha
我们希望用一些命令进行去重。
方法一
我们可以用ROWID来进行
DELETE FROM student WHERE ROWID NOT IN (SELECT MIN(ROWID) FROM student GROUP BY sno );
这里的ROWID,个人理解是:每生成一行,SQL就会自动给行加一个行的ID,我们可以直接读取。
在SELECT子句中,通过GROUP BY,把所有sno相同的都化为一类,再用min选出一个sno相同的出来,再进行排除法,就可以删去。
输出如下:
已删除 1 行。
方法二
我们可以用传统的HAVING和COUNT实现
DELETE FROM student WHERE (sno) IN (SELECT sno FROM student GROUP BY sno HAVING COUNT(sno) > 1);
这里是对每一组中,相同的sno数量进行计数,如果大于1了,就将两个都删去,和方法一有一定的区别。
输出如下:
已删除2行。
找出选修了所有课程的同学的名字
我们有三个表:学生姓名——学号表,学生学号——课程表,课程表
我们通过一个三重套娃可以求解该问题
select Sname from student where Sno IN (select Sno from SC group by Sno having count(*) = (select count(*)from course ));
个人理解为:用(select count(*)from course )求出有多少门课
然后在SC表中,用学生ID对数据进行分组,将选课数量够的学生取出,构成一个子表。
然后,基于该子表取出的学生ID,在student中查询学生姓名。
输出如下:
SNAME ---------------------------------------- 邱同
查找学号为2011001的同学没有选修的科目
SELECT cname FROM course WHERE cno NOT IN (SELECT distinct cno FROM sc WHERE sno = 2011001);
输出如下:
CNAME ------------------------------------------------------------ 语言学 训诂学 计算机概论 数据库
输出最靠前的N个
我们可以用rownum来进行限制
Select rownum, department_id , a from (select department_id ,avg(salary) a from employees group by department_id order by avg(salary) desc ) where rownum <=3;
这里相当于是,先对表进行了排序,然后再选出表的前面若干项
输出如下:
ROWNUM DEPARTMENT_ID A ---------- ------------- ---------- 1 90 19333.3333 2 110 10150 3 20 9500
输出待遇最低的N个薪酬
select e.last_name, a.min_sal, e.department_id from (select department_id,min(salary) min_sal from employees group by department_id) a, employees e where a.min_sal=e.salary and a.department_id=e.department_id ;
输出如下:
LAST_NAME MIN_SAL DEPARTMENT_ID -------------------------------------------------- ---------- ------------- Kochhar 17000 90 De Haan 17000 90 Lorentz 4200 60 Popp 6900 70 Colmenares 2500 30 Olson 2100 50 Kumar 6100 80 Whalen 4400 10 Fay 6000 20 Mavris 6500 40 Gietz 8300 110 LAST_NAME MIN_SAL DEPARTMENT_ID -------------------------------------------------- ---------- ------------- Popp 6900 100 已选择12行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!