SELECT 语句中子句的执行顺序与 SELECT 语句中子句的输入顺序是不一样的, 所以并不是从 SELECT 子句开始执行的, 而是按照下面的顺序执行:
开始 ->FROM 子句 ->WHERE 子句 ->GROUP BY 子句 ->HAVING 子句 ->ORDER BY 子句 ->SELECT 子句 ->LIMIT 子句 -> 最终结果
每个子句执行后都会产生一个中间结果, 供接下来的子句使用, 如果不存在某个子句, 就跳过
对比了一下, MySQL 和 sql 执行顺序基本是一样的, 标准顺序的 SQL 语句为:
select 考生姓名, max(总成绩) as max 总成绩
from tb_Grade
where 考生姓名 is not null
group by 考生姓名
having max(总成绩)> 600
order by max 总成绩
在上面的示例中 SQL 语句的执行顺序如下:
(1). 首先执行 FROM 子句, 从 tb_Grade 表组装数据源的数据
(2). 执行 WHERE 子句, 筛选 tb_Grade 表中所有数据不为 NULL 的数据
(3). 执行 GROUP BY 子句, 把 tb_Grade 表按 "学生姓名" 列进行分组 (注: 这一步开始才可以使用 select 中的别名, 他返回的是一个游标, 而不是一个表, 所以在 where 中不可以使用 select 中的别名, 而 having 却可以使用, 感谢网友 zyt1369 提出这个问题)
(4). 计算 max() 聚集函数, 按 "总成绩" 求出总成绩中最大的一些数值
(5). 执行 HAVING 子句, 筛选课程的总成绩大于 600 分的.
(7). 执行 ORDER BY 子句, 把最后的结果按 "Max 成绩" 进行排序.
SQL 的各种连接 Join 详解
SQL JOIN 子句用于把来自两个或多个表的行结合起来, 基于这些表之间的共同字段.
最常见的 JOIN 类型: SQL INNER JOIN(简单的 JOIN),SQL LEFT JOIN,SQL RIGHT JOIN,SQL FULL JOIN, 其中前一种是内连接, 后三种是外链接.
假设我们有两张表, Table A 是左边的表, Table B 是右边的表.
id | name |
1 | |
2 | 淘宝 |
3 | 微博 |
4 |
id | address |
1 | 美国 |
5 | 中国 |
3 | 中国 |
6 | 美国 |
INNER JOIN
内连接是最常见的一种连接, 只连接匹配的行.
inner join 语法
- select column_name(s)
- from table 1
- INNER JOIN table 2
- ON
- table 1.column_name=table 2.column_name
注释: INNER JOIN 与 JOIN 是相同
INNER JOIN 产生的结果集中, 是 1 和 2 的交集.
- select * from Table A inner join Table B
- on Table A.id=Table B.id
执行以上 SQL 输出结果如下:
id | name | address |
1 | 美国 | |
3 | 微博 | 中国 |
LEFT JOIN
LEFT JOIN 返回左表的全部行和右表满足 ON 条件的行, 如果左表的行在右表中没有匹配, 那么这一行右表中对应数据用 NULL 代替.
LEFT JOIN 语法
- select column_name(s)
- from table 1
- LEFT JOIN table 2
- ON table 1.column_name=table 2.column_name
注释: 在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN
LEFT JOIN 产生表 1 的完全集, 而 2 表中匹配的则有值, 没有匹配的则以 null 值取代.
- select * from Table A left join Table B
- on Table A.id=Table B.id
执行以上 SQL 输出结果如下:
id | name | address |
1 | 美国 | |
2 | 淘宝 | null |
3 | 微博 | 中国 |
4 | null |
RIGHT JOIN
RIGHT JOIN 返回右表的全部行和左表满足 ON 条件的行, 如果右表的行在左表中没有匹配, 那么这一行左表中对应数据用 NULL 代替.
RIGHT JOIN 语法
- select column_name(s)
- from table 1
- RIGHT JOIN table 2
- ON table 1.column_name=table 2.column_name
注释: 在某些数据库中, RIGHT JOIN 称为 RIGHT OUTER JOIN
RIGHT JOIN 产生表 2 的完全集, 而 1 表中匹配的则有值, 没有匹配的则以 null 值取代.
- select * from Table A right join Table B
- on Table A.id=Table B.id
执行以上 SQL 输出结果如下:
id | name | address |
1 | 美国 | |
5 | null | 中国 |
3 | 微博 | 中国 |
6 | null | 美国 |
FULL OUTER JOIN
FULL JOIN 会从左表 和右表 那里返回所有的行. 如果其中一个表的数据行在另一个表中没有匹配的行, 那么对面的数据用 NULL 代替
FULL OUTER JOIN 语法
- select column_name(s)
- from table 1
- FULL OUTER JOIN table 2
- ON table 1.column_name=table 2.column_name
FULL OUTER JOIN 产生 1 和 2 的并集. 但是需要注意的是, 对于没有匹配的记录, 则会以 null 做为值.
- select * from Table A full outer join Table B
- on Table A.id=Table B.id
执行以上 SQL 输出结果如下:
id | name | address |
1 | 美国 | |
2 | 淘宝 | null |
3 | 微博 | 中国 |
4 | null | |
5 | null | 中国 |
6 | null | 美国 |
来源: http://www.bubuko.com/infodetail-3393626.html