例题:

先来讲讲not in 和not exists的区别,再开始今天的例题(和in,exists相反)

not in内外表做笛卡尔积,然后按照条件查询,没有用到索引

not exists是对外表进行循环,每次循环再对内表进行查询,先查的外表的内容,不是子查询的内容,并且依然用到了表上的索引

两者最大的区别是:not in只能返回一个字段

如:

select week6s.SNO 一门课程没选的学生学号
from week6s
where week6s.SNO not in(
select week6sc.SNO
from week6sc
group by week6sc.SNO)
select week6s.SNO 一门课程都没选修的学生学号
from week6s
where  not exists(
select *
from week6sc
where week6s.SNO=week6sc.SNO
)

not in能表示的not exists也能表示(其实所有带in,比较运算符,any,all的子查询都能用exists表示),并且注意观察,两者引用的方式也不同

where week6sc.SNO not in()

where not exists()

返回的结果是:

再着重讲一下两者的引用过程

not in相当于笛卡尔积的运算过程,找到符合not in前的一个字段的条件,不能是name,id not in

exists子查询的返回结果只返回真值或假值,所以给出列明没有实际的意义

对于exists,内层循环结果非空,外层where返回真值

对于not exists,内层循环结果非空,外层where返回假值

select *
from week6sc
where week6s.SNO=week6sc.SNO

内层循环返回结果非空,所以not exists 为false,这里的记录在exists会被记录下来

补充:‘=’和‘in’

当确切知道内层循环返回单值时,可用比较运算符(‘>’'<''=''!=')

select sno,sname,sdept
from student
where(select sdept from student where sname='刘')=sdept

在sql server中这条语句不会报错,但是sql标准要求子查询一定要跟在比较符之后,所以这条语句是错的。

1)检索至少选修一门课程的学生学号
select week6s.SNO 至少选修一门课程的学生学号
from week6s,week6sc
group by week6s.SNO,week6sc.SNO
having week6s.SNO=week6sc.SNO

2)检索一门课程都没选修的学生学号

select week6s.SNO 一门课程没选的学生学号
from week6s
where week6s.SNO not in(
select week6sc.SNO
from week6sc
group by week6sc.SNO)

3)检索至少选修两门课程的学生学号
select week6sc.SNO 至少选修两门课程的学生学号
from week6sc
group by week6sc.SNO
having count(week6sc.SNO)>1

这里也可以检索所有选了课的学生-选了小于两门课的学生,思路相同只是写起来比较繁琐

4)检索恰好选修一门课程的学生学号
select week6sc.SNO 选修了一门课程的学生学号
from week6s,week6sc
group by week6s.SNO,week6sc.SNO
having week6s.SNO=week6sc.SNO
and week6sc.SNO not in(
select week6sc.SNO
from week6sc
group by week6sc.SNO
having count(week6sc.SNO)>1
)

5)检索至少选修三门课程的学生学号

select week6sc.SNO 至少选修三门课程的学生学号
from week6sc
group by week6sc.SNO
having count(week6sc.SNO)>2

6)检索全部课程都选的学生学号(不存在一门课,成绩表中找不到他这门课的成绩记录)
select week6s.SNO 选修了全部课程的学生学号
from week6s
where not exists(select * from week6cwhere not exists(select * from week6scwhere week6c.CNO=week6sc.CNOand week6sc.SNO=week6s.SNO)
)

7)检索选了S2所选全部课程的学生学号(同理,不存在一门课S2选了,而学生x没选)
select distinct sc1.SNO 选了S2所选的全部课程的学生学号
from week6sc sc1
where not exists(select * from week6sc sc2where sc2.SNO='S2'and not exists(select *from week6sc sc3where sc3.SNO=sc1.SNOand sc3.CNO=sc2.CNO)
)

 法2:

select distinct SNO
from week6sc
where CNO>=all(select CNOfrom week6scwhere SNO='s2'
)

数据库sql语句(经典)相关推荐

  1. sqlserver sql语句|经典sql语句|实用sql语句

    sqlserver sql语句|经典sql语句|实用sql语句 一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop databa ...

  2. SQL语句经典50题

    Sql语句经典50题 注:数据库版本为mysql 8.0 #学生表 CREATE TABLE `Student`( `s_id` VARCHAR(20), `s_name` VARCHAR(20) N ...

  3. oracle数据库----SQL语句的实践(应用实例)

    oracle数据库----SQL语句的实践(应用实例) 创建表工资表salary,包括员工号emp_id,员工名emp_name,员工月基本工资monthsal,员工月总发工资totalsal. cr ...

  4. MySQL删除s表命令_SQLServer数据库sql语句中----删除表数据drop、truncate和delete的用法...

    本文主要向大家介绍了SQLServer数据库sql语句中----删除表数据drop.truncate和delete的用法,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助. 虽 ...

  5. 建立学生选课表 mysql 语句_学生选课数据库SQL语句45道练习题整理及mysql常用函数(20161019)...

    学生选课数据库SQL语句45道练习题: 一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四 ...

  6. mysql sql exists_数据库sql语句的exists总结

    数据库sql语句的exists总结 sql exists in 学习 先来比较下语法: --deals=交易表,areas=地域表,例如香港:我们的目的:查看有交易的地域 select * from ...

  7. 计算机导论sql试题,数据库SQL语句练习题

    一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...

  8. 数据库三级考mysql还是sqlse_计算机三级考试数据库SQL语句整理

    计算机三级考试数据库SQL语句整理 本文是关于计算机三级考试数据库SQL语句整理,包括创建数据库.删除数据库.备份sql server.创建新表等,供同学们参考学习!想了解更多相关信息请持续关注我们应 ...

  9. 数据库SQL语句课堂总结(2)——子查询

    废话引言 我有一个梦想,有一天能跟上单大师敲sql的速度QAQ 本文数据库同数据库SQL语句课堂总结(1) 主要介绍子查询的相关语句 正文开始 子查询介绍 定义: 子查询允许把一个查询嵌套在另一个查询 ...

  10. mysql查询选课程的学生学号和姓名_数据库SQL语句中查询选修了全部课程的学生的学号和姓名理解...

    首先头脑中有三点概念: 1.EXISTS子查询找到的提交 NOTEXISTS子查询中找不到的提交 说明:不要去翻译为存在和不存在,把脑袋搞晕. 2.建立程序循环的概念,这是一个动态的查询过程.如FOR ...

最新文章

  1. JMC | 药物发现中的迁移学习
  2. 有什么事是你当了程序员才知道的? | 每日趣闻
  3. 阿里对象存储OSS在laravel框架中的使用
  4. TRIE - Data Structure
  5. Hibernate 一级缓存,二级缓存,查询缓存
  6. 七种分布式全局 ID 生成策略,你更爱哪种?
  7. typescript 判断异步执行已经结束_vue进阶系列——用typescript玩转vue和vuex
  8. OpenAI挑战DOTA 2世界冠军OG,这是赌上人类尊严的决战
  9. 机器人模仿人类动作一学就会,还能举一反三了 | 论文
  10. Linux 系统批量安装字体的方法
  11. 使用自己的服务器中转远程桌面
  12. 1.2 编程语言选择 | 排行榜、对比、现状,java c++语言对比,哪个工资高、难度更高,mysql数据库对比,java入门怎么学
  13. 桌面的快捷方式图标异常
  14. c语言 中文转拼音,汉字转换拼音解决思路
  15. Java下载excel模板
  16. Unity项目总结(已完成17项,持续更新ing,含商城、塔防、背包、动画、坦克大战等)
  17. Java数据结构:有序优先队列
  18. MATLAB处理数据,掌握这几个小技巧就够了
  19. 使用Django开发一个简易的留言板
  20. 来到公司一星期的感受

热门文章

  1. 微型计算机转移指令,川大《微机原理与应用(1)1351》14秋在线作业1答案
  2. c++ 四元数转欧拉角
  3. matlab样本序列的时域波形,基于MATLAB的简易声音信号频谱分析仪设计
  4. PIC10F200单片机编程总结-0
  5. Photoshop 2020最新版免费下载教程
  6. “神秘的”0day漏洞
  7. echart中国地图
  8. 牛逼!用 AI 实现 C++、Java、Python 代码互译!
  9. 我YY的一个移动应用运营模式
  10. vue3—elementPlus如何单独修改页面中的下拉框样式