Mysql的学习(二)——多表查询

表之间的关系:一对一、一对多、多对多

多表之间的约束靠外键约束。

一、多表关系

①一对一关系

一对一关系在实际应用中不太多,因为可以直接建一张表

两种建表原则:

唯一外键对应:假设一对一是一个一对多的关系,在多的一方创建一个外键指向一的一方的主键,将外键设置为unique.

主键对应:让一对一的双方的主键进行建立关系.

②、一对多关系

建表原则:在多的一方创建一个字段,字段作为外键指向一的一方的主键。

③、多对多关系

建表原则:需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。

二、多表查询

合并结果集

UNION、UNION ALL

连接查询

内连接:[INNER] JOIN ......ON

显示左表及右表符合连接条件的记录,也就是两表共有的。

Mysql的学习(二)——多表查询

外连接:

左外连接:LEFT [OUTER] JOIN

显示左表的全部记录及右表符合连接条件的记录,直接理解为左表全部即可

Mysql的学习(二)——多表查询

右外连接:RIGHT [OUTER] JOIN

显示右表的全部记录及左表符合连接条件的记录,直接理解为右表全部

Mysql的学习(二)——多表查询

①、合并结果集

作用:合并结果集就是把两个select语句的查询结果合并到一起

合并结果集有两种方式:

UNION:去除重复记录,例如:SELECT* FROM t1 UNION SELECT * FROM t2;

Mysql的学习(二)——多表查询

UNION ALL:不去除重复记录,例如:SELECT * FROM t1 UNION ALL SELECT * FROM t2。

Mysql的学习(二)——多表查询

被合并的两个结果,列数、列类型必须相同

②连接查询

连接查询就是求出多个表的乘积,例如t1连接t2,那么查询出的结果就是t1*t2。

Mysql的学习(二)——多表查询

连接查询会产生笛卡尔积,假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。

多表查询产生这样的结果,并不是我们想要的,如果要得到我们想要的,我们应该通过条件过滤。通常要查询的多个表之间都存在关联关系,可以通过关联关系去除笛卡尔积。

连接不限与两张表,连接查询也可以是三张、四张,甚至N张表的连接查询。通常连接查询不可能需要整个笛卡尔积,而只是需要其中一部分,那么这时就需要使用条件来去除不需要的记录。这个条件大多数情况下都是使用主外键关系去除。

两张表的连接查询一定有一个主外键关系,三张表的连接查询就一定有两个主外键关系,所以在大家不是很熟悉连接查询时,首先要学会去除无用笛卡尔积,那么就是用主外键关系作为条件来处理。如果两张表的查询,那么至少有一个主外键条件,三张表连接至少有两个主外键条件

③子查询

子查询是指出现在其它SQL语句内的SELECT子句。

子查询指嵌套在查询内部,且必须始终出现在圆括号内。

子查询可以包含多个关键字或条件,如DISTINCT、GROUP BY、ORDER BY、LIMIT、函数等。

子查询的外层查询可以是:SELECT、INSERT、UPDATE、SET、或DO

子查询可以返回标量、一行、一列或子查询。

下面做一些练习:

练习可以参考链接:https://blog.****.net/weixin_39718665/article/details/78161013

通过练习,作了一些个人总结:

凡是涉及到“每”这种的,都需要使用GROUP BY进行分组;

如果涉及到数量,即题目要求要>、<、=之类某个数量时,需要使用HAVING进行过滤;

进行多表查询时,给出了某一个条件时,要求查询的结果,先看看查询的结果在哪一张表,然后看看需要使用到哪些表,然后看看查询结果的那一张表跟其它表之间的关联,通过它们之间的关联关系进行查询。一般可以使用子查询、连接查询。

使用子查询时,当使用到WHERE的时候,注意后面子查询连接使用=还是IN或者其它。

count计数使用的时候,要注意count计数的是NOT NULL,如果是NULL的,是不计数的。如果count计数中的条件是一个范围,一定在count计数中的条件后添加 OR NULL,因为如果未满足条件,返回的是false,而count只不会计数NULL的值,false或true都会计数,所以要添加OR NULL。

使用连接查询的时候,注意ON后面的条件,一般在多表查询使用连接查询的时候,就直接在ON后面写上各个表之间的关联关系,即t1.no=t2.no这种形式。

如果涉及到日期,可以使用YEAR(date)来获取年份,使用QUARTER(date)来获取季度,使用MONTH(date)来返回月份。

MySql的查询应该是在实际应用中使用到最多的,关于MySql语句的练习,可以直接百度练习题,一遍一遍的练习,在练习过程中再自己进行总结。