为什么要进行拆表
比如说一张学生表,里面有一个字段为分数:
我们知道,一个学生可以考多门课程,有多门课程的分数,那么这时候就需要添加多个重复的数据了;而且这里并不能区分是什么课程。那么这时候就需要进行表拆分了:
进行表拆分的优点是:
实现项目的具体需求
避免大量冗余数据,提高数据的查询效率。
注意:表并不是拆分得越仔细越好,否则工作量会增加
多表查询
既然有了表拆分,那么就会有多表查询。多表查询有如下几种:
合并结果集;UNION 、 UNION ALL
连接查询
内连接 [INNER] JOIN ON
外连接 OUTER JOIN ON
左外连接 LEFT [OUTER] JOIN
右外连接 RIGHT [OUTER] JOIN
全外连接(MySQL不支持)FULL JOIN
自然连接 NATURAL JOIN
子查询
自连接
1 合并结果集
作用:合并结果集就是把两个select语句的查询结果合并到一起!
合并结果集有两种方式:
UNION:去除重复记录,例如:SELECT * FROM t1 UNION SELECT * FROM t2;
UNION ALL:不去除重复记录,例如:SELECT * FROM t1 UNION ALL SELECT * FROM t2。
要求:被合并的两个结果:列数、列类型必须相同(不相同的时候,通过SELECT关键字去筛选需要的列)。
相关的图例如下:
例子:
2 连接查询(重点)
连接不限于两张表,连接查询也可以是三张、四张,甚至N张表的连接查询。直接查询多张表会产生笛卡尔积,通常连接查询不可能需要整个笛卡尔积,而只是需要其中一部分,那么这时就需要使用条件来去除不需要的记录。这个条件大多数情况下都是使用主外键关系去除,这时候就需要N-1个查询条件。
两张表的连接查询一定有一个主外键关系,三张表的连接查询就一定有两个主外键关系,所以在大家不是很熟悉连接查询时,首先要学会去除无用笛卡尔积,那么就是用主外键关系作为条件来处理。如果两张表的查询,那么至少有一个主外键条件,三张表连接至少有两个主外键条件。
3 子查询
子查询就是嵌套查询,即SELECT中包含SELECT,如果一条语句中存在两个,或两个以上SELECT,那么就是子查询语句了。
子查询出现的位置:
子查询结果集的形式:
4 自连接查询
领取专属 10元无门槛券
私享最新 技术干货