7.MySQL复合查询

本文介绍了MySQL数据库的高级查询技术,包括复合查询、基本查询回顾、多表查询、自连接、子查询(单行/多行/多列)、合并查询(union和unionall)以及实战示例,如在职员工薪水查询和牛客网编程题目。
摘要由CSDN通过智能技术生成

个人主页:Lei宝啊 

愿所有美好如期而遇


目录

复合查询

基本查询回顾

多表查询

自连接

子查询

单行子查询

多行子查询

多列子查询

在from子句中使用子查询

合并查询

union

union all

实战OJ


复合查询

前面我们讲解的mysql表的查询都是对一张表进行查询,在实际开发中这远远不够

基本查询回顾

回顾我们建的表

以及三张表内的数据

  

查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J

按照部门号升序而雇员的工资降序排序

使用年薪进行降序排序

显示工资最高的员工的名字和工作岗位

显示工资高于平均工资的员工信息

显示每个部门的平均工资和最高工资

显示平均工资低于2000的部门号和它的平均工资

显示每种岗位的雇员总数,平均工资

多表查询

实际开发中往往数据来自不同的表,所以需要多表查询。本节我们用一个简单的公司管理系统,有三张表EMP,DEPT,SALGRADE来演示如何进行多表查询,也就是上面我们给出的表。

显示雇员名、雇员工资以及所在部门的名字

(因为上面的数据来自EMP和DEPT表,因此要联合查询)

显示部门号为10的部门名,员工名和工资

显示各个员工的姓名,工资,及工资级别

 

自连接

自连接是指在同一张表连接查询

显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号--empno)

使用的子查询

使用多表查询(自查询)

子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询

单行子查询

返回一行记录的子查询

显示SMITH同一部门的员工

多行子查询

返回多行记录的子查询

in关键字;查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自
己的

all关键字;显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

any关键字;显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门
的员工)

 

多列子查询

单行子查询是指子查询只返回单列,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句

查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人

在from子句中使用子查询

子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。

显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资

先找出各个部门的平均工资,将其与emp表做笛卡尔积后,通过工资和部门条件筛选出来。

select ename,emp.deptno,sal,avgsal

from emp,(select deptno,avg(sal) avgsal from emp group by deptno)

where emp.deptno=avg.deptno

and sal>avgsal;

也许你会有疑问,avgsal不是求平均值吗,前面三个数据没有分组,为什么能够做聚合?首先,我们在from那里就已经做出了avgsal的表,而且已经拼接。

查找每个部门工资最高的人的姓名、工资、部门、最高工资

select ename,sal,emp.deptno,m 

from emp,(select deptno,max(sal) m from emp group by deptno) max

where emp.deptno=max.deptno

and sal=m;

显示每个部门的信息(部门名,编号,地址)和人员数量

子查询

select dept.dname,emp.deptno,dept.loc,count

from (select deptno, count(*) count from emp group by deptno) emp,dept

where emp.deptno=depto;

多表查询 

select dept.dname,dept.deptno,dept.loc,count(*)

from emp,dept

where emp.deptno=dept.deptno

group by dname,loc,dept.deptno;

合并查询

在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all

union

该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行

将工资大于2500或职位是MANAGER的人找出来

union all

该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。

实战OJ

查找所有员工入职时候的薪水情况_牛客题霸_牛客网 (nowcoder.com)

select emp.emp_no,sal.salary from employees emp,salaries sal

where emp.emp_no=sal.emp_no and emp.hire_date=sal.from_date

order by emp.emp_no desc;

获取所有非manager的员工emp_no_牛客题霸_牛客网 (nowcoder.com)

select emp_no from employees

where emp_no not in (select emp_no from dept_manager);

获取所有员工当前的manager_牛客题霸_牛客网 (nowcoder.com) 

select emp.emp_no,man.emp_no manager from dept_emp emp,dept_manager man

where emp.dept_no=man.dept_no

and emp.emp_no<>man.emp_no;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lei宝啊

觉得博主写的有用就鼓励一下吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值