SELECT的定义格式为:
SELECT[ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]…
FROM<表名或视图名>[,<表名或视图名>]…
[WHERE<条件表达式>]
[GROUP BY<列名1>][HAVING<条件表达式>]
[ORDER BY<列名2>][ASC|DESC]
0、先执行子查询。
1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;如果group by包含多个列,再分组;
4、使用聚集函数进行计算;对每个分组进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、返回select选择的列;
8、使用order by对结果集进行排序。
A表
id | name |
1 | 张三 |
2 | 李四 |
3 | 王五 |
B表
id | add |
1 | 北京 |
2 | 上海 |
3 | 广州 |
4 | 深圳 |
where筛选条件
select A.id, A.name, B.add from A, B where A.id = B.id;
我的理解是先把A,B表做连接生成虚拟表,表里的内容是A、B表的笛卡儿积,然后在用where子句筛选出满足A.id = B.id行,然后在显示指定的列A.id、A.name、B.add
笛卡儿积:A表中的第一条记录和B表中的第一条记录连接生成一条记录,A表中第一条记录再和B表中的第二条记录连接生成一条记录。。。和B表中的第N条记录连接
如果A表有M条记录,B表有N条记录,虚拟表就有M*N条记录
虚拟表中的每一条记录是A表中的一条记录和B表中的一条记录连接后的结果
语句执行过程:
产生虚拟表(笛卡儿积)
id | name | id | add |
1 | 张三 | 1 | 北京 |
1 | 张三 | 2 | 上海 |
1 | 张三 | 3 | 广州 |
1 | 张三 | 4 | 深圳 |
2 | 李四 | 1 | 北京 |
2 | 李四 | 2 | 上海 |
2 | 李四 | 3 | 广州 |
2 | 李四 | 4 | 深圳 |
3 | 王五 | 1 | 北京 |
3 | 王五 | 2 | 上海 |
3 | 王五 | 3 | 广州 |
3 | 王五 | 4 | 深圳 |
筛选出A.id = B.id的行
id | name | id | add |
1 | 张三 | 1 | 北京 |
2 | 李四 | 2 | 上海 |
3 | 王五 | 3 | 广州 |
将select列表中的列取出来
A.id | A.name | B.add |
1 | 张三 | 北京 |
2 | 李四 | 上海 |
3 | 王五 | 广州 |
等值连接(内连接)
只返回满足连接条件的数据
select A.id, A.name, B.add from A, B where A.id = B.id;
上面这句就是等值连接,要连接n个表,至少需要n-1个连接条件
外连接(左外连接和右外连接)
两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右)外连接。
以左外连接为例(右外连接类似),它除了显示符合连接条件的记录以外,还会显示除此之外所有左表中的记录(右外连接就是所有右表中的记录)。
select A.id, A.name, B.add from A, B where A.id(+)=B.id;
我的理解是先把A,B表做连接生成虚拟表,表里的内容是A、B表的笛卡儿积,然后在用where子句筛选出满足A.id = B.id行,然后找出B表中id在A表中不存在的行,插入到结果集中。
这句sql是右外连接,执行结果:
A.id | A.name | B.add |
1 | 张三 | 北京 |
2 | 李四 | 上海 |
3 | 王五 | 广州 |
NULL | NULL | 深圳 |
自连接
把一张表当成多张表,自己和自己连接
在一个表内有包含关系的字段可以使用自连接
满外连接
两个表在连接过程中除了返回满足连接条件的行以外还返回两个表中不满足条件的行,这种连接称为满外连接。
GROUP BY
所有包含于SELECT 列表中,而未包含于聚合函数中的列,都必须包含于GROUP BY子句中。
HAVING
HAVING子句对GROUP BY的分组结果进行筛选。
子查询(初级)
子查询(sub query)是内层的查询,内层查询先执行,它返回一个结果给外层的主查询(main query)使用。
子查询可以写在WHERE子句、HAVING子句、FROM子句中。
单行操作符(>,=,>=,<,<>,<=)对应单行子查询。
多行操作符(IN,ANY,ALL)对应多行子查询。
多行子查询不能使用单行比较符。
除非进行Top-N分析,否则不要在子查询中使用ORDER BY子句。
在查询是基于未知的值时应使用子查询。
多行操作符含义
<ANY means less than the maximum. >ANY means more than the minimum. =ANY is equivalent to IN.
>ALL means more than the maximum, and <ALL means less than the minimum.