1. 在执行语句之前,会先检查下列事项
1.1. 是否有权限执行该语句
1.2. 是否有权限访问指定的数据
1.3. 语句的语法是否正确
2. select子句
2.1. select子句是select语句中的第一个子句,但最后才会被数据库服务器评估
2.2. 决定哪些列应该包含在查询的结果集中
2.3. 字面量
2.4. 表达式
2.5. 内建函数调用
2.6. 用户自定义函数调用
2.7. select version(),database(),user()
2.8. 列的别名
2.8.1. AS是可选项
2.9. 移除重复数据
2.9.1. select后面直接添加关键字distinct来实现
2.10. 关键字all是默认的
2.10.1. 不需要指明
2.10.2. 如果不想让服务器移除重复数据或者确定结果集中不会出现重复数据,可以使用关键字all代替distinct
2.11. 生成一组不同的结果时需要对数据进行排序,这对于大型结果集会很耗时
2.12. 不要陷入为了确保没有重复数据而使用distinct的陷阱,而应该花时间充分理解所处理的数据,以便了解是否可能出现重复数据
3. from子句
3.1. 定义了查询要用到的数据表以及连接数据表的方式
3.2. 宽泛定义的数据表
3.2.1. 永久数据表(使用create table语句创建)
3.2.2. 派生数据表(由子查询返回并保存在内存中的行)
3.2.2.1. 子查询由一对小括号包围,可以出现在select语句的各个部分中
3.2.2.2. 子查询的作用在于生成其他所有查询子句中可见的派生数据表,以及与from子句中的其他数据表交互
3.2.3. 临时数据表(保存在内存中的易失数据)
3.2.3.1. mysql
-> CREATE TEMPORARY TABLE actors_j
-> (actor_id smallint(5),
-> first_name varchar(45),
-> last_name varchar(45)
-> );
3.2.3.2. 临时保留在内存中,会话结束后就消失了
3.2.3.3. Oracle Database是一个例外,它会保留临时数据表定义,以备后续会话使用
3.2.4. 虚拟数据表(使用create view语句创建)
3.2.4.1. 视图是存储在数据目录中的查询,其行为表现就像数据表,但是并没有与之关联的数据(这就是将其称为虚拟数据表的原因)
3.2.4.2. 创建视图时,不会生成或存储额外的数据
3.2.4.3. 服务器只是保留select语句,以备后用
3.2.4.4. 创建视图的原因各种各样,包含对用户隐藏列、简化复杂的数据库设计
4. 数据表链接
4.1. 如果from子句中出现多个数据表,则必须包含用于链接(link)这些数据表的条件
4.2. 定义数据表别名
4.2.1. 使用完整的数据表名称
4.2.2. 为每个数据表指定别名,在查询中使用该别名
4.2.3. 使用别名可以在不造成困惑的情况下(只要选择合理的别名)编写出更紧凑的语句
5. where子句
5.1. 一种机制,用于过滤掉结果集中不想要的行
5.2. 在混用不同的运算符时,应该坚持使用括号对条件进行分组
5.2.1. 以便你自己、数据库服务器和后续人员都能够意见统一地修改代码
6. group by和having子句
6.1. 在返回结果集之前对数据进行处理,以便发现数据呈现的规律
7. order by子句
7.1. 使用原始列数据或基于列数据的表达式对结果集进行排序的一种机制
7.2. 可以通过关键字asc和desc来指定升序排序或降序排序
7.3. 默认为按照升序排序,如果希望按照降序排序,需要加入desc关键字
7.4. 降序排序多用于评级查询
7.5. MySQL提供了limit子句以允许对数据进行排序,然后只保留前X行
7.6. 比如“显示余额最多的前5个账户”
7.7. 通过数字占位符进行排序
7.7.1. 查询使用select子句中的第3列,按照降序进行排序
7.7.2. mysql
-> SELECT c.first_name, c.last_name,
-> time(r.rental_date) rental_time
-> FROM customer c
-> INNER JOIN rental r
-> ON c.customer_id = r.customer_id
-> WHERE date(r.rental_date) = '2005-06-14'
-> ORDER BY 3 desc;