SELECT 语句中各个子句的执行顺序与 SELECT 语句中子句的语法顺序是不一样的。
SELECT 语句在书写时各个关键字要保持下面的顺序:
select [distinct] 字段或表达式列表 from 表名 join(left join, right join) on 连接条件 where 筛选条件 group by 字段列表 having 字段列表 order by 字段列表 limit <m,n>SELECT 语句中各个子句按照下面的顺序执行。每个子句执行后都会产生一个中间结果,供接下来的子句使用,如果不存在某个子句,就跳过该子句。
1. FROM子句 2. WHERE子句 3. GROUP BY子句 4. HAVING子句 5. SELECT子句 6. ORDER BY子句 7. LIMIT子句 /* ######################################################################################## 执行顺序的说明: (1) from 子句组装来自不同数据源的数据; (2) where 子句基于指定的条件对记录行进行筛选; (3) group by 子句将数据划分为多个分组; (4) 使用聚集函数进行计算; (5) 使用 having 子句筛选分组; (6) 计算所有的表达式; (7) select 字段; (8) 使用 order by 对结果集进行排序。 关于字段别名的使用: (1) WHERE子句不能使用字段别名。 (2) 从 GROUP BY 子句开始,后面的所有子句可以使用字段别名。 ######################################################################################## */后面的查询用到下面的两张表,表结构和数据如下:
mysql> select * from dept; +---------+-----------+ | dept_id | dept_name | +---------+-----------+ | 11 | 财务部 | | 12 | 技术部 | | 13 | 销售部 | | 14 | 公关部 | +---------+-----------+ 4 rows in set (0.00 sec) mysql> select * from emp; +------+-----------+--------+----------+---------+ | e_id | e_name | gender | salary | dept_id | +------+-----------+--------+----------+---------+ | 1101 | 张美华 | 女 | 5000.00 | 11 | | 1102 | 王涛 | 男 | 5200.00 | 11 | | 1103 | 张学有 | 男 | 4700.00 | 11 | | 1201 | 刘得华 | 男 | 5200.00 | 12 | | 1202 | 董雯花 | 女 | 5900.00 | 12 | | 1203 | 宋族营 | 男 | 6500.00 | 12 | | 1204 | 李霜江 | 男 | 7200.00 | 12 | | 1301 | 梁美丽 | 女 | 7040.00 | 13 | | 1302 | 王大强 | 男 | 6710.00 | 13 | | 1303 | 张美华 | 女 | 8580.00 | 13 | | 1304 | 赵紫龙 | 男 | 7590.00 | 13 | | 1305 | 诸葛量 | 男 | 10120.00 | 13 | | 1306 | 曹梦德 | 男 | 9240.00 | 13 | +------+-----------+--------+----------+---------+ 13 rows in set (0.00 sec)注意:在 WHERE 子句中不能使用字段别名。
mysql> SELECT -> e.e_id, -> e.e_name ename, -> e.salary, -> e.dept_id, -> d.dept_name -> FROM -> emp e JOIN dept d ON e.dept_id = d.dept_id -> WHERE ename like '王%'; ERROR 1054 (42S22): Unknown column 'ename' in 'where clause' ---说明:出现错误!在 WHERE 子句中不能使用字段别名 ename。 mysql> SELECT -> e.e_id, -> e.e_name ename, -> e.salary, -> e.dept_id, -> d.dept_name -> FROM -> emp e JOIN dept d ON e.dept_id = d.dept_id -> WHERE -> salary BETWEEN 5000 AND 10000; +------+-----------+---------+---------+-----------+ | e_id | ename | salary | dept_id | dept_name | +------+-----------+---------+---------+-----------+ | 1101 | 张美华 | 5000.00 | 11 | 财务部 | | 1102 | 王涛 | 5200.00 | 11 | 财务部 | | 1201 | 刘得华 | 5200.00 | 12 | 技术部 | | 1202 | 董雯花 | 5900.00 | 12 | 技术部 | | 1203 | 宋族营 | 6500.00 | 12 | 技术部 | | 1204 | 李霜江 | 7200.00 | 12 | 技术部 | | 1301 | 梁美丽 | 7040.00 | 13 | 销售部 | | 1302 | 王大强 | 6710.00 | 13 | 销售部 | | 1303 | 张美华 | 8580.00 | 13 | 销售部 | | 1304 | 赵紫龙 | 7590.00 | 13 | 销售部 | | 1306 | 曹梦德 | 9240.00 | 13 | 销售部 | +------+-----------+---------+---------+-----------+ 11 rows in set (0.00 sec)