目录
6.1多表查询
(1)联合查询
联合查询是多表查询的一种方式,在保证多个SELECT语句的查询字段数相同的情况下,合并多个查询的结果。
SELECT …
UNION [ALL | DISTINCT] SELECT …
[UNION [ALL | DISTINCT] SELECT …];
UNION 是实现联合查询的关键字。
ALL 表示保存所有的查询结果。
DISTINCT 是默认值,可以省略,表示去除完全重复的记录。
(2)连续查询
1.交叉连接
交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积。
SELECT 查询字段 FROM 表1 CROSS JOIN 表2;
CROSS JOIN 用于连接两个要查询的表。
通过该语句可以查询两个表中所有的数据组合。
2.内连接
内连接是一种常见的连接查询,它根据匹配条件返回第1个表与第2个表所有匹配成功的记录。
SELECT 查询字段 FROM 表1[INNER] JOIN 表2 ON 匹配条件;
ON 用于指定内连接的查询条件。
在不设置 ON 时,与交叉连接等价。
自连接查询是内连接中的一种特殊查询。
它是指相互连接的表在物理上为同一个表,但逻辑上分为两个表。
3.左外连接
左外连接是外连接查询中的一种,也可以将其称为左连接。
它用于返回连接关键字(LEFT JOIN)左表中所有的记录,以及右表中符合连接条件的记录。
当左表的某行记录在右表中没有匹配的记录时,右表中相关的记录将设为空值(NULL)。
SELECT 查询字段 FROM 表1 LEFT [OUTER] JOIN 表2 ON 匹配条件;
关键字“ LEFT [OUTER] JOIN ”左边的表(表 1 )被称为 左表 ,也可称为 主表 。
关键字右边的表(表 2 )被称为 右表 ,也可称为 从表 。
OUTER在查询时可以省略。
4.右外连接
右外连接也是外连接查询中的一种,可以将其称为右连接。
它用于返回连接关键字(RIGHT JOIN)右表(主表)中所有的记录,以及左表(从表)中符合连接条件的记录。
当右表的某行记录在左表中没有匹配的记录时,左表中相关的记录将设为空值(NULL)。
SELECT 查询字段 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 匹配条件;
USING关键字
若连接查询数据表连接的字段同名,则连接时的匹配条件使用USING代替ON。
SELECT 查询字段 FROM 表1 [CROSS|INNER|LEFT|RIGHT] JOIN 表2
USING( 同名的连接字段列表);
USING关键字在实际开发中并不常使用,原因在于设计表的时候不能确定使用相同的字段名称保存对应的数据。
6.2子查询
(1)什么是子查询
子查询可以理解为,在一个SQL语句A(SELECT、INSERT、UPDATE等)中嵌入一个查询语句B,作为执行的条件或查询的数据源(代替FROM后的数据表),那么B就是子查询语句,它是一条完整的SELECT语句,能够独立的执行。
在含有子查询的语句中,子查询必须书写在圆括号( )内。
子查询的划分方式有多种,最常见的是以功能和位置进行划分。
按子查询的功能可以分为标量子查询、列子查询、行子查询和表子查询。
按子查询出现的位置可以分为WHERE子查询和FROM子查询。
标量子查询、列子查询和行子查询都属于WHERE子查询。
表子查询属于FROM子查询。
(2)子查询分类
1.标量子查询
子查询返回的结果是一个数据,即一行一列。
WHERE条件判断 {=|<>}
(SELECT 字段名 FROM 数据源 [WHERE] [GROUP BY] [HAVING] [ORDER BY] [LIMIT]);
子查询利用比较运算符 = 或 <> ,判断子查询语句返回的数据是否与指定的条件相等或不等,然后根据比较结果完成相关需求的操作。
数据源表示一个符合二维表结构的数据,如数据表。
2.列子查询
子查询返回的结果是一个字段符合条件的所有数据,即一列多行。
WHERE条件判断 {IN|NOT IN}
(SELECT 字段名 FROM 数据源 [WHERE] [GROUP BY] [HAVING] [ORDER BY] [LIMIT]);
子查询利用比较运算函数 IN() 或 NOT IN() 。
判断指定的条件是否在子查询语句返回的结果集中。
然后根据比较结果完成相关需求的操作。
3.行子查询
当子查询的结果是一条包含多个字段的记录(一行多列)时,称为行子查询。
WHERE (指定字段名1,指定字段名2,…) =
(SELECT字段名1,字段名2,… FROM 数据源 [WHERE] [GROUP BY]
[HAVING] [ORDER BY] [LIMIT]);
行子查询返回的一条记录与指定的条件比较,比较的运算符通常使用 = 。
子查询的结果必须全部与指定的字段相等才满足WHERE指定的条件。
行子查询时,还可以用MySQL中其他的比较运算符,如<>、>等。
不同运算符的行比较 | 描述 |
(a, b) = (x, y) | 表达的含义等价于(a=x)AND(b=y) |
(a, b) <=> (x, y) | 表达的含义等价于(a<=>x)AND(b<=>y) |
(a, b) <> (x, y)或(a, b) != (x, y) | 表达的含义等价于(a<>x)OR (b<>y) |
(a, b) > (x, y) | 表达的含义等价于(a>x) OR ((a=x) AND (b>y)) |
(a, b) >= (x, y) | 表达的含义等价于(a>x) OR ((a=x) AND (b>=y)) |
(a, b) < (x, y) | 表达的含义等价于(a<x) OR ((a=x) AND (b<y)) |
(a, b) <= (x, y) | 表达的含义等价于(a<x) OR ((a=x) AND (b<=y)) |
行在相等比较( = 或 <=> )时,各条件之间是与的逻辑关系。
在不等比较( <> 或 ! )时,各条件之间是或的逻辑关系。
在进行其他方式比较时,各条件之间的逻辑关系包含两种情况。
4.表子查询
子查询的返回结果用于FROM数据源,它是一个符合二维表结构的数据,可以是一行一列、一列多行、一行多列或多行多列。
SELECT 字段列表 FROM (SELECT语句) [AS] 别名
[WHERE] [GROUP BY] [HAVING] [ORDER BY] [LIMIT];
FROM 后的数据源都是表名。
当数据源是子查询时必须为其设置别名,同时也是为了将查询结果作为一个表使用时,可以进行条件判断、分组、排序以及限量等操作。
(3)子查询关键字
带EXISTS关键字的子查询返回的结果只有0和1两个值。
0代表不成立,1代表成立。
WHERE EXISTS(子查询语句);
带ANY关键字的子查询时,表示给定的判断条件,只要符合ANY子查询结果中的任意一个,就返回1,否则返回0。
WHERE 表达式 比较运算符 ANY(子查询语句);
当比较运算符为“=”时,其执行的效果等价于IN关键字。
带ALL关键字的子查询时,表示给定的判断条件,只有全部符合ALL子查询的结果时,才返回1,否则返回0。
WHERE 表达式 比较运算符 ALL(子查询语句);
6.3外键约束
(1)添加外键约束
外键指的是在一个表中引用另一个表中的一列或多列,被引用的列应该具有主键约束或唯一性约束,从而保证数据的一致性和完整性。
被引用的表称为主表。引用外键的表称为从表。
创建数据表( CREATE TABLE ),在相应的位置 添加外键约束。
修改数据结构( ALTER TABLE ),在相应的位置 添加外键约束。
FOREIGN KEY...REFERENCES 关键字:向数据表中添加外键约束。
语法中第一行的参数 “ index_col_name , ... ” 表示从表中外键名称列表。
tbl_name 表示主表,主表后的参数列表“ index_col_name , ... ” 表示主键约束或唯一性约束字段。
关键字 CONSTRAINT 用于定义外键约束的名称 symbol ,如果省略, MYSQL 将会自动生成一个名字。
index_name 也是可选参数,表示外键索引名称,如果省略, MySQL 也会在建立外键时自动创建一个外键索引,加快查询速度。
ON DELETE 与 ON UPDATE 用于设置主表中的数据被删除或修改时,从表对应数据的处理办法。
ON DELETE 与 ON UPDATE 的各参数含义
参数名称 | 功能描述 |
RESTRICT | 默认值。拒绝主表删除或修改外键关联字段 |
CASCADE | 主表中删除或更新记录时,同时自动删除或更新从表中对应的记录 |
SET NULL | 主表中删除或更新记录时,使用NULL值替换从表中对应的记录。 (不适用于NOT NULL字段) |
NO ACTION | 与默认值RESTRICT相同,拒绝主表删除或修改外键关联字段 |
SET DEFAULT | 设默认值,但InnoDB目前不支持 |
• 定义外键约束名称 时,不能加单引号和双引号。
(2)关联表操作
一个具有外键约束的从表在插入数据时,外键字段的值会受主表数据的约束,保证从表插入的数据必须符合约束规范的要求。例如,从表外键字段不能插入主表中不存在的数据。
对于建立外键约束的关联数据表来说,若对主表进行更新操作,从表将按照其建立外键约束时设置的ON UPDATE参数自动执行相应的操作。例如,当参数设置为CASCADE时,如果主表发生更新,则从表也会对相应的字段进行更新。
外键约束在使用时既有一定的优势,同时又会带来一定的问题,具体如下。
对于已建立外键约束的关联数据表来说,若要对主表执行删除操作,从表将按照其建立外键约束时设置的ON DELETE参数自动执行相应的操作。
例如,当参数设置为RESTRICT时,如果主表进行删除操作,同时从表中的外键字段有关联记录,就会阻止主表的删除操作。
(3)删除外键约束
ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
若要在删除外键约束后,同时删除系统为外键创建的普通索引,则需要通过手动删除索引的方式分完成。
ALTER TABLE 从表 DROP KEY 外键约束别名;