有时只需要汇总数据,并不需要把数据实际检索出来,所以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
语句
为了有更好的可伸缩性,数据更有效、更方便的存储,我们将数据分解为多个表
数据存储在多个表中时,我们想要检索时,就需要联结多个表返回一个输出
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 必须有两条即以上的 SELECT 语句组成
UNION 中的每个查询必须包含相同的列、表达式、聚合函数,但不需要各个列按照相同的次序列出
列数据类型不需要完全相同,但是一定要兼容,且使DBMS可以隐含转换的类型
UNION 会从查询结果集中自动去掉重复的行,如果想要返回所有的行,可以使用 union all
关键字
UNION ALL 完成了 WHERE 子句无法完成的工作
如果想对 UNION 组合查询进行排序,只能使用一条 ORDER BY 语句,且必须放在最后一条 SELECT 语句之后
上一篇:Java集合类
下一篇:关于Hanoi塔的实现