MySQL进阶操作
LIKE子句
MySQL 中使用 SELECT 命令来读取数据。通过 SELECT 语句中使用WHERE 子句来获取指定的记录。
LIKE 子句通常用于 WHERE 子句中。
LIKE 子句中使用百分号(%)字符来表示任意字符,类似于UNIX或正则表达式中的星号(*)。
如果没有使用百分号(%), LIKE 子句与等号(=)的效果是一样的。
SELECT
field_1,
field_2,
...,
field_n
from
table_name_1,
table_name_2,
...,
table_name_n
WHERE
field1 LIKE condition1 [AND [OR]] filed2 = 'value'
GROUP BY分组子句
- GROUP BY 语句根据一个或多个列对结果集进行分组。
- 可使用 COUNT, SUM, AVG 等函数对每一组进行操作。
- 若不分组使用 COUNT, SUM, AVG 等函数,MySQL将把所有获取的所有数据做为一个组,当且仅当只有这一个组。
SELECT
column_name,
function(column_name)
FROM
table_name [WHRER Clause]
GROUP BY
column_name
HAVING子句
- HAVING子句通常与GRUOP BY同时使用,用于过滤聚合后的结果(比如使用了SUM、COUNT、AVG等聚合函数)。
- HAVING子句通常与聚合函数(SUM、COUNT、AVG)搭配使用。
- HAVING与WHERE子句含义相近,都是用来设置条件的。不同的是,WHERE子句先判断再聚合结果;HAVING子句先聚合结果再判断再聚合结果。
- HAVING与WHERE通常不会同时出现。
SELECT
field_1,
field_2,
...,
field_n
FROM
table_name_1,
table_name_2,
...,
table_name_n
GROUP BY
field_1
HAVING
SUM(field_1) > 10
表的别名(Alias)
当进行多表操作时,给表使用别名可以达到简化SQL语句的功能。
别名加在表名的后面,用AS子句表示,也可以直接用空格隔开。事实上,通常用空格隔开。
SELECT
t1.name,
t2.gender
FROM
table_1 [AS] t1,
table_2 [AS] t2
解析:从table_1、table_2中取出数据。对于table_1只需要它的name字段数据;对于table_2只需要它的gender字段数据。
JOIN连接表,进行多表查询
你可以在SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询。
JOIN 按照功能大致分为如下三类:
- INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
- LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
- RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
注:MySQL没有FULL OUTER JOIN,但可以通过某种方式实现FULL OUTER JOIN,后续讲解。
①INNER JOIN(相当于JOIN,内连接)
SELECT
t1.name,
t2.salary
FROM
table_1 t1
[INNER] JOIN table_2 t2 ON t1.dept = t2.dept
分析:只返回满足t1.dept = t2.dept条件的数据。分别取t1表的name字段,t2表的salary字段。
②LEFT JOIN(左连接)
SELECT
t1.name,
t2.salary
FROM
table_1 t1
LEFT JOIN table_2 t2 ON t1.dept = t2.dept
分析:返回t1表的所有数据,不管是否满足t1.dept = t2.dept条件。返回t2表中满足t1.dept = t2.dept的数据。
③RIGHT JOIN
SELECT
t1.name,
t2.salary
FROM
table_1 t1
LEFT JOIN table_2 t2 ON t1.dept = t2.dept
分析:返回t2表的所有数据,不管是否满足t1.dept = t2.dept条件。返回t1表中满足t1.dept = t2.dept的数据。
刚才上文说MySQL没有FULL OUTER JOIN,那么我们怎么实现FULL OUTER JOIN呢?
事实上,使用UNION语句连接LEFT JOIN和RIGHT JOIN就可实现全外连接
SELECT
t1.name,
t2.salary
FROM
table_1 t1
LEFT JOIN table_2 t2 ON t1.dept = t2.dept
UNION
SELECT
t1.name,
t2.salary
FROM
table_1 t1
RIGHT JOIN table_2 t2 ON t1.dept = t2.dept