MySQL - exists与in的用法

【1】exists

对外表用loop逐条查询,每次查询都会查看exists的条件语句。

当 exists里的条件语句能够返回记录行时(无论记录行是多少,只要能返回),条件就为真 , 返回当前loop到的这条记录。反之如果exists里的条件语句不能返回记录行,条件为假,则当前loop到的这条记录被丢弃。

exists的条件就像一个boolean条件,当能返回结果集则为1,不能返回结果集则为 0。

语法格式如下:

select * from tables_name where [not] exists(select..);
  • 1

示例如下:

select * from p_user_2 where  EXISTS(select * from p_user where id=12)
  • 1

如果p_user表中有id为12的记录,那么将返回所有p_user_2表中的记录;否则,返回记录为空。

如果是not exists,则与上述相反。

总的来说,如果A表有n条记录,那么exists查询就是将这n条记录逐条取出,然后判断n遍exists条件


【2】in

语法格式如下:

select * from A where column in (select column from B);
  • 1

需要说明的是,where中,column为A的某一列,in 所对应的子查询语句返回为一列多行结果集。

注意,in所对应的select语句返回的结果一定是一列!可以为多行。

示例如下:

select * from p_user_2 where id [not] in (select id from p_user )
  • 1

查询id在p_user表id集合的p_user_2的记录。not in则相反。


【3】exists与in的关系

经过sql改变,二者是可以达到同一个目标的:

select * from p_user_2 where id [not] in (select id from p_user );

select * from p_user_2 where [not] EXISTS (select id from p_user where id = p_user_2.id )
  • 1
  • 2
  • 3

那么什么时候用exists 或者in呢?

如果查询的两个表大小相当,那么用in和exists差别不大。 
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:

例如:表A(小表),表B(大表)

① 子查询表为表B:

select * from A where cc in (select cc from B) 效率低,用到了A表上cc列的索引;

select * from A where exists(select cc from B where cc=A.cc) 效率高,用到了B表上cc列的索引。
相反的
  • 1
  • 2
  • 3
  • 4

② 子查询表为表A:

select * from B where cc in (select cc from A) 效率高,用到了B表上cc列的索引;

select * from B where exists(select cc from A where cc=B.cc) 效率低,用到了A表上cc列的索引。
  • 1
  • 2
  • 3

not in 和not exists如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。

所以无论那个表大,用not exists都比not in要快。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/J080624/article/details/72910548

原文地址:https://www.cnblogs.com/Pjson/p/8646367.html

时间: 2024-10-29 14:54:22

MySQL - exists与in的用法的相关文章

MySQL: ON DUPLICATE KEY UPDATE 用法

使用该语法可在插入记录的时候先判断记录是否存在,如果不存在则插入,否则更新,很方便,无需执行两条SQL 这个语句知识mysql中,而标准sql语句中是没有的. INSERT INTO .. ON DUPLICATE KEY更新多行记录 如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE:如果不会导致唯一值列重复的问题,则插入新行.例如,如果列a被定义为UNIQUE,并

php学习之道:mysql SELECT FOUND_ROWS()与COUNT(*)用法区别

在mysql中 FOUND_ROWS()与COUNT(*)都可以统计记录,如果都一样为什么会有两个这样的函数呢,下面我来介绍SELECT FOUND_ROWS()与COUNT(*)用法区别 SELECT语句中经常可能用LIMIT限制返回行数.有时候可能想要知道如果没有LIMIT会返回多少行,但又不想再执行一次相同语句.那么,在SELECT查询中包含SQL_CALC_FOUND_ROWS选项,然后执行FOUND_ROWS()就可以了:  代码如下 复制代码 mysql> SELECT SQL_CA

mysql 有报错  ERROR! MySQL is not running, but lock file (/var/lock/subsys/mysql) exists

sh-4.1# /etc/init.d/mysqld status ERROR! MySQL is not running, but lock file (/var/lock/subsys/mysql) exists sh-4.1# /etc/init.d/mysqld start Starting MySQL. ERROR! The server quit without updating PID file (/data1/mysql/mysql.pid). sh-4.1# rm mysql

Mysql 中的CASE WHEN 用法

在SELECT语句查询中可以使用CASE WHEN对查询出来的结果,进行一个类似于if else的判断. 具体的用法 1. SELECT a.website_id, b.customer_name, a.website_enddate, c.member_name, d.websitetype_id,            CASE                 WHEN d.websitetype_id=1 THEN 400                WHEN d.websitetype

mysql sum() 求和函数的用法

查询在record表中 name=? 的 money 加起来的值使用聚和函数 sum() 求和select sum(money) from record t where t.name = ?另外:count() 求记录数avg() 求平均值 mysql sum() 求和函数的用法 SUM函数的语法是: 代码如下 复制代码 SELECT SUM(expression )FROM tablesWHERE predicates; 表达式可以是一个数值字段或公式. 简单的例子 例如,你可能想知道合并全体

MySQL 存储过if语句用法

MySQL 存储过if语句用法,MySQL IF语句允许您根据表达式的某个条件或值结果来执行一组SQL语句. 1,if 结构 IF expression THEN statements; END IF; IF expression THEN statements;ELSEelse-statements;END IF; IF expression THENstatements;ELSEIF elseif-expression THENelseif-statements;ELSEelse-state

MYSQL数值运算符和函数用法

mysql也有数值运算,那么列出常见的函数 ceil() div() floor() mod() power() round() truncate()等等,具体说说MYSQL数值运算符和函数用法. 1,ceil select ceil() 进一取整 2,div select div() 整除除法 3,floor 舍一取整 4,mod 取余数 5,power 幂运算 6,round 四舍五入 7,truncate 数字截取 以上就是常见的数字运算 文章来自 www.huthon.cn 原文地址:h

mysql exists用法

在mysql中,有个关键字exists比较难理解,今天就来搞明白其含义和应用 exists的使用总是跟子查询关联起来,一种是不相关子查询,对于exists来说更常用的是相关子查询 不相关子查询:子查询和父查询没有直接的关系.只要子查询为真,则返回父查询的所有结果.否则返回空 select A.id from A where exists (select B.name from B where B.name = "hello world"); 相关子查询: select A.id fro

MySQL exists 和 not exists 的用法

有一个查询如下: 1 SELECT c.CustomerId, c.CompanyName   2 FROM Customers c   3 WHERE EXISTS(   4     SELECT OrderID FROM Orders o   5     WHERE o.CustomerID = c.CustomerID)   这里面的EXISTS是如何运作呢?子查询返回的是OrderId字段,可是外面的查询要找的是CustomerID和CompanyName字段,这两个字段肯定不在Orde