MySQL基础知识整理 ---- 多表关系和多表查询

一.多表关系

在数据库表和表之间存在三中对应关系,一对一,一对多(多对一),多对多。

1.一对一关系
理论上可以将任意一方向另外一方合并,但一般结合实际情况进行合并。实际运用中一般不会出现一对一的情况。比如,学生的学号和姓名是一对一的关系,但是我们在设计表时一般不会将二者分开。

2.一对多关系
理论上我们将一的一方向多的一方合并。实际操作时我们可以在多的一方设置外键来关联一的一方,实现合并。比如,班级和学生时一对多的关系,那我们就可以在学生表中设置外键来将其和班级表关联。
在这里插入图片描述
3.多对多关系
不能直接将量表合并。但是可以借助一张中间表来实现二者的关联。比如,学生和课程之间的关系,一个学生可以选多门课程,一门课程也可以被多个学生选,这时如果我们要将二者联系起来的话,就需要借助一张选课表。
在这里插入图片描述

二.多表查询

多表查询可以分为三种:内连接查询,外连接查询,子查询。其主要的作用是查询时消除无用的数据。因为当我们直接查询多张表时,其查询的结果是多张表的笛卡尔集,笛卡尔集中存在许多无用数据。

/*
创建班级表
*/
create table class{
   id int primary key,
   cname varchar(10),
   class_location varchar(10)  -- 班级所在校区
};

/*
创建学生表
*/
create table student{
  son char(5) primary key,
  sname varchar(10),
  cls_id int,  -- 外键列
  constraint stu_cls_fk foreign key (cls_id) references class(id) on update cascade on delete cascade;  -- 关联并添加级联
};

/*
直接查询会显示笛卡尔集
*/
select *
from student,class;

1.内连接查询
(1)隐式内连接
使用where条件消除无用的数据

select son,sname,con,cname
from student,class
where student.cls_id = class.id;

(2)显示内连接

select son,sname,con,cname
from student inner join class on student.cls_id = class.id; -- inner可以省略

2.外连接查询
(1)左外连接查询
查询的是左表的所有内容以及其与另一表的交集部分。

select son,sname,cls_id,id,cname,class_location
from student left outer join class on student.cls_id = class.id;

结果展示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2)右外连接查询
查询的是右表的所有内容,以及其与另一表的交集部分

select son,sname,cls_id,id,cname,class_location
from student right outer join class on student.cls_id = class.id;

3.子查询
查询中嵌套查询,称嵌套查询为子查询

(1)子查询的结果是单行单列的

/*
查询cls_id值最大的学生的信息
*/
select son,sname
from student
where id = (
   select max(id)
   from student
);

(2) 子查询的结果是多行单列的
可以结合 in 运算符使用

(3)子查询的结果是多行多列的
子查询可以作为一张虚拟表

/*
子查询的结果是多行多列
*/

select *
from student (select * from class where id > 1) t  -- 筛选班级ID>1的班级,形成的虚拟表起别名为t
where student.cls_id = t.id; -- 将虚拟表和student表通过id连接起来

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值