【MYSQL】复合查询(重点)

发布于:2025-05-20 ⋅ 阅读:(22) ⋅ 点赞:(0)

 📚 博主的专栏

🐧 Linux   |   🖥️ C++   |   📊 数据结构  | 💡C++ 算法 | 🅒 C 语言  | 🌐 计算机网络 |🗃️ mysql

本篇文章所用到的练习数据库:scott

摘要:本文主要介绍了MySQL中的多表查询和子查询操作,涵盖了单表查询、多表联合查询、自连接、子查询(单行、多行、多列)、合并查询(UNION、UNION ALL)等内容。通过实际案例,展示了如何在不同场景下使用这些查询技术,如查询工资高于平均工资的员工、显示部门信息及人员数量、查找每个部门工资最高的员工等。文章还强调了解决多表查询问题的本质是将多表转化为单表,并提供了多种查询方法的对比和优化建议。最后,通过实战OJ题目,进一步巩固了多表查询的应用。

目录

基本查询回顾

多表查询

自连接

子查询

单行子查询

多行子查询

多列子查询

在from子句中使用子查询

合并查询

union

union all

实战OJ


前面我们探讨的 MySQL 表查询仅限于单表操作,但在实际开发场景中,这显然无法满足需求。

基本查询回顾


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

mysql> select * from emp where (sal>500 or job='MANAGER') and ename like 'J%';
+--------+-------+---------+------+---------------------+---------+------+--------+
| empno  | ename | job     | mgr  | hiredate            | sal     | comm | deptno |
+--------+-------+---------+------+---------------------+---------+------+--------+
| 007566 | JONES | MANAGER | 7839 | 1981-04-02 00:00:00 | 2975.00 | NULL |     20 |
| 007900 | JAMES | CLERK   | 7698 | 1981-12-03 00:00:00 |  950.00 | NULL |     30 |
+--------+-------+---------+------+---------------------+---------+------+--------+
2 rows in set (0.00 sec)

mysql> select * from emp where (sal>500 or job='MANAGER') and substring(ename, 1, 1) ='J';
+--------+-------+---------+------+---------------------+---------+------+--------+
| empno  | ename | job     | mgr  | hiredate            | sal     | comm | deptno |
+--------+-------+---------+------+---------------------+---------+------+--------+
| 007566 | JONES | MANAGER | 7839 | 1981-04-02 00:00:00 | 2975.00 | NULL |     20 |
| 007900 | JAMES | CLERK   | 7698 | 1981-12-03 00:00:00 |  950.00 | NULL |     30 |
+--------+-------+---------+------+---------------------+---------+------+--------+
2 rows in set (0.00 sec)


mysql> select * from emp where (sal>500 or job='MANAGER') and substring(ename, 1, 2) ='JA';
+--------+-------+-------+------+---------------------+--------+------+--------+
| empno  | ename | job   | mgr  | hiredate            | sal    | comm | deptno |
+--------+-------+-------+------+---------------------+--------+------+--------+
| 007900 | JAMES | CLERK | 7698 | 1981-12-03 00:00:00 | 950.00 | NULL |     30 |
+--------+-------+-------+------+---------------------+--------+------+--------+
1 row in set (0.00 sec)

mysql> 

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

mysql> select ename, sal, deptno from emp order by deptno asc, sal desc;
+--------+---------+--------+
| ename  | sal     | deptno |
+--------+---------+--------+
| KING   | 5000.00 |     10 |
| CLARK  | 2450.00 |     10 |
| MILLER | 1300.00 |     10 |
| SCOTT  | 3000.00 |     20 |
| FORD   | 3000.00 |     20 |
| JONES  | 2975.00 |     20 |
| ADAMS  | 1100.00 |     20 |
| SMITH  |  800.00 |     20 |
| BLAKE  | 2850.00 |     30 |
| ALLEN  | 1600.00 |     30 |
| TURNER | 1500.00 |     30 |
| WARD   | 1250.00 |     30 |
| MARTIN | 1250.00 |     30 |
| JAMES  |  950.00 |     30 |
+--------+---------+--------+
14 rows in set (0.00 sec)

使用年薪进行降序排序
这里要注意:任何数和null运算的结果都是null:

mysql> select ename, sal*12+comm 年薪 from emp order by 年薪 desc;
+--------+----------+
| ename  | 年薪     |
+--------+----------+
| ALLEN  | 19500.00 |
| TURNER | 18000.00 |
| MARTIN | 16400.00 |
| WARD   | 15500.00 |
| SMITH  |     NULL |
| JONES  |     NULL |
| BLAKE  |     NULL |
| CLARK  |     NULL |
| SCOTT  |     NULL |
| KING   |     NULL |
| ADAMS  |     NULL |
| JAMES  |     NULL |
| FORD   |     NULL |
| MILLER |     NULL |
+--------+----------+
14 rows in set (0.00 sec)

解决办法:使用ifnull(comm, 0),如果不是null就返回comm值,如果是就返回0

mysql> select ename, sal*12+ifnull(comm, 0) 年薪 from emp order by 年薪 desc;
+--------+----------+
| ename  | 年薪     |
+--------+----------+
| KING   | 60000.00 |
| SCOTT  | 36000.00 |
| FORD   | 36000.00 |
| JONES  | 35700.00 |
| BLAKE  | 34200.00 |
| CLARK  | 29400.00 |
| ALLEN  | 19500.00 |
| TURNER | 18000.00 |
| MARTIN | 16400.00 |
| MILLER | 15600.00 |
| WARD   | 15500.00 |
| ADAMS  | 13200.00 |
| JAMES  | 11400.00 |
| SMITH  |  9600.00 |
+--------+----------+
14 rows in set (0.00 sec)

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

嵌套了select语句

mysql> select ename, job, sal from emp where sal=(select max(sal) from emp);
+-------+-----------+---------+
| ename | job       | sal     |
+-------+-----------+---------+
| KING  | PRESIDENT | 5000.00 |
+-------+-----------+---------+
1 row in set (0.00 sec)

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

mysql> select * from emp where sal > (select avg(sal) from emp);
+--------+-------+-----------+------+---------------------+---------+------+--------+
| empno  | ename | job       | mgr  | hiredate            | sal     | comm | deptno |
+--------+-------+-----------+------+---------------------+---------+------+--------+
| 007566 | JONES | MANAGER   | 7839 | 1981-04-02 00:00:00 | 2975.00 | NULL |     20 |
| 007698 | BLAKE | MANAGER   | 7839 | 1981-05-01 00:00:00 | 2850.00 | NULL |     30 |
| 007782 | CLARK | MANAGER   | 7839 | 1981-06-09 00:00:00 | 2450.00 | NULL |     10 |
| 007788 | SCOTT | ANALYST   | 7566 | 1987-04-19 00:00:00 | 3000.00 | NULL |     20 |
| 007839 | KING  | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 | NULL |     10 |
| 007902 | FORD  | ANALYST   | 7566 | 1981-12-03 00:00:00 | 3000.00 | NULL |     20 |
+--------+-------+-----------+------+---------------------+---------+------+--------+
6 rows in set (0.01 sec)

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

mysql> select deptno, max(sal) 最高工资, avg(sal) 平均 from emp group by deptno order by deptno;
+--------+--------------+-------------+
| deptno | 最高工资     | 平均        |
+--------+--------------+-------------+
|     10 |      5000.00 | 2916.666667 |
|     20 |      3000.00 | 2175.000000 |
|     30 |      2850.00 | 1566.666667 |
+--------+--------------+-------------+
3 rows in set (0.00 sec)

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

mysql> select deptno, avg(sal) 平均工资 from emp group by deptno having 平均工资 < 2000;
+--------+--------------+
| deptno | 平均工资     |
+--------+--------------+
|     30 |  1566.666667 |
+--------+--------------+
1 row in set (0.00 sec)

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

mysql> select job, format(avg(sal), 2) 平均工资, count(job) 雇员总数 from emp group by job order by 雇员.
数;
+-----------+--------------+--------------+
| job       | 平均工资     | 雇员总数     |
+-----------+--------------+--------------+
| PRESIDENT | 5,000.00     |            1 |
| ANALYST   | 3,000.00     |            2 |
| MANAGER   | 2,758.33     |            3 |
| CLERK     | 1,037.50     |            4 |
| SALESMAN  | 1,400.00     |            4 |
+-----------+--------------+--------------+
5 rows in set (0.00 sec)

多表查询

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

案例:

显示雇员名、雇员工资以及所在部门的名字因为上面的数据来自EMP和DEPT表,因此要联合查询

过滤条件:其实我们只要emp表中的deptno = dept表中的deptno字段的记录

mysql> select ename, sal, dname from emp, dept where emp.deptno = dept.deptno order by sal;
+--------+---------+------------+
| ename  | sal     | dname      |
+--------+---------+------------+
| SMITH  |  800.00 | RESEARCH   |
| JAMES  |  950.00 | SALES      |
| ADAMS  | 1100.00 | RESEARCH   |
| WARD   | 1250.00 | SALES      |
| MARTIN | 1250.00 | SALES      |
| MILLER | 1300.00 | ACCOUNTING |
| TURNER | 1500.00 | SALES      |
| ALLEN  | 1600.00 | SALES      |
| CLARK  | 2450.00 | ACCOUNTING |
| BLAKE  | 2850.00 | SALES      |
| JONES  | 2975.00 | RESEARCH   |
| SCOTT  | 3000.00 | RESEARCH   |
| FORD   | 3000.00 | RESEARCH   |
| KING   | 5000.00 | ACCOUNTING |
+--------+---------+------------+
14 rows in set (0.00 sec)

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

mysql> select * from emp, dept where emp.deptno = dept.deptno and emp.deptno=10 order by empno;
+--------+--------+-----------+------+---------------------+---------+------+--------+--------+------------+----------+
| empno  | ename  | job       | mgr  | hiredate            | sal     | comm | deptno | deptno | dname      | loc      |
+--------+--------+-----------+------+---------------------+---------+------+--------+--------+------------+----------+
| 007782 | CLARK  | MANAGER   | 7839 | 1981-06-09 00:00:00 | 2450.00 | NULL |     10 |     10 | ACCOUNTING | NEW YORK |
| 007839 | KING   | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 | NULL |     10 |     10 | ACCOUNTING | NEW YORK |
| 007934 | MILLER | CLERK     | 7782 | 1982-01-23 00:00:00 | 1300.00 | NULL |     10 |     10 | ACCOUNTING | NEW YORK |
+--------+--------+-----------+------+---------------------+---------+------+--------+--------+------------+----------+
3 rows in set (0.00 sec)

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

mysql> select ename, sal, grade, losal, hisal from emp, salgrade where sal between losal and hisal order by sal;
+--------+---------+-------+-------+-------+
| ename  | sal     | grade | losal | hisal |
+--------+---------+-------+-------+-------+
| SMITH  |  800.00 |     1 |   700 |  1200 |
| JAMES  |  950.00 |     1 |   700 |  1200 |
| ADAMS  | 1100.00 |     1 |   700 |  1200 |
| WARD   | 1250.00 |     2 |  1201 |  1400 |
| MARTIN | 1250.00 |     2 |  1201 |  1400 |
| MILLER | 1300.00 |     2 |  1201 |  1400 |
| TURNER | 1500.00 |     3 |  1401 |  2000 |
| ALLEN  | 1600.00 |     3 |  1401 |  2000 |
| CLARK  | 2450.00 |     4 |  2001 |  3000 |
| BLAKE  | 2850.00 |     4 |  2001 |  3000 |
| JONES  | 2975.00 |     4 |  2001 |  3000 |
| SCOTT  | 3000.00 |     4 |  2001 |  3000 |
| FORD   | 3000.00 |     4 |  2001 |  3000 |
| KING   | 5000.00 |     5 |  3001 |  9999 |
+--------+---------+-------+-------+-------+
14 rows in set (0.00 sec)

mysql> 

自连接

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


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

使用的子查询

思路:由于emp表中存放的是整个公司的员工们,因此FORD的领导也在emp表中

1.先找FORD的上级领导的编号

mysql> select mgr from emp where ename='FORD';
+------+
| mgr  |
+------+
| 7566 |
+------+
1 row in set (0.00 sec)

2.再通过编号查找姓名以及工号:

mysql> select ename, empno from emp where empno = (select mgr from emp where ename='FORD');
+-------+--------+
| ename | empno  |
+-------+--------+
| JONES | 007566 |
+-------+--------+
1 row in set (0.00 sec)

使用多表查询(自查询)

mysql> select e2.ename, e2.empno from emp e1, emp e2 where e1.ename='FORD' and e1.mgr=e2.empno;
+-------+--------+
| ename | empno  |
+-------+--------+
| JONES | 007566 |
+-------+--------+
1 row in set (0.00 sec)


子查询

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

单行子查询

返回一行记录的子查询
显示SMITH同一部门的员工

mysql> select ename from emp where deptno = (select deptno from emp where ename='SMITH');
+-------+
| ename |
+-------+
| SMITH |
| JONES |
| SCOTT |
| ADAMS |
| FORD  |
+-------+
5 rows in set (0.00 sec)

多行子查询

返回多行记录的子查询

in关键字:某一个列值,是否在某一个集合当中

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

mysql> select ename, job, sal, deptno from emp where job in (select distinct(job) from emp where deptno='10') and deptno<>10;
+-------+---------+---------+--------+
| ename | job     | sal     | deptno |
+-------+---------+---------+--------+
| SMITH | CLERK   |  800.00 |     20 |
| JONES | MANAGER | 2975.00 |     20 |
| BLAKE | MANAGER | 2850.00 |     30 |
| ADAMS | CLERK   | 1100.00 |     20 |
| JAMES | CLERK   |  950.00 |     30 |
+-------+---------+---------+--------+
5 rows in set (0.00 sec)

增加需求:查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含<>10自己的,并且知道对应的员工属于哪一个部门的名字

mysql> select ename, job, sal, dname, emp.deptno from emp, dept 
    where job in (select distinct(job) from emp where emp.deptno='10') 
    and emp.deptno<>10 and emp.deptno=dept.deptno order by emp.deptno;

+-------+---------+---------+----------+--------+
| ename | job     | sal     | dname    | deptno |
+-------+---------+---------+----------+--------+
| ADAMS | CLERK   | 1100.00 | RESEARCH |     20 |
| JONES | MANAGER | 2975.00 | RESEARCH |     20 |
| SMITH | CLERK   |  800.00 | RESEARCH |     20 |
| JAMES | CLERK   |  950.00 | SALES    |     30 |
| BLAKE | MANAGER | 2850.00 | SALES    |     30 |
+-------+---------+---------+----------+--------+
5 rows in set (0.00 sec)

或者这样:

在from后边添加子句:将子句作为一个新的表tmp

mysql> select ename, job, sal, dname deptno from (select ename, job, sal, deptno 
from emp where job in (select distinct(job) from emp where deptno='10') and deptno<>10)
as tmp, dept where dept.deptnno=tmp.deptno order by sal;
+-------+---------+---------+----------+
| ename | job     | sal     | deptno   |
+-------+---------+---------+----------+
| SMITH | CLERK   |  800.00 | RESEARCH |
| JAMES | CLERK   |  950.00 | SALES    |
| ADAMS | CLERK   | 1100.00 | RESEARCH |
| BLAKE | MANAGER | 2850.00 | SALES    |
| JONES | MANAGER | 2975.00 | RESEARCH |
+-------+---------+---------+----------+
5 rows in set (0.00 sec)

all关键字

显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

方法一:比30号部门的最高工资高的

mysql> select ename, sal, deptno from emp where sal > (select max(sal)
     from emp where deptno='30');
+-------+---------+--------+
| ename | sal     | deptno |
+-------+---------+--------+
| JONES | 2975.00 |     20 |
| SCOTT | 3000.00 |     20 |
| KING  | 5000.00 |     10 |
| FORD  | 3000.00 |     20 |
+-------+---------+--------+
4 rows in set (0.00 sec)

方法二:使用all,找出比30部门所有员工工资高的

mysql> select ename, sal, deptno from emp where sal > 
    all(select distinct sal from emp where deptno='30');
+-------+---------+--------+
| ename | sal     | deptno |
+-------+---------+--------+
| JONES | 2975.00 |     20 |
| SCOTT | 3000.00 |     20 |
| KING  | 5000.00 |     10 |
| FORD  | 3000.00 |     20 |
+-------+---------+--------+
4 rows in set (0.00 sec)

any关键字:

显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员

工)

mysql> select ename, sal, deptno from emp where sal > 
    any(select distinct sal from emp where deptno='30');
+--------+---------+--------+
| ename  | sal     | deptno |
+--------+---------+--------+
| ALLEN  | 1600.00 |     30 |
| WARD   | 1250.00 |     30 |
| JONES  | 2975.00 |     20 |
| MARTIN | 1250.00 |     30 |
| BLAKE  | 2850.00 |     30 |
| CLARK  | 2450.00 |     10 |
| SCOTT  | 3000.00 |     20 |
| KING   | 5000.00 |     10 |
| TURNER | 1500.00 |     30 |
| ADAMS  | 1100.00 |     20 |
| FORD   | 3000.00 |     20 |
| MILLER | 1300.00 |     10 |
+--------+---------+--------+
12 rows in set (0.00 sec)

多列子查询

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


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

可以使用 = 也可以使用 in

mysql> select ename from emp where (deptno, job) 
    = (select deptno, job from emp where ename='SMITH') and ename<>'SMITH';
+-------+
| ename |
+-------+
| ADAMS |
+-------+
1 row in set (0.00 sec)

mysql> select ename from emp where (deptno, job) in (select deptno, job from emp where ename='SMITH') and ename<>'SMITH';
+-------+
| ename |
+-------+
| ADAMS |
+-------+
1 row in set (0.00 sec)


目前全部的子查询,全部都在where子句中,充当判断条件,而我们知道任何时刻查询出来的临时结构,本质在逻辑上也是表结构 

在from子句中使用子查询

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

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

最后: 添加筛选条件

mysql> select * from emp, (select  deptno, avg(sal) 平均工资 from emp 
    group by deptno) as tmp where emp.deptno=tmp.deptno and emp.sal > 平均工资;
+--------+-------+-----------+------+---------------------+---------+--------+--------+--------+--------------+
| empno  | ename | job       | mgr  | hiredate            | sal     | comm   | deptno | deptno | 平均工资     |
+--------+-------+-----------+------+---------------------+---------+--------+--------+--------+--------------+
| 007499 | ALLEN | SALESMAN  | 7698 | 1981-02-20 00:00:00 | 1600.00 | 300.00 |     30 |     30 |  1566.666667 |
| 007566 | JONES | MANAGER   | 7839 | 1981-04-02 00:00:00 | 2975.00 |   NULL |     20 |     20 |  2175.000000 |
| 007698 | BLAKE | MANAGER   | 7839 | 1981-05-01 00:00:00 | 2850.00 |   NULL |     30 |     30 |  1566.666667 |
| 007788 | SCOTT | ANALYST   | 7566 | 1987-04-19 00:00:00 | 3000.00 |   NULL |     20 |     20 |  2175.000000 |
| 007839 | KING  | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 |   NULL |     10 |     10 |  2916.666667 |
| 007902 | FORD  | ANALYST   | 7566 | 1981-12-03 00:00:00 | 3000.00 |   NULL |     20 |     20 |  2175.000000 |
+--------+-------+-----------+------+---------------------+---------+--------+--------+--------+--------------+
6 rows in set (0.00 sec)

添加需求:

除以上要求外,显示办公地点:

mysql> select ename, dept.loc, t1.deptno from (select ename, emp.deptno, sal from emp, (select  deptno, avg(sal) 平均工资 from emp group by deptno) as tmp wherre emp.deptno=tmp.deptno and emp.sal > 平均工资) as t1, dept where t1.deptno=dept.deptno;
+-------+----------+--------+
| ename | loc      | deptno |
+-------+----------+--------+
| ALLEN | CHICAGO  |     30 |
| JONES | DALLAS   |     20 |
| BLAKE | CHICAGO  |     30 |
| SCOTT | DALLAS   |     20 |
| KING  | NEW YORK |     10 |
| FORD  | DALLAS   |     20 |
+-------+----------+--------+
6 rows in set (0.00 sec)

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

//方法一
mysql> select ename, sal, t1.deptno, mymax from emp t1, (select deptno, max(sal) mymax from emp group by deptno) t2 where t1.deptno=t2.deptno and t1.sal=t2.mym
max;
+-------+---------+--------+---------+
| ename | sal     | deptno | mymax   |
+-------+---------+--------+---------+
| BLAKE | 2850.00 |     30 | 2850.00 |
| SCOTT | 3000.00 |     20 | 3000.00 |
| KING  | 5000.00 |     10 | 5000.00 |
| FORD  | 3000.00 |     20 | 3000.00 |
+-------+---------+--------+---------+
4 rows in set (0.00 sec)


//方法二
mysql> select ename, sal, deptno, sal 最高工资 from emp where sal in (select max(sal) from emp group by deptno);
+-------+---------+--------+--------------+
| ename | sal     | deptno | 最高工资     |
+-------+---------+--------+--------------+
| BLAKE | 2850.00 |     30 |      2850.00 |
| SCOTT | 3000.00 |     20 |      3000.00 |
| KING  | 5000.00 |     10 |      5000.00 |
| FORD  | 3000.00 |     20 |      3000.00 |
+-------+---------+--------+--------------+
4 rows in set (0.00 sec)

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

方法1:使用多表

mysql> select t1.dname, t1.loc, t2.dept_num, t1.deptno  from dept t1, (select deptno, count(*) dept_num from emp group by deptno) t2 where t1.deptno=t2.deptno;
;
+------------+----------+----------+--------+
| dname      | loc      | dept_num | deptno |
+------------+----------+----------+--------+
| ACCOUNTING | NEW YORK |        3 |     10 |
| RESEARCH   | DALLAS   |        5 |     20 |
| SALES      | CHICAGO  |        6 |     30 |
+------------+----------+----------+--------+
3 rows in set (0.00 sec)

方法2:使用子查询 

-- 1. 对EMP表进行人员统计
select count(*), deptno from emp group by deptno;
-- 2. 将上面的表看作临时表
select dept.deptno, dname, mycnt, loc from dept,
(select count(*) mycnt, deptno from emp group by deptno) tmp
where dept.deptno=tmp.deptno;

解决多表问题的本质:想办法将多表转化成为单表,所以在mysql中,所有select的问题都可以转化成为单表问题 


合并查询

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

union

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

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

会去除重复行

mysql> select ename, sal, job from EMP where sal>2500 union
-> select ename, sal, job from EMP where job='MANAGER';--去掉了重复记录
+-------+---------+-----------+
| ename | sal | job |
+-------+---------+-----------+
| JONES | 2975.00 | MANAGER |
| BLAKE | 2850.00 | MANAGER |
| SCOTT | 3000.00 | ANALYST |
| KING | 5000.00 | PRESIDENT |
| FORD | 3000.00 | ANALYST |
| CLARK | 2450.00 | MANAGER |
+-------+---------+-----------+

union all

案例:将工资大于25000或职位是MANAGER的人找出来

注意:列数必须要是一样的,不会去除重复行

mysql> select ename, sal, job from emp where sal>2500 union all
-> select ename, sal, job from emp where job='MANAGER';
+-------+---------+-----------+
| ename | sal | job |
+-------+---------+-----------+
| JONES | 2975.00 | MANAGER |
| BLAKE | 2850.00 | MANAGER |
| SCOTT | 3000.00 | ANALYST |
| KING | 5000.00 | PRESIDENT |
| FORD | 3000.00 | ANALYST |
| JONES | 2975.00 | MANAGER |
| BLAKE | 2850.00 | MANAGER |
| CLARK | 2450.00 | MANAGER |
+-------+---------+-----------+

实战OJ练习


获取所有非manager的员工emp_no_牛客题霸_牛客网

获取所有员工当前的manager_牛客题霸_牛客网

获取所有员工当前的manager_牛客题霸_牛客网

 结语:

       随着这篇博客接近尾声,我衷心希望我所分享的内容能为你带来一些启发和帮助。学习和理解的过程往往充满挑战,但正是这些挑战让我们不断成长和进步。我在准备这篇文章时,也深刻体会到了学习与分享的乐趣。    

         在此,我要特别感谢每一位阅读到这里的你。是你的关注和支持,给予了我持续写作和分享的动力。我深知,无论我在某个领域有多少见解,都离不开大家的鼓励与指正。因此,如果你在阅读过程中有任何疑问、建议或是发现了文章中的不足之处,都欢迎你慷慨赐教。

        你的每一条反馈都是我前进路上的宝贵财富。同时,我也非常期待能够得到你的点赞、收藏,关注这将是对我莫大的支持和鼓励。当然,我更期待的是能够持续为你带来有价值的内容。


网站公告

今日签到

点亮在社区的每一天
去签到