基础篇主要内容:MySQL概述、SQL语句、函数、约束、多表查询、事务。
多表查询
实际项目开发中,在进行数据库表结构设计时,会根据业务需求和业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,于是需要多表查询。
一、多表关系
各个表结构之间存在着各种联系,基本分为三类:一对多(多对一),多对多,一对一。
一对多关系:在多的一方建立外键,在一的一方建立主键
多对多关系:建立第三张表,设置至少两个外键,分别关联两方主键。
一对一关系:多用于单表拆分:在任意一方加入外键,关联另一方的主键,并将外键设置为唯一的(unique),从而保证不会存在多个数据对应同一记录的可能。
二、多表查询概述
即从多张表中查询数据。
笛卡尔积:
在数学上是指两个集合的所有组合情况,在多表查询中要消除无效的笛卡尔积。
如果直接使用 select * from 表1,表2; 则输出结果为笛卡尔积的形式,即没有考虑到两张表中的数据的关联。所以在多表查询中,需要通过设置条件来控制两张表的数据一一对应,即
select * from 表1,表2 where 表一某数据 = 表二某数据;
多表查询分类:
1、连接查询:内连接(求两表的交集数据)、外连接(求某表的全部数据和两表的交集数据)、自连接(当前表与自身的连接查询,必须使用表别名)
2、子查询
三、内连接
两种内连接效果相同,仅语法不同。
隐式内连接
select 查询列表 from 表1 ①表1别名,表2 ①表2别名 where 条件;
①常常通过设置别名来简化条件中表名的书写,但设置别名后,条件中不能在继续使用原表名了。
显式内连接
select 查询列表 from 表1 ①表1别名 ②inner join 表2 ①表2别名 on 条件 ;
②inner可以省略
四、外连接
左右其实相同,只要保证两张表的先后顺序正确即可,所以一般只用左外连接。
左外链接
得到表1的全部数据和两张表的交集数据
select 查询列表 from 表1 ①表1别名 left ③outer join 表2 ①表2别名 on 条件 ;
③outer可以省略
右外连接
得到表2的全部数据和两张表的交集数据
select 查询列表 from 表1 ①表1别名 right ③outer join 表2 ①表2别名 on 条件 ;
③outer可以省略
内连接与外连接的一大区别在于,如果是两个表的对应数据其中有空,则内连接不会显示,而外连接会显示。
五、自连接
自连接既可以是内连接,也可以是外连接,只要是一张表自己连接自己即可。
select 查询列表 from 表1 别名1 join 表1 别名2 on 条件;
六、联合查询
union查询,即把多次查询的结果合并起来,形成一个新的查询结果集。
select 查询列表 from 表1····
union ①all
select 查询列表 from 表2····;
①all如果删去,则重复的数据会被删去。
注意:联合查询时,多张表的查询列表必须相同。
七、子查询
概念:SQL语句中嵌套select语句,即嵌套查询,又称子查询;子查询外部的语句为SQL语句,即可以是insert、select、update、delete中任意一个语句。
根据子查询结果不同,可以子查询分为
标量子查询:子查询结果为单个值
列子查询:子查询结果为一列
行子查询:子查询结果为一行
表子查询:子查询结果为多行多列
根据子查询位置又可以分为:where后子查询、from后子查询、select后子查询
1、标量子查询
常用的操作符:> 、>= 、< 、<= 、= 、<>
2、列子查询
常用操作符:in 、not in 、any 、some 、all
3、行子查询
常用操作符:=、<>、in 、not in
4、表子查询
常用操作符:in