mysql里的exists详解
一、建表时使用如果不存在,就建表二、查询时使用
一、建表时使用
如果不存在,就建表
drop table if exists temp;
一般放在建表语句前面,如果存在同名的表的话,就删了它,继续建表
顺便插入点数据
drop table if exists `girl`;
CREATE TABLE `girl` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`sex` char(1) DEFAULT '女',
`borndate` datetime DEFAULT '1999-01-01 00:00:00',
`phone` varchar(11) NOT NULL,
`boyfriend_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
insert into girl values (1,'小王','女','1998-02-03','13598847855',2);
insert into girl values (2,'小李','女','1998-02-03','13598847852',4);
insert into girl values (3,'小欣','女','1998-02-03','13598842355',3);
insert into girl values (4,'小苍','女','1998-02-03','13598237855',4);
insert into girl values (5,'小饭','女','1998-02-03','13598237855',5);
insert into girl values (6,'小雨','女','1998-02-03','13598347855',2);
insert into girl values (7,'小井','女','1998-02-03','13598457855',2);
insert into girl values (8,'小香','女','1998-02-03','13594458455',3);
insert into girl values (9,'小玉','女','1998-02-03','13598584555',2);
insert into girl values (10,'小陈','女','1998-02-03','13598448595',4);
insert into girl values (11,'小杨','女','1998-02-03','13598457805',5);
insert into girl values (12,'小孙','女','1998-02-03','13598548595',2);
select * from girl;
再建个boy表
drop table if exists boy;
create table boy (
id int(8) PRIMARY key,
name varchar(16)
) ;
insert into boy values (1,'隔壁老王');
insert into boy values (2,'隔壁王五');
insert into boy values (3,'隔壁老张');
insert into boy values (4,'隔壁张三');
select * from boy;
两张表的数据是这样的
二、查询时使用
放在where后面,格式如下
select ....... where exists(子查询)
如果子查询有任意数据返回,exists就返回true,子查询外的查询语句执行
如果子查询没有数据返回,exists就返回false,子查询外的查询语句就不执行
先来写一个简单的有返回的语句
select 'helloworld'
然后放到exists后面,看看返回什么
select exists(select 'helloworld')
可以看出,子查询有返回数据的话,不管返回什么,在exists后面,都只返回1,表示true
再来测试一个简单的,没有返回值的
然后放到exists后面看看是什么效果
子查询没有返回值的话,exists就只返回0,表示false
三、举个栗子
1、如果存在叫小王的妹子的话,找出他的男朋友
我写出来了,但是这题跟我想说的好像并没有啥关系。。。。。
我们继续
2、如果存在叫小王的妹子的话,把她的信息查询出来
select * from girl
where exists (select name from girl where name = '小王')
and name = '小王'
这么写并没有什么意义,还不如直接一个where来得直接明白
3、如果存在叫小空的妹子的话,把她的信息查询出来
如果没有,就算了
select * from girl
where exists (select name from girl where name = '小空')
and name = '小空'
也没什么意思,也是简单一个where可以代替的
4、如果有女朋友,就把这个隔壁男的名字查出来
试试这个,我觉得是有点意思的
查询语句是这样的
select b.name from boy b
where exists (
select g.name from girl g
where g.boyfriend_id = b.id
)
查询结果是三个,1号没女朋友,2,3,4都查出来了
按介绍来说,子查询会比外层查询先执行,然后返回一个true或false来决定执不执行外层查询
但是这里的子查询单独拿出来根本运行不了
在B网上看了好几个视频,最后自己敲了半天,才有点明白了,如果理解还是有错误的地方的话,欢迎回复指导
首先子查询运行,查找girl表中第一行数据,找到1号小王和他的男朋友编号2,然后子查询的条件判断b.id直接从外层查询中拿,在boy b 表中成功拿到编号2的隔壁王五,返回true
girl表中一共有12条数据,子查询一共运行了12次,在男朋友编号为2,3,4的时候返回true,编号为5的时候返回false
是的,没错,它不是只返一个true,而是很多个true,中间还混杂着false
然后在返回true的时候,外层运行,false的时候,外层查询不运行
基本是这样
然后执行外层查询
外层查询boy表,先查第一条,b.name = '隔壁老王',b.id = 1
然后编历子查询返回的九个布尔值,查找里面有没有b.id=1 并且返回值为true的
没有
然后查第二条,b.name = '隔壁王五',b.id = 2
当b.id = 2的时候,整个查询语句应该是这样
子查询返回的true,外层查询成功运行,查到隔壁王五
然后查第三条,b.name = '隔壁老张',b.id = 3
当b.id = 3的时候,子查询有两条数据符合条件,都能返回true
外层查询也能成功运行,返回'隔壁老张'
最后查第四条,b.name = '隔壁张三',b.id = 4
当b.id = 4 的时候,子查询也能返回true
外层查询也能成功运行,返回'隔壁张三'
最后成功返回
最后再说一句,这东西可以用in代替
更多推荐
所有评论(0)