SELECT 的语法相对比较复杂。本节首先会介绍普通的 SELECT 语法结构,然后介绍集合类 SELECT 的语法结构。

SIMPLE SELECT

描述

该语句用于查询表中的内容。

格式

  1. simple_select:
  2. SELECT [/*+ hint statement */] [ALL | DISTINCT | UNIQUE | SQL_CALC_FOUND_ROWS]
  3. select_expr_list FROM from_list [WHERE condition]
  4. [GROUP BY group_expression_list [WITH ROLLUP] [HAVING condition]]
  5. [ORDER BY order_expression_list]
  6. [limit_clause]
  7. [FOR UPDATE]
  8. select_expr:
  9. table_name.*
  10. | table_alias_name.*
  11. | expr [[AS] column_alias_name]
  12. from_list:
  13. table_reference [, table_reference ...]
  14. table_reference:
  15. simple_table
  16. | joined_table
  17. simple_table:
  18. table_factor [partition_option] [[AS] table_alias_name]
  19. | (select_stmt) [AS] table_alias_name
  20. | (table_reference_list)
  21. joined_table:
  22. table_reference [INNER] JOIN simple_table [join_condition]
  23. | table_reference outer_join_type JOIN simple_table join_condition
  24. partition_option:
  25. PARTITION (partition_name_list)
  26. partition_name_list:
  27. partition_name [, partition_name ...]
  28. outer_join_type:
  29. {LEFT | RIGHT | FULL} [OUTER]
  30. join_condition:
  31. ON expression
  32. condition:
  33. expression
  34. group_expression_list:
  35. group_expression [, group_expression ...]
  36. group_expression:
  37. expression [ASC | DESC]
  38. order_expression_list:
  39. order_expression [, order_expression ...]
  40. order_expression:
  41. expression [ASC | DESC]
  42. limit_clause:
  43. LIMIT {[offset,] row_count |row_count OFFSET offset}

参数解释

参数

描述

ALL | DISTINCT | UNIQUE | SQL_CALC_FOUND_ROWS

在数据库表中,可能会包含重复值。

  • 指定“DISTINCT”,则在查询结果中相同的行只显示一行;

  • 指定“ALL”,则列出所有的行;

  • 指定“SQL_CALC_FOUND_ROWS”,则不输出数据,只返回数据行数;

  • 不指定时,默认为“ALL”。

select_expr

列出要查询的表达式或列名,用“,”隔开。也可以用“*”表示所有列。

AS othername

为输出字段重新命名。

FROM table_references

指名了从哪个表或哪些表中读取数据(支持多表查询)。

WHERE where_conditions

可选项,WHERE 字句用来设置一个筛选条件,查询结果中仅包含满足条件的数据。where_conditions 为表达式。

GROUP BY group_by_list

用于进行分类汇总。

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。

[LIMIT {[offset,] row_count |row_count OFFSET offset}]

强制 SELECT 语句返回指定的记录数。

LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。

  • 如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)。

  • 如果只给定一个参数,它表示返回记录行的最大数目,偏移量为0。

FOR UPDATE

对查询结果所有行上排他锁,以阻止其他事务的并发修改,或阻止在某些事务隔离级别时的并发读取。

PARTITION(partition_list)

指定查询表的分区信息。例如:partition(p0,p1…)

示例

以如下表 a 为例。

image.png

  • 从表 a 中读取 name 数据。
  1. obclient> SELECT name FROM a;
  2. +------+
  3. | name |
  4. +------+
  5. | a |
  6. | b |
  7. | a |
  8. +------+
  9. 3 rows in set (0.01 sec)
  • 在查询结果中对 name 进行去重处理。
  1. obclient> SELECT DISTINCT name FROM a;
  2. +------+
  3. | name |
  4. +------+
  5. | a |
  6. | b |
  7. +------+
  8. 2 rows in set (0.01 sec)
  • 从表 a 中查询 id,name,num,然后把 num 列除以 2 输出,输出的列名为 avg。
  1. obclient> SELECT id, name, num/2 AS avg FROM a;
  2. +------+------+----------+
  3. | id | name | avg |
  4. +------+------+----------+
  5. | 1 | a | 50.0000 |
  6. | 2 | b | 100.0000 |
  7. | 3 | a | 25.0000 |
  8. +------+------+----------+
  9. 3 rows in set (0.01 sec)
  • 从表 a 中根据筛选条件“ name = ‘a’ ” ,输出对应的 id 、name 和 num 。
  1. obclient> SELECT id, name, num FROM a WHERE name = 'a';
  2. +------+------+------+
  3. | id | name | num |
  4. +------+------+------+
  5. | 1 | a | 100 |
  6. | 3 | a | 50 |
  7. +------+------+------+
  8. 2 rows in set (0.01 sec)
  • 从表 a 中查询 id,name,按照 name 分组对 num 求和,并输出。
  1. obclient> SELECT id, name, SUM(num) FROM a GROUP BY name;
  2. +------+------+----------+
  3. | id | name | SUM(num) |
  4. +------+------+----------+
  5. | 1 | a | 150 |
  6. | 2 | b | 200 |
  7. +------+------+----------+
  8. 2 rows in set (0.00 sec)
  • 从表 a 中查询 id,name,按照 name 分组对 num 求和,查询 num 总和小于160的行,并输出。
  1. obclient> SELECT id, name, SUM(num) as sum FROM a GROUP BY name HAVING SUM(num) < 160;
  2. +------+------+------+
  3. | id | name | sum |
  4. +------+------+------+
  5. | 1 | a | 150 |
  6. +------+------+------+
  7. 1 row in set (0.01 sec)
  • 从表 a 中查询 id,name,num,根据 num 按升序(ASC)输出查询结果。
  1. obclient> SELECT * FROM a ORDER BY num ASC;
  2. +------+------+------+
  3. | id | name | num |
  4. +------+------+------+
  5. | 3 | a | 50 |
  6. | 1 | a | 100 |
  7. | 2 | b | 200 |
  8. +------+------+------+
  9. 3 rows in set (0.00 sec)
  • 从表 a 中查询 id,name,num,根据 num 按降序(DESC)输出查询结果。
  1. obclient> SELECT * FROM a ORDER BY num DESC;
  2. +------+------+------+
  3. | id | name | num |
  4. +------+------+------+
  5. | 2 | b | 200 |
  6. | 1 | a | 100 |
  7. | 3 | a | 50 |
  8. +------+------+------+
  9. 3 rows in set (0.00 sec)
  • 从表 a 中查询 id,name,num,使用 LIMIT强制从第2行开始,返回表 a 的两行结果。
  1. obclient> SELECT * FROM a LIMIT 1,2;
  2. +------+------+------+
  3. | id | name | num |
  4. +------+------+------+
  5. | 2 | b | 200 |
  6. | 3 | a | 50 |
  7. +------+------+------+
  8. 2 rows in set (0.00 sec)​

集合类 SELECT

描述

该语句用于对多个 SELECT 查询的结果进行 UNION,MINUS,INTERSECT。

格式

  1. select_clause_set:
  2. simple_select [ UNION | UNION ALL | EXCEPT | INTERSECT] select_clause_set_left
  3. [ORDER BY sort_list_columns] [limit_clause]
  4. select_clause_set_right:
  5. simple_select |
  6. select_caluse_set

参数解释

参数

描述

UNION ALL

合并两个查询的结果

UNION

合并两个查询的结果,并去重

EXCEPT

从左查询结果集中去重出现在右查询中的结果,并去重

INTERSECT

保留左查询结果集中出现在右查询中的结果,并去重

示例

以如下两表的数据为例:

  1. create table t1 (c1 int, c2 int);
  2. create table t2 (c1 int, c2 int);
  3. insert into t1 values (1, -1), (2, -2);
  4. insert into t2 values (1, 1), (2, -2), (3, 3);
  • 计算 T1, T2 的所有的记录
  1. obclient> SELECT C1, C2 FROM T1 UNION ALL SELECT C1, C2 FROM T2;
  2. +------+------+
  3. | C1 | C2 |
  4. +------+------+
  5. | 1 | -1 |
  6. | 2 | -2 |
  7. | 1 | 1 |
  8. | 2 | -2 |
  9. | 3 | 3 |
  10. +------+------+
  11. 5 rows in set (0.01 sec)
  • 计算 T1, T2 的去重后的所有记录
  1. obclient> SELECT C1, C2 FROM T1 UNION SELECT C1, C2 FROM T2;
  2. +------+------+
  3. | C1 | C2 |
  4. +------+------+
  5. | 1 | -1 |
  6. | 2 | -2 |
  7. | 1 | 1 |
  8. | 3 | 3 |
  9. +------+------+
  10. 4 rows in set (0.01 sec)
  • 计算 T1 和 T2 的交集
  1. obclient> SELECT C1, C2 FROM T1 INTERSECT SELECT C1, C2 FROM T2;
  2. +------+------+
  3. | C1 | C2 |
  4. +------+------+
  5. | 2 | -2 |
  6. +------+------+
  7. 1 row in set (0.00 sec)
  • 计算 T1 和 T2 的差集
  1. obclient> SELECT C1, C2 FROM T1 EXCEPT SELECT C1, C2 FROM T2;
  2. +------+------+
  3. | C1 | C2 |
  4. +------+------+
  5. | 1 | -1 |
  6. +------+------+
  7. 1 row in set (0.00 sec)
  • 取 T1 和 T2 并集中 C2 排序最大的前两行
  1. obclient> SELECT C1, C2 FROM T1 UNION SELECT C1, C2 FROM T2 ORDER BY C2 DESC LIMIT 2;
  2. +------+------+
  3. | C1 | C2 |
  4. +------+------+
  5. | 3 | 3 |
  6. | 1 | 1 |
  7. +------+------+
  8. 2 rows in set (0.00 sec)