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

格式

参数解释

示例

以如下表a为例。

  1. CREATE TABLE a (id INT,name VARCHAR(10),num INT);
  2. INSERT INTO a VALUES (1, 'a',100);
  3. INSERT INTO a VALUES (2, 'b',200);
  4. INSERT INTO a VALUES (3, 'a',50);
  • 从表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.00 sec)
  • 在查询结果中对name进行去重处理。

    1. obclient> SELECT DISTINCT name FROM a;
    2. +------+
    3. | NAME |
    4. +------+
    5. | a |
    6. | b |
    7. +------+
    8. 2 rows in set (0.00 sec)
  • 从表a中查询 idnamenum,然后把num列除以 2 输出,输出的列名为avg

    1. obclient> SELECT id, name, num/2 AS avg FROM a;
    2. +----+------+------+
    3. | ID | NAME | AVG |
    4. +----+------+------+
    5. | 1 | a | 50 |
    6. | 2 | b | 100 |
    7. | 3 | a | 25 |
    8. +----+------+------+
    9. 3 rows in set (0.00 sec)
  • 从表a中根据筛选条件“ name = ‘a’ ”,输出对应的idnamenum

    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.00 sec)
  • 从表a中查询name,按照name分组对num求和,并输出。

    1. obclient> SELECT id, name, num FROM a WHERE name = 'a';
    2. +----+------+------+
    3. | ID | NAME | NUM |
    4. | 1 | a | 100 |
    5. | 3 | a | 50 |
    6. +----+------+------+
  • 从表a中查询idnamenum,根据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中查询idnamenum,根据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的行,并使用FOR UPDATE子句把查询结果行进行锁定。

    1. /* 在会话 1 中查询表 a 中 id=1 的行并锁定 */
    2. obclient> SELECT * FROM a WHERE id=1 FOR UPDATE;
    3. +------+------+------+
    4. | ID | NAME | NUM |
    5. +------+------+------+
    6. | 1 | a | 100 |
    7. +------+------+------+
    8. 1 row in set (0.01 sec)
    9. /* 在会话 2 中查询表 a 中 id=1 或 id=2 的行并锁定 */
    10. obclient> SELECT * FROM a WHERE id=1 or id=2 FOR UPDATE;
    11. ORA-30006: resource busy; acquire with WAIT timeout expired
    12. obclient> SELECT * FROM a WHERE id=1 or id=2 FOR UPDATE SKIP LOCKED;
    13. +------+------+------+
    14. | ID | NAME | NUM |
    15. +------+------+------+
    16. | 2 | b | 200 |
    17. +------+------+------+
    18. 1 row in set (0.01 sec)
  • 从表a中按 name 和 num 分组查询并统计每个分组中的数量。

    1. obclient> SELECT name, num, COUNT(*) from a GROUP BY GROUPING SETS(name, num);
    2. +------+------+----------+
    3. | NAME | NUM | COUNT(*) |
    4. +------+------+----------+
    5. | a | NULL | 2 |
    6. | b | NULL | 1 |
    7. | NULL | 100 | 1 |
    8. | NULL | 200 | 1 |
    9. | NULL | 50 | 1 |
    10. +------+------+----------+
    11. 5 rows in set (0.01 sec)

该语句用于对多个SELECT查询的结果进行UNIONMINUSINTERSECT

格式

  1. select_clause_set:
  2. simple_select [ UNION | UNION ALL | | INTERSECT] select_clause_set_right
  3. [ORDER BY sort_list_columns]
  4. select_clause_set_right:
  5. simple_select |

参数解释

参数

描述

UNION ALL

合并两个查询的结果

UNION

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

MINUS

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

INTERSECT

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

示例

以如下两表的数据为例:

  1. CREATE TABLE t1 (c1 INT, c2 INT);
  2. CREATE TABLE t2 (c1 INT, c2 INT);
  3. INSERT INTO t2 VALUES (1, 1), (2, -2), (3, 3);
  • 计算t1t2的所有的记录

  • 计算t1t2的去重后的所有记录

    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)
  • 计算t1t2的交集

    1. SELECT c1, c2 FROM t1 INTERSECT SELECT c1, c2 FROM t2;
    2. +------+------+
    3. | C1 | C2 |
    4. +------+------+
    5. | 2 | -2 |
    6. +------+------+
  • 计算t1t2的差集

    1. obclient>SELECT c1, c2 FROM t1 INTERSECT SELECT c1, c2 FROM t2;
    2. +------+------+
    3. | C1 | C2 |
    4. +------+------+
    5. | 2 | -2 |
    6. +------+------+

如果查询语句中有多个相同的子查询,可以把相同的子查询放在with clause作为公共表达式,在主体查询中直接引用即可。

格式

  1. with_clause_select:
  2. with_clause simple_select
  3. with_clause:
  4. WITH table_name [opt_column_alias_name_list] AS ( select_clause )
  5. select_clause:
  6. simple_select | select_clause_set
  7. opt_column_alias_name_list:
  8. (column_name_list)
  9. column_name_list:
  10. column_name | column_name , column_name_list

参数解释

示例

  1. CREATE TABLE t1(c1 INT, c2 INT, c3 INT);
  2. CREATE TABLE t2(c1 INT);
  3. INSERT INTO t1 VALUES(1,1,1);
  4. INSERT INTO t1 VALUES(2,2,2);
  5. INSERT INTO t1 VALUES(3,3,3);
  6. INSERT INTO t2 VALUES(4);
  7. obclient>SELECT * FROM t1 WHERE c1 > (SELECT COUNT(*) FROM t2)
  8. AND c2 > (SELECT COUNT(*) FROM t2)
  9. AND c3 > (SELECT COUNT(*) FROM t2);
  10. +------+------+------+
  11. | C1 | C2 | C3 |
  12. +------+------+------+
  13. | 2 | 2 | 2 |
  14. | 3 | 3 | 3 |
  15. +------+------+------+
  16. 2 rows in set (0.01 sec)

可以抽取相同子查询为with clause

  1. obclient>WITH TEMP(cnt) AS (SELECT COUNT(*) FROM t2)
  2. SELECT t1.* FROM t1, temp WHERE c1 > temp.cnt AND c2 > temp.cnt
  3. AND c3 > temp.cnt;
  4. +------+------+------+
  5. | C1 | C2 | C3 |
  6. +------+------+------+
  7. | 2 | 2 | 2 |
  8. | 3 | 3 | 3 |
  9. +------+------+------+