IN-子查询
为什么需要子查询?
现实中,很多情况需要进行以下条件的判断
集合成员资格
某一元素是否是某一个集合的成员
集合之间的比较
某一个集合是否包含另一个集合
集合基数的测试
测试集合是否为空
测试集合是否存在重复元素
子查询定义
出现在 Where 子句中的 Select 语句被称为子查询(subquery),子查询返回了一个集合,可以通过与这个集合的比较来确定另一个查询集合。
基本语法
表达式 [not] in (子查询)
- 语法中,表达式最简单的形式就是列名或者常数
- 语义:判断某一表达式的值是否在子查询的结果中
例1
在一张表中查询tom、david同学的信息
+----------------+
| name |
+----------------+
| tom |
| david |
| lily |
| jony |
+----------------+
如果没有子查询,我们会这么写
mysql>select * from test where name='tom' or name ='david';
+----------------+
| name |
+----------------+
| tom |
| david |
+----------------+
使用子查询,我们可以这么写.此处直接使用了某一子查询的结果集合(该集合是已知的固定的)
mysql>select * from test where name in ("tom","david");
+----------------+
| name |
+----------------+
| tom |
| david |
+----------------+
例2
欲查询即学过课程001 又学过课程002的同学
+----------------+------------------+
| name | course |
+----------------+------------------+
| tom | 001 |
| tom | 002 |
| david | 001 |
+----------------+------------------+
如果没有子查询,可能会这么写
select t1.name
from test as t1, test as t2
where t1.name = t2.name
and t1.course='001'
and t2.course='002'
+----------------+
| name |
+----------------+
| tom |
+----------------+
实际上是表对自身做了笛卡儿积
+----------------+------------------+----------------+------------------+
| name | course | name | course |
+----------------+------------------+----------------+------------------+
| tom | 001 | tom | 001 |
| tom | 002 | tom | 001 |
| david | 001 | tom | 001 |
| tom | 001 | tom | 002 |
| tom | 002 | tom | 002 |
| david | 001 | tom | 002 |
| tom | 001 | david | 001 |
| tom | 002 | david | 001 |
| david | 001 | david | 001 |
+----------------+------------------+----------------+------------------+
然后再进行了挑选。
使用子查询改写
select name
from test
where course = '001'
and name in
(
select name
from test
where course = '002'
)
查询结果
+----------------+
| name |
+----------------+
| tom |
+----------------+
这里的逻辑是:从选修了002课程的学生中再选出选修了001课程的同学,思路更加清晰。
IN-子查询的更多相关文章
- 深入理解MySql子查询IN的执行和优化
IN为什么慢? 在应用程序中使用子查询后,SQL语句的查询性能变得非常糟糕.例如: SELECT driver_id FROM driver where driver_id in (SELECT dr ...
- Mysql - 性能优化之子查询
记得在做项目的时候, 听到过一句话, 尽量不要使用子查询, 那么这一篇就来看一下, 这句话是否是正确的. 那在这之前, 需要介绍一些概念性东西和mysql对语句的大致处理. 当Mysql Server ...
- 在SQL Server中为什么不建议使用Not In子查询
在SQL Server中,子查询可以分为相关子查询和无关子查询,对于无关子查询来说,Not In子句比较常见,但Not In潜在会带来下面两种问题: 结果不准确 查询性能低下 下面 ...
- 读书笔记--SQL必知必会11--使用子查询
11.1 子查询 查询(query),任何SQL语句都是查询.但此术语一般指SELECT语句. SQL还允许创建子查询(subquery),即嵌套在其他查询中的查询. 作为子查询的SELECT语句只能 ...
- 你真的会玩SQL吗?无处不在的子查询
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等)
Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等) 子查询 描述:查询订单数超过5的顾客信息 查询句法: var 子查询 = from c i ...
- 当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式。
当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式.比如 select * from T_Employee where FNumber not in ( select top 5* ...
- Oracle学习笔记五 SQL命令(三):Group by、排序、连接查询、子查询、分页
GROUP BY和HAVING子句 GROUP BY子句 用于将信息划分为更小的组每一组行返回针对该组的单个结果 --统计每个部门的人数: Select count(*) from emp group ...
- [转]HQL中的子查询
原文地址:http://blog.csdn.net/xb12369/article/details/8638683 子查询: 子查询是SQL语句中非常重要的功能特性,它可以在SQL语句中利用另外一 ...
- MySQL 子查询与连接操作笔记
SQL语句之间是可以进行连接操作的,在一些复杂的数据操作中必须用到连接操作.简单的说就是一个SQL语句的结果可以作为相连接的SQL操作的一部分.SQL结构化查询语句,子查询是指的所有的SQL操作,并非 ...
随机推荐
- Use of Recv-Q and Send-Q
From my man page: Recv-Q Established: The count of bytes not copied by the user program connected to ...
- 浅析foreach语句
本篇是我对于foreach语句(增强for)的总结: 我的总结流程如下: 1.先整体说明增强for遍历集合与数组之间的区别. 2.通过一维数组来说明(给出反编译的源码,形成对照). 3.通过二维数组来 ...
- 014_浅说 XSS和CSRF
在 Web 安全领域中,XSS 和 CSRF 是最常见的攻击方式.本文将会简单介绍 XSS 和 CSRF 的攻防问题. 声明:本文的示例仅用于演示相关的攻击原理 XSS XSS,即 Cross Sit ...
- UITouch - BNR
本节任务:创建一个视图,让用户在视图上拖动手指来画线. UIView类能够重载4个方法来处理不同的触摸事件. - (void)touchesBegan:(NSSet *)touches withEve ...
- 解决 AttributeError: 'ForeignKey' object has no attribute 're'
解决办法 # print('rel...',filter_field_obj.re.to.objects.all()) print("rel...", filter_field_o ...
- C# GDI+绘制一维条码打印模糊的解决办法
最近遇到使用zxing生成的一维条码打印出来的条码图形很模糊根本识别不了.其实原因只有一句话: bitmap没有直接使用PrintDocument的Graphics画布进行绘制,而是中间处理了一下外部 ...
- flask(一)之路由和视图
01-介绍 Flask 是一个 Python 实现的 Web 开发微框架,同时具有很强的扩展能力. 02-第一个flask程序 # 初始化 from flask import Flask, url_f ...
- 判断语句之if..else if...else
判断语句之if..else if...else if语句第三种格式:if..else if...else 格式: 执行流程 首先判断关系表达式1看其结果是true还是false 如果是true就执行语 ...
- 想要开发自己的PHP框架需要那些知识储备?
作者:安正超链接:https://www.zhihu.com/question/26635323/answer/33812516来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- mybatis 使用事务处理
mybatis默认开启事务 以前使用JDBC的时候,如果要开启事务,我们需要调用conn.setAutoCommit(false)方法来关闭自动提交,之后才能进行事务操作,否则每一次对数据库的操作都会 ...