查看: 89|回复: 1

MySQL学习基本功—多表查询的几种方式!

[复制链接]

3

主题

10

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2023-1-9 09:49:40 | 显示全部楼层 |阅读模式
表与表之间的关系

在SQL语句中,数据表与数据表之间,如果存在关系,一般一共有3种情况:
① 一对一关系(高级)
比如有A、B两张表,A表中的每一条数据,在B表中有一条唯一的数据与之对应。
用户表user
user_id(用户编号)账号username密码password
001adminadmin888
002itheima123456
用户详情表user_items
user_id(用户编号)真实姓名年龄联系方式
001张三1610086
002李四1810010
我们把用户表与用户详情表之间的关系就称之为一对一关系。
② 一对多关系(重点)
比如有A、B两张表,A表中的每一条数据,在B表中都有多条数据与之对应,我们把这种关系就称之为一对多关系
产品分类表
分类id编号分类名称
1手机
2电脑
产品信息表
产品id编号产品名称产品价格所属分类id编号
1Apple iPhone 136799.001
2Redmi Note 93499.001
我们把产品分类表与产品表之间的关系就称之为一对多关系。
③ 多对多关系(高级)
用户表
用户编号登录账号登录密码
1adminadmin888
2itheima123456
权限表
权限id编号权限名称
1增加
2删除
3修改
4查询
虽然从以上图解来看,两者之间好像没有任何联系,但是两者之间其实是有关系的,这种关系需要通过一张临时表进行呈现。
每个用户,应该有对应的权限,admin账号可以做增删改查,itheima账号可以做查询
反过来
每个权限都应该对应多个用户,查询权限 => admin/itheima
中间表 :用户_权限表
用户id编号权限的id编号
1(admin)1(增加)
12(删除)
13(修改)
14(查询)
24(查询)

交叉连接(了解)

没有意义,但是它是所有连接的基础。其功能就是将表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 = '广东省';说明:

  • 自连接查询必须对表起别名
☆ 小结


  • 自连接查询就是把一张表模拟成左右两张表,然后进行连表查询。
  • 自连接就是一种特殊的连接方式,连接的表还是本身这张表
回复

使用道具 举报

1

主题

8

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 昨天 02:05 | 显示全部楼层
啊啊啊啊啊啊啊啊啊啊啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表