荐 八、MySQL数据库之连接查询

连接查询

学习这个连接查询,我们先聊一聊啥叫连接。

生活中,比如说我们的纽带和这个转盘,这俩玩意通过齿轮上的齿进行连接,带动这个自行车,或者是汽车啊啥的,可以让它们动起来。当然,这个和我们的数据库没啥关系。

说点有关系的,在我们数据库中,说是连接,那肯定不是库和库的连接,我们是指的表与表之间的连接。

而这个连接查询呢,就是将两个或两个以上的表按照某个条件连接起来,从中选取需要的数据。

当然,这个是一个很重要的知识点,我们以后会经常用到这个东西,所以好好学习。

连接查询的种类

连接查询分为两种,一个是内连接查询,还有一个是外连接查询。我们一个一个开始说。

1. 内连接查询

内连接查询是一种最常用的连接查询。内连接查询可以查询两个或者两个以上的表,当然啊,表多了也没事,只要给出相应的条件即可。这个怎么写呢?

SELECT 字段,字段,字段 FROM A表,B表... WHERE 条件

大概就这样的,我们来使用一下。

当然啊,我们现在就一个表,需要再弄一个表,不然就一个表连接屁啊。我们再创建一个班级表。

CREATE TABLE t_class (
    id            int(11)        not null AUTO_INCREMENT,
    className     varchar(20)    null,            -- 班级名称
    teacher       varchar(5)     null,            -- 班主任
    PRIMARY KEY (id)
) ENGINE = InnoDB CHARACTER SET = utf8;

INSERT INTO t_class(id, className, teacher) VALUES(1, '高一一班', '陈胖子'),(2, '高一二班', '二麻子')

当然,我们还得给我们的学生添加一个字段,就是班级的字段,每一个学生都需要有一个班级。

ALTER TABLE t_student ADD COLUMN classId int(11);

然后呢,顺便给我们的学生弄一些班级,不要让这个字段空下。

添加好之后,我们先来使用这个内连接查询查询一波。

我们会发现啊,怎么这么多数据,总共查询出来了8条数据,可是我们只有4个学生啊,怎么回事?

这里就得给大家说一个牛逼的人,这个人叫笛卡尔,而这种查询结果,我们称为是一个笛卡尔集合。有兴趣的同学可以去网上百度一下,笛卡尔集合。

这样就是说,我们有4个人,但是有2个班级,然后4个乘2个,也就是八种组合,也就是我们上面所看到的。

但是我们并不希望出现这样的情况,所以我们就给定条件,然后让它去查询。

我们通过学生表中学生的所在班级,和这个班级表的id,让他这两个值相同的记录查询出来,其他的我们就不要。这样,我们就能排除掉那些不对的组合。

这样的话,数据就对了。四个学生,然后对应的每个人的班级就都出来了。

当然,这个除去这一个条件,我们还可以往上累加,只需要使用and做连接即可。

现在我们再来显示一下这个,学生主键ID,学生姓名、性别、班级名称以及对应的班主任。

我们会发现,报错了,这个错误的意思是,这个id这个字段,不明确。很显然,我们可以看这两个表,都是有id这么个主键,而这两个id在我们进行连接查询的时候,一个输出的就是id,还有一个是id(1),所以,我们需要告诉我们的数据库,具体要查询那个表中的id。这里呢,我们就使用  表名点字段名来进行具体的输出。

我们可以看到,只有这一个id去进行这么做了,但是其他的却没有,但是依旧也能查询出来。

这是因为数据库将查询出来的记录进行筛选的时候,发现name的字段在这一大堆的列中,就这么一个,所以肯定就是它了。但上面的id却有两列,数据库就懵了,所以就会报错。

这里大家一定要牢记,以后最好所有的这样的连接查询都去指明是那个表的什么字段。因为当你写的SQL比较复杂的时候,你就可能忘记了,搞混了,这个要是没有被检查出来就上线了,你就等着背锅吧。

2. 外连接查询

外连接可以查出某一张表的所有信息,好比现在有两个表A、B,我们呢可以把所有A这个表的信息全部罗列出来,也可以把B表的信息全部罗列出来。但是现在好比B表中有一些内容和A表中的信息关联不上, 怎么办呢,数据库会优先保证主表的数据是完整的,然后B如果有能对应的上的就查询出来,没有的就拉倒,就填写个NULL。

外连接还具体细分为两种,一个是左外连接,一个是右外连接,这两个区别就是,左外连接,会保证 左面的表的数据是完整的,右外连接会保证右面的表数据是完整的,分割的话就是按照 LEFT 和 RIGHT 进行分割。

语法:

SELECT 属性名列表 FROM 表名 1 (LEFT 或者 RIGHT) JOIN 表名 2 ON 表名 1.属性名 1=表名 2.属性名 2;

左外连接查询

我们呢,先来使用一下 LEFT 左外连接 去查询一下 学生和他们所对应的班级信息。

 

是OK的,但是,我们为了能凸显出来我们这个左外连接,我们修改一下 张三这个学生的班级信息,我们让张三去三班,而班级表中并不存在三班。

我们再来查询一下。

可以看到,是空的。

右外连接查询

我们其他的不需要动,我们换一下这个left,把它换成right即可,我们再来查询一次。

我们会发现,班级表的数据是全的。同样,为了能凸显出右外连接,我们给这个班级表加一行数据。

id为4,学生表中不存在班级是4班的学生。我们再来查询一次。

OK,也是没有问题的。

 

大家要好好练习一下,有问题可以直接QQ我,我个人QQ:2100363119.

最近还弄了QQ群,主要为了学习,平时扯扯闲篇,有需要的可以加一下:1108075065

本文地址:https://blog.csdn.net/weixin_45908370/article/details/107073548

THE END
喜欢就支持一下吧
点赞11 分享