SELECT 的语法相对比较复杂。本节首先会介绍普通的 SELECT 语法结构,然后介绍集合类 SELECT 的语法结构,最后介绍带有 with clause 的 SELECT。
SIMPLE SELECT
描述
该语句用于查询表中的内容。
格式
simple_select:
SELECT [/*+ hint statement */] [DISTINCT | UNIQUE | ALL]
select_expr_list FROM from_list [WHERE condition]
[GROUP BY group_expression_list] [ROLLUP group_expression_list] [HAVING condition]]
[ORDER BY order_expression_list]
[FOR UPDATE]
select_expr:
table_name.*
| table_alias_name.*
| expr [[AS] column_alias_name]
from_list:
table_reference [, table_reference ...]
table_reference:
simple_table
| joined_table
simple_table:
table_factor [partition_option] [[AS] table_alias_name]
| (select_stmt) [AS] table_alias_name
| (table_reference_list)
joined_table:
table_reference [INNER] JOIN simple_table [join_condition]
| table_reference outer_join_type JOIN simple_table join_condition
partition_option:
PARTITION (partition_name_list)
partition_name_list:
partition_name [, partition_name ...]
outer_join_type:
{LEFT | RIGHT | FULL} [OUTER]
join_condition:
ON expression
condition:
expression
group_expression_list:
group_expression [, group_expression ...]
group_expression:
expression [ASC | DESC]
order_expression_list:
order_expression [, order_expression ...]
order_expression:
expression [ASC | DESC]
参数解释
参数 | 说明 |
DISTINCT UNIQUE ALL | 在数据库表中,可能会包含重复值。
|
select_expr | 列出要查询的表达式或列名,用“,”隔开。也可以用“*”表示所有列。 |
AS othername | 为输出字段重新命名。 |
FROM table_references | 指名了从哪个表或哪些表中读取数据(支持多表查询)。 |
WHERE where_conditions | 可选项,WHERE 字句用来设置一个筛选条件,查询结果中仅包含满足条件的数据。where_conditions 为表达式。 |
GROUP BY group_by_list | 按一些字段进行分组,产生统计值 |
ROLLUP group_expression_list | 合并 Group By 的分组,产生统计值 |
HAVING search_confitions | HAVING 字句与 WHERE 字句类似,但是 HAVING 字句可以使用累计函数(如 SUM,AVG 等)。 |
ORDER BY order_list order_list : colname [ASC | DESC] [,colname [ASC | DESC]…] | 用来按升序(ASC)或者降序(DESC)显示查询结果。不指定 ASC 或者 DESC 时,默认为 ASC。 |
FOR UPDATE | 对查询结果所有行上排他锁,以阻止其他事务的并发修改,或阻止在某些事务隔离级别时的并发读取。 |
PARTITION(partition_list) | 指定查询表的分区信息。例如:partition(p0,p1…) |
示例
以如下表 a 为例。
- 从表 a 中读取 name 数据。
SELECT name FROM a;
- 在查询结果中对 name 进行去重处理。
SELECT DISTINCT name FROM a;
- 从表 a 中查询 id,name,num,然后把 num 列除以2输出,输出的列名为 avg。
SELECT id, name, num/2 AS avg FROM a;
- 从表 a 中根据筛选条件“ name = ‘a’ ” ,输出对应的 id 、name 和 num 。
SELECT id, name, num FROM a WHERE name = 'a';
- 从表 a 中查询 id,name,按照 name 分组对 num 求和,并输出。
SELECT id, name, SUM(num) FROM a GROUP BY name;
- 从表 a 中查询 id,name,按照 name 分组对 num 求和,查询 num 总和小于160的行,并输出。
SELECT id, name, SUM(num) as sum FROM a GROUP BY name HAVING SUM(num) < 160;
- 从表 a 中查询 id,name,num,根据 num 按升序(ASC)输出查询结果。
SELECT * FROM a ORDER BY num ASC;
- 从表 a 中查询 id,name,num,根据 num 按降序(DESC)输出查询结果。
SELECT * FROM a ORDER BY num DESC;
集合类 SELECT
描述
该语句用于对多个 SELECT 查询的结果进行 UNION,MINUS,INTERSECT。
格式
select_clause_set:
simple_select [ UNION | UNION ALL | | INTERSECT] select_clause_set_right
[ORDER BY sort_list_columns]
select_clause_set_right:
simple_select |
select_caluse_set
参数解释
参数 | 说明 |
UNION ALL | 合并两个查询的结果 |
UNION | 合并两个查询的结果,并去重 |
MINUS | 从左查询结果集中去重出现在右查询中的结果,并去重 |
INTERSECT | 保留左查询结果集中出现在右查询中的结果,并去重 |
示例
以如下两表的数据为例:
create table t1 (c1 int, c2 int);
create table t2 (c1 int, c2 int);
insert into t1 values (1, -1), (2, -2);
insert into t2 values (1, 1), (2, -2), (3, 3);
- 计算 T1, T2 的所有的记录
SELECT C1, C2 FROM T1 UNION ALL SELECT C1, C2 FROM T2;
+------+------+
| C1 | C2 |
+------+------+
| 1 | -1 |
| 2 | -2 |
| 1 | 1 |
| 2 | -2 |
| 3 | 3 |
+------+------+
- 计算 T1, T2 的去重后的所有记录
SELECT C1, C2 FROM T1 UNION SELECT C1, C2 FROM T2;
+------+------+
| C1 | C2 |
+------+------+
| 1 | -1 |
| 2 | -2 |
| 1 | 1 |
| 3 | 3 |
+------+------+
- 计算 T1 和 T2 的交集
SELECT C1, C2 FROM T1 INTERSECT SELECT C1, C2 FROM T2;
+------+------+
| C1 | C2 |
+------+------+
| 2 | -2 |
+------+------+
- 计算 T1 和 T2 的差集
SELECT C1, C2 FROM T1 MINUS SELECT C1, C2 FROM T2;
+------+------+
| C1 | C2 |
+------+------+
| 1 | -1 |
+------+------+
带有 with clause 的 SELECT
描述
如果查询语句中有多个相同的子查询,可以把相同的子查询放在 with clause 作为公共表达式,在主体查询中直接引用即可。
格式
with_clause_select:
with_clause simple_select
with_clause:
WITH table_name [opt_column_alias_name_list] AS ( select_clause )
select_clause:
simple_select | select_clause_set
opt_column_alias_name_list:
(column_name_list)
column_name_list:
column_name | column_name , column_name_list
参数解释
无
示例
- 以如下表格数据和 SELECT 查询为例。
create table t1(c1 int, c2 int, c3 int);
create table t2(c1 int);
insert into t1 values(1,1,1);
insert into t1 values(2,2,2);
insert into t1 values(3,3,3);
insert into t2 values(4);
select * from t1 where c1 > (select count(*) from t2)
and c2 > (select count(*) from t2)
and c3 > (select count(*) from t2);
+------+------+------+
| C1 | C2 | C3 |
+------+------+------+
| 2 | 2 | 2 |
| 3 | 3 | 3 |
+------+------+------+
可以抽取相同子查询为 with clause:
with temp(cnt) as (select count(*) from t2)
select t1.* from t1, temp where c1 > temp.cnt and c2 > temp.cnt and c3 > temp.cnt;
+------+------+------+
| C1 | C2 | C3 |
+------+------+------+
| 2 | 2 | 2 |
| 3 | 3 | 3 |
+------+------+------+