Mysql的学习(二)——多表查询
表之间的关系:一对一、一对多、多对多
多表之间的约束靠外键约束。
一、多表关系
①一对一关系
一对一关系在实际应用中不太多,因为可以直接建一张表
两种建表原则:
唯一外键对应:假设一对一是一个一对多的关系,在多的一方创建一个外键指向一的一方的主键,将外键设置为unique.
主键对应:让一对一的双方的主键进行建立关系.
②、一对多关系
建表原则:在多的一方创建一个字段,字段作为外键指向一的一方的主键。
③、多对多关系
建表原则:需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。
二、多表查询
合并结果集
UNION、UNION ALL
连接查询
内连接:[INNER] JOIN ......ON
显示左表及右表符合连接条件的记录,也就是两表共有的。
外连接:
左外连接:LEFT [OUTER] JOIN
显示左表的全部记录及右表符合连接条件的记录,直接理解为左表全部即可
右外连接:RIGHT [OUTER] JOIN
显示右表的全部记录及左表符合连接条件的记录,直接理解为右表全部
①、合并结果集
作用:合并结果集就是把两个select语句的查询结果合并到一起
合并结果集有两种方式:
UNION:去除重复记录,例如:SELECT* FROM t1 UNION SELECT * FROM t2;
UNION ALL:不去除重复记录,例如:SELECT * FROM t1 UNION ALL SELECT * FROM t2。
被合并的两个结果,列数、列类型必须相同
②连接查询
连接查询就是求出多个表的乘积,例如t1连接t2,那么查询出的结果就是t1*t2。
连接查询会产生笛卡尔积,假设集合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语句的练习,可以直接百度练习题,一遍一遍的练习,在练习过程中再自己进行总结。