单表查询
案例表
create table emp(
id int not null unique auto_increment,
name varchar(20) not null,
sex enum('male','female') not null default 'male', #大部分是男的
age int(3) unsigned not null default 28,
hire_date date not null,
post varchar(50),
post_comment varchar(100),
salary double(15,2),
office int, #一个部门一个屋子
depart_id int
);
#查看表结构
mysql> desc emp;
+--------------+-----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-----------------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| sex | enum('male','female') | NO | | male | |
| age | int(3) unsigned | NO | | 28 | |
| hire_date | date | NO | | NULL | |
| post | varchar(50) | YES | | NULL | |
| post_comment | varchar(100) | YES | | NULL | |
| salary | double(15,2) | YES | | NULL | |
| office | int(11) | YES | | NULL | |
| depart_id | int(11) | YES | | NULL | |
+--------------+-----------------------+------+-----+---------+----------------+
#插入记录
#三个部门:教学,销售,运营
insert into emp(name,sex,age,hire_date,post,salary,office,depart_id) values
('egon','male',18,'20170301','老男孩驻沙河办事处外交大使',7300.33,401,1), #以下是教学部
('alex','male',78,'20150302','teacher',1000000.31,401,1),
('wupeiqi','male',81,'20130305','teacher',8300,401,1),
('yuanhao','male',73,'20140701','teacher',3500,401,1),
('liwenzhou','male',28,'20121101','teacher',2100,401,1),
('jingliyang','female',18,'20110211','teacher',9000,401,1),
('jinxin','male',18,'19000301','teacher',30000,401,1),
('成龙','male',48,'20101111','teacher',10000,401,1),
('歪歪','female',48,'20150311','sale',3000.13,402,2),#以下是销售部门
('丫丫','female',38,'20101101','sale',2000.35,402,2),
('丁丁','female',18,'20110312','sale',1000.37,402,2),
('星星','female',18,'20160513','sale',3000.29,402,2),
('格格','female',28,'20170127','sale',4000.33,402,2),
('张野','male',28,'20160311','operation',10000.13,403,3), #以下是运营部门
('程咬金','male',18,'19970312','operation',20000,403,3),
('程咬银','female',18,'20130311','operation',19000,403,3),
('程咬铜','male',18,'20150411','operation',18000,403,3),
('程咬铁','female',18,'20140512','operation',17000,403,3)
;
较完整的查询语句
select id,name from emp
where id > 1 and name like %xx%
group by city
having 分组后的条件
order by 排序依据
limit 展示条数;
关键字
DISTINCT 去重查询
查出所有的岗位(去掉重复)
SELECT DISTINCT post FROM emp;
+--------------------+
| post |
+--------------------+
| 张江第一帅形象代言 |
| teacher |
| sale |
| operation |
+--------------------+
四则运行查询
查年薪,重命名
SELECT name, salary*12 FROM emp;
SELECT name, salary*12 AS year_salary FROM emp;
+--------+-------------+
| name | year_salary |
+--------+-------------+
| jason | 87603.96 |
| egon | 12000003.72 |
| kevin | 99600.00 |
| tank | 42000.00 |
| owen | 25200.00 |
| jerry | 108000.00 |
| nick | 360000.00 |
| sean | 120000.00 |
| 歪歪 | 36001.56 |
| 丫丫 | 24004.20 |
| 丁丁 | 12004.44 |
| 星星 | 36003.48 |
| 格格 | 48003.96 |
| 张野 | 120001.56 |
| 程咬金 | 240000.00 |
| 程咬银 | 228000.00 |
| 程咬铜 | 216000.00 |
| 程咬铁 | 204000.00 |
+--------+-------------+
CONCAT 定义显式
查出所有员工的名字,薪资,格式为:
<名字:xxx> <薪资:666666>
SELECT CONCAT('姓名: ',name,' 年薪: ', salary*12) AS year_salary FROM emp;
+-------------------------------+
| year_salary |
+-------------------------------+
| 姓名: jason 年薪: 87603.96 |
| 姓名: egon 年薪: 12000003.72 |
| 姓名: kevin 年薪: 99600.00 |
| 姓名: tank 年薪: 42000.00 |
| 姓名: owen 年薪: 25200.00 |
| 姓名: jerry 年薪: 108000.00 |
| 姓名: nick 年薪: 360000.00 |
| 姓名: sean 年薪: 120000.00 |
| 姓名: 歪歪 年薪: 36001.56 |
| 姓名: 丫丫 年薪: 24004.20 |
| 姓名: 丁丁 年薪: 12004.44 |
| 姓名: 星星 年薪: 36003.48 |
| 姓名: 格格 年薪: 48003.96 |
| 姓名: 张野 年薪: 120001.56 |
| 姓名: 程咬金 年薪: 240000.00 |
| 姓名: 程咬银 年薪: 228000.00 |
| 姓名: 程咬铜 年薪: 216000.00 |
| 姓名: 程咬铁 年薪: 204000.00 |
+-------------------------------+
WHERE 约束
where字句中可以使用:
1. 比较运算符:> < >= <= <> !=
2. between 80 and 100 值在80到100之间
3. in(80,90,100) 值是10或20或30
4. like 'xxx%'
pattern可以是%或_,
%表示任意多字符
_表示一个字符
5. 逻辑运算符:多个条件直接可以使用逻辑运算符 and or not
1.查看岗位是teacher的员工姓名、年龄
select name,age from emp where post = 'teacher';
+-------+-----+
| name | age |
+-------+-----+
| egon | 78 |
| kevin | 81 |
| tank | 73 |
| owen | 28 |
| jerry | 18 |
| nick | 18 |
| sean | 48 |
+-------+-----+
2.查看岗位是teacher且年龄大于30岁的员工姓名、年龄
select name,age from emp where post='teacher' and age > 30;
+-------+-----+
| name | age |
+-------+-----+
| egon | 78 |
| kevin | 81 |
| tank | 73 |
| sean | 48 |
+-------+-----+
3. 查看岗位是teacher且薪资在9000-1000范围内的员工姓名、年龄、薪资
select name,age,salary from emp where post='teacher' and salary between 9000 and 10000;
+-------+-----+----------+
| name | age | salary |
+-------+-----+----------+
| jerry | 18 | 9000.00 |
| sean | 48 | 10000.00 |
+-------+-----+----------+
4. 查看岗位描述不为NULL的员工信息
select * from emp where post_comment is not null;
Empty set (0.00 sec)
5. 查看岗位是teacher且薪资是10000或9000或30000的员工姓名、年龄、薪资
select name,age,salary from emp where post='teacher' and salary in (10000,9000,30000);
+-------+-----+----------+
| name | age | salary |
+-------+-----+----------+
| jerry | 18 | 9000.00 |
| nick | 18 | 30000.00 |
| sean | 48 | 10000.00 |
+-------+-----+----------+
6. 查看岗位是teacher且薪资不是10000或9000或30000的员工姓名、年龄、薪资
select name,age,salary from emp where post='teacher' and salary not in (10000,9000,30000);
+-------+-----+------------+
| name | age | salary |
+-------+-----+------------+
| egon | 78 | 1000000.31 |
| kevin | 81 | 8300.00 |
| tank | 73 | 3500.00 |
| owen | 28 | 2100.00 |
+-------+-----+------------+
7. 查看岗位是teacher且名字是jin开头的员工姓名、年薪
select name,salary*12 from emp where post='teacher' and name like 'j%';
+-------+-----------+
| name | salary*12 |
+-------+-----------+
| jerry | 108000.00 |
+-------+-----------+
GROUP BY 分组查询
1、首先明确一点:分组发生在where之后,即分组是基于where之后得到的记录而进行的
2、分组指的是:将所有记录按照某个相同字段进行归类,比如针对员工信息表的职位分组,或者按照性别进行分组等
3、大前提: 可以按照任意字段分组,但是分组完毕后,比如group by post,只能查看post字段,如果想查看组内信息,需要借助于聚合函数
- 分组后应该做到最小单位是组,而不应该在展示组内的单个数据信息
- 分组之后,只能拿到分组的字段信息,无法直接获取其他字段信息,但是可以通过(聚合函数)间接获取
- 设置sql_mode为only_full_group_by,意味着以后分组,只能取到分组的依据,不应该再取组里面的单个元素值,否则分组就没有意义了,因为不分组就是对单个元素信息的随意获取
show variables like '%mode%';
set global sql_mode="strict_trans_tables,only_full_group_by";
设置严格模式后要重启mysql
# 注意: 如果一张表没有group by 默认所有的数据就是一个组
单独使用GROUP BY关键字分组
SELECT post FROM emp GROUP BY post;
注意:我们按照post字段分组,那么select查询的字段只能是post,想要获取组内的其他相关信息,需要借助函数
GROUP BY关键字和GROUP_CONCAT()函数一起使用
SELECT post,GROUP_CONCAT(name) FROM emp GROUP BY post;#按照岗位分组,并查看组内成员名
SELECT post,GROUP_CONCAT(name) as emp_members FROM emp GROUP BY post;
GROUP BY与聚合函数一起使用
select post,count(id) as count from emp group by post;#按照岗位分组,并查看每个组有多少人
注意:
- 如果我们用unique的字段作为分组的依据,则每一条记录自成一组,这种分组没有意义
- 多条记录之间的某个字段值相同,该字段通常用来作为分组的依据
聚合函数
强调:聚合函数聚合的是组的内容,若是没有分组,则默认一组
示例:
SELECT COUNT(*) FROM emp;
SELECT COUNT(*) FROM empe WHERE depart_id=1;
SELECT MAX(salary) FROM emp;
SELECT MIN(salary) FROM emp;
SELECT AVG(salary) FROM emp;
SELECT SUM(salary) FROM emp;
SELECT SUM(salary) FROM emp WHERE depart_id=3;
1. 查询岗位名以及岗位包含的所有员工名字
select post,group_concat(name) from emp group by post;
+--------------------+--------------------------------------+
| post | group_concat(name) |
+--------------------+--------------------------------------+
| operation | 张野,程咬金,程咬银,程咬铜,程咬铁 |
| sale | 歪歪,丫丫,丁丁,星星,格格 |
| teacher | egon,kevin,tank,owen,jerry,nick,sean |
| 张江第一帅形象代言 | jason |
+--------------------+--------------------------------------+
2. 查询岗位名以及各岗位内包含的员工个数
select post,count(id) from emp group by post;
+--------------------+-----------+
| post | count(id) |
+--------------------+-----------+
| operation | 5 |
| sale | 5 |
| teacher | 7 |
| 张江第一帅形象代言 | 1 |
+--------------------+-----------+
3.查询公司内男员工和女员工的个数
select gender,count(id) from emp group by gender;
+--------+-----------+
| gender | count(id) |
+--------+-----------+
| male | 10 |
| female | 8 |
+--------+-----------+
4. 查询岗位名以及各岗位的平均薪资
select post,avg(salary) from emp group by post;
+--------------------+---------------+
| post | avg(salary) |
+--------------------+---------------+
| operation | 16800.026000 |
| sale | 2600.294000 |
| teacher | 151842.901429 |
| 张江第一帅形象代言 | 7300.330000 |
+--------------------+---------------+
5. 查询岗位名以及各岗位的最高薪资
select post,max(salary) from emp group by post;
+--------------------+-------------+
| post | max(salary) |
+--------------------+-------------+
| operation | 20000.00 |
| sale | 4000.33 |
| teacher | 1000000.31 |
| 张江第一帅形象代言 | 7300.33 |
+--------------------+-------------+
6. 查询岗位名以及各岗位的最低薪资
select post,min(salary) from emp group by post;
+--------------------+-------------+
| post | min(salary) |
+--------------------+-------------+
| operation | 10000.13 |
| sale | 1000.37 |
| teacher | 2100.00 |
| 张江第一帅形象代言 | 7300.33 |
7. 查询男员工与男员工的平均薪资,女员工与女员工的平均薪资
select gender,avg(salary) from emp group by gender;
+--------+---------------+
| gender | avg(salary) |
+--------+---------------+
| male | 110920.077000 |
| female | 7250.183750 |
+--------+---------------+
HAVING 分组后过滤
HAVING与WHERE不一样的地方在于:
-
执行优先级从高到低:where > group by > having
-
Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。
-
Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数
1. 查询各岗位内包含的员工个数小于2的岗位名、岗位内包含员工名字、个数
select post,group_concat(name),count(id) from emp group by post having count(id) < 2;
+--------------------+--------------------+-----------+
| post | group_concat(name) | count(id) |
+--------------------+--------------------+-----------+
| 张江第一帅形象代言 | jason | 1 |
+--------------------+--------------------+-----------+
2. 查询各岗位平均薪资大于10000的岗位名、平均工资
select post,avg(salary) from emp group by post having avg(salary) > 10000;
+-----------+---------------+
| post | avg(salary) |
+-----------+---------------+
| operation | 16800.026000 |
| teacher | 151842.901429 |
+-----------+---------------+
3. 查询各岗位平均薪资大于10000且小于20000的岗位名、平均工资
select post,avg(salary) from emp group by post having avg(salary) > 10000 and avg(salary) <20000;
+-----------+--------------+
| post | avg(salary) |
+-----------+--------------+
| operation | 16800.026000 |
+-----------+--------------+
ORDER BY 排序
正序 ASC 默认
倒序 DESC
1. 查询所有员工信息,先按照age升序排序,如果age相同则按照hire_date降序排序
select * from emp ORDER BY age asc,hire_date desc;
2. 查询各岗位平均薪资大于10000的岗位名、平均工资,结果按平均薪资升序排列
select post,avg(salary) from emp group by post having avg(salary) > 10000 order by avg(salary) asc;
+-----------+---------------+
| post | avg(salary) |
+-----------+---------------+
| operation | 16800.026000 |
| teacher | 151842.901429 |
+-----------+---------------+
3. 查询各岗位平均薪资大于10000的岗位名、平均工资,结果按平均薪资降序排列
select post,avg(salary) from emp group by post having avg(salary) > 10000 order by avg(salary) desc;
+-----------+---------------+
| post | avg(salary) |
+-----------+---------------+
| teacher | 151842.901429 |
| operation | 16800.026000 |
+-----------+---------------+
LIMIT 限制查询记录的条数
示例:
SELECT * FROM emp ORDER BY salary DESC
LIMIT 3; #默认初始位置为0
SELECT * FROM emp ORDER BY salary DESC
LIMIT 0,5; #从第0开始,即先查询出第一条,然后包含这一条在内往后查5条
SELECT * FROM emp ORDER BY salary DESC
LIMIT 5,5; #从第5开始,即先查询出第6条,然后包含这一条在内往后查5条
单表查询关键字执行顺序
执行顺序:
from # 确定是那张表
where # 根据条件,筛选数据
group by # 分组
having # 对分组后的表筛选 分组之后只能拿到分组的依据和聚合函数的结果
select # 拿出筛选出来的数据中的某些字段
distinct # 去重
多表查询
案例表
create table dep(
id int,
name varchar(20)
);
create table emp(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') not null default 'male',
age int,
dep_id int
);
#插入数据
insert into dep values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营');
insert into emp(name,sex,age,dep_id) values
('egon','male',18,200),
('alex','female',48,201),
('wupeiqi','male',38,201),
('yuanhao','female',28,202),
('liwenzhou','male',18,200),
('jingliyang','female',18,204)
;
#查看表结构和数据
mysql> desc dep;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
mysql> desc emp;
+--------+-----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-----------------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
| sex | enum('male','female') | NO | | male | |
| age | int(11) | YES | | NULL | |
| dep_id | int(11) | YES | | NULL | |
+--------+-----------------------+------+-----+---------+----------------+
mysql> select * from dep;
+------+--------------+
| id | name |
+------+--------------+
| 200 | 技术 |
| 201 | 人力资源 |
| 202 | 销售 |
| 203 | 运营 |
+------+--------------+
mysql> select * from emp;
+----+------------+--------+------+--------+
| id | name | sex | age | dep_id |
+----+------------+--------+------+--------+
| 1 | egon | male | 18 | 200 |
| 2 | alex | female | 48 | 201 |
| 3 | wupeiqi | male | 38 | 201 |
| 4 | yuanhao | female | 28 | 202 |
| 5 | liwenzhou | male | 18 | 200 |
| 6 | jingliyang | female | 18 | 204 |
+----+------------+--------+------+--------+
笛卡尔积
左表的一条记录对应右表的每条记录,其中一条记录是正确的对应关系
select * from emp,dep;
+----+------------+--------+------+--------+------+--------------+
| id | name | sex | age | dep_id | id | name |
+----+------------+--------+------+--------+------+--------------+
| 1 | egon | male | 18 | 200 | 200 | 技术 |
| 1 | egon | male | 18 | 200 | 201 | 人力资源 |
| 1 | egon | male | 18 | 200 | 202 | 销售 |
| 1 | egon | male | 18 | 200 | 203 | 运营 |
| 2 | alex | female | 48 | 201 | 200 | 技术 |
| 2 | alex | female | 48 | 201 | 201 | 人力资源 |
| 2 | alex | female | 48 | 201 | 202 | 销售 |
| 2 | alex | female | 48 | 201 | 203 | 运营 |
| 3 | wupeiqi | male | 38 | 201 | 200 | 技术 |
| 3 | wupeiqi | male | 38 | 201 | 201 | 人力资源 |
| 3 | wupeiqi | male | 38 | 201 | 202 | 销售 |
| 3 | wupeiqi | male | 38 | 201 | 203 | 运营 |
| 4 | yuanhao | female | 28 | 202 | 200 | 技术 |
| 4 | yuanhao | female | 28 | 202 | 201 | 人力资源 |
| 4 | yuanhao | female | 28 | 202 | 202 | 销售 |
| 4 | yuanhao | female | 28 | 202 | 203 | 运营 |
| 5 | liwenzhou | male | 18 | 200 | 200 | 技术 |
| 5 | liwenzhou | male | 18 | 200 | 201 | 人力资源 |
| 5 | liwenzhou | male | 18 | 200 | 202 | 销售 |
| 5 | liwenzhou | male | 18 | 200 | 203 | 运营 |
| 6 | jingliyang | female | 18 | 204 | 200 | 技术 |
| 6 | jingliyang | female | 18 | 204 | 201 | 人力资源 |
| 6 | jingliyang | female | 18 | 204 | 202 | 销售 |
| 6 | jingliyang | female | 18 | 204 | 203 | 运营 |
+----+------------+--------+------+--------+------+--------------+
可以利用where条件选出正确的对应关系,正常不用where做链表的活
select * from emp,dep where emp.dep_id = dep.id;
+----+-----------+--------+------+--------+------+--------------+
| id | name | sex | age | dep_id | id | name |
+----+-----------+--------+------+--------+------+--------------+
| 1 | egon | male | 18 | 200 | 200 | 技术 |
| 2 | alex | female | 48 | 201 | 201 | 人力资源 |
| 3 | wupeiqi | male | 38 | 201 | 201 | 人力资源 |
| 4 | yuanhao | female | 28 | 202 | 202 | 销售 |
| 5 | liwenzhou | male | 18 | 200 | 200 | 技术 |
+----+-----------+--------+------+--------+------+--------------+
链表
内连接 inner join ... on ...
只取两张表有对应关系的记录,链接成一张虚拟表
select * from emp inner join dep on emp.dep_id = dep.id;
+----+-----------+--------+------+--------+------+--------------+
| id | name | sex | age | dep_id | id | name |
+----+-----------+--------+------+--------+------+--------------+
| 1 | egon | male | 18 | 200 | 200 | 技术 |
| 2 | alex | female | 48 | 201 | 201 | 人力资源 |
| 3 | wupeiqi | male | 38 | 201 | 201 | 人力资源 |
| 4 | yuanhao | female | 28 | 202 | 202 | 销售 |
| 5 | liwenzhou | male | 18 | 200 | 200 | 技术 |
+----+-----------+--------+------+--------+------+--------------+
查询"技术"部门员工的信息
select * from emp inner join dep on emp.dep_id = dep.id
where dep.name = "技术";
+----+-----------+------+------+--------+------+--------+
| id | name | sex | age | dep_id | id | name |
+----+-----------+------+------+--------+------+--------+
| 1 | egon | male | 18 | 200 | 200 | 技术 |
| 5 | liwenzhou | male | 18 | 200 | 200 | 技术 |
+----+-----------+------+------+--------+------+--------+
左连接 left join ... on ...
内连接基础上,保留左表没有对应关系的记录
select * from emp left join dep on emp.dep_id = dep.id;
+----+------------+--------+------+--------+------+--------------+
| id | name | sex | age | dep_id | id | name |
+----+------------+--------+------+--------+------+--------------+
| 1 | egon | male | 18 | 200 | 200 | 技术 |
| 5 | liwenzhou | male | 18 | 200 | 200 | 技术 |
| 2 | alex | female | 48 | 201 | 201 | 人力资源 |
| 3 | wupeiqi | male | 38 | 201 | 201 | 人力资源 |
| 4 | yuanhao | female | 28 | 202 | 202 | 销售 |
| 6 | jingliyang | female | 18 | 204 | NULL | NULL |
+----+------------+--------+------+--------+------+--------------+
右链接 right join ... on ...
内连接基础上,保留右表没有对应关系的记录
select * from emp right join dep on emp.dep_id = dep.id;
+------+-----------+--------+------+--------+------+--------------+
| id | name | sex | age | dep_id | id | name |
+------+-----------+--------+------+--------+------+--------------+
| 1 | egon | male | 18 | 200 | 200 | 技术 |
| 2 | alex | female | 48 | 201 | 201 | 人力资源 |
| 3 | wupeiqi | male | 38 | 201 | 201 | 人力资源 |
| 4 | yuanhao | female | 28 | 202 | 202 | 销售 |
| 5 | liwenzhou | male | 18 | 200 | 200 | 技术 |
| NULL | NULL | NULL | NULL | NULL | 203 | 运营 |
+------+-----------+--------+------+--------+------+--------------+
全连接 union
内连接基础上,保留左右两张表没有对应关系的记录
select * from emp inner join dep on emp.dep_id = dep.id
union
select * from emp left join dep on emp.dep_id = dep.id;
+----+------------+--------+------+--------+------+--------------+
| id | name | sex | age | dep_id | id | name |
+----+------------+--------+------+--------+------+--------------+
| 1 | egon | male | 18 | 200 | 200 | 技术 |
| 2 | alex | female | 48 | 201 | 201 | 人力资源 |
| 3 | wupeiqi | male | 38 | 201 | 201 | 人力资源 |
| 4 | yuanhao | female | 28 | 202 | 202 | 销售 |
| 5 | liwenzhou | male | 18 | 200 | 200 | 技术 |
| 6 | jingliyang | female | 18 | 204 | NULL | NULL |
+----+------------+--------+------+--------+------+--------------+
子查询
1:子查询是将一个查询语句嵌套在另一个查询语句中。
2:内层查询语句的查询结果,可以为外层查询语句提供查询条件。
3:子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字
4:还可以包含比较运算符:= 、 !=、> 、<等
查询技术部门员工的姓名:
1.链表查询:
select emp.name
from emp inner join dep on emp.dep_id = dep.id
where dep.name = "技术";
2.子查询:
select name from emp
where dep_id = (
select id from dep where name = "技术"
);
+-----------+
| name |
+-----------+
| egon |
| liwenzhou |
+-----------+
查询平均年龄在25岁以上的部门名称
1.链表查询:
select dep.name from
emp inner join dep on emp.dep_id = dep.id
group by dep.name
having avg(age) > 25;
2.子查询:
select name from dep
where id in (
select dep_id from emp group by dep_id having avg(age) > 25
);
+--------------+
| name |
+--------------+
| 人力资源 |
| 销售 |
+--------------+
带EXISTS关键字的子查询
EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回查询的记录。
而是返回一个真假值。True或False
当返回True时,外层查询语句将进行查询;当返回值为False时,外层查询语句不进行查询
#dep表中存在dept_id=203,Ture
select * from emp
where exists
(select id from dep where id=200);
+----+------------+--------+------+--------+
| id | name | sex | age | dep_id |
+----+------------+--------+------+--------+
| 1 | egon | male | 18 | 200 |
| 2 | alex | female | 48 | 201 |
| 3 | wupeiqi | male | 38 | 201 |
| 4 | yuanhao | female | 28 | 202 |
| 5 | liwenzhou | male | 18 | 200 |
| 6 | jingliyang | female | 18 | 204 |
+----+------------+--------+------+--------+
#dep表中存在dept_id=205,False
select * from emp
where exists
(select id from dep where id=204);
Empty set (0.00 sec)