zoukankan      html  css  js  c++  java
  • Mysql常用sql语句(19)- in / exists 子查询

    测试必备的Mysql常用sql语句系列

    https://www.cnblogs.com/poloyy/category/1683347.html

    前言

    • 子查询在我们查询方法中是比较常用的,通过子查询可以实现多表查询
    • 子查询是指:将一个查询语句嵌套在另一个查询语句中
    • 子查询可以在select、update、delete语句中使用,还可以进行多层嵌套

    子查询的语法格式

    WHERE <表达式> <操作符> (子查询)

    语法格式说明

    • 操作符可以是比较运算符、in、not in、exists、not exists
    • not 当然就是取反啦

    in 和 exists的一个比较

    in exists
    当表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回 FALSE; 用于判断子查询的结果集是否为空,若子查询的结果集不为空,返回 TRUE,否则返回 FALSE;
    适合外表大而内表小的情况 适合内表大而外表小的情况

    无论哪个表大,用 not exists 都比 not in 速度快

    1、A是表达式,B是子查询结果集

    2、若A在B里面,则返回True

    方便理解,画个图

     

    先看看dept、emp表有什么数据

    dept表

    emp表

    比较运算符的栗子

    查询部门销售部的员工信息

    select * from emp where dept_id = (select id from dept where name = "销售部")

    查询部门不是销售部的员工信息

    select * from emp where dept_id <> (select id from dept where name = "销售部")

    in 的栗子

    SQL分析

    • 从 dept 表查询部门名字为销售部or财务部的部门 id
    • 然后从 emp 表查询 depte_id 在上面 id 结果集的记录
    select * from emp where dept_id in (select id from dept where name = "财务部" or name ="销售部")

     可以看看子查询 sql 的查询结果

    select id from dept where name = "财务部" or name ="销售部"

    最终的 sql 其实是这样的

    select * from emp where dept_id in (1,3)

    not in 的栗子

    select * from emp where dept_id not in (select id from dept where name = "财务部" or name ="销售部")

     其实就是上面栗子结果集的取反

    exists 栗子

    SQL分析

    • 从 dept 表中查询 id = 1 的记录,若有,exists 表达式则返回True
    • 外层查询语句接收到 True 之后,对 emp 表进行查询,返回所有记录
    select * from emp where exists(select * from dept where id = 1)

    可以看看 exists 表达式里的子查询结果集

    select * from dept where id = 1

    可以看到,查询结果集不为空,所以 exists() 返回 true

    最终的 sql 其实是这样的

    select * from emp where true

    exists + 其他查询条件的栗子

    select * from emp where exists (select * from dept where id = 1) and dept_id = 2

    知识点

    • 子查询的功能其实通过表连接(join)也可以完成
    • 一般来说,表连接(内连接、外连接等)都可以用子查询查询,但反过来却不一定,有的子查询不能用表连接来替换
    • 子查询比较灵活,适合作为查询的筛选条件
    •  表连接更适合查看连接表之后的数据集
  • 相关阅读:
    【转载】CentOS 6.3(x86_64)下安装Oracle 10g R2 天高地厚
    Oracle查看表空间和删除表空间 天高地厚
    获取android手机的定位信息(转)
    android里pull解析xml文件
    google map 开发去掉图片阴影
    ubuntu12.04配置android开发环境遇到的问题
    google code中下载你的项目源码
    android无法自动生成R文件
    android中ocr解决方案(tesseract)
    自定义Android标题栏TitleBar布局(转)
  • 原文地址:https://www.cnblogs.com/poloyy/p/12885443.html
Copyright © 2011-2022 走看看