一、建表时使用

如果不存在,就建表

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代替

 

 

Logo

更多推荐