全部产品
阿里云办公

SELECT

更新时间:2017-06-07 13:26:11

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

基本查询

格式

SELECT 
   [ALL | DISTINCT] 
   selectexpr [AS othername] [, selectexpr ...] 
   [FROM table_references]
   [WHERE where_conditions] 
   [GROUP BY group_by_list] 
   [HAVING search_confitions] 
   [ORDER BY order_list] 
   [LIMIT {[offset,] rowcount | rowcount OFFSET offset}]
   [FOR UPDATE];

SELECT子句说明如下所示。



子句 说明
ALL | DISTINCT 在数据库表中,可能会包含重复值。指定“DISTINCT”,则在查询结果中相同的行只显示一行;指定“ALL”,则列出所有的行;不指定时,默认为“ALL”。
select_expr 列出要查询的列名,用“,”隔开。也可以用“*”表示所有列。
AS other_name 为输出字段重新命名。
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 [ASC | DESC] 用来按升序(ASC)或者降序(DESC)显示查询结果。不指定ASC或者DESC时,默认为ASC。
[LIMIT {[offset,] row_count |row_count OFFSET offset}] 强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)。 如果只给定一个参数,它表示返回记录行的最大数目,偏移量为0。
FOR UPDATE 对查询结果所有行上排他锁,以阻止其他事务的并发修改,或阻止在某些事务隔离级别时的并发读取。

JOIN句法

JOIN连接分为内连接和外连接。外连接又分为左连接、右连接和全连接。两个表连接后,可以使用ON指定条件进行筛选。

OceanBase1.0版本里JOIN可以支持USING子句,JOIN的连接条件中必须至少有一个等值连接条件。

内连接:结果中只包含两个表中同时满足条件的行。

左连接:结果中包含位于关键字LEFT [OUTER] JOIN左侧的表中的所有行,以及该关键字右侧的表中满足条件的行。

右连接:结果中包含位与关键字[RIGHT] [OUTER] JOIN右侧的表中的所有行,以及该关键字左侧的表中满足条件的行。

全连接:结果中包含两个表中的所有行。

集合操作

OceanBase中的集合操作主要包括UNION、EXCEPT和INTERSECT。

UNION句法

UNION用于合并两个或多个SELECT语句的结果集。使用UNION需要注意以下几点:

  • UNION内部的SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条SELECT语句中的列的顺序必须相同。

  • 默认地,UNION操作符选取不同的值。如果允许重复的值,请使用UNION ALL。

  • UNION 结果集中的列名总是等于UNION中第一个SELECT语句中的列名。

UNION指令的目的是将两个或多个SELECT语句的结果合并起来。从这个角度来看,UNION跟JOIN有些类似,因为这两个指令都可以由多个表格中撷取资料。但是UNION只是将两个结果联结起来一起显示,并不是联结两个表。

EXCEPT句法

EXCEPT用于查询第一个集合中存在,但是不存在于第二个集合中的数据。

INTERSECT句法

INTERSECT用于查询在两个集合中都存在的数据。

DUAL虚拟表

DUAL是一个虚拟的表,可以视为一个一行零列的表。当我们不需要从具体的表来取得表中数据,而是单纯地为了得到一些我们想得到的信息,并要通过SELECT完成时,就要借助一个对象,这个对象就是DUAL。一般可以使用这种特殊的SELECT语法获得用户变量或系统变量的值。

当SELECT语句没有FROM子句的时候,语义上相当于FROM DUAL,此时,表达式中只能是常量表达式。

格式

SELECT 
    [ALL | DISTINCT] 
    select_list 
    [FROM DUAL [WHERE where_condition]] 
    [LIMIT {[offset,] rowcount | rowcount OFFSET offset}];

SELECT…FOR UPDATE句法

格式

SELECT ... FOR UPDATE [WAIT n| NOWAIT]; 

其中:

  • WAIT子句指定等待其他用户释放锁的秒数,防止无限期的等待。

  • NOWAIT不等待行锁释放。

SELECT … FOR UPDATE可以用来对查询结果所有行上排他锁,以阻止其他事务的并发修改,或阻止在某些事务隔离级别时的并发读取。即使用FOR UPDATE语句将锁住查询结果中的元组,这些元组将不能被其他事务的UPDATE,DELETE和FOR UPDATE操作,直到本事务提交。

注意,目前OceanBase实现有如下限制:必须是单表查询。

例如:

SELECT * FROM a FOR UPDATE;

IN和OR

OceanBase支持逻辑运算“IN”和“OR”。