多表查询-2-多表查询概述
多表关系-2-多表查询概述
- 多表查询概述
- 为什么需要多表查询?🤔
- 概述
- 笛卡尔积
- 多表查询分类
多表查询概述
在数据库的世界里, 多表查询是非常常见的一种操作. 当我们有多个表, 并且想要从这些表中提取信息时, 多表查询就成了我们的得力助手.
为什么需要多表查询?🤔
想象一下, 你正在管理一个电商平台的数据库, 里面有一个订单表(orders
)、一个用户表(users
)和一个商品表(`products). 每个表中都包含了大量的数据, 单独查询这些表时, 能拿到的只是某一部分的信息. 但是, 假如你需要查询一个特定用户的订单, 并且希望能看到订单里购买了哪些商品, 那怎么做呢?
答案就是:多表查询!通过这种方式,我们可以从多个表中获取相关数据,并将它们结合起来,形成一个完整的视图。
概述
顾名思义, 多表查询指的是从多张表中查询数据
笛卡尔积
笛卡尔乘积是指在数学中, 两个集合 A集合
和 B集合
的所有组合情况. (再多表查询时, 需要消除无效的笛卡尔积)
select *
from 表A, 表B;
这样子查询出来的结果就是两张表所有数据相互组合的结果, 如下所示
但是我们需要的数据并不是这样子的, 所以我们需要使用 WHERE
筛选出对我们有用的数据
select *
from 表A, 表B
where 条件;
-
注意事项
使用上面例子来说, 我们选择的是
学生信息表
和选课记录表
进行的一个多表查询, 但是我设计的表不太适合讲这里, 我们先假设学生的学号student_no
与选课记录表中的学生idstudent_id
有关联select * from students,grades where students.student_no = grades.student_id;
但是, 我们现在有一个新入学的学生, 还没有分配学号, 那么, 他的
student_no
会为null
, 此时的多表查询会缺失掉该同学的数据,因为我们使用WHERE
匹配不到该同学的两张表的关联数据, 所以哪怕有选课也查询不到这是一个需要注意的地方, 当然实际情况一般都不会是这样, 一般是入职员工未分配部门然后查询出来没有该员工
多表查询分类
-
连接查询
内连接: 相当于查询
A
、B
交集部分数据
外连接:
左外连接: 查询左表所有数据, 以及两张表交集部分数据
右外连接: 查询右表所有数据, 以及两张表交集部分数据
自连接: 当前表与自身的连接查询, 自连接必须使用表别名 -
子查询
子查询就是
SELECT
查询是另一个查询的附属. 在 MySQL 中可以嵌套多个查询, 在外面一层的查询中使用里面一层查询产生的结果集. 这样就不是执行两个(或者多个)独立的查询, 而是执行包含一个(或者多个)子查询的单独查询