Mysql exists和in

今天在学习sql语句时,遇到关于exsits的用法,下面是题目:

表架构

Student(S#,Sname,Sage,Ssex) 学生表 
Course(C#,Cname,T#)
课程表 
SC(S#,C#,score) 成绩表 
Teacher(T#,Tname) 教师表

问题:

查询学过“001”并且也学过编号“002”课程的同学的学号、姓名:

  即执行主句查询前,先查询是否子句是否为真,若存在学过002课程的学生,再执行查询学过001的,

此时查询出来的结果,就符合既学过001又学过002。

select Student.`S#`,Student.Sname from Student,SC where Student.`S#`=SC.`S#` and SC.`C#`=‘001‘and exists( Select * from SC as SC_2 where SC_2.`S#`=SC.`S#` and SC_2.`C#`=‘002‘); 

由此对比in和exsits的用法:

exsits:

exsits子句返回的并非查询结果,而是布尔值,TRUE或者FALSE,exists对外表用loop逐条查询,

每次查询都会查看exists的条件语句,当 exists里的条件语句,能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真

返回当前loop到的这条记录,反之如果exists里的条件语句不能返回记录行,则当前loop到的这条记录被丢弃,exists的条件就像一个bool条件,

当能返回结果集则为true,不能返回结果集则为 false。

In:

in查询相当于多个or条件的叠加,这个比较好理解,比如下面的查询:

select * from user where userId in (1, 2, 3);

等效于

select * from user where userId = 1 or userId = 2 or userId = 3;

not in与in相反,如下

select * from user where userId not in (1, 2, 3);

等效于

select * from user where userId != 1 and userId != 2 and userId != 3;

总的来说,in查询就是先将子查询条件的记录全都查出来,假设结果集为B,共有m条记录,然后在将子查询条件的结果集分解成m个,再进行m次查询

值得一提的是,in查询的子条件返回结果必须只有一个字段,例如

select * from user where userId in (select id from B);

而不能是

select * from user where userId in (select id, age from B);

而exists就没有这个限制

性能方面对比:

1: select * from A where exists (select * from B where B.id = A.id);

2: select * from A where A.id in (select id from B);

查询1.可以转化以下伪代码,便于理解

for ($i = 0; $i < count(A); $i++) {

  $a = get_record(A, $i); #从A表逐条获取记录

  if (B.id = $a[id]) #如果子条件成立

    $result[] = $a;

}

return $result;

大概就是这么个意思,其实可以看到,查询1主要是用到了B表的索引,A表如何对查询的效率影响应该不大

假设B表的所有id为1,2,3,查询2可以转换为

select * from A where A.id = 1 or A.id = 2 or A.id = 3;

这个好理解了,这里主要是用到了A的索引,B表如何对查询影响不大。

时间: 2024-10-16 13:58:09

Mysql exists和in的相关文章

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 exists 如何使用

还没时间看,exists用的少  ==>当你只需要判断后面的查询结果是否存 在时使用exists() http://edu.codepub.com/2011/0208/29218.php 今天正好做一个查询,两个表中过滤数据,当T1中字段F1在T2表的F2中存在时,返回这条件数据.刚刚开始觉得简单,就想到子查询和连接查询,但是发现 两个表中如果数据量多时,这样就不行,并且效率不高,后来想到用Mysql中的In函数 今天正好做一个查询,两个表中过滤数据,当T1中字段F1在T2表的F2中存在时,返回

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 和 in的效率比较

这条语句适用于a表比b表大的情况 select * from ecs_goods a where cat_id in(select cat_id from ecs_category); 这条语句适用于b表比a表大的情况select * from ecs_goods a where EXISTS(select cat_id from ecs_category b where a.cat_id = b.cat_id); 原因:(转发) select * from Awhere id in(selec

MySQL - exists与in的用法

[1]exists 对外表用loop逐条查询,每次查询都会查看exists的条件语句. 当 exists里的条件语句能够返回记录行时(无论记录行是多少,只要能返回),条件就为真 , 返回当前loop到的这条记录.反之如果exists里的条件语句不能返回记录行,条件为假,则当前loop到的这条记录被丢弃. exists的条件就像一个boolean条件,当能返回结果集则为1,不能返回结果集则为 0. 语法格式如下: select * from tables_name where [not] exis

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

mysql高可用之PXC(Percona XtraDB Cluster)

借鉴 http://www.cnblogs.com/xiaoboluo768/p/5135619.html 服务器环境信息如下: node1    192.168.0.100 node2    192.168.0.101 node3    192.168.0.102 1.安装软件依赖包(添加repl源,再安装依赖,3台server操作一样.) [[email protected] ~]# rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64

msyql中子查询IN,EXISTS,ANY,ALL,SOME,UNION介绍

1.ANY关键字 假设any内部的查询语句返回的结果个数是三个,如:result1,result2,result3,那么, select ...from ... where a > any(...); -> select ...from ... where a > result1 or a > result2 or a > result3; 2.ALL关键字 ALL关键字与any关键字类似,只不过上面的or改成and.即: select ...from ... where a

linux 下mysql的安装,并设置必要的密码

首先,我使用的是redhat linux ,版本号为: 1 [[email protected] init.d]# cat /proc/version 2 Linux version 2.4.20-8 ([email protected]) (gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)) #1 Thu Mar 13 17:54:28 EST 2003 1.  第一步,下载一个mysql版本...我下载的是.tar压缩包,所以对于其他的压缩