Skip to content

多表查询

一、外键约束

外键约束:约束的是从表,约束从表不能插入主表主键不存在的外键数据

sql
# 主表
create table tableA (
 id int primary key,
 name varchar(10)
);
# 从表
create table tableB (
 id int ,
 cname varchar(10),
 # 建立主表从表约束关系
 [constraint 约束名] foreign key id references tableA(id)
);

作用:

  • 保证插入数据的准确性:从表中外键的值在主表主键中必须有对应的值
  • 保证删除数据的完整性:主表的主键值被从表外键引用之后,主表中对应的记录不能被删除

二、多表查询

1. 无条件链接(笛卡尔积)

也叫交叉连接,将两张表的每一行数据无差别的,分别进行关联,组成新的数据。

sql
# 语法:
# 1.select * from 表A,表B
# 2.select * from 表A [cross] join 表B

2. 有条件链接

2.1 内连接

返回两张表都满足连接条件的部分(交集)

sql
# 语法(inner join):
# select * from 表A [inner] join 表B on 连接条件 
# 示例:
select *
from day05_mutiple_tab.table_category
       inner join day05_mutiple_tab.table_product on table_category.cid = table_product.category_id;

2.2 左外连接

交集 + 表A(left join左边的表)有的内容(表B没有就用null拼接)

sql
# 语法(left [outer] join):
# select * from 表A left [outer] join 表B on 条件
# 示例:
select *
from day05_mutiple_tab.table_category
       left join day05_mutiple_tab.table_product on table_category.cid = table_product.category_id;

2.3 右外连接

交集 + 表B(left join右边的表)有的内容(表A没有就用null拼接)

sql
# 语法(right [outer] join):
# select * from 表A right [outer] join 表B on 条件
# 示例:
select *
from day05_mutiple_tab.table_category
       right join day05_mutiple_tab.table_product on table_category.cid = table_product.category_id;

2.4 全外连接

MySQL数据库不支持全连接full [outer] join,需要将左连接和右连接的结果利用 UNION 关键字组合实现全连接的效果

sql
# 语法:
# union 左外加右外(不保留重复的地方) : 左外  union  右外
# union all 左外加右外(保留重复的地方) : 左外  union all  右外
# 示例:
select *
from day05_mutiple_tab.table_product
       left join day05_mutiple_tab.table_category on table_product.category_id = table_category.cid
union  [all]
select *
from day05_mutiple_tab.table_product
       right join day05_mutiple_tab.table_category on table_product.category_id = table_category.cid;
 # 注:union本身只做拼接

三、自连接查询

sql
# 语法:
select  
	A.ID,
	A.name,
	B.ID,
	B.NAME,
	C.ID,
	C.NAME
from 地区表 A join 地区表 B on B.PID = A.ID join 地区表 C on C.pid = B.id ;
# 注:自己和自己关联, 必须给表起一个别名, 用来假设为不同的表,否则无法使用

四、子查询

将查询的结果作为下一次查询的内容进行使用

  • 查询的结果充当主查询的条件: 在where后面

  • 子查询的结果充当主查询的数据源(临时表): 在 from的后面

  • 子查询的结果充当主查询的查询字段 : 在 select 和 from的中间