|
表与表之间的关系
在SQL语句中,数据表与数据表之间,如果存在关系,一般一共有3种情况:
① 一对一关系(高级)
比如有A、B两张表,A表中的每一条数据,在B表中有一条唯一的数据与之对应。
用户表user
user_id(用户编号) | 账号username | 密码password | 001 | admin | admin888 | 002 | itheima | 123456 | 用户详情表user_items
user_id(用户编号) | 真实姓名 | 年龄 | 联系方式 | 001 | 张三 | 16 | 10086 | 002 | 李四 | 18 | 10010 | 我们把用户表与用户详情表之间的关系就称之为一对一关系。
② 一对多关系(重点)
比如有A、B两张表,A表中的每一条数据,在B表中都有多条数据与之对应,我们把这种关系就称之为一对多关系
产品分类表
产品信息表
产品id编号 | 产品名称 | 产品价格 | 所属分类id编号 | 1 | Apple iPhone 13 | 6799.00 | 1 | 2 | Redmi Note 9 | 3499.00 | 1 | 我们把产品分类表与产品表之间的关系就称之为一对多关系。
③ 多对多关系(高级)
用户表
用户编号 | 登录账号 | 登录密码 | 1 | admin | admin888 | 2 | itheima | 123456 | 权限表
虽然从以上图解来看,两者之间好像没有任何联系,但是两者之间其实是有关系的,这种关系需要通过一张临时表进行呈现。
每个用户,应该有对应的权限,admin账号可以做增删改查,itheima账号可以做查询
反过来
每个权限都应该对应多个用户,查询权限 => admin/itheima
中间表 :用户_权限表
用户id编号 | 权限的id编号 | 1(admin) | 1(增加) | 1 | 2(删除) | 1 | 3(修改) | 1 | 4(查询) | 2 | 4(查询) |
交叉连接(了解)
没有意义,但是它是所有连接的基础。其功能就是将表1和表2中的每一条数据进行连接。
结果:
字段数 = 表1字段 + 表2的字段
记录数 = 表1中的总数量 * 表2中的总数量(笛卡尔积)
select * from students cross join classes;
或
select * from students, classes;

1、内连接
☆ 连接查询的介绍
连接查询可以实现多个表的查询,当查询的字段数据来自不同的表就可以使用连接查询来完成。
连接查询可以分为:
- 内连接查询
- 左外连接查询
- 右外连接查询
- 自连接查询(自己查询自己)
☆ 内连接查询
查询两个表中符合条件的共有记录

内连接查询语法格式:
select 字段 from 表1 inner join 表2 on 表1.字段1 = 表2.字段2
说明:
- inner join 就是内连接查询关键字
- on 就是连接查询条件
例1:使用内连接查询学生表与班级表:
select * from students as s inner join classes as c on s.cls_id = c.id;
☆ 小结
- 内连接使用inner join .. on .., on 表示两个表的连接查询条件
- 内连接根据连接查询条件取出两个表的 “交集”
2、左外连接
☆ 左连接查询
以左表为主根据条件查询右表数据,如果根据条件查询右表数据不存在使用null值填充

左连接查询语法格式:
select 字段 from 表1 left join 表2 on 表1.字段1 = 表2.字段2说明:
- left join 就是左连接查询关键字
- on 就是连接查询条件
- 表1 是左表
- 表2 是右表
例1:使用左连接查询学生表与班级表:
select * from students as s left join classes as c on s.cls_id = c.id;☆ 小结
- 左连接使用left join .. on .., on 表示两个表的连接查询条件
- 左连接以左表为主根据条件查询右表数据,右表数据不存在使用null值填充。
3、右外连接
☆ 右连接查询
以右表为主根据条件查询左表数据,如果根据条件查询左表数据不存在使用null值填充

右连接查询语法格式:
select 字段 from 表1 right join 表2 on 表1.字段1 = 表2.字段2说明:
- right join 就是右连接查询关键字
- on 就是连接查询条件
- 表1 是左表
- 表2 是右表
例1:使用右连接查询学生表与班级表:
select * from students as s right join classes as c on s.cls_id = c.id;☆ 小结
- 右连接使用right join .. on .., on 表示两个表的连接查询条件
- 右连接以右表为主根据条件查询左表数据,左表数据不存在使用null值填充。
4、自连接查询(扩展)
自连接查询:数据表自己连接自己,前提:==连接操作时必须为数据表定义别名!==
左表和右表是同一个表,根据连接查询条件查询两个表中的数据。
两个实际的工作场景,求省市区信息,求分类导航信息
cid name pid
1 图书 null
2 童书 1
3 中国儿童文学 2
地域:area
pid 全称 parent id(父级ID编号),如果pid值为null代表本身就是父级,如果pid是一个具体的数值,则代表其属于子级

例1:查询省的名称为“广东省”的所有城市

创建areas表:
use db_itheima;
create table tb_area(
aid int not null AUTO_INCREMENT,
atitle varchar(20),
pid int,
primary key(aid)
) default charset=utf8;执行sql文件给areas表导入数据:
insert into tb_area values (null, '广东省', null),(null, '山西省', null),(null, '深圳市', 1), (null, '广州市', 1);自连接查询的用法:
select c.id, c.title, c.pid, p.title from areas as c inner join areas as p on c.pid = p.id where p.title = '广东省';说明:
☆ 小结
- 自连接查询就是把一张表模拟成左右两张表,然后进行连表查询。
- 自连接就是一种特殊的连接方式,连接的表还是本身这张表
|
|