MySQL基础篇(四)

news2025/1/16 2:41:28

多表查询

  1. 概述:多表查询就是多张表之间的查询。

    • 回顾:SELECT * FROM table_name

    • 多表查询 from 后面就得跟多张表。如:select * from emp,dept

在这里插入图片描述
笛卡尔积:笛卡尔积在数学中,表示两个集合,集合 A 和集合 B的所有组成情况。
在这里插入图片描述

  1. 如何在 sql 中去消除笛卡尔积尼?在sql 查询中,只需要加上一定的条件,就可以消除无效数据,消除笛卡尔积。

    • 比如,查询马云的时候,加上部门id 的条件,就可以消除其它无效数据

多表查询的分类

连接查询

  • 内连接查询(相当于查询我们集合的交集部分(C))
  • 在这里插入图片描述

内连接查询

  1. 注意:无法查询没有关联关系的数据
隐式内连接查询
  1. 语法:

    SELECT 字段列表 FROM1 ,2 WHERE 条件 ... ;
    
    SELECT * FROM emp,dept where emp.dept_id = dept.id
    

    在这里插入图片描述

显式内连接查询
  1. 语法

    SELECT 字段列表 FROM1 [ INNER ] JOIN2 ON 连接条件 ... ;
    
    SELECT * FROM emp JOIN dept on emp.dept_id = dept.id;
    

    在这里插入图片描述

内连接查询的案例
  1. 查询每一个员工的姓名 , 及关联的部门的名称 (隐式内连接实现)

    • 表结构: emp , dept
    • 连接条件: emp.dept_id = dept.id
    SELECT emp.name '员工姓名' ,dept.name '部门名称' from emp,dept where emp.dept_id = dept.id;
    
    
    SELECT e.name '员工姓名', d.name '部门名称'
    			FROM emp e,dept d 
    			where e.dept_id = d.id;
    

    在这里插入图片描述

查询每一个员工的姓名 , 及关联的部门的名称 (显式内连接实现) — INNER JOIN …ON …

  • 表结构: emp , dept
  • 连接条件: emp.dept_id = dept.id
SELECT e.name '员工姓名',d.name '部门名称' 
			FROM emp e JOIN dept d ON e.dept_id = d.id;
			
			
SELECT e.name '员工姓名',d.name '部门名称' 
			FROM emp e INNER JOIN dept d ON e.dept_id = d.id;

注意:一旦起了别名,就不能用表直接使用,此时只能使用别名,inner 可以省略(不影响任何效果,开发中基本不使用)
在这里插入图片描述

外连接查询

  1. 外连接查询分为左外连接和右外连接
左外连接
  1. 语法(包含左表的所有数据,也包含两张表交集的数据):

    SELECT 字段列表 FROM1 LEFT [ OUTER ] JOIN2 ON 条件 ... ;
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EcOddn7G-1692223409433)(day04.assets/image-20220622114232241.png)]
    SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 … ;
    在这里插入图片描述

外连接查询的案例
  1. 查询emp表的所有数据, 和对应的部门信息,由于需求中提到,要查询emp的所有数据,所以是不能内连接查询的,需要考虑使用外连接查询。

    • 表结构: emp, dept
    • 连接条件: emp.dept_id = dept.id
    SELECT e.*,d.* from emp e left join dept d on e.dept_id = d.id;
    
  2. 查询dept表的所有数据, 和对应的员工信息(右外连接)由于需求中提到,要查询dept表的所有数据,所以是不能内连接查询的,需要考虑使用外连接查询。

    • 表结构: emp, dept
    • 连接条件: emp.dept_id = dept.id
    SELECT e.*,d.* from emp e right join dept d on e.dept_id = d.id;
    SELECT e.*,d.* from  dept d left join emp e  on e.dept_id = d.id;
    
外连接查询注意
  1. 左外连接,右外连接可以相互替换(只不过是颠倒顺序的问题),在开发中,你任意使用,我偏向于喜欢左连接

自连接查询

  1. 概述:自己连接自己,也就是把一张表当成两张表来查询,自连接查询可以使用内连接或者外连接查询

  2. 语法(必须使用别名)

    SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ... ;
    
自连接查询的案例
  1. 查询员工 及其 所属领导的名字

    SELECT   e.name '员工姓名' , ee.name '领导名称'  FROM emp e,emp ee where e.managerid = ee.id
    
  2. 查询所有员工 emp 及其领导的名字 emp , 如果员工没有领导, 也需要查询出来

    SELECT   e.name '员工姓名' , ee.name '领导名称'  FROM emp e left join emp ee on e.managerid = ee.id
    

联合查询

  • union查询

    • 把多次查询的结果合并起来,形成一个新的查询结果集
  • union all 查询

    • 将全部的数据直接合并到一起(union) 会去重
  • 语法

    SELECT 字段列表 FROM 表名 ...
    UNION [ALL]
    SELECT 字段列表 FROM 表名 ...
    
  • 要求:对于联合查询,必须保持查询的列长度一致,字段类型也需要保持一致

  • 在这里插入图片描述

联合查询的案例
  1. 将薪资低于 5000 的员工 , 和 年龄大于 50 岁的员工全部查询出来.

    select * from emp where salary < 5000 
        union 
    select * from emp where age > 50 
    
  2. 注意:使用 union all 不会去重,只是把两张表的结果集做一个逻辑合并

  3. 在这里插入图片描述

子查询

  1. 概述,实质是一种嵌套查询,把查询出来的结果集作为新表来进行查询

  2. 语法:

    SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 );
    
  3. 对于增删改查来说,都可以使用子查询的方式

  4. 分类

    • 标量子查询(查询出来的结果是单个值)
    • 列子查询(子查询的结果为一列)
    • 行子查询(子查询出来的结果是一行)
    • 表子查询(子查询查出来的结果是多行多列的)
  5. 查询位置

    • where
    • from
    • select

标量子查询

  1. 查询结果是单个值(数值,日期),常用一些操作位,= ,!=,>,<,>=,<=

  2. 案例:

    • 查询 “研发部” 的所有员工信息

      SELECT * FROM emp where dept_id = (SELECT id from dept where name = '研发部');
      
    • 查询在 “马云” 入职之后的员工信息

      SELECT * FROM emp where entrydate > (SELECT entrydate from emp where name = '马云');
      

列子查询

  1. 子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。

    • 常用操作符
      • IN
      • NOT IN
      • ANY 有任意一个满足就行
      • SOME 有任意一个满足就行 ANY 和 SOME 可以替换
      • ALL 必须全部满足
  2. 案例:

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

      SELECT * FROM emp WHERE dept_id in (SELECT id FROM dept where name = '销售部' or name = '市场部');
      
    • 查询比 “财务部” 所有人工资都高的员工信息

      SELECT * FROM emp where salary > all(SELECT salary from emp where dept_id = (SELECT id from dept where name = '财务部'))
      
    • 查询比研发部其中任意一人工资高的员工信息

      SELECT * FROM emp WHERE salary > any(SELECT salary from emp where dept_id = (SELECT id from dept where name = '研发部'))
      

行子查询

  1. 概述:子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。

  2. 常用操作符

    • =
    • !=
    • IN
    • NOT IN
  3. 案例:

    • 查询与 “谢世煌” 的薪资及直属领导相同的员工信息

      SELECT 	* FROM emp where (managerid,salary) = (SELECT managerid,salary from emp where name = '谢世煌');
      

表子查询

  1. 概述:就是查询的结果返回多行多列,这种子查询就是表子查询

  2. 常用操作符

    • IN
  3. 案例

    • 查询与 “韩敏” , “蒋芳” 的职位和薪资相同的员工信息

      select * from emp where (job,salary) in ( SELECT job,salary from emp where name = '韩敏' or name = '蒋芳')
      
    • 查询入职日期是 “2006-01-01” 之后的员工信息 , 及其部门信息

      SELECT e.name '员工姓名' ,e.salary '薪资', d.name '部门名称' 
      	FROM  (SELECT * FROM emp where entrydate > '2006-01-01') e
      	LEFT JOIN dept d on  d.id = e.dept_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 join dept d on e.dept_id = d.id
    		WHERE e.age < 30
    
  3. 查询拥有员工的部门ID、部门名称

    SELECT distinct d.id ,d.name
        FROM emp e join dept d on 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  e.* ,s.id '薪资等级'
        FROM emp e left join salgrade s on  e.salary > s.losal and e.salary <= s.hisal 
    
  6. 查询 “研发部” 所有员工的信息及 工资等级

    SELECT * 
    		FROM (SELECT * FROM emp where dept_id = (SELECT id from dept where name = '研发部')) e left join salgrade s on e.salary > s.losal and e.salary <= s.hisal
    
  7. 查询 “研发部” 员工的平均工资

    SELECT avg(salary)
    		FROM emp where dept_id = (SELECT id from dept where name = '研发部')
    
  8. 查询工资比张瑛高的员工信息

    select * from emp where salary > (SELECT salary FROM emp where name = '张瑛')
    
  9. 查询比平均薪资高的员工信息

    select * from emp where salary > (select avg(salary) from emp)
    
  10. 查询低于本部门平均工资的员工信息

    SELECT * FROM emp e1 where e1.salary < (select avg(e2.salary) from emp e2 where e1.dept_id = e2.dept_id )
    
    • 分析复杂sql

      SELECT * FROM emp e1 where e1.salary < (
              SELECT n.avgSalary from (
                      SELECT avg(e.salary) avgSalary,d.name,d.id
                          FROM dept d left join emp e on d.id = e.dept_id
                          GROUP BY d.name
                  ) n
              where e1.dept_id = n.id
          )
          
      #第一步查询出部门信息的平均薪资
      SELECT avg(e.salary) avgSalary,d.name,d.id
      						FROM dept d left join emp e on d.id = e.dept_id
      						GROUP BY d.name
      						
      #第二步
      SELECT n.avgSalary from (
      					SELECT avg(e.salary) avgSalary,d.name,d.id
      						FROM dept d left join emp e on d.id = e.dept_id
      						GROUP BY d.name
      				) n
      				
      #第三步再建立子查询查出部门员工的平均薪资
      SELECT * FROM emp e1 where e1.salary < (
      			SELECT n.avgSalary from (
      					SELECT avg(e.salary) avgSalary,d.name,d.id
      						FROM dept d left join emp e on d.id = e.dept_id
      						GROUP BY d.name
      				) n
      			where e1.dept_id = n.id
      		)	
      
  11. 查询所有的部门信息, 并统计部门的员工人数

    SELECT d.name '部门名称' ,count(e.name)
        FROM dept d left join emp e on d.id = e. dept_id
        GROUP BY d.id
    		
    
    
    select d.name '部门名称',(select count(*) from emp e where e.dept_id = d.id) '人数'
    	from dept d;
    
    

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

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

相关文章

解决`idea`中`database`工具查询起别名乱码问题

文章目录 解决idea中database工具查询起别名乱码问题场景复现如何解决方式一 设置编码方式二&#xff1a;修改字体 原因说明 解决idea中database工具查询起别名乱码问题 场景复现 使用Idea做查询的并且起别名出现了中文乱码 如何解决 方式一 设置编码 settings->输入框输…

算法-滑动窗口-串联所有单词的子串

算法-滑动窗口-串联所有单词的子串 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/substring-with-concatenation-of-all-words/ 1.2 题目描述 2 滑动窗口Hash表 2.1 解题思路 构建一个大小为串联子串的总长的滑动窗口为每个words中的子串创建一个hash表, <子…

BTP Integration Suite学习笔记 - (Unit4) Developing with SAP Integration Suite

详细指导还是要看官方文档 4. 云集成管理 4.1 云集成介绍 什么是云集成&#xff1f; 前三章讲了很多内容&#xff0c;但都不是最核心的&#xff0c;通常我们用CPI是让他实现原来PI/PO的功能的&#xff0c;是用来做集成的。这章才刚开始。 云集成有以下几个特性&#xff1a;…

web基础http与apache

一、http相关概念&#xff1a; http概述&#xff1a; HTTP 是一种用作获取诸如 HTML 文档这类资源的协议。它是 Web 上进行任何数据交换的基础&#xff0c;同时&#xff0c;也是一种客户端—服务器&#xff08;client-server&#xff09;协议 为解决"用什么样的网络协…

添加了.gitignore 文件,git status 的时候还是显示修改文件

1. 用IAR 软件编译STM32 工程&#xff0c;IAR 会生成很多中间文件&#xff0c;这些文件是不需要加入到git 版本管理里面的 2. .gitignore 文件位置需要放对应目录才会起作用&#xff0c;递归起作用的 3. 如果 .gitignore文件中指定的文件或目录仍然显示在git status的输出中&a…

考研C语言进阶题库——更新41-50题

目录 41.编写程序要求输出整数a和b若a和b的平方和大于100&#xff0c;则输出a和b的平方和&#xff0c;否则输出a和b的和 42.现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的&#xff1a;第一项是1/1&#xff0c;第二项是是…

RHCE——四、Web服务器(理论篇)

Web服务器 一、Web服务器1、www简介1.1 常见Web服务程序介绍&#xff1a;1.2 服务器主机1.3 主要数据1.4 浏览器 2、网址及HTTP简介2.1 URL2.2 http请求方法:2.3 HTTP协议请求的工作流程&#xff1a; 3、www服务器的类型静态网站动态网站 二、快速安装Apache1、安装2、准备工作…

[oneAPI] 基于BERT预训练模型的SWAG问答任务

[oneAPI] 基于BERT预训练模型的SWAG问答任务 基于Intel DevCloud for oneAPI下的Intel Optimization for PyTorch基于BERT预训练模型的SWAG问答任务数据集下载和描述数据集构建问答选择模型训练 结果参考资料 比赛&#xff1a;https://marketing.csdn.net/p/f3e44fbfe46c465f4d…

nginx代理webSocket链接,webSocket频繁断开重连

一、场景 1、使用nginx代理webSocket链接&#xff0c;消息发送和接收都是正常的&#xff0c;但webSocket链接会频繁断开重连 2、如果不使用nginx代理则一切正常 3、程序没有做webSocket心跳处理 如下图 二、nginx代理配置 upstream cloud_ass {#ip_hash;server 192.168.1.…

计组 | 寻址方式

目录 一、知识点 1.寻址方式什么&#xff1f; 2.根据操作数所在的位置&#xff0c;都有哪些寻址方式&#xff1f; 3.直接寻址 4.立即寻址 5.隐含寻址 6.相对寻址 7.寄存器 8.寄存器-寄存器型&#xff08;RR&#xff09;、寄存器-存储器型&#xff08;RS&#xff09;和…

C语言<自定义类型>结构体、枚举、联合

✨Blog&#xff1a;&#x1f970;不会敲代码的小张:)&#x1f970; &#x1f251;推荐专栏&#xff1a;C语言&#x1f92a;、Cpp&#x1f636;‍&#x1f32b;️、数据结构初阶&#x1f480; &#x1f4bd;座右铭&#xff1a;“記住&#xff0c;每一天都是一個新的開始&#x1…

手写Vue3响应式数据原理

Vue3响应式数据 前言一、proxy是什么&#xff1f;1.1 proxy基本使用 二、实现最基本的reactive函数三、实现基本响应式系统四、完善基本响应式系统4.1 执行每一个副作用函数4.2 实现依赖收集4.2.1 基本实现 4.3 改进桶结构 五、相关面试题1.Object.defineProperty 和 Proxy 的区…

AMBA_AXI Protocol_Transaction Identifiers

AXI Protocol_Transaction Identifiers Transaction Identifiers&#xff08;事务标识符&#xff09; 1. AXI事务标识符简介 2. ID信号. 读数据顺序. 写数据顺序. 使用事务标识符的互联1. AXI事务标识符简介 AXI协议包含AXI事务标识符&#xff08;AXI ID&#xff09;&#x…

2023-8-22 双链表

题目链接&#xff1a;双链表 #include <iostream>using namespace std;const int N 100010;int e[N], l[N], r[N], idx;void init() {r[0] 1;l[1] 0;idx 2; }void add(int k, int x) {e[idx] x;r[idx] r[k];l[idx] k;l[r[k]] idx;r[k] idx;idx ; }void remove…

前端需要理解的HTML知识

HTML&#xff08;超文本标记语言&#xff0c;HyperText Markup Language&#xff09;不是编程语言&#xff0c;而是定义了网页内容的含义和结构的标记语言。。“超文本”&#xff08;hypertext&#xff09;是指连接单个网站内或多个网站间的网页的链接。HTML 使用“标记”&…

BootstrapBlazor组件使用:数据注解

文章目录 前言BB数据注解数据注解源码数据注解简介注解简单实例[BB 编辑弹窗](https://www.blazor.zone/edit-dialog)[ValidateForm 表单组件](https://www.blazor.zone/validate-form)使用简介 前言 BootstrapBlazor(一下简称BB)是个特别好用的组件&#xff0c;基本上满足了大…

bh003- Blazor hybrid / Maui 使用蓝牙BLE快速教程

1. 建立工程 bh003_ble 源码 2. 添加 nuget 包 <PackageReference Include"BlazorHybrid.Maui.Permissions" Version"0.0.2" /> <PackageReference Include"BootstrapBlazor" Version"7.*" /> <PackageReference In…

机器学习笔记之优化算法(十九)经典牛顿法的收敛性分析

机器学习笔记之优化算法——经典牛顿法的收敛性分析 引言回顾&#xff1a;算法的收敛性分析 Wolfe \text{Wolfe} Wolfe准则的收敛性分析梯度下降法在凸函数的收敛性分析梯度下降法在强凸函数的收敛性分析 经典牛顿法的收敛性分析收敛性定理介绍证明过程关于隐含条件的说明 引言…

Spring之域对象共享数据

文章目录 前言一、requset域1.使用ServletAPI向request域对象共享数据2.使用ModelAndView向request域对象共享数据3.使用Model向request域对象共享数据4.使用map向request域对象共享数据5.使用ModelMap向request域对象共享数据6.Model、ModelMap、Map的关系 二、session域向ses…

语谱图(一) Spectrogram 的定义与机理

1. 语谱图 spectrogram 在音频、语音信号处理领域&#xff0c;我们需要将信号转换成对应的语谱图(spectrogram)&#xff0c;将语谱图上的数据作为信号的特征。 语谱图的横坐标是时间&#xff0c;纵坐标是频率&#xff0c;坐标点值为语音数据能量。由于是采用二维平面表达三维…