Java联盟

MySQL数据库之子查询与合并查询

2017-11-17  本文已影响0人  Java联盟

温馨提示:本文阅读需要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

娜姐带你用 Eclipse 写一个 Servlet

【福利合集】JavaSE 高阶篇文章汇总

为什么有些 专业程序员 做出的软件 不被认可?

程序员就是这样聊天把女朋友聊没的。

上一篇 下一篇

猜你喜欢

热点阅读