MySQL多表查询

article/2025/9/24 8:44:58

文章目录

  • 一、什么是多表查询
      • 1、概述
      • 2、笛卡尔积现象
  • 二、多表查询的分类
    • 1、等值连接 vs非等值连接
    • 2、自连接 vs 非自连接
    • 3、内连接 vs 外连接
    • 4、满外连接(FULL OUTER JOIN)
  • 三、UNION[ALL]的使用
  • 四、7种SQL JOINS的实现

一、什么是多表查询

1、概述

多表查询就是从多张表中去查询数据,在实际开发中大多数情况数据都是存储在多张中的,它们通过一个关联关系连接起来,这样就可以通过这个关联关系去查询到想要的数据。比如:下面两个表的数据就是通过stu_num这个字段关联的,通过stu_num即可查询到此名学生的成绩。
关联关系:可以是一对一,也可以是一对多的关系
学生信息在这里插入图片描述
(关于这两张表的sql在文章最后附录中)

2、笛卡尔积现象

上文提到了需要通过一个关联关系连接起来,如果不通过关系连接会出现什么情况呢?答案就是笛卡尔积现象

(1)、使用此SQL去查询观察结果:
SELECT * FROM t_student,t_score
查询出了两个表的全部组合结果,共计49条记录。
在这里插入图片描述
(图片中只展示了部分数据)

(2)、使用连接关系查询结果:
SELECT * FROM t_student,t_score WHERE t_student.stu_num = t_score.stu_num
查询出期望的结果6条记录,因为关联关系是字段stu_num,所有可以对应查询到的结果只有6条记录。
在这里插入图片描述

(3)、查询出最终结果(可以设置别名查询想要的列)

SELECT a.stu_num,a.stu_name,a.stu_age,b.stu_score 
FROM t_student a,t_score b 
WHERE a.stu_num = b.stu_num   # 关联关系

在这里插入图片描述

二、多表查询的分类

1、等值连接 vs非等值连接

1、等值连接:就是通过一个表的字段和另一个表的字段相等来连接

SELECT a.stu_num,a.stu_name,a.stu_age,b.stu_score 
FROM t_student a,t_score b 
WHERE a.stu_num = b.stu_num

在这里插入图片描述

2、非等值连接:不是这种两表之间通过字段相等的连接。例如我们统计每个学生的分数在那个等级
在这里插入图片描述
(引入第三张表,成绩等级表)

SELECT* 
FROMt_score a,t_grade b
WHEREa.stu_score BETWEEN b.score_min and b.score_max

在这里插入图片描述
3、连接多张表
如果想查查询出最终的结果需要连接三张表才可以。

SELECTa.stu_num,a.stu_name,a.stu_age,b.stu_score,c.score_grade 
FROMt_student a,t_score b,t_grade c 
WHEREa.stu_num = b.stu_num AND b.stu_score BETWEEN c.score_min AND c.score_max

在这里插入图片描述

2、自连接 vs 非自连接

(1)、自连接:就是同一张表,利用取别名的方式虚拟成两张表以代表不同的意义的表,然后这两个表再进行内连接或者外连接。

SELECTa.employee_id,a.employee_name,b.employee_name as manager_name 
FROMt_employee a,t_employee b 
WHEREa.manager_id = b.employee_id

在这里插入图片描述
只有两条记录是因为只有依据连接关系只又两条记录符合条件

(2)、非自连接:不同表之间进行连接

3、内连接 vs 外连接

(1)、内连接:只查出符合关联条件的记录。上面的所有连接均为内连接
语法:
a、直接在from后面接关联表,where后面写关联关系

SELECTa.stu_num,a.stu_name,a.stu_age,b.stu_score 
FROMt_student a,t_score b 
WHEREa.stu_num = b.stu_num

b、INNER JOIN 表名 ON 关联关系 WHERE 其他条件 ,其中INNER可以省略不写

SELECTa.stu_num,a.stu_name,a.stu_age,b.stu_score 
FROMt_student aINNER JOIN t_score b ON a.stu_num = b.stu_num

查询结果
在这里插入图片描述

(2)、外连接:外连接分为左外连接和右外连接。
左外连接:在查出符合关联条件的同时会将左表中的记录全部展示出来,没有关联到记录右表补充为null。
语法:LEFT OUTER JOIN 表名 ON 关联关系 WHERE 其他条件,其中OUTER可以省略

  • 例一:查出所有学生的成绩

在这里插入图片描述

  • 例一SQL:
SELECTa.stu_num,a.stu_name,a.stu_age,b.stu_score 
FROMt_student aLEFT JOIN t_score b ON a.stu_num = b.stu_num
  • 例二:查出所有员工和他们的经理
    在这里插入图片描述
  • 例二SQL
SELECTa.employee_id,a.employee_name,b.employee_name AS manager_name 
FROMt_employee aLEFT JOIN t_employee b ON a.manager_id = b.employee_id

右外连接:在查出符合关联条件的同时会将右表中的记录全部展示出来,没有关联到记录左表补充为null。
语法:RIGHT OUTER JOIN 表名 ON 关联关系 WHERE 其他条件,其中OUTER可以省略

  • 例三:查询所有成绩对应的学生信息

在这里插入图片描述

  • 例三SQL
SELECTa.stu_num,a.stu_name,a.stu_age,b.stu_score 
FROMt_student aRIGHT JOIN t_score b ON a.stu_num = b.stu_num
  • 例四:查询所有经理的员工
    在这里插入图片描述

  • 例四SQL

SELECTa.employee_id,a.employee_name,b.employee_name AS manager_name 
FROMt_employee aRIGHT JOIN t_employee b ON a.manager_id = b.employee_id

4、满外连接(FULL OUTER JOIN)

  • 满外连接的结果 = 左右表匹配的数据 + 左表没有匹配到的数据 + 右表没有匹配到的数据。
  • SQL99是支持满外连接的。使用FULL JOIN 或 FULL OUTER JOIN来实现。
  • 需要注意的是,MySQL不支持FULL JOIN,但是可以用 LEFT JOIN UNION RIGHT join代替

三、UNION[ALL]的使用

利用UNION关键字,可以给出多条SELECT语句,并将它们的结果组合成单个结果集。其中UNION ALL不会对结果集去重,但是效率较高,日常开发中更建议使用UNION All

条件:两个表对应的列数和数据类型必须相同,并且相互对应
语法

SELECT column,... FROM table1
UNION [ALL]
SELECT column,... FROM table2

演示

  • 例五:查询stu_num小于5和stu_age大于10的全部记录

在这里插入图片描述

  • 例五SQL
SELECT stu_num,stu_name,stu_age FROM t_student WHERE stu_num < 5 
UNION ALL 
SELECT stu_num, stu_name, stu_age FROM t_student WHERE stu_age > 10
  • 例六:查询stu_num小于5和stu_age大于10的全部记录,去除重复
    在这里插入图片描述
  • 例六SQL
SELECT stu_num,stu_name,stu_age FROM t_student WHERE stu_num < 5 
UNION
SELECT stu_num, stu_name, stu_age FROM t_student WHERE stu_age > 10

四、7种SQL JOINS的实现

在这里插入图片描述


http://chatgpt.dhexx.cn/article/AbgbmrMt.shtml

相关文章

【MySQL】多表查询策略(多表联查子查询)

目录 一、MySQL多表查询 二、准备工作 1.运行环境 2.创建公司表 3.创建员工表 三、多表查询 &#xff08;一&#xff09;多表联查—同时查询多张表 1.联结 2.左连接 3.右连接 4.内连接 &#xff08;二&#xff09;子查询 1.SELECT子查询 2.WHERE子查询 3.FROM子…

MySQL----多表查询

MySQL----多表查询 多表关系表与表之间的联系&#xff1a;一对多(多对一)多对多一对一 多表查询多表查询的分类数据准备内连接外连接自连接联合查询子查询标量子查询列子查询行子查询表子查询 多表查询案例 多表关系 在进行数据库表结构的设计时&#xff0c;会根据业务的需求和…

SQL语句多表查询

多表查询 多表查询&#xff0c;也称为关联查询&#xff0c;指两个或更多个表一起完成查询操作。 前提条件&#xff1a;这些一起查询的表之间是有关系的&#xff08;一对一、一对多&#xff09;&#xff0c;它们之间一定是有关联字段&#xff0c;这个关联字段可能建立了外键&a…

十、多表查询

十、多表查询 *多表查询的本质就是把多张表合并成一个临时表 1、多表数据合并方案 连接查询合并方案【最常见】 首先确保两张表之间存在【隶属关系】将两张表中的数据行【沿着水平方向进行拼接】最终得到一个拥有【完整隶属关系】的新数据行 联合查询合并方案 不需要两张表之…

图解数据库多表查询(多表联查)的几种方式

多表查询&#xff0c;也被称为多表连接查询。 为什么会有多表查询这个操作呢&#xff1f; 在实际项目开发过程中&#xff0c;会出现多张表&#xff0c;用于分类存储不同的信息&#xff0c;我们测试需要的数据也会来自不同的表&#xff0c;因此需要使用多表查询。 我们常用的…

史上最牛mysql-06 (多表连接)

多表连接 个人博客 &#xff1a;www.xiaobeigua.icu 多表查询&#xff0c;也称为关联查询&#xff0c;指两个或更多个表一起完成查询操作。 前提条件&#xff1a;这些一起查询的表之间是有关系的&#xff08;一对一、一对多&#xff09;&#xff0c;它们之间一定是有关联字段&…

sql多表查询

1.多表查询概念&#xff1a;从多张表查询数据 2.分类&#xff1a;连接查询和子查询。 有两张表A、B 连接查询&#xff1a; 内连接 相当于查询A、B交集数据 例1&#xff1a;select * from emp,dept where emp.dep_iddept.id; 外连接 左外连接&#xff1a;相当于查询…

sql语句之多表查询

文章目录 一、笛卡尔积(交叉连接) ---->cross join1、概念2. 语法3.示例 二、内连接---->inner join1、概念2. 语法3.示例 三、外链接---->outer join1、概念2. 语法3.示例 四、联合连接---->union1、概念2.示例 一、笛卡尔积(交叉连接) ---->cross join 1、概…

连接查询(多表查询)——MySQL

连接查询&#xff08;多表查询&#xff09; 又称多表查询&#xff0c;当查询的字段涉及多个表的时候&#xff0c;就要用到连接查询 分类&#xff1a; 为表起别名&#xff1a; 提高语句的简洁度区分多个重名字段注意&#xff1a;如果为表起了别名&#xff0c;则查询的字段就不…

MySQL-多表查询

一、表架构 student(sid,sname,sage,ssex) 学生表course(cid,cname,tid) 课程表sc(sid,cid,score) 成绩表teacher(tid,tname) 教师表 二 、建表sql语句 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for course -- --…

Java中的XML解析

前言 这几天在手写Spring IOC的时候遇上了xml文件的解析&#xff0c;通过解析Spring.xml配制文件的方式来创建对象。因为之前从来都没遇见过相关的需求&#xff0c;所以对此做一份记录 XML (eXtensible Markup Language) 意为可扩展标记语言&#xff0c;被多数技术人员用以选择…

Java - XML文件解析

Java对XML文件的解析 一、前言二、实例分析 - DOM方式解析XML文件2.1 XMLDomParseUtil - 抽象工具类2.2 待解析xml文件示例2.3 解析xml文件2.3.1 新建一个用于存储xml文件中各节点的属性和属性值的类2.3.2 解析实际节点 2.4 测试 一、前言 1、HTTP网络传输中的数据组织方式有三…

Java解析XML文件的方式

在项目里&#xff0c;我们往往会把一些配置信息放到xml文件里&#xff0c;或者各部门间会通过xml文件来交换业务数据&#xff0c;所以有时候我们会遇到“解析xml文件”的需求。一般来讲&#xff0c;有基于DOM树和SAX的两种解析xml文件的方式&#xff0c;在这部分里&#xff0c;…

java解析xml格式的节点属性值

xml示例&#xff1a; <ResponseContent><Parameter><Document><RecordSet id"1"><Master name"purchase"><Record><Field name"orderNumber" value"1P05-151200172"/><Field name"…

Java解析XML字符串

在网上找了很多Java语言解析XML字符串的资料&#xff0c;很多内容写得很繁复&#xff0c;没有普适性&#xff0c;遂自己动手写了一个用Java解析XML的工具类。话不多说&#xff0c;直接看下面代码&#xff1a; XML解析工具类&#xff1a; import org.dom4j.Document; import o…

JAVA解析xml报文

目录 问题需求 响应报文格式 1&#xff0c;开发导入的依赖 2&#xff0c;开发样例 3&#xff0c;测试结果 问题需求 在工作中此项目请求指定项目之后&#xff0c;项目会返回一个xml报文格式的响应&#xff0c;此时我需要判断返回的报文是否是成功的响应报文&#xff0c;如…

Java解析xml

记录工作中遇到的一些问题和解决方式&#xff0c;自己摘抄整理了一下用来巩固&#xff0c;如有不足或有更好的方式 欢迎交流。 java解析xml的话有四种方式&#xff0c;分别为DOM,SAX,DOM4J,JDOM 转载&#xff1a;Java解析XML(4种方法)_蓝星花的博客-CSDN博客_java解析xml 这里的…

Java解析XML(4种方法)

xml文件 <?xml version"1.0" encoding"utf-8" ?> <class><student><firstname>cxx1</firstname><lastname>Bob1</lastname><nickname>stars1</nickname><marks>85</marks></stud…

混合开发架构|Android工程集成React Native、Flutter、ReactJs

混合开发架构|Android工程集成React Native、Flutter、ReactJs 架构设计说明创建安卓原生工程创建Flutter集成嵌入原生工程 创建React Native解决RN报错问题集成嵌入原生工程RN集成后&#xff0c;启动报错 底部导航栏架构设计原生仿招商银行首页原生Android Socket 即时通讯Rea…

Android MVVM开发框架

MVVM 数据双向绑定&#xff0c;通过数据驱动UI&#xff0c;M提供数据&#xff0c;V视图&#xff0c;VM即数据驱动层 MVP框架图 &#xff08;图片来源于网络&#xff09; 学习MVVM开发框架&#xff0c;要先了解DataBinding&#xff0c;DataBinding 是什么&#xff1f; DataBi…