Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【MySql】复合查询

【MySql】复合查询

作者头像
平凡的人1
发布于 2023-10-15 04:30:13
发布于 2023-10-15 04:30:13
24600
代码可运行
举报
运行总次数:0
代码可运行
前面我们讲解的mysql表的查询都是对一张表进行查询,在实际开发中这远远不够。

回顾基本查询

回顾一下前面所学的基本查询,通过一些案例来练习回顾:

  • 查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select  * from emp where (sal>500 or job='MANAGER') and ename like 'J%';


select  * from emp where (sal>500 or job='MANAGER') and substring(ename,1,1)='J';
  • 按照部门号升序而雇员的工资降序排序
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from emp order by deptno asc,sal desc;
  • 使用年薪进行降序排序
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select ename,sal,comm,sal*12+ifnull(comm,0) 年薪 from emp order by 年薪 desc;
  • 显示工资最高的员工的名字和工作岗位
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from emp where sal=(select max(sal) from emp);
  • 显示工资高于平均工资的员工信息
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from emp where sal > (select avg(sal) from emp);
  • 显示每个部门的平均工资和最高工资
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select deptno, max(sal)最高,format(avg(sal),2) 平均 from emp group by deptno;
  • 显示平均工资低于2000的部门号和它的平均工资
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select deptno,avg(sal) 平均工资 from emp group by deptno having avg(sal)<2000;

-- select deptno,avg(sal) 平均工资 from emp group by deptno having 平均工资<2000;
  • 显示每种岗位的雇员总数,平均工资
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select job,count(*) 人数,format(avg(sal),2) 平均工资 from emp group by job;

多表查询

实际开发中往往数据来自不同的表,所以需要多表查询。现在我们用三张表EMP,DEPT,SALGRADE来演示多表查询。

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

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

将数据进行穷举组合——就是笛卡尔积,此时可以理解为把两张表变成了一张表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select ename,sal,dname from emp,dept where emp.deptno=dept.deptno;
  • 显示部门号为10的部门名,员工名和工资
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select ename,sal,dname from emp,dept where emp.deptno=dept.deptno and emp.deptno=10;
  • 显示各个员工的姓名,工资,及工资级别
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select ename,sal,grade,losal,hisal from emp,salgrade where sal between losal and hisal;

自连接

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

举个例子:

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

想找FORD的领导的编号,通过EMP表;根据领导的编号,找领导信息,也是通过EMP表:

使用的子查询

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select ename,empno from emp where empno=(select  mgr from emp where ename='FORD');

使用多表查询(自查询):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select e2.ename,e2.empno from emp e1,emp e2 where e1.ename='FORD' and e1.mgr=e2.empno;

子查询

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

单行子查询

返回一行记录的子查询

  • 显示SMITH同一部门的员工
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from emp where deptno=(select deptno from emp where ename='SMITH');

多行子查询

返回多行记录的子查询

  • in关键字;查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select ename,job,sal,deptno from emp where job in (select distinct job from emp where deptno=10) and deptno <> 10;

如果此时还想知道对应的员工属于哪个部门的名字呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select ename,job,sal,dname from (select ename,job,sal,deptno from emp where job in (select distinct jobb from emp where deptno=10) and deptno <> 10) as tmp,dept where dept.deptno=tmp.deptno;
  • all关键字;显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

第一种做法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from emp where sal > (select max(sal) from emp where deptno=30);

第二种做法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from emp where sal>all(select distinct sal from emp where deptno=30);
  • any关键字;显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from emp where sal > any(select distinct sal from emp where deptno=30);

多列子查询

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

  • 查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from emp where (deptno,job) = (select deptno,job from emp where ename ='SMITH') and ename <>'SMITH';

-- select * from emp where (deptno,job) in (select deptno,job from emp where ename ='SMITH') and ename <> 'SMITH';

我们前面说了,任何时刻,查询出来的临时结构,本质在逻辑上也是表结构!

我们上面的子查询全部都是在where子句中,充当判断条件。

下面,我们来看一看在from子句中使用子查询。

在from子句中使用子查询

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

  • 显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from emp,(select deptno,avg(sal) myavg from emp group by deptno) tmp where emp.deptno=tmp.deptno and emp.sal> tmp.myavg;
  • 查找每个部门工资最高的人的姓名、工资、部门、最高工资
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.mymax;
  • 显示每个部门的信息(部门名,编号,地址)和人员数量
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.dtno=t2.deptno;

合并查询

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

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

  • 将工资大于2500或职位是MANAGER的人找出来
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from emp where sal > 2500 union select * from emp where job='MANAGER';

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from emp where sal > 2500 union all select * from emp where job='MANAGER';

OJ题目

查找所有员工入职时候的薪水情况

描述 查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序(请注意,一个员工可能有多次涨薪的情况) CREATE TABLE employees ( emp_no int(11) NOT NULL, birth_date date NOT NULL, first_name varchar(14) NOT NULL, last_name varchar(16) NOT NULL, gender char(1) NOT NULL, hire_date date NOT NULL, PRIMARY KEY (emp_no)); CREATE TABLE salaries ( emp_no int(11) NOT NULL, salary int(11) NOT NULL, from_date date NOT NULL, to_date date NOT NULL, PRIMARY KEY (emp_no,from_date)); 输入描述: 无

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select s.emp_no,s.salary from salaries s,employees e
where e.emp_no=s.emp_no and e.hire_date=s.from_date
order by e.emp_no desc;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL复合查询
对于CURD之一的查找,他作为最重要的操作,仅仅在一张表之中查是不够的,还需要在多表之间进行查询,复合查询就是解决多表查询的问题。
每天都要进步呀
2023/10/16
2230
MySQL复合查询
【MySQL】复合查询
查询工资高于 500 或岗位为 MANAGER 的雇员,同时还要满足他们的姓名首字母为大写的 J
YoungMLet
2024/03/01
1410
【MySQL】复合查询
MySQL 多表查询与复杂查询技巧实战
实际开发中往往数据来自不同的表,所以需要多表查询。本节我们用一个简单的公司管理系统,有三张表EMP,DEPT,SALGRADE来演示如何进行多表查询。
用户11286421
2025/03/24
1290
MySQL 多表查询与复杂查询技巧实战
OracleDBA之表管理
  下面是Oracle表管理的部分,用到的测试表是oracle数据库中scott用户下的表做的测试,有的实验也用到了hr用户的数据,以下这些东西是我的麦库上存的当时学Oracle的学习笔记今天拿出来和大家分享一下,转载请注明出处,下面用的Oracle的版本是10g,用的时WinServer2003的操作系统,可能有些命令和Oracle11g的有所不同,但大部分是一样的,接下来还会陆续的分享一下Oracle中对数据库的管理,对表的管理,还有Oracle中的存储过程和PL/SQL编程。用到的Oracle的管理工
lizelu
2018/01/12
1.1K0
MySQL 多表查询
多表查询是指基于两个和两个以上的表查询.在实际应用中,查询单个表可能不能满足你的需求.
用户9615083
2022/12/25
4K0
MySQL 多表查询
数据库表中常用的查询实验
select ename,sal from emp where deptno=10;
Twcat_tree
2022/11/30
1K0
SQL员工部门表综合查询60题
CREATE DATABASE oa; USE oa; CREATE TABLE dept( deptno INT PRIMARY KEY, dname VARCHAR(20), loc VARCHAR(20) ) DROP TABLE emp CREATE TABLE emp( empno INT PRIMARY KEY, ename VARCHAR(20) NOT NULL, job VARCHAR(20) CHECK (job IN ('CLERK','SALESMAN','MANAGER','
Albert陈凯
2018/04/04
5.3K0
mysql练习(含答案)
表结构 DROP DATABASE IF EXISTS test1; CREATE DATABASE test1; USE test1; ##部门表 #DROP IF EXISTS TABLE DEPT; CREATE TABLE DEPT( DEPTNO int PRIMARY KEY,##部门编号 DNAME VARCHAR(14) , ##部门名称 LOC VARCHAR(13) ##部门地址 ) ; INSERT INTO DEPT VALUES (10,'ACCOU
Java学习
2018/04/17
2.6K0
mysql练习(含答案)
常用sql查询语句
5.9 合并查询(union 并集, intersect 交集, union all 并集+交集, minus差集)
FGGIT
2024/10/15
1330
Java补充之MySQL入门必备知识
mysql5.5 mysql5.6 mysqI5.7(稳定) mysql8 更高版本
timerring
2023/05/24
1.5K0
Java补充之MySQL入门必备知识
MySQL面试题(二)
-- 9.查询出emp表中,部门名称、部门编号并且工作内容为clerk的员工名称和员工岗位.
兔云小新LM
2019/07/22
5100
MySQL经典练习题+解题思路(三)
CSDN话题挑战赛第2期 参赛话题:学习笔记 个人主页:BoBooY的CSDN博客_Java领域博主 前言:在上一期中我们讲解了MySQL的入门知识点,但理论总还是要通过实践来印证,学了再多不练也是白费,这一期我们讲解MySQL的一些经典查询例题帮助大家巩固已学知识点,如在做题过程中有知识点的遗忘,可以参考往期文章: MySQL入门知识点(上):https://blog.csdn.net/qq_58233406/article/details/127143537 MySQL入门知识点(下)
啵啵鱼
2022/11/23
4170
MySQL经典练习题+解题思路(三)
【MySQL】多表查询
首先,为了方便说明问题,创建两个表emp(雇员信息)和dept(雇员部门信息),其数据如下:
全栈程序员站长
2022/08/23
3.2K0
【MySQL】多表查询
hql和sql练习题
select t.ename,t.empno,t.deptno from emp t where t.job = ‘CLERK’
用户9184480
2024/12/17
830
单表查询练习
# ORDER BY price DESC 排序查询, DESC是降序 ASC是升序 默认 ASC -- 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 -- 格式: -- SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; -- ASC 升序 (默认) -- DESC 降序 SELECT pname,price FROM product ORDER BY price DESC; SELECT pid,pname,price
名字是乱打的
2022/05/13
9740
MYSQL数据库-复合查询
MYSQL数据库-复合查询 零、前言 一、基本查询 二、多表查询 三、自连接 四、子查询 1、单行子查询 2、多行子查询 3、多列子查询 3、在from子句中使用子查询 五、合并查询 1、union 2、union all 零、前言 本章主要讲解学习MYSQL数据库中的复合查询,前面我们讲解的mysql表的查询都是对一张表进行查询,在实际开发中这远远不够 一、基本查询 示例: 查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J 按照部门号升序而雇员的工资降序排序
用户9645905
2022/12/11
13.3K0
MYSQL数据库-复合查询
数据库相关
【数据库系统概述】 常用的数据库有MySql、oracle等。不同数据库都支持sql标准,并且不同数据库在sql标准的基础上进行了一些扩充。 对于数据库的学习包括:sql>过程、触发器等内容,其中重要程度如下: sql>过程、触发器等 oracle数据库: 1、oracle的开发部分,包含两个部分:sql+plsql编程 2、oracle管理部分,数据库配置和运行维护 【oracle简介】 oracle默认有sys和system两个用户,其中 sys: 超级管理员,拥有操作数据库的所有权限 syst
代码改变世界-coding
2018/07/03
1.9K0
MySQL入门学习笔记(上)
英文单词DataBase,简称DB。按照一定格式存储数据的一些文件的组合。 顾名思义:存储数据的仓库,实际上就是一堆文件。这些文件中存储了具有特定格式的数据。
啵啵鱼
2022/11/23
1.8K0
MySQL入门学习笔记(上)
Oracle学习笔记二
格式: select * from 表1,表2   select * from emp;   select * from dept;
Kevin_Zhang
2018/08/20
7090
Oracle学习笔记二
Oracle 数据库查询专题 (select * from emmmm 80 T)
传送门: Oracle数据库学习笔记 (四 —— select 从入门到放弃 【上】) Oracle数据库学习笔记 (四 —— select 从入门到放弃 【下】)
Gorit
2021/12/09
4700
相关推荐
MySQL复合查询
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验