MySQL多表查询

Mysql 多表查询详解 纸上得来终觉浅 1.前言:上篇讲到Mysql中关键字执行的顺序,只涉及了一张表;实际应用大部分情况下,查询语句都会涉及到多张表格 : 1)多表连接有哪些分类; 2)针对这些分类有哪些连接方法? 3)这些连接方法分别作用于哪些应用场景? 这篇针对这三个点通过实例来讲述,目的是穷尽所有的场景和所有的方法,并且对每个方法的使用做实例。 2.假设有两张表格A和B,把表格当作一个集合,那么表格中 阅读详情

多表查询是指同时从两个或多个表中检索数据,通过表之间的关联关系获取综合信息。在关系型数据库中,数据通常分散存储在多个表中,多表查询是获取关联数据的核心操作。

一、多表查询基础

1. 表关系类型

多表查询基于表之间的关系,常见关系类型包括:

一对一:一个表中的一条记录对应另一个表中的一条记录

一对多:一个表中的一条记录对应另一个表中的多条记录(最常见)

多对多:一个表中的多条记录对应另一个表中的多条记录(通常通过中间表实现)

2. 表连接的基本概念

多表查询通过"连接"(JOIN)操作实现,核心是通过共同字段(通常是主键和外键)建立表之间的关联。

示例表结构(以下示例将基于这些表):

-- 部门表
CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(50) NOT NULL
);

-- 员工表
CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    emp_name VARCHAR(50) NOT NULL,
    dept_id INT,
    salary DECIMAL(10,2),
    hire_date DATE,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

-- 项目表
CREATE TABLE projects (
    project_id INT PRIMARY KEY,
    project_name VARCHAR(100) NOT NULL,
    start_date DATE
);

-- 员工-项目关联表(多对多关系)
CREATE TABLE employee_projects (
    emp_id INT,
    project_id INT,
    role VARCHAR(50),
    PRIMARY KEY (emp_id, project_id),
    FOREIGN KEY (emp_id) REFERENCES employees(emp_id),
    FOREIGN KEY (project_id) REFERENCES projects(project_id)
);

二、常用连接类型

1. 内连接(INNER JOIN)

作用:只返回两个表中匹配条件的记录,即两个表的交集。

语法:

SELECT 字段列表
FROM 表1
INNER JOIN 表2 ON 表1.关联字段 = 表2.关联字段;

示例:查询员工及其所属部门信息

SELECT e.emp_id, e.emp_name, d.dept_name
FROM employees e
INNER JOIN departments d ON e.dept_id = d.dept_id;

2. 左连接(LEFT JOIN / LEFT OUTER JOIN)

作用:返回左表中的所有记录,以及右表中匹配条件的记录。如果右表中没有匹配项,则返回NULL。

语法:

SELECT 字段列表
FROM 左表
LEFT JOIN 右表 ON 左表.关联字段 = 右表.关联字段;

示例:查询所有部门及该部门的员工(包括没有员工的部门)

SELECT d.dept_id, d.dept_name, e.emp_name
FROM departments d
LEFT JOIN employees e ON d.dept_id = e.dept_id;

3. 右连接(RIGHT JOIN / RIGHT OUTER JOIN)

作用:返回右表中的所有记录,以及左表中匹配条件的记录。如果左表中没有匹配项,则返回NULL。

语法:

SELECT 字段列表
FROM 左表
RIGHT JOIN 右表 ON 左表.关联字段 = 右表.关联字段;

示例:查询所有员工及其所属部门(包括没有分配部门的员工)

SELECT e.emp_id, e.emp_name, d.dept_name
FROM departments d
RIGHT JOIN employees e ON d.dept_id = e.dept_id;

4. 全连接(FULL JOIN / FULL OUTER JOIN)

作用:返回左表和右表中的所有记录,当某一侧没有匹配项时返回NULL。

注意:MySQL不直接支持FULL JOIN,但可以通过UNION组合LEFT JOIN和RIGHT JOIN实现。

示例:查询所有部门和所有员工,包括没有匹配的记录

SELECT d.dept_id, d.dept_name, e.emp_name
FROM departments d
LEFT JOIN employees e ON d.dept_id = e.dept_id
UNION
SELECT d.dept_id, d.dept_name, e.emp_name
FROM departments d
RIGHT JOIN employees e ON d.dept_id = e.dept_id;

5. 交叉连接(CROSS JOIN)

作用:返回两个表的笛卡尔积,即左表的每条记录与右表的每条记录组合。

注意:结果集可能非常大,使用时需谨慎。

示例:

SELECT e.emp_name, p.project_name
FROM employees e
CROSS JOIN projects p;

三、多表连接(三个及以上表)

可以通过连续的JOIN操作实现多表连接,依次建立表之间的关联。

示例:查询员工、所属部门及参与的项目信息

SELECT e.emp_id, e.emp_name, d.dept_name, p.project_name, ep.role
FROM employees e
INNER JOIN departments d ON e.dept_id = d.dept_id
INNER JOIN employee_projects ep ON e.emp_id = ep.emp_id
INNER JOIN projects p ON ep.project_id = p.project_id;

四、使用别名简化查询

为表指定别名可以简化SQL语句,特别是在多表查询中。

示例:

SELECT e.emp_name, d.dept_name
FROM employees AS e  -- AS关键字可省略,直接写 e
INNER JOIN departments d ON e.dept_id = d.dept_id;

五、多表查询中的筛选与排序

多表查询可以结合WHERE、GROUP BY、HAVING和ORDER BY等子句进行数据筛选和排序。

1. 带条件的多表查询

-- 查询销售部门的员工及其工资(工资大于5000)
SELECT e.emp_name, d.dept_name, e.salary
FROM employees e
INNER JOIN departments d ON e.dept_id = d.dept_id
WHERE d.dept_name = '销售部' AND e.salary > 5000;

2. 分组统计的多表查询

-- 按部门分组,统计每个部门的员工人数和平均工资
SELECT d.dept_name, COUNT(e.emp_id) AS emp_count, AVG(e.salary) AS avg_salary
FROM departments d
LEFT JOIN employees e ON d.dept_id = e.dept_id
GROUP BY d.dept_id, d.dept_name
HAVING avg_salary > 4000
ORDER BY avg_salary DESC;

六、子查询与多表查询

子查询可以作为多表查询的补充,在一个查询中嵌套另一个查询。

示例:查询参与了"新产品开发"项目的员工信息

SELECT e.emp_id, e.emp_name
FROM employees e
WHERE e.emp_id IN (
    SELECT ep.emp_id
    FROM employee_projects ep
    INNER JOIN projects p ON ep.project_id = p.project_id
    WHERE p.project_name = '新产品开发'
);

七、多表查询的性能注意事项

1. 确保连接字段上有索引(如主键和外键),提高查询效率

2. 只选择需要的字段,避免使用SELECT *

3. 对于大型表,限制返回的记录数(使用LIMIT)

4. 复杂查询可以拆分为多个简单查询,或使用视图简化

5. 避免不必要的JOIN操作,减少参与连接的表数量

使用kali对局域网内的主机进行远程控制 输入命令:hydra -l administrator -P/usr/share/woerdlists/rockyou.txt 192.168.100.241 smb -V。账户(adminitrator)密码:123456 【一般账户都是我们知晓了,如果不知道账户进行破解那几乎不太可能,密码如果设置的特别复杂无规律也是特别难破解的】【-r:扫描整个网段 后面就是设置 192.168.241.100/24的网络地址段 为 192.168.241.0/24 0和/24之间不要空格】 阅读详情

相关推荐

StarWind V2V Converter v9 虚拟磁盘转换工具使用教程 (转)

StarWind V2V Converter v9.0.1.268 是一款免费的虚拟磁盘转换工具,支持不同管理程序间的虚拟机镜像格式转换,包括VMDK、VHD/VHDX、IMG和QCOW2等格式。该工具具有窗口修复模式、零拷贝转换和管理程序切换等特色功能,能够轻松实现物理机到虚拟机的转换,并兼容主流管理程序如Hyper-V、ESXi等。使用教程详细介绍了从本地文件选择到格式转换的完整操作流程,转换过程简单高效且不影响原虚拟磁盘数据。

hsh的专栏 1482

MySQL --- 多表查询 & 驱动表

指从多张表中查询数据,就是从多张表当中进行查询单表查询的SQL语句:select 字段列表 from 表名;那么要执行多表查询,只需要使用逗号分隔多张表即可,如: select 字段列表 from 表1, 表2;-- 多表查询:直接在from之后跟上多张表就可以了,多张表之间使用逗号分隔可以看到,在多表查询的结果当中,每个员工都展示了5次,将每个员工分别和五个部门进行了一次匹配, 也就是将17个员工和5个部门挨个组合了一次,就是17 * 5 = 85。

weixin_53622554的博客 1万+

STM32 USART高级功能全解析:IrDA、DMA、硬件流控与低功耗唤醒

USART是嵌入式系统中最基础的串行通信外设,其核心原理在于同步/异步时序控制与数据帧收发机制。现代MCU如STM32通过深度集成IrDA调制解调、DMA直传通道、RS232/RS485硬件流控及Stop模式唤醒等扩展能力,显著提升通信可靠性、吞吐效率与能效比。其中,IrDA SIR采用RZI编码实现抗干扰红外传输,DMA通过TXE/RXNE事件驱动实现零CPU干预的连续数据流,而硬件流控(RTS/CTS/DE)和低功耗唤醒(WUF+UESM)则分别保障工业现场鲁棒性与电池级超长待机。本文围绕STM32平台

weixin_28922227的博客 211

MySQL多表查询 (超详细)

关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率。实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)(开发中一般取消外键的设定,即在多的一方建立字段指向一的一方的主键即可)(开发中一般取消外键的设定,即在任意一方加入字段关联另外一方的主键即可)(开发中一般取消外键的设定,即在中间表建立两个字段指向两方的主键即可)关系:一个部门对应多个员工,一个员工对应一个部门。实现:在多的一方建立外键,指向一的一方的主键。

· 8692

QT窗体大小控制全攻略:从setFixedSize到事件过滤器的进阶用法

本文深入探讨了QT窗体尺寸控制的进阶实践,从基础的setFixedSize方法到结合事件过滤器实现智能动态适配。通过分析窗口状态变化、多显示器环境处理以及布局策略,提供了实现禁止缩放但支持最大化、多屏智能适配及动态约束等复杂场景的完整解决方案与核心代码示例。

weixin_29229261的博客 299

ubuntu恢复分区表——testdisk

testdisk恢复ubuntu分区表testdisk介绍安装testdisk使用testdisk恢复分区表 testdisk介绍 testdisk 具有广泛的功能,包括恢复丢失或损坏的分区和使不能启动磁盘可以重新启动,也经常被用来恢复被误删的文件。 安装testdisk 如果系统分区表被删除,需要使用ubuntu的启动盘,选择try ubnutu模式进入试用系统。 1、可以直接在终端安装testdisk: sudo apt-get install testdisk 通过命令直接打开testdisk: t

ZNestor的博客 6459

MySQL 多表查询

此为MySQL专栏文章之一,讲解MySQL多表查询。多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。

Java 技术专栏,从入门到精通,熟悉企业级开发 1万+

农作物生长模型:数学建模与实战案例

在本篇博客中,我们介绍了农作物生长模型的基本原理,并结合Matlab代码和实战案例,演示了如何应用数学建模技术进行农作物生长模型的研究与应用。农作物生长模型在农业领域具有重要意义,希望本篇博客能帮助读者更好地理解农作物生长模型的原理和应用,并在实际农业生产中取得更好的效果。

YOLO 2734

【MySQL】不就是多表查询

嗨!小伙伴们大家好呀,忙碌的一周就要开始!在此之前我们学习的MySQL数据库的各种操作都是在一张表之中,今天我们学习要对多张表进行相关操作,相比较于单一的表来说,多张表操作相对复杂一些,我相信只要认真学习多表查询也不再话下!项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:一对一(多对一)一对多多对多概述: 指从多张表中查询数据,多表查询就是要消除笛卡尔积。

super大雄的博客 7499

解决宿主机Ping不通虚拟机的问题

在使用虚拟机的过程中,我们常常会遇到宿主机和虚拟机之间无法相互通信的问题。具体来说,我们要查看虚拟机和宿主机的 IP 地址,然后尝试进行 Ping 测试。在某些情况下,我们可能发现 Ping 虚拟机不通,接下来我将分享如何解决这个问题。

howard2005的专栏 7万+

锂电池寿命预测 | Python实现基于LSTM长短期记忆神经网络的锂电池寿命预测

锂电池寿命预测 | Python实现基于LSTM长短期记忆神经网络的锂电池寿命预测

算法如诗的博客 1902

【MySQL基础教程】多表查询

本文为【MySQL基础教程】多表查询相关知识,下边将对多表关系,多表查询概述,内连接,外连接,自连接,子查询,多表查询案例等进行详尽介绍~

小新要变强的博客 3047

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

MySQL- 多表查询(上)

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。 MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。 MySQL所使用的 SQL 语言是用于访问数据库

一起努力共同进步,为了未来一起奋斗吧! 4439

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

MYSQL多表查询

多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。比如:员工表和部门表,这两个表依靠“部门编号”进行关联。

weixin_42894555的博客 4631

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

MySQL的多表查询

MySQL的多表查询

weixin_55734444的博客 4574

【MySQL】多表查询

项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:一对多(多对一)、多对多、一对一 的关系,有时需要通过这些关系查询另一张表的数据,这时就需要进行多表查询

m0_72532428的博客 2158

【MySQL】多表操作 —— 多表查询

MySQL 有时在信息查询时需要进行对表自身进行关联查询,即一张表自己和自己关联,一张表当成多张表使用。子查询就是指的在一个完整的查询语句之中,嵌套若干个不同功能的小查询,从而一起完成复杂查询的一种编写形式,通俗一点就是包含。多表查询就是同时查询两个或两个以上的表,因为有的时候用户在查看数据的时候,需要显示的数据来自多张表。在子查询中,有一些常用的逻辑关键字,这些关键字可以提供更丰富的查询功能。对于联合查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。注意:交叉连接查询会产生很多错误的冗余数据。

m0_72516377的博客 1389

MySQL 多表查询详解

本文系统讲解MySQL多表查询技术,主要内容包括:1)三种多表关系(一对多、多对多、一对一)及其实现方式;2)多表查询方法,重点介绍连接查询(内连接、外连接、自连接)、联合查询和子查询;3)通过示例代码演示如何避免笛卡尔积,正确关联多表数据。文章强调在实际业务中,合理设计表关系和选择查询方法对数据提取效率至关重要。

2301_80204744的博客 2171

MySQL之多表查询

指从多张表中查询数据子查询(Subquery)是在一个 SQL 查询中嵌套的另一个查询,它可以出现在SELECTINSERTUPDATEDELETE语句的内部,或者用于WHEREFROMHAVING等子句中。

gege_0606的博客 1545

MySQL多表查询小总结

作为MySQL数据库的初学者,多表查询的知识点多,内容复杂,很令人头大。这篇文章作为总结,以案例的形式,供大家理解和记忆。 目录 概述 一、内连接 概述 多表查询主要分以下两个方面: 一、连接查询 1.内连接 2.外连接 3.自连接 二、子查询 1.标量子查询 2.列子查询 3.行子查询 4.表子查询 我们就用这样的两张学生选课信息表格作为数据 studen...

qq_63708623的博客 5075
上一篇: MySQL约束知识点
下一篇: MySQL事务
learning_tom
博客等级 码龄1年 157粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值