MySQL-----多表查询(二)

目录

一.子查询概述:

二:标量子查询:

 三:列子查询:

四:行子查询:

五:表子查询:

六:练习部分:


写在之前:本文承接上文MySQL-----多表查询(一)-CSDN博客

一.子查询概述:

首先引出子查询的概念:子查询指一个查询语句嵌套在另一个查询语句内部的查询,即SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询

SQL 中子查询的使用大大增强了 SELECT 查询的能力,因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得出一个数据结果,然后与这个数据结果(可能是某个标量,也可能是某个集合)进行比较。

如下面这种形式: 

SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 );

 子查询分类:

  • A. 标量子查询(子查询结果为单个值)
  • B. 列子查询(子查询结果为一列)
  • C. 行子查询(子查询结果为一行)
  • D. 表子查询(子查询结果为多行多列)

查询位置可分为:

  • A. WHERE之后
  • B. FROM之后
  • C. SELECT之后

接着,基于上面的概述,相信你对子查询有了一定了解了,首先我们导入要查询的数据,下面在根据子查询的分类一个一个说明:(在查询之前,我们先导入数据(建立表以及表之间的关系)

-- 创建部门表
create table dept(
id int auto_increment comment 'ID' primary key,
name varchar(50) not null comment '部门名称'
)comment '部门表';
 
INSERT INTO dept (id, name) VALUES (1, '研发部'), (2, '市场部'),(3, '财务部'), (4,
'销售部'), (5, '总经办'), (6, '人事部');
-- 创建员工表
create table emp(
id int auto_increment comment 'ID' primary key,
name varchar(50) not null comment '姓名',
age int comment '年龄',
job varchar(20) comment '职位',
salary int comment '薪资',
entrydate date comment '入职时间',
managerid int comment '直属领导ID',
dept_id int comment '部门ID'
)comment '员工表';
-- 设置外键约束
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references
dept(id);
-- 插入数据
INSERT INTO emp (id, name, age, job,salary, entrydate, managerid, dept_id)
VALUES
(1, '金庸', 66, '总裁',20000, '2000-01-01', null,5),
(2, '张无忌', 20, '项目经理',12500, '2005-12-05', 1,1),
(3, '杨逍', 33, '开发', 8400,'2000-11-03', 2,1),
(4, '韦一笑', 48, '开发',11000, '2002-02-05', 2,1),
(5, '常遇春', 43, '开发',10500, '2004-09-07', 3,1),
(6, '小昭', 19, '程序员鼓励师',6600, '2004-10-12', 2,1),
(7, '灭绝', 60, '财务总监',8500, '2002-09-12', 1,3),
(8, '周芷若', 19, '会计',4800, '2006-06-02', 7,3),
(9, '丁敏君', 23, '出纳',5250, '2009-05-13', 7,3),
(10, '赵敏', 20, '市场部总监',12500, '2004-10-12', 1,2),
(11, '鹿杖客', 56, '职员',3750, '2006-10-03', 10,2),
(12, '鹤笔翁', 19, '职员',3750, '2007-05-09', 10,2),
(13, '方东白', 19, '职员',5500, '2009-02-12', 10,2),
(14, '张三丰', 88, '销售总监',14000, '2004-10-12', 1,4),
(15, '俞莲舟', 38, '销售',4600, '2004-10-12', 14,4),
(16, '宋远桥', 40, '销售',4600, '2004-10-12', 14,4),
(17, '陈友谅', 42, null,2000, '2011-10-12', 1,null);

创建好后的表中数据及其对应关系:

 

二:标量子查询:

子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。 常用的操作符:= <> > >= < <=

 案例演示(A,B表示查询例子,后面跟着的是查询步骤,后续一样,不再说明):

# 标量子查询:
-- A: 查询“销售部”的所有员工信息:

-- 第一步:查询销售部门id
select id from dept where name = '销售部';

-- 第二步:根据销售部门id,查询员工信息:
select * from emp where dept_id = (select id from dept where name = '销售部');

-- B: 查询在 "方东白" 入职之后的员工信息:

-- 第一步:查询 方东白 的入职日期:
select entrydate from emp where name = '方东白';

-- 第二步:查询指定入职日期之后的员工信息:
select * from emp where entrydate > (select entrydate from emp where name = '方东白');

查询结果(根据上述例A与例B展示)对比上述员工表与部门表可知,查询无误: 

 三:列子查询:

子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。常用的操作符:IN 、NOT IN 、 ANY 、SOME 、 ALL:

案例演示:

# 列子查询:

-- A: 查询“销售部”和“市场部”的的所有员工信息:

-- 第一步:查询“销售部”和“市场部”的部门id
select id from dept where name = '销售部' or name = '市场部';

-- 第二步:根据部门id,查询员工信息:
select * from emp where dept_id in (select id from dept 
where name = '销售部' or name = '市场部');

-- B: 查询比 财务部 所有人工资都高的员工信息:

-- 第一步:查询所有 财务部 人员工资:
select id from dept where name = '财务部';

select salary from emp where dept_id = (select id from dept where name = '财务部');

-- 第二步:比 财务部 所有人工资都高的员工信息:
select * from emp where salary > all (select salary from emp where
 dept_id = (select id from dept where name = '财务部'));
 
 -- C:查询比研发部其中任意一人工资高的员工信息:
 
 -- 第一步:查询研发部所有人工资:
 select id from dept where name = '研发部';
 
 select salary from emp where dept_id = ( select id from dept where name = '研发部');
 
 -- 第二步:根据部门id查询比研发部任意一人工资都高的员工信息:
 select * from emp where salary > any( select salary from emp where 
 dept_id = ( select id from dept where name = '研发部'));

查询结果(根据上述例A与例B例C展示):

四:行子查询:

子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。 常用的操作符:= 、<> 、IN 、NOT IN

案例演示:

 # 行子查询:
 
 -- A. 查询与 "张无忌" 的薪资及直属领导相同的员工信息:
 
 -- 第一步:查询 "张无忌" 的薪资及直属领导:
 select salary , managerid from emp where name = '张无忌';
 
 -- 第二步:查询与 "张无忌" 的薪资及直属领导相同的员工信息:
 select * from emp where (salary,managerid) = (select salary , managerid
	from emp where name = '张无忌');

查询结果:

五:表子查询:

子查询返回的结果是多行多列,这种子查询称为表子查询。 常用的操作符:IN

案例演示:


 #  表子查询:
 
 -- A:查询与 "鹿杖客" , "宋远桥" 的职位和薪资相同的员工信息

-- 第一步:查询 "鹿杖客" , "宋远桥" 的职位和薪资:
select job , salary from emp where name = '鹿杖客' or name = '宋远桥';

-- 第二步:查询与 "鹿杖客" , "宋远桥" 的职位和薪资相同的员工信息:
select * from emp where (job,salary) in (select job , salary from emp 
where name = '鹿杖客' or name = '宋远桥');

-- B:查询入职日期是 "2006-01-01" 之后的员工信息 , 及其部门信息:

-- 第一步: 入职日期是 "2006-01-01" 之后的员工信息:
select * from emp where entrydate > '2006-01-01';

-- 第二步: 查询这部分员工信息及其对应的部门信息:
select e.*,d.* from (select * from emp where entrydate > '2006-01-01')
e left join dept d on e.dept_id = d.id;

查询结果:

通过上面的学习,我们对多表查询有了一定认识,接下来练习一下加深印象:

六:练习部分:

此部分就不给出运行结果了,有需要可以自己尝试运行:

# 综合练习:

-- 1). 查询员工的姓名、年龄、职位、部门信息 (隐式内连接):
select e.name , e.age , e.job , d.name from emp e , dept d where e.dept_id = d.id;

-- 2). 查询年龄小于30岁的员工的姓名、年龄、职位、部门信息(显式内连接):
select e.name , e.age , e.job , d.name from emp e inner join dept d on e.dept_id =
d.id where e.age < 30;

-- 3). 查询拥有员工的部门ID、部门名称:
select distinct d.id , d.name from emp e , dept d where e.dept_id = d.id;

-- 4). 查询所有年龄大于40岁的员工, 及其归属的部门名称; 如果员工没有分配部门, 也需要展示出
来(外连接):
select e.*, d.name from emp e left join dept d on e.dept_id = d.id where e.age >
40 ;

-- 	5).查询 "研发部" 员工的平均工资:
select avg(e.salary) from emp e, dept d where e.dept_id = d.id and d.name = '研发部';

-- 6). 查询低于本部门平均工资的员工信息:
select * from emp e2 where e2.salary < ( select avg(e1.salary) from emp e1 where
e1.dept_id = e2.dept_id );


-- 7). 查询所有的部门信息, 并统计部门的员工人数:
select d.id, d.name , ( select count(*) from emp e where e.dept_id = d.id ) '人数'
from dept d;

 结语: 写博客不仅仅是为了分享学习经历,同时这也有利于我巩固知识点,总结该知识点,由于作者水平有限,对文章有任何问题的还请指出,接受大家的批评,让我改进。同时也希望读者们不吝啬你们的点赞+收藏+关注,你们的鼓励是我创作的最大动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/604830.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

万用板是什么?和印刷电路板一样吗?

同学们大家好&#xff0c;今天我们继续学习杨欣的《电子设计从零开始》&#xff0c;这本书从基本原理出发&#xff0c;知识点遍及无线电通讯、仪器设计、三极管电路、集成电路、传感器、数字电路基础、单片机及应用实例&#xff0c;可以说是全面系统地介绍了电子设计所需的知识…

Hikyuu-PF-银行股轮动交易策略实现

今天&#xff0c;带来的是“如何使用 Hikyuu 中的投资组合来实现银行股轮动交易策略”。 这个策略的逻辑很简单&#xff1a;持续持有两支市净率最低银行股&#xff0c;然后每月换仓 定义回测周期与回测标的 同样&#xff0c;首先定义回测周期&#xff1a; # 定义回测日期 …

基于Nios-II的流水灯

基于Nios-II的流水灯 一、Qsys设计&#xff08;一&#xff09;新建项目&#xff08;二&#xff09;Platfrom Designer&#xff08;三&#xff09;设置时钟主频&#xff08;四&#xff09;添加Nios-II Processor并设置&#xff08;五&#xff09;添加JTAG并配置&#xff08;六&a…

android_systemServer进程启动流程

一&#xff0c;systemServer进程是被Zygote进程fork出来的&#xff0c;具体代码&#xff0c; 在startBootstrapServices、startCoreServices、startOtherServices、startApexServices中&#xff0c;对各类服务进行了启动&#xff0c;比如我们常见的ActivityManagerService、Pa…

AI视频教程下载:用ChatGP在24小时内制作发布畅销电子书

这门变革性的课程使您能够利用内容生成和自行出版的新兴AI世界。利用ChatGPT 4等尖端人工智能工具&#xff0c;也称为ChatGPT Plus&#xff0c;您将获得所需的技能集&#xff0c;以创建引人入胜的内容&#xff0c;掌握设计&#xff0c;并成为亚马逊KDP上成功的自行出版作者 。 …

Parallels Desktop 19 for Mac v19.3.0.54924中文破解版

Parallels Desktop 19 for Mac v19.3.0.54924中文破解版是一款强大的虚拟机软件&#xff0c;支持多操作系统&#xff0c;提供卓越的虚拟化技术&#xff0c;确保流畅稳定的运行。新增特色功能如共享打印、TouchID集成等&#xff0c;提供便捷高效的虚拟机体验。界面美观现代&…

理解DPI:从数码到打印的深入分析

目录标题 1. DPI的定义2. DPI与图像质量2.1. 对于打印来说&#xff1a;2.2. 对于屏幕显示来说&#xff1a; 3. 如何计算DPI4. 调整DPI4.1. 提高DPI&#xff1a;4.2. 降低DPI&#xff1a; 5. DPI与图像文件大小的关系6. 实际应用中的DPI6.1. 专业打印&#xff1a;6.2. 屏幕设计&…

含义:理财风险等级R1、R2、R3、R4、R5

理财风险等级R1、R2、R3代表什么&#xff0c;为什么R1不保本&#xff0c;R2可能亏损 不尔聊投资https://author.baidu.com/home?frombjh_article&app_id1704141696580953 我们购买理财产品的时候&#xff0c;首先都会看到相关产品的风险等级。风险等级约定俗成有5级&…

谷歌十诫 Ten things we know to be true, Google‘s Core values

雷军曾经要求金山人人都必须能背谷歌十诫 我们所知的十件事 当谷歌刚成立几年时&#xff0c;我们首次写下了这“十件事”。我们时不时回顾这个列表&#xff0c;看看它是否仍然适用。我们希望它仍然适用——你也可以要求我们做到这点。 1. Focus on the user and all else wi…

三、Redis五种常用数据结构-Hash

Hash是redis中常用的一种无序数据结构。结构类似HashMap。 具体结构如下&#xff1a;key field value 1、优缺点 1.1、优点 同类数据归类整合储存&#xff0c;方便数据管理。相比于string操作消耗内存和CPU更小。分字段存储&#xff0c;节省网络流量。 1.2、缺点 过期时间…

Java数组的使用

前言 这里我使用的是IDEA编译器进行演示 数组的创建与初始化 创建格式&#xff1a; T[] 数组名 new T[N] T表示数组存放的数据类型&#xff0c;N表示数组的大小。 T[] 表示数组的类型。 这里要注意和C语言不同的是C语言使用类似int arr[10]这样的结构进行创建数组&#xff0c…

24V转3.8V用什么芯片方案-AH8310

在将24V降压至3.8V的电源转换中&#xff0c;AH8310是一个理想的选择。这款芯片是一款降压转换器&#xff0c;输入电压范围为4.5V至36V&#xff0c;输出电压可调&#xff0c;峰值电流可达1.5A。AH8310采用SOT23-6封装&#xff0c;内置MOS&#xff0c;适用于各种应用场合&#xf…

modprobe: can‘t open ‘modules.dep‘: No such file or directory

使用modprobe会提示modprobe: cant open modules.dep: No such file or directory 直接输入depmod即可。 如果depmod没有效果&#xff0c;则需要重新配置编译你的根文件。 在busybox配置界面进入linux Module Utilities, 上下键选择depmod&#xff0c;并按 y 选中&#xff0c…

【vue+vue-treeselect】根据指定字段,如isLeaf(是否末级节点),设置只允许末级节点可以选

1、当项目有特殊要求&#xff0c;必须根据某个字段的值去判断&#xff0c;是否节点可以选&#xff0c;即使已经是末级节点了&#xff0c;还是需要根据字段判断是否禁用 &#xff08;1&#xff09; :flat"true"一定要设置 (2)获取数据源的时候&#xff0c;设置下禁用…

leetcode91.解码方法(动态规划)

问题描述&#xff1a; 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; A -> "1" B -> "2" ... Z -> "26" 要 解码 已编码的消息&#xff0c;所有数字必须基于上述映射的方法&#xff0c;反向映射回字母&#xff08;可…

NineData亮相2024中国移动算力网络大会

4月28日至29日&#xff0c;2024中国移动算力网络大会在苏州召开。大会以“算力网络点亮AI新时代”为主题&#xff0c;全面展示了中国移动最新算力网络成果与能力。江苏省委常委、苏州市委书记刘小涛&#xff0c;副省长赵岩出席开幕式并致辞。内蒙古自治区副主席白清元出席。中国…

【JAVA语言-第20话】多线程详细解析(二)——线程安全,非线程安全的集合转换成线程安全

目录 线程安全 1.1 概述 1.2 案例分析 1.3 解决线程安全 1.3.1 synchronized关键字 1.3.1.1 同步代码块 1.3.1.2 同步方法 1.3.2 使用Lock锁 1.3.2.1 概述 代码示例 1.4 线程安全的类 1.4.1 非线程安全集合转换成线程安全集合 线程安全 1.1 概述 指如果有多…

JavaEE企业级开发中常用的JDK7和JDK8的时间类

JDK7时间类 全世界的时间有一个统一的计算标准 在同一条经线上的时间是一样的 格林威治时间 简称GMT 计算核心 地球自转一天是24小时 太阳直射正好是12小时 但是误差太大 现在用原子钟来代替 用铯原子震动的频率来计算时间&#xff0c;作为世界的标准时间UTC 中国标准时间…

Dockerfile实践java项目

目的&#xff1a;用java项目测试dockerfil部署&#xff08;前提是安装好了docker&#xff09; 部署准备文件如下 1. java项目 java项目demo地址 https://gitee.com/xiaoqu_12/dockerfileDemo.git 或者百度网盘直接下载打包好的jar包 链接&#xff1a;https://pan.baidu.com/s/…

Ansible---inventory 主机清单

一、inventory 主机清单 1.1、inventory介绍 hosts配置文件位置&#xff1a;/etc/ansible/hosts Inventory支持对主机进行分组&#xff0c;每个组内可以定义多个主机&#xff0c;每个主机都可以定义在任何一个或多个主机组内。 1.2、inventory中的变量 Inventory变量名含义…
最新文章