OceanBase SELECT

2021-06-11 17:44 更新

SELECT 的語法相對比較復(fù)雜。本節(jié)首先會介紹普通的 SELECT 語法結(jié)構(gòu),然后介紹集合類 SELECT 的語法結(jié)構(gòu)。

SIMPLE SELECT

描述

該語句用于查詢表中的內(nèi)容。

格式

simple_select:
SELECT [/*+ hint statement */] [ALL | DISTINCT | UNIQUE | SQL_CALC_FOUND_ROWS] 
 select_expr_list FROM from_list [WHERE condition] 
  [GROUP BY group_expression_list [WITH ROLLUP] [HAVING condition]]
  [ORDER BY order_expression_list]
  [limit_clause]
  [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]
    
limit_clause:
  LIMIT {[offset,] row_count |row_count OFFSET offset}

參數(shù)解釋

參數(shù)

描述

ALL | DISTINCT | UNIQUE | SQL_CALC_FOUND_ROWS

在數(shù)據(jù)庫表中,可能會包含重復(fù)值。

  • 指定“DISTINCT”,則在查詢結(jié)果中相同的行只顯示一行;

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

  • 指定“SQL_CALC_FOUND_ROWS”,則不輸出數(shù)據(jù),只返回數(shù)據(jù)行數(shù);

  • 不指定時,默認(rèn)為“ALL”。

select_expr

列出要查詢的表達(dá)式或列名,用“,”隔開。也可以用“*”表示所有列。

AS othername

為輸出字段重新命名。

FROM table_references

指名了從哪個表或哪些表中讀取數(shù)據(jù)(支持多表查詢)。

WHERE where_conditions

可選項,WHERE 字句用來設(shè)置一個篩選條件,查詢結(jié)果中僅包含滿足條件的數(shù)據(jù)。where_conditions 為表達(dá)式。

GROUP BY group_by_list

用于進(jìn)行分類匯總。

HAVING search_confitions

HAVING 字句與 WHERE 字句類似,但是 HAVING 字句可以使用累計函數(shù)(如 SUM,AVG 等)。

ORDER BY order_list

order_list :

colname [ASC | DESC] [,colname [ASC | DESC]…]

用來按升序(ASC)或者降序(DESC)顯示查詢結(jié)果。不指定 ASC 或者 DESC 時,默認(rèn)為 ASC。

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

強(qiáng)制 SELECT 語句返回指定的記錄數(shù)。

LIMIT 接受一個或兩個數(shù)字參數(shù)。參數(shù)必須是一個整數(shù)常量。

  • 如果給定兩個參數(shù),第一個參數(shù)指定第一個返回記錄行的偏移量,第二個參數(shù)指定返回記錄行的最大數(shù)目。初始記錄行的偏移量是 0(而不是 1)。

  • 如果只給定一個參數(shù),它表示返回記錄行的最大數(shù)目,偏移量為 0。

FOR UPDATE

對查詢結(jié)果所有行上排他鎖,以阻止其他事務(wù)的并發(fā)修改,或阻止在某些事務(wù)隔離級別時的并發(fā)讀取。

PARTITION(partition_list)

指定查詢表的分區(qū)信息。例如:partition(p0,p1…)

示例

以如下表 a 為例。

OceanBase select

  • 從表 a 中讀取 name 數(shù)據(jù)。
obclient> SELECT name FROM a;
+------+
| name |
+------+
| a    |
| b    |
| a    |
+------+
3 rows in set (0.01 sec)
  • 在查詢結(jié)果中對 name 進(jìn)行去重處理。
obclient> SELECT DISTINCT name FROM a;
+------+
| name |
+------+
| a    |
| b    |
+------+
2 rows in set (0.01 sec)
  • 從表 a 中查詢 id,name,num,然后把 num 列除以 2 輸出,輸出的列名為 avg。
obclient> SELECT id, name, num/2 AS avg FROM a;
+------+------+----------+
| id   | name | avg      |
+------+------+----------+
|    1 | a    |  50.0000 |
|    2 | b    | 100.0000 |
|    3 | a    |  25.0000 |
+------+------+----------+
3 rows in set (0.01 sec)
  • 從表 a 中根據(jù)篩選條件“ name = 'a' ” ,輸出對應(yīng)的 id 、name 和 num 。
obclient> SELECT id, name, num FROM a WHERE name = 'a';
+------+------+------+
| id   | name | num  |
+------+------+------+
|    1 | a    |  100 |
|    3 | a    |   50 |
+------+------+------+
2 rows in set (0.01 sec)
  • 從表 a 中查詢 id,name,按照 name 分組對 num 求和,并輸出。
obclient> SELECT id, name, SUM(num) FROM a GROUP BY name;
+------+------+----------+
| id   | name | SUM(num) |
+------+------+----------+
|    1 | a    |      150 |
|    2 | b    |      200 |
+------+------+----------+
2 rows in set (0.00 sec)
  • 從表 a 中查詢 id,name,按照 name 分組對 num 求和,查詢 num 總和小于 160 的行,并輸出。
obclient> SELECT id, name, SUM(num) as sum FROM a GROUP BY name HAVING SUM(num) < 160;
+------+------+------+
| id   | name | sum  |
+------+------+------+
|    1 | a    |  150 |
+------+------+------+
1 row in set (0.01 sec)
  • 從表 a 中查詢 id,name,num,根據(jù) num 按升序(ASC)輸出查詢結(jié)果。
obclient> SELECT * FROM a ORDER BY num ASC;
+------+------+------+
| id   | name | num  |
+------+------+------+
|    3 | a    |   50 |
|    1 | a    |  100 |
|    2 | b    |  200 |
+------+------+------+
3 rows in set (0.00 sec)
  • 從表 a 中查詢 id,name,num,根據(jù) num 按降序(DESC)輸出查詢結(jié)果。
obclient> SELECT * FROM a ORDER BY num DESC;
+------+------+------+
| id   | name | num  |
+------+------+------+
|    2 | b    |  200 |
|    1 | a    |  100 |
|    3 | a    |   50 |
+------+------+------+
3 rows in set (0.00 sec)
  • 從表 a 中查詢 id,name,num,使用 LIMIT強(qiáng)制從第2行開始,返回表 a 的兩行結(jié)果。
obclient> SELECT * FROM a LIMIT 1,2;
+------+------+------+
| id   | name | num  |
+------+------+------+
|    2 | b    |  200 |
|    3 | a    |   50 |
+------+------+------+
2 rows in set (0.00 sec)?

集合類 SELECT

描述

該語句用于對多個 SELECT 查詢的結(jié)果進(jìn)行 UNION,MINUS,INTERSECT。

格式

select_clause_set:
    simple_select [ UNION | UNION ALL | EXCEPT | INTERSECT] select_clause_set_left 
  [ORDER BY sort_list_columns] [limit_clause]
select_clause_set_right:
    simple_select | 
  select_caluse_set

參數(shù)解釋

參數(shù)

描述

UNION ALL

合并兩個查詢的結(jié)果

UNION

合并兩個查詢的結(jié)果,并去重

EXCEPT

從左查詢結(jié)果集中去重出現(xiàn)在右查詢中的結(jié)果,并去重

INTERSECT

保留左查詢結(jié)果集中出現(xiàn)在右查詢中的結(jié)果,并去重

示例

以如下兩表的數(shù)據(jù)為例:

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 的所有的記錄
obclient> SELECT C1, C2 FROM T1 UNION ALL SELECT C1, C2 FROM T2;
+------+------+
| C1   | C2   |
+------+------+
|    1 |   -1 |
|    2 |   -2 |
|    1 |    1 |
|    2 |   -2 |
|    3 |    3 |
+------+------+
5 rows in set (0.01 sec)
  • 計算 T1, T2 的去重后的所有記錄
obclient> SELECT C1, C2 FROM T1 UNION SELECT C1, C2 FROM T2;
+------+------+
| C1   | C2   |
+------+------+
|    1 |   -1 |
|    2 |   -2 |
|    1 |    1 |
|    3 |    3 |
+------+------+
4 rows in set (0.01 sec)
  • 計算 T1 和 T2 的交集
obclient> SELECT C1, C2 FROM T1 INTERSECT SELECT C1, C2 FROM T2;
+------+------+
| C1   | C2   |
+------+------+
|    2 |   -2 |
+------+------+
1 row in set (0.00 sec)
  • 計算 T1 和 T2 的差集
obclient> SELECT C1, C2 FROM T1 EXCEPT SELECT C1, C2 FROM T2;
+------+------+
| C1   | C2   |
+------+------+
|    1 |   -1 |
+------+------+
1 row in set (0.00 sec)
  • 取 T1 和 T2 并集中 C2 排序最大的前兩行
obclient> SELECT C1, C2 FROM T1 UNION SELECT C1, C2 FROM T2 ORDER BY C2 DESC LIMIT 2;
+------+------+
| C1   | C2   |
+------+------+
|    3 |    3 |
|    1 |    1 |
+------+------+
2 rows in set (0.00 sec)


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號