汇总数据
聚集函数
有时只需要汇总数据,并不需要把数据实际检索出来,所以MySql提供了专门的函数
聚集函数:运行在行组上,计算和返回单个值的函数
函数 | 说明 |
---|---|
AVG() | 返回某列平均值 |
COUNT() | 返回某列的行数 |
MAX() | 返回某列最大值 |
MIN() | 返回某列最小值 |
SUM() | 返回某列值之和 |
COUNT()中,如果指定列名,则忽略NULL值,如果为*,则不忽略NULL
AVG() \ MAX() \ MIN() \ SUM() 函数忽略列值为NULL的行
使用 DISTINCT 参数,可以让聚合函数忽略相同的值
分组数据
主要介绍 group by 和 having
创建分组
使用 group by
创建分组
SELECT col_name_1, col_name_2
FROM table_name
Group by col_name_a,col_name_b
group by 子句可以包含任意数目的列
如果在 group by 子句中嵌套了分组, 数据将在最后规定的分组下进行会中
如果分组的列中具有NULL值,所有的NULL将被分成一个组返回
group by 子句必须在 where子句之后, order by子句之前
过滤分组
使用 having 过滤分组
having支持where的所有操作符
SELECT col_name
FROM table_name
GROUP BY col_name_a
HAVING condition
having
和 where
的差别
where
在数据分组前进行过滤。where
过滤的行不包含在分组中having
在数据分组后进行过滤
分组和排序
我们有时需要 group by
以分组顺序输出,但实际情况并不总是这样。
所以我们需要使用 order by
语句
使用子查询
- 子查询即嵌套在其他查询中的查询
- 对于嵌套的子查询数目没有限制,但是实际使用时由于性能的限制,不能嵌套太多的自查询
- 在 where 子句中使用自查询,应该保证 子查询的 select 语句具有与 where 子句中相同数目的列
- 相关子查询,涉及到外部查询的子查询。
联结表
基础知识
- 关系表
- 主键:可以唯一标识一行数据的属性
- 外键:定义两个表之间的联系,要么为空,要么为另一个表的主键
- 可伸缩性:能够适应不断增加的工作量而不失败的程度
使用联结的原因
为了有更好的可伸缩性,数据更有效、更方便的存储,我们将数据分解为多个表
数据存储在多个表中时,我们想要检索时,就需要联结多个表返回一个输出
创建链接
SELECT col_name_1, col_name_2, col_name_3
FROM table_name_1
WHERE table_name_1.col_name_a = table_name_2.col_name_b
当引用的列可能出现二义性时,必须使用完全限定列名,即表名+'.'+列名
如果不加入 where 子句,即没有联结条件,将返回两个表的笛卡尔积
内部联结
内部联结,又称等值联结
SELECT col_name_1, col_name_2
FROM table_name_1 INNER JOIN table_name_2
ON table_name_1.col_name_a = table_name_2.col_name_b
此处的 inner join 子句与 上面提到的 where 子句其相同的作用,但是使用明确的联结语法可以确保不会忘记联结条件,有时这样做也会影响到性能
MySql在运行时,关联指定的每个表以处理联结,这种处理非常消耗资源,所以,不要联结不必要的表,联结的表越多,性能下降的越厉害
自联结
SELECT a.col_name_1, a.col_name_2
FROM table_name as a, table_name as b
where a.col_name_a = b.col_name_a
自联结通常作为外部语句替代从相同表中检索数据时使用的子查询语句,虽然最终结果相同,但是处理联结比处理子查询快得多,应该试一下两种方式,以确定那种性能更好
自然连接
自然连接是一种特殊的内部联结,他要求两个表具有相同的属性列,同时在内部联结的基础上,去掉了重复的属性
外部链接
分为 左外连接 和 右外连接
连接时会产生一些在另一个表中没有数据的元组,这些元组成为悬浮元组
左外连接,使返回结果包含左边关系表联结后产生的的悬浮元组,这些元组在右边表的属性列值都为NULL
右外连接同上,两种类型的外连接可以互换使用,根据方便决定
注意事项
- 一般使用内部联结和外部链接
- 要保证使用正确的连接条件
- 应该总是提供联结条件(否则会出现笛卡尔积
- 在一个联结中可以包含多个表,对于每个联结可以采用不同的连接方式
组合查询
-
MySql允许执行多个查询,然后将结果作为单个查询结果集返回
-
这样的组合查询通常称为 并 或者 复合查询,使用
union
关键字 -
需要使用组合查询的情况:
- 在单个查询中从不同的表返回类似结构的数据
- 对单个表执行多个查询,按单个查询返回数据
-
组合相同表的查询 = 具有多个 where 子句条件的单挑查询
- 这两种技术在不同的查询中性能不同,因此应该尝试两种方式,以确定对待特定的查询哪一种性能更好
UNION 规则
-
UNION 必须有两条即以上的 SELECT 语句组成
-
UNION 中的每个查询必须包含相同的列、表达式、聚合函数,但不需要各个列按照相同的次序列出
-
列数据类型不需要完全相同,但是一定要兼容,且使DBMS可以隐含转换的类型
-
UNION 会从查询结果集中自动去掉重复的行,如果想要返回所有的行,可以使用
union all
关键字UNION ALL 完成了 WHERE 子句无法完成的工作
-
如果想对 UNION 组合查询进行排序,只能使用一条 ORDER BY 语句,且必须放在最后一条 SELECT 语句之后