主题
多表查询
一、外键约束
外键约束:约束的是从表,约束从表不能插入主表主键不存在的外键数据
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 表B2. 有条件链接
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的中间