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

news2024/12/28 10:45:35

目录

一.子查询概述:

二:标量子查询:

 三:列子查询:

四:行子查询:

五:表子查询:

六:练习部分:


写在之前:本文承接上文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.coloradmin.cn/o/1638579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

邦注科技 温控箱对企业的重要性

注塑加工是将加热的熔融塑料注入模具中形成所需产品的工艺过程。良好的注塑加工工艺需要控制好许多参数&#xff0c;其中最重要的因素之一就是模具的温度。模具温度的不稳定会导致产品尺寸大小、表面缺陷等方面的问题&#xff0c;甚至会导致生产不良品&#xff0c;加大生产成本…

普冉PY32系列(十五) PY32F0系列的低功耗模式

目录 普冉PY32系列(一) PY32F0系列32位Cortex M0 MCU简介普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境普冉PY32系列(三) PY32F002A资源实测 - 这个型号不简单普冉PY32系列(四) PY32F002A/003/030的时钟设置普冉PY32系列(五) 使用JLink RTT代替串口输出日志普冉PY32…

【深入浅出MySQL】「性能调优」高性能查询优化MySQL的SQL语句编写

高性能查询优化MySQL的SQL语句编写准则这里写目录标题 总体优化大纲&#xff08;1&#xff09;优化查询性能&#xff1a;通过索引降低全表扫描频率优化方向案例介绍问题分析解决方案建立复合索引建立单独索引 &#xff08;2&#xff09;优化数据表与查询&#xff1a;合理使用非…

数组的扩容与缩容

数组的扩容与缩容 文章目录 数组的扩容与缩容数组的扩容内存分析 数组的缩容内存分析内存分析 数组的扩容 数组扩容是指当原有数组的空间不足以容纳更多的元素时&#xff0c;创建一个新的、长度更大的数组&#xff0c;并将原数组中的元素复制到新数组中&#xff0c;然后更新原…

OpenFeign夺命9连问

今天介绍一款服务调用的组件&#xff1a;OpenFeign&#xff0c;同样是一款超越先辈&#xff08;Ribbon、Feign&#xff09;的狠角色。 文章目录如下&#xff1a; 这篇文章之前陈某发过&#xff0c;全网阅读 10W &#xff0c;时隔一年发出来让大家复习复习&#xff0c;部分读者…

LNMP部署及应用(Linux+Nginx+MySQL+PHP)

LNMP 我们为什么采用LNMP这种架构? 采用Linux、PHP、MySQL的优点我们不必多说。 Nginx是一个小巧而高效的Linux下的Web服务器软件&#xff0c;是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的&#xff0c;已经在一些俄罗斯的大型网站上运行多年&#xff0c;目…

Spring - 10 ( 9000 字 Spring 入门级教程 )

一&#xff1a;MyBatis 进阶 动态 SQL 是 Mybatis 的强大特性之⼀&#xff0c;能够完成不同条件下不同的 sql 拼接。 1.1 if 标签 在注册用户的时候&#xff0c;可能会有这样⼀个问题&#xff0c;如下图所示&#xff1a; 注册分为两种字段&#xff1a;必填字段和非必填字段&…

【二】电力系统规约IEC 104详解

电力系统规约IEC 104详解 概述 很早就准备梳理出一下电力系统规约系列的文章&#xff0c;因为自己在实践过程中发现这方面太难找了&#xff0c;网上的资料也都比较陈旧。我接触和使用IEC系列规约也有一段时间了&#xff0c;本着总结和分享的想法&#xff0c;我想推出这系列的文…

Linux的基础IO:文件描述符 重定向本质

目录 前言 文件操作的系统调用接口 open函数 close函数 write函数 read函数 注意事项 文件描述符-fd 小补充 重定向 文件描述符的分配原则 系统调用接口-dup2 缓冲区 缓冲区的刷新策略 对于“2”的理解 小补充 前言 在Linux中一切皆文件&#xff0c;打开文件…

Android 音视频基础知识

本系列文章会介绍两个 Android NDK Demo&#xff0c;拉流端会实现一个基于 FFmpeg 的视频播放器 Demo&#xff0c;推流端会实现一个视频直播 Demo&#xff0c;当然在做 Demo 之前会介绍音视频的基础知识。以下是本系列文章的目录&#xff1a; Android 音视频基础知识 Android 音…

SpringBoot集成Kafka开发

4.SpringBoot集成Kafka开发 4.1 创建项目 4.2 配置文件 application.yml spring:application:name: spring-boot-01-kafka-basekafka:bootstrap-servers: 192.168.2.118:90924.3 创建生产者 package com.zzc.producer;import jakarta.annotation.Resource; import org.spri…

HTML5本地存储账号密码

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>HTML5本地存储账号密码</title> </head…

C语言/数据结构——每日一题(合并两个有序链表)

一.前言 嗨嗨嗨&#xff0c;大家好久不见&#xff01;今天我在LeetCode看到了一道单链表题&#xff1a;https://leetcode.cn/problems/merge-two-sorted-lists想着和大家分享一下&#xff0c;废话不多说&#xff0c;让我们开始今天的题目分享吧。 二.正文 1.1题目描述 1.2题…

2.2 Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3-基础-Vue基本语法

文本渲染指令 文本渲染指令-v-html与v-text Vue使用了基于HTML的模板语法&#xff0c;允许开发者声明式地将DOM绑定至底层Vue实例的数据。所有Vue的模板都是 合法的HTML&#xff0c;所以能被遵循规范的浏览器和HTML解析器解析。 在前面&#xff0c;我们一直使用的是字符串插…

利用STM32实现语音识别功能

引言 随着物联网和智能设备的普及&#xff0c;语音识别技术正逐渐成为用户交互的主流方式之一。 STM32微控制器具备处理高效率语音识别算法的能力&#xff0c;使其成为实现低成本、低功耗语音交互系统的理想选择。 本教程将介绍如何在STM32平台上开发和部署一个基础的语音识…

创建codereview

创建codereview流程 一、开始创建二、选择分支三、添加细节 一、开始创建 点击codereivew按钮 为新的codereview选择一个工程后点击create review 二、选择分支 选择目标分支和要比对的分支&#xff0c;比如develop 三、添加细节 Add branch后&#xff0c;可以继续Edit …

Linux深入学习内核 - 中断与异常(下)

软中断&#xff0c;Tasklet和Work Queue 由内核执行的几个任务之间有一些不是紧急的&#xff0c;他们可以被延缓一段时间&#xff01;把可延迟的中断从中断处理程序中抽出来&#xff0c;有利于使得内核保持较短的响应时间&#xff0c;所以我们现在使用以下面的这些结构&#x…

JVM的垃圾回收机制(GC机制)

在Java代码运行的过程中&#xff0c;JVM发现 某些资源不需要再使用的时候&#xff0c;就会自动把资源所占的内存给回收掉&#xff0c;就不需要程序员自行操作了。“自动回收资源”就是JVM的“垃圾回收机制”&#xff0c;“垃圾回收机制”也称"GC机制"。 对于Java代码…

文心一言 VS 讯飞星火 VS chatgpt (250)-- 算法导论18.2 3题

三、请说明如何在一棵 B 树中找出最小关键字&#xff0c;以及如何找出某一给定关键字的前驱。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 在B树&#xff08;也称为B-tree&#xff09;中&#xff0c;最小的关键字总是位于最左边的叶子节点的最左边的元素。要…

C++ | 类和对象(中) (构造函数 | 析构函数 | 拷贝构造函数 | 赋值运算符重载 | 取地址 | const取地址)

目录 默认成员函数 构造函数 构造函数是什么 构造函数特征 什么是默认构造函数 注意事项 编译器自动生成的默认构造 缺省值 对象如何传值给构造函数 初始化列表 析构函数 析构函数的特征 编译器默认生成的析构函数 总结 拷贝构造函数 拷贝构造函数的使用场景 拷…