分组函数
分组函数
分组函数是对表中一组记录进行操作,每组只返回一个结果,即首先要对表记录进行分组,然后再进行操作汇总,每组返回一个结果,分组时可能是整个表分为一组,也可能根据条件分成多组。
分组函数常用到以下五个函数:
- MIN 最小
- MAX 最大
- SUM 求和
- AVG 平均
- COUNT 计数
组函数中DISTINCT
DISTINCT会消除重复记录后再使用组函数
分组函数中空值处理
除了COUNT(*)之外,其它所有分组函数都会忽略列中的空值,然后再进行计算。
在分组函数中使用IFNULL函数
IFNULL 函数可以使分组函数强制包含含有空值的记录
用GROUP BY子句创建数据组
其中GROUP BY子句指定要分组的列
SELECT deptno, AVG(sal)
FROM emp
GROUP BY deptno;
SELECT deptno, job, sum(sal)
FROM emp
GROUP BY deptno, job;
排除组结果
SELECT deptno, max(sal)
FROM emp
GROUP BY deptno
HAVING max(sal)>290
SELECT语句执行过程
SELECT语句执行过程:
- 通过FROM子句中找到需要查询的表;
- 通过WHERE子句进行非分组函数筛选判断;
- 通过GROUP BY子句完成分组操作;
- 通过HAVING子句完成组函数筛选判断;
- 通过SELECT子句选择显示的列或表达式及组函数;
- 通过ORDER BY子句进行排序操作。
子查询概述
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list FROM table);
子查询可以嵌于以下SQL子句中
WHERE子句
HAVING子句
FROM子句
子查询使用指导
子查询要用括号括起来
将子查询放在比较运算符的右边
对于单行子查询要使用单行运算符
对于多行子查询要使用多行运算符
视图
- 为什么使用视图
- 限制其它用户对数据库表的访问,因为视图可以有选择性的显示数据库表的一部分;
- 容易实现复杂的查询;
- 对于相同的数据可以产生不同的视图;
创建一个视图v_emp10,通过该视图只能查看10号部门的员工编号,员工姓名,职位。
CREATE VIEW empvu10
2 AS SELECT empno, ename, job
3 FROM emp
4 WHERE deptno = 10;
视图分类
从视图检索数据
修改视图
视图上执行DML操作
删除
在简单视图上可以执行 DML 操作;
您可以通过视图删除基表中数据,只要视图中不出现以下情况:
Group 函数;
GROUP BY 子句;
DISTINCT 关键字;
修改
您可以通过视图修改基表中数据,只要视图中不出现以下情况:
GROUP函数、GROUP BY子句,DISTINCT关键字;
使用表达式定义的列;
插入
您可以通过视图向基表插入数据,只要视图中不出现以下情况:
GROUP函数、GROUP BY子句,DISTINCT关键字;
使用表达式定义的列;
基表中未在视图中选择的其它列定义为非空并且没有默认值;
WITH CHECK OPTION
如果要确保在视图上执行的DML操作仅限于一定的范围,便可使用WITH CHECK OPTION子句;
删除视图
删除视图并不会删除数据,因为视图是基于数据库中的基表的虚表。
DROP VIEW view;
索引
索引是一种特殊的数据库结构,可以用来快速查询数据库表中的特定记录。索引是提高数据库性能的重要方式。MySQL中,所有的数据类型都可以被索引。
- 索引由数据库表中一列或多列组合
- 索引是创建在表上
- 是对数据库表中一列或多列的值进行排序的一种结构
缺点
索引的缺点是创建和维护索引需要耗费时间,增删改数据维护速度降低
分类
- 索引分类
- 普通索引
- 惟一性索引
- 全文索引
- 单列索引
- 多列索引
- 空间索引
搜索
mysql 性能调优金字塔
Oracle SQL性能优化的40条军规
创建索引
有三种方式,这三种方式分别是:
- 创建表的时候创建索引
- 在已经存在的表上创建索引
- 使用ALTER TABLE语句来创建索引
设计原则
为了使索引的使用效率更高,在创建索引的时候必须考虑在哪些字段上创建索引和创建什么类型的索引。索引的设计原则如下:
- 选择惟一性索引
- 为经常需要排序、分组和联合操作的字段建立索引
- 为常作为查询条件的字段建立索引
- 限制索引的数目
- 尽量使用数据量少的索引
- 尽量使用前缀来索引
- 删除不再使用或者很少使用的索引