----start

这几个关键字有一个共同点,那就是它们一般应用于子查询中。大家对 IN 都比较熟悉,这里我们就不介绍了,下面我们看一看其他几个关键字的使用,首先,我们定义如下表:

--学生 CREATE TABLE STUDENT ( ID VARCHAR(8),---学号 NAME VARCHAR(20),---姓名 CLASS VARCHAR(20),---班级 CHINESE FLOAT,---语文成绩 MATH FLOAT---数学成绩 ); INSERT INTO STUDENT (ID, NAME, CLASS, CHINESE, MATH) VALUES ('20090001', '张三', '五年级A班', 80 ,90), ('20090002', '李四', '五年级A班', 60 ,75), ('20090003', '王五', '五年级A班', 90 ,95), ('20090004', '赵红', '五年级B班', 70 ,90), ('20090004', '李白', '五年级B班', 85 ,80), ('20090005', '王蓝', '五年级B班', NULL ,70);

假设现在让你查询一下,A班哪些学生的数学成绩高于B班数学成绩的最小值,怎么办?我们可以采用如下SQL:

SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND MATH > ( SELECT MIN(MATH) FROM STUDENT WHERE CLASS='五年级B班' );

除此之外,我们还可以使用SOME或ANY。注意:ANY和 SOME 的作用完全和使用方式完全相同,不知道制定SQL标准的人为什么要定义两个关键字。我们来看一下以上问题通过SOME或ANY怎么实现。如下SQL所示:

SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND MATH > ANY ( SELECT MATH FROM STUDENT WHERE CLASS='五年级B班' );

假设现在让你查询一下,A班哪些学生的数学成绩高于B班数学成绩的最大值,怎么办呢?我们可以采用如下SQL:

SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND MATH > ( SELECT MAX(MATH) FROM STUDENT WHERE CLASS='五年级B班' );

除此之外,我们还可以使用ALL,如下SQL所示:

SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND MATH > ALL ( SELECT MATH FROM STUDENT WHERE CLASS='五年级B班' );

至此,我们可以总结出SOME,ANY,ALL 和 MIN, MAX 的对应关系

> ANY(sub-qurey) --- > MIN(sub-qurey) < ANY(sub-query) --- < MAX(sub-qurey) > ALL(sub-query) --- > MAX(sub-qurey) < ALL(sub-query) --- < MIN(sub-qurey)

至此,你应该理解了SOME,ANY,ALL关键字的作用了吧。下面我们看一看EXISTS关键字的作用。EXISTS的作用比较简单,它只关注它后面的子查询返没返回值,而不在乎返回多少。如果返回,则整个表达式就为真,否则为假。NOT EXISTS关键字则和EXISTS作用相反。假设现在让你查询一下有没有数学成绩为100的学生,如果有,则将所有学生的数学成绩输出,如果没有,则什么都不输出,我们使用EXISTS实现,如下:

SELECT NAME,MATH FROM STUDENT WHERE EXISTS ( SELECT * FROM STUDENT WHERE MATH=100 );

至此,以上几个关键字的作用全部介绍给大家了,不知大家理解了没有。以上操作都针对数学成绩,如果你认为对语文成绩也执行类似的操作会得到类似的答案的话,那么你就错了。一切的原因都是因为NULL引起的。下面,我们来讨论NULL对各个关键字的影响。

---语句1 SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND CHINESE > ( SELECT MAX(CHINESE) FROM STUDENT WHERE CLASS='五年级B班' ); ---语句2 SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND CHINESE > ALL ( SELECT CHINESE FROM STUDENT WHERE CLASS='五年级B班' );

通常,我们认为语句1和语句2会返回同样的结果,然而上面两条语句返回的结果却令人吃惊,语句1返回王五,语句2则什么也没返回,为什么会出现这样的情况呢?MAX函数默认会忽略NULL值,所以语句1返回了王五。那么为什么语句2返回NULL呢?答案是我也不知道。哪位朋友知道的话请告诉我一下。不仅如此,下面两条语句也返回不同的结果:

---语句1 SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND CHINESE < ( SELECT MIN(CHINESE) FROM STUDENT WHERE CLASS='五年级B班' ); ---语句2 SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND CHINESE < ALL ( SELECT CHINESE FROM STUDENT WHERE CLASS='五年级B班' );

不仅如此,试一试下面的语句(子查询没有返回任何记录):

---语句1 SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND CHINESE < ( SELECT MIN(CHINESE) FROM STUDENT WHERE 1<>1 ); --语句2 SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND CHINESE < ALL ( SELECT CHINESE FROM STUDENT WHERE 1<>1 );

上面的几个例子提醒大家,使用ALL的时候应该特别注意,一不留神就会返回我们不期望的结果。

还有个关键字需要大家注意,那就是NOT IN,请看下面的例子:

SELECT NAME FROM STUDENT WHERE CLASS='五年级A班' AND CHINESE NOT IN ( 80,60,NULL );

如果你认为以上语句返回王五的话,那么,你就错了,虽然我们一般不会像上面那样主动写出NULL值,但是不能保证子查询也不会返回NULL值,所以在使用NOT NULL时也需要特别注意。

----更多参见:DB2 SQL 精萃

----声明:转载请注明出处。

----last updated on 2010.1.15

----written by ShangBo on 2009.11.23

----end

SOME,ANY,All,EXISTS,IN相关推荐

  1. MySQL基础知识-MySQL概述安装,单表增删改查,函数,约束,多表查询,事物

    MySQL基础知识-MySQL概述安装,单表增删改查,函数,约束,多表查询,事物 前言 1.MySQL概述 1.1数据库相关概念 1.2MySQL数据库 1.2.1版本 1.2.2下载 1.2.3安装 ...

  2. [SQL使用经验]选用 IN 还是 EXISTS,哪个性能更好

    一.EXISTS 并非总比IN 快,究竟应该选用 IN 还是 EXISTS ,可参考以下分析: 1.Select * from t1 where x in ( select y from t2 ) 相 ...

  3. Mysql Exists与in_在MySQL里,有个和in一样的东东叫做exists,但是它比in更牛叉,你会么?...

    我们在学习Yii2的时候,一定接触过这样的where输入 $query->where(["exists",xxxx]); User::find()->where([&q ...

  4. 浅析MySQL中exists,in ,=的使用

    exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录, ...

  5. file.exists(),file.isFile()和file.isDirectory()的区别

    file.exists(),file.isFile()和file.isDirectory()的区别 作为一个java小白(*__*) 嘻嘻,最近在学习File类的时候遇到了疑惑,分不清这三个方法,查询 ...

  6. Visual Studio 2017、2019 调试Docker无法启动,卡在vsdbg\vs2017u5 exists, deleting.

    一.问题描述 正在准备容器 ========== 正在准备 Docker 容器- C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe - ...

  7. sql语句里面最难的not exists,exists,口语化解释(个人笔记)

    文章目录 1.查询选修了所有课程的学生 2.查询至少选修了课程号为1,2的学生 3.思考一下where是如何筛选记录的 4.exists的返回的是boolean值 5.对查询选修了所有课程的学生的sq ...

  8. 多个字段的in 和 not in 及其替代写法(exists,not exists)

    首先声明:数据库高手请走开,您看了碍眼啊! 有些时候进行查询的时候啊,一个字段的in. not in根本不能满足要求,非常需要类似多个字段的in.not in,但是很多数据库不支持多个字段的in. n ...

  9. MySQL安装错误示范!!!(我是来展示我多无能的,bushi~The service already exists!The current server installed: D:\

    谨以此文开始我第一次计算机的记录之旅~~~ 昨天下午的这个时候我开始安装MySQL,然而看了文章之后,连接一直报错,咱也不敢说咱也不敢问.后来一直整到七点,依旧报错.遂--放弃!对!你没有看错.然后今 ...

  10. VirtualBox中出现UUID have already exists ,并且数字键盘numlock效果相反

    原文地址:https://www.cnblogs.com/xqzt/p/5053338.html 原因:由于linux密码登录错误,修改也报错误,所以只能重新安装虚拟机并在其中安装镜像文件,但是安装镜 ...

最新文章

  1. 基于 Bochs 的操作系统内核实现
  2. 【自动驾驶】相机标定 疑问总结
  3. c++ 管理员身份_CATIA的管理员模式和多版本环境变量设置
  4. 数组和集合的区别?你还知道这些吗?
  5. .NET Core IdentityServer4实战 第Ⅴ章-单点登录
  6. python 慕课网请编写一个fib函数_中国大学MOOC(慕课)Python编程基础章节测试答案...
  7. 十.jmeter性能测试基础实践(2)
  8. linux rpm安装简要说明
  9. 免费下载百度文库的几款在线工具推荐
  10. 台达b3伺服modbus通讯_台达ASDA-AB伺服与EVIEW触摸屏MODBUS通讯
  11. 两个实用型教学网站:菜鸟教程与W3School,估计是国内做得做好的了
  12. YUV422_UYVY图像格式转RGB565
  13. WinDirStat下载使用指南,处理电脑空间神器
  14. 通过console线登录交换机
  15. bp神经网络,多输入多输出,3层网络matlab程序
  16. cesium实现流入迁徙图(仿echarts)(着色器)(cesium篇.52)
  17. git 本地回退到某个版本
  18. office自动更新提示0xc0000142错误 解决办法
  19. 了解lammps中NVE/NVT/NPT三种系综的特性和区别
  20. ksweb如何安装php5.6_KSWEB PHP+MySQL环境搭建及应用

热门文章

  1. 艾美捷细胞低密度脂肪酸(LDL)摄取试剂盒的功能应用
  2. Linux文件命名数字开头,linux 文件名命名规则
  3. 基于单片机的车辆防碰撞及自动刹车系统(STC89C52RC芯片+超声波传感器HC-SR04+液晶屏1602+继电器+蜂鸣器)
  4. Navicat数据导出
  5. JavaScript 实例:当当网 购物车统计总价
  6. cocos2d-x塔防游戏教程(四)
  7. 力扣 991. 坏了的计算器
  8. oracle 输出全角空格,html中的空格符号( nbsp; ensp; emsp; )介绍以及中文对齐实现的方法详解...
  9. 开火车游戏c语言,大班游戏活动:开火车
  10. 远程连接BlueStacks模拟器调试