SQL语法 之 数据库多表查询

news2024/12/27 4:02:37

对这篇文章的延申

Mysql-全外连接-Union和Union ALL的辨析及练习-CSDN博客

其他SQL系列文章:

MySQL《一》-数据库基础_宋红康主要课程-CSDN博客

MySQL《二》-基本查询语句(Select)-CSDN博客

Mysql - 定点型(DECIMAL)的使用详解及练习-CSDN博客

MySQL-关于逻辑架构与存储引擎看这一篇就够了-CSDN博客

MySQL - 创建表的三种方法详解及练习_mysql 建表练习-CSDN博客

MySQL- in(集合) 和 not in(...) 的使用和练习_mysql in组合-CSDN博客

MySql-substring函数和substring_index函数的使用及练习_substring_index语句-CSDN博客MySQL - 表达式With as 语句的使用及练习_mysql with as update-CSDN博客

MySQL-日期时间函数详解及练习-CSDN博客

Mysql- 流程函数-(If, CASE WHEN)的使用及练习_mysql case when-CSDN博客

目录

一、🥪笛卡尔积

1. 笛卡尔积定义

2. 表连接的约束条件

二、多表连接查询

1. 🥪内连接(INNER JOIN)

2. 外连接(OUTER JOIN)

2.1. 🥪左连接(LEFT JOIN)

 2.2. 🥪右外连接(RIGHT JOIN)

2.3. 🥪全外连接(UNION,UNION ALL)

3. 🥪自连接

4. 练习题1-行转列

5. 牛客练习题:


一、🥪笛卡尔积

1. 笛卡尔积定义

定义:将两(或多)个表的所有行进行组合,连接后的行数为两(或多)个表的乘积数.

实际开发中应该避免全笛卡尔积 ----在 where 加入有效的连接条件【等值连接】

在MySQL中如下情况会出现笛卡尔积,主要是因为缺少关联条件或者关联条件不准确

注:外连接必须写关联条件,否则报语法错误

#笛卡尔积#查询员工姓名和所在部门名称
SELECT ename,dname FROM t_employee,t_department;
SELECT ename,dname FROM t_employee INNER JOIN t_department;
SELECT ename,dname FROM t_employee CROSS JOIN t_department;
SELECT ename,dname FROM t_employee JOIN t_department;

2. 表连接的约束条件

表连接的约束条件可以有三种方式:WHERE, ON, USING

  • WHERE:适用于所有关联查询

  • ON:只能和JOIN一起使用,只能写关联条件。虽然关联条件可以并到WHERE中和其他条件一起写,但分开写可读性更好。

  • USING:只能和JOIN一起使用,而且要求两个关联字段在关联表中名称一致,而且只能表示关联字段值相等

#关联条件#把关联条件写在where后面
SELECT ename,
           dname 
FROM t_employee,
     t_department 
WHERE t_employee.dept_id = t_department.did; 


#把关联条件写在on后面,只能和JOIN一起使用
SELECT ename,
           dname 
FROM t_employee 
INNER JOIN t_department 
ON t_employee.dept_id=t_department.did;


#把关联字段写在using()中,只能和JOIN一起使用
#而且两个表中的关联字段必须名称相同,而且只能表示=
#查询员工姓名与基本工资
SELECT ename,
           basic_salary 
FROM t_employee 
INNER JOIN t_salary 
USING(eid); 

#n张表关联,需要n-1个关联条件
#查询员工姓名,基本工资,部门名称
SELECT ename,
           basic_salary,
           dname 
FROM t_employee,
         t_department,
         t_salary
WHERE t_employee.dept_id = t_department.did 
AND t_employee.eid=t_salary.eid; 

二、多表连接查询

1. 🥪内连接(INNER JOIN)

有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行

格式:

隐式:SELECT [cols_list] from 表1,表2 where [condition]
显式:SELECT [cols_list] from 表1 INNER JOIN 表2 ON [关联条件] where [其他筛选条件]
SELECT [cols_list] from 表1 CROSS JOIN 表2 ON [关联条件] where [其他筛选条件]
SELECT [cols_list] from 表1 JOIN 表2 ON [关联条件] where [其他筛选条件]

MySql-substring函数和substring_index函数的使用及练习_substring_index语句-CSDN博客

#内连接#查询员工姓名和所在部门名称
--隐式:SELECT [cols_list] from 表1,表2 where [condition]
SELECT ename,
           dname 
FROM t_employee,
          t_department 
WHERE t_employee.dept_id = t_department.did;

-----------------------------
--显式:SELECT [cols_list] from 表1 INNER JOIN 表2 ON [关联条件] where [其他筛选条件]
SELECT ename,
           dname 
FROM t_employee 
INNER JOIN t_department 
ON t_employee.dept_id=t_department.did;

-----------------------------
--SELECT [cols_list] from 表1 CROSS JOIN 表2 ON [关联条件] where [其他筛选条件]
SELECT ename,
           dname 
FROM t_employee 
CROSS JOIN t_department 
ON t_employee.dept_id = t_department.did;

-----------------------------
--SELECT [cols_list] from 表1 JOIN 表2 ON [关联条件] where [其他筛选条件]
SELECT ename,
           dname 
FROM t_employee 
JOIN t_department 
ON t_employee.dept_id=t_department.did; 

 

2. 外连接(OUTER JOIN)

外连接分为:

左外连接(LEFT OUTER JOIN),简称左连接(LEFT JOIN)

右外连接(RIGHT OUTER JOIN),简称右连接(RIGHT JOIN)

全外连接(FULL OUTER JOIN),简称全连接(FULL JOIN)。

2.1. 🥪左连接(LEFT JOIN)

-- 返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。
#左连接
#查询所有部门信息以及该部门员工信息
SELECT did,
           dname,
           eid,
           ename 
FROM t_department 
LEFT OUTER JOIN 
t_employee 
ON t_department.did = t_employee.dept_id;
 2.2. 🥪右外连接(RIGHT JOIN)

-- 恰与左连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。
#查询所有部门信息以及该部门员工信息
SELECT did,
           dname,
           eid,
           ename 
FROM t_employee 
RIGHT OUTER JOIN t_department
ON t_department.did = t_employee.dept_id;
2.3. 🥪全外连接(UNION,UNION ALL

mysql不支持FULL JOIN,但是可以用 (select 语句1) union (select 语句2)代替

1) SQL UNION 操作符

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

2) SQL UNION 语法

SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2

注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

3) SQL UNION ALL 语法

SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2

另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

4) Union和Union ALL区别

区别一:取结果的交集

  • union:对两个结果集进行并集操作,不包括重复行,相当于distinct, 同时进行默认规则的排序

  • Union all: 对两个结果集进行并集操作,包括重复行,即所有的结果全部显示,不管是不是重复。

区别2:获取结果后的操作

  • Union:会对获取的结果进行排序操作

  • Union all: 不会对获取的结果进行排序操作

 Union all只是合并查询结果,并不会进行去重和排序操作,在没有去重的前提下,使用union all的执行效率要比union高。

3. 🥪自连接

当table1和table2本质上是同一张表,只是用取别名的方式虚拟成两张表以代表不同的意义。然后两个表再进行内连接,外连接等查询

#自连接
#查询员工姓名以及领导姓名,仅显示有领导的员工
SELECT emp.ename,
           mgr.ename 
FROM t_employee AS emp, 
         t_employee AS mgr
WHERE emp.mid = mgr.eid; 

 

4. 练习题1-行转列

5. 牛客练习题:

牛客SQL25

SQL 602 好友申请

SQL1280 学生们参加各科测试的次数

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

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

相关文章

RuleEngine规则引擎底层改造AviatorScript 之公式规则

前情提要,看上一个文章,具体要实现的效果就是 当然上来的问题就是前端的问题,这个框首先他们用的是富文本,富文本传到后台的结果是前端脚本,带着h5的标签,后面改成了这个,当时这个东西其实和后…

【Linux】TCP编程{socket/listen/accept/telnet/connect/send}

文章目录 1.TCP接口1.1socket文档 1.2listen拓:端口号8080 1.3accept拓:今天全局函数 1.4读写接口1.5telnet1.一个客户端2.两个客户端 1.6ulimit -a1.7常识回顾1.8connect1.9拓:客户端的ip和地址什么时候被分配?1.10拓&#xff1a…

【接口自动化】参数化替换

在做接口测试时,除了测单个接口,还需要进行业务链路间的接口测试 比如[注册-登陆]需要token鉴权的业务流 当我们用使用postman/jmeter等工具时,将注册接口的一些响应信息提取出来,放到登陆接口的请求中,来完成某个业务…

【Redis】Redis群集的三种模式(主从、哨兵、群集)

redis群集有三种模式,分别是主从同步/复制、哨兵模式、Cluster,下面会讲解一下三种模式的工作方式,以及如何搭建cluster群集 ●主从复制:主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主…

Qt案例 通过调用Setupapi.h库实现对设备管理器中设备默认驱动的备份

参考腾讯电脑管家-软件市场中的驱动备份专家写的一个驱动备份软件案例,学习Setupapi.h库中的函数使用.通过Setupapi.h库读取设备管理器中安装的设备获取安装的驱动列表,通过bit7z库备份驱动目录下的所有文件. 目录导读 实现效果相关内容示例获取SP_DRVIN…

DevOps已死?2024年的DevOps将如何发展

随着我们进入2024年,DevOps也发生了变化。新兴的技术、变化的需求和发展的方法正在重新定义有效实施DevOps实践。 IDC预测显示,未来五年,支持DevOps实践的产品市场继续保持健康且快速增长,2022年-2027年的复合年增长率&#xff0…

数字人解决方案——Champ单个视频单张图像生成可控且一致的人体视频生成

概述 Champ是阿里巴巴集团、南京大学和复旦大学的研究团队共同提出了一种创新的人体动画生成技术,Champ能够在仅有一段原始视频和一张静态图片的情况下,激活图片中的人物,使其按照视频中的动作进行动态表现,极大地促进了虚拟主播…

Git-LFS 远程命令执行漏洞 CVE-2020-27955 漏洞复现

今天遇到了一个比较有意思的洞,复现一下下.......... 漏洞描述 Git LFS 是 Github 开发的一个 Git 的扩展,用于实现 Git 对大文件的支持 一些受影响的产品包括Git,GitHub CLI,GitHub Desktop,Visual Studio&#xff0…

C#开发常用的库使用-Ioc库Autofac的使用

介绍 Autofac 是一个适用于 .NET 的强大的 IoC(控制反转)容器。它管理类之间的依赖关系,使得随着应用程序规模和复杂性的增长,应用程序仍然易于修改。它允许您管理 .NET 应用程序中的组件依赖关系,并自动将依赖项解析…

数据库(mysql)-基本查询语句(DQL)

查询语句 这边查询是给予一定表格,这边先做个解释 教师表包括(name(姓名),gender(性别),salary(工资),title(职位),subject_id(课程的编号),comm(奖金)) 学生表包括(姓名(name),gender(性别),job(职位),生日(birth)) 模版 SELECT 字段名 FROM 查询表 WHERE 查询语句 或与非…

Linux|从 STDIN 读取 Awk 输入

简介 在之前关于 Awk 工具的系列文章中,主要探讨了如何从文件中读取数据。但如果你希望从标准输入(STDIN)中读取数据,又该如何操作呢? 在本文中,将介绍几个示例,展示如何使用 Awk 来过滤其他命令…

Go语言实战:掌握html/template包的高效开发技巧

Go语言实战:掌握html/template包的高效开发技巧 引言Go标准库html包概览html包的基本用途html/template包的核心功能开始使用html/template应用场景 安全的HTML内容处理防范XSS攻击使用示例内容安全策略(CSP)小结 操作HTML元素创建和解析HTML…

java数据结构与算法刷题-----LeetCode628. 三个数的最大乘积

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 排序选择线性搜索最值 排序 解题思路:时间复杂度O( …

简介有向无环图DAG

Sui创纪录的每秒交易量部分归功于数学构造,即有向无环图(Directed Acyclic Graph,DAG),该构造通过以最高效的方式处理交易来加速网络交易,而不是按照先来先服务的线性进展。 区块链是设计用于确保数据完整…

APx500音频分析仪硬件简介

两通道模拟输出,两通道或以上的模拟输入接口 线性编码数字音频接口(AES/EBU,TOSLINK,SPDIF)Linear PCM 脉冲密度调制码流(需要APx-PDM选件支持) Bluetooth蓝牙音频码流(需APx-BT选件支持) 最…

基于Android的记单词App系统的设计与实现

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…

js 求出对应年月的开始日期和结束日期

实现效果: 背景: element日期时间选择组件,通过时间选择年-月,求出对应年月的开始日期和结束日期。 核心代码: /*** 返回给定年份和月份的起始和结束日期。* 202403 -> 2024-03-01 2024-03-31* param {number} y…

11-新热文章-实时计算

热点文章-实时计算 1 今日内容 1.1 定时计算与实时计算 1.2 今日内容 kafkaStream 什么是流式计算 kafkaStream概述 kafkaStream入门案例 Springboot集成kafkaStream 实时计算 用户行为发送消息 kafkaStream聚合处理消息 更新文章行为数量 替换热点文章数据 2 实时…

Linux下解决Java输出文件,中文变问号和中文乱码问题

# 启用 zh_CN.UTF-8 字体 echo "zh_CN.UTF-8 UTF-8" >> /etc/locale.gen # 生成并安装 locale 数据 locale-gen # 更新当前 shell 环境 source /etc/default/locale 相当于以下操作: # Debian sudo apt install locales sudo dpkg-reconfigur…

基于SSM+Jsp+Mysql的超市管理系统

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包…