温馨提示:本文阅读需要5分钟,建议收藏后阅读!
各位宝宝们
我们今天一起来了解
MySQL数据库的子查询与合并查询
子查询
任务:
我们现在想要找出分公司人数最多的总经理的姓名。
方案一:
select office_id from employee group by office_id order by count(employee_id) desc limit 1;
要出人数最多的分公司的 ID 号码
select employee_name from employee where office_id=1003 and job_title='总经理';
然后再找出这个分公司的总经理是谁
那我们可不可以用一条查询语句来完成这个任务呢?
方案二:
select employee_name from employee where office_id=(select office_id from employee group by office_id order by count(employee_id) desc limit 1) and job_title='总经理';
这个就是我们的子查询了
子查询就是指用 select 查询的是另一个查询的结果。
注:子查询是从最内层的查询开始执行的。
子查询的分类:
类型一(根据子查询的返回值):
一个子查询会返回一个标量(单一值),一个行, 一个列,一个表
这些子查询被称为标量子查询,行子查询,列子查询,表子查询。
类型二(根据子查询的出现条件语句):
where 子查询
from 子查询
那么我们刚才使用的查询就是:
标量子查询(返回 office_id 单一值), where子查询(使用了where语句)
select employee_name from employee where office_id=(select office_id from employee group by office_id order by count(employee_id) desc limit 1) and job_title='总经理';
任务:
查询电话有10的公司的所有员工。
select * from employee where office_id in(select office_id from office where phone like '%10%');
列子查询,where 子查询
任务:
查询员工id=18的员工信息
select a.* from (select employee_name,gender,email from employee where employee_id =18) a;
行子查询, from子查询
我们实际的使用中很少这么用,就是给大家演示一下行子查询!
任务:
统计分公司(office_id=1003)的男女员工人数
select count(a.employee_name),a.gender from (select employee_name,gender from employee where office_id=1003) a group by a.gender;
表子查询, from 子查询
select employee_name,gender from employee where office_id=1003;
子查询返回的一张表所以是一个表子查询!
带 exists 关键字的子查询
内层查询语句不返回查询记录,而是返回一个真假值(满足条件记录时候,就返回一个true,否则返回false)
select employee_name,gender,email,job_title from employee where exists(select * from employee where employee_name='李娜');
显然我的名字并不在这个数据表中,返回一个空(empty)
select employee_name,gender,email,job_title from employee where exists(select * from employee where employee_name='成龙');
我们的表中是有成龙的,所以可以返回数据。
这个带 exists 关键字的子查询语句,更适合我们的数据权限控制,当子查询成立的时候才会显示数据,否则我们就不显示数据!
带 any 关键字的子查询
只要满足内层查询语句返回结果中的任意一个,就为true。就可以执行外层查询语句。
select order_id,customer_id,order_number,order_date from `order` where order_id = any(select order_id from order_detail where buy_number>49);
这个就是查询所有购买数量大于49的订单的信息!
带 all 关键字的子查询
all 关键字表示满足所有条件,即满足内层查询语句返回的所结果,才可以执行外层的查询语句。
select order_id,customer_id,order_number,order_date from `order` where total_money> all(select price*10 from order_detail);
所有满足订单的总金额大于单价*10的订单的信息
合并查询
将多条select语句结果,合并在一起,称为合并查询
任务:
找出公司人数最多的总经理信息和office_id为1001分公司所有女生的信息。
select office_id from employee group by office_id order by count(employee_id) desc limit 1
从表中我们可以看出,人数最多的分公司 id 是1003不是 1001
so!我们可以分别来查询出这两个信息
select employee_name,gender,email from employee where office_id = (select office_id from employee group by office_id order by count (employee_id) desc limit 1) and job_title='总经理';
select employee_name,gender,email from employee where office_id = 1001 and gender='女';
那么该如何让他们出现在同一张表上
select employee_name,gender,email from employee where office_id = (select office_id from employee group by office_id order by count (employee_id) desc limit 1) and job_title ='总经理' union select employee_name ,gender,email from employee where office_id=1001 and gender='女';
当获得数据的条件出现逻辑冲突,或者很难在一个逻辑内表示,就可以拆分成为多个逻辑,分别实现最终将结果用(union 或者union all)合并在一起。这个就是合并查询!
任务:
找出公司所有女生的信息和上海公公司所有员工的信息。
select employee_name,gender,email from employee where gender='女';
select employee_name,gender,email from employee where office_id = 1001;
select employee_name,gender,email from employee where gender='女' union select employee_name,gender,email from employee where office_id =1001;
只有21条记录
select employee_name,gender,email from employee where gender='女' union all select employee_name,gender,email from employee where office_id=1001;
总结 union 与union all 的区别 :
union : 有去重的功能
union all:没有去重的功能
合并查询语法要求 :
二个需要合并的语句,字段的个数要求一致,可以允许字段的类型不一致。
select employee_name,gender,email from employee where gender='女' union select employee_name,gender,office_id from employee where office_id=1001;
数据库到这里的话
初级部分就算是基本结束了
一般的查询问题应该是没有问题的
宝宝们勤加练习哈!
给大家一点小建议:
开发的时候无所谓,真的发布项目的时候,一定要设置一个复杂一点的密码!前段时间看新闻,好像朝鲜的一个系统就被破解了,原因就是密码太简单,一下就被猜出来了。。。
伙伴们呀!可长点心吧!
有任何问题都可以在文章留言,娜姐都看着的呢!
合作,投稿,转载,版权问题请联系 李娜:Lina_Java