SELECT
功能描述
SELECT用于从表或视图中查询数据。
SELECT语句就像叠加在数据库表上的过滤器,利用SQL关键字从数据表中过滤出用户需要的数据。
本文档仅介绍SELECT语句兼容MySQL的特性,原Vastbase的SELECT语法未做删除和修改,详见SELECT。
Vastbase在MySQL兼容模式下支持SELECT的如下特性用法:
注意事项
以上功能仅在数据库兼容模式为MySQL时能够使用(即创建DB时DBCOMPATIBILITY='B'),在其他数据库兼容模式下不能使用该特性。
语法格式
SELECT select_list FROM table_name [ WHERE condition ] [,...];
参数说明
select_list
SELECT查询输出的目标列。
多个列名间用逗号隔开。
SELECT *
表示输出表的所有列。
table_name
查询指定的表名。
[ WHERE condition ]
WHERE子句构成一个行选择表达式,用来缩小SELECT查询的范围。condition是返回值为布尔型的任意表达式,任何不满足该条件的行都不会被检索。
SELECT…GROUP BY
功能描述
GROUP BY子句可以将查询结果按某一列或多列的值分组,值相等的为一组。
Vastbase在MySQL兼容模式下,支持通过参数vastbase_sql_mode控制出现在select中的目标列,是否一定要出现在group by子句中。
当vastbase_sql_mode的取值包含ONLY_FULL_GROUP_BY时,select后的目标列一定要出现在group by子句中。此为默认情况。
当vastbase_sql_mode的取值不包含ONLY_FULL_GROUP_BY时,允许select后的目标列不出现在group by子句中。
注意事项
从V2.2 Build 10(Patch No.9)开始,参数vastbase_sql_mode同时控制了B模式下的多种SQL校验规则,请注意参数取值对其它功能的影响。
语法格式
SELECT select_list FROM table_name [ WHERE condition ] GROUP BY column_name [,...];
参数说明
GROUP BY column_name
指定GROUP BY时,将查询结果按column_name列的值分组,值相等的为一组。
可以指定单列或多个列,多个列名间用逗号隔开。
示例
前置条件:
1、创建兼容MySQL的库db_mysql,并进入。
CREATE DATABASE db_mysql dbcompatibility='B';
\c db_mysql
2、创建测试表student,并插入测试数据。
CREATE TABLE student(sid int,name varchar2(20),age int, class varchar2(20));
INSERT INTO student VALUES(1,'陈一',22,'java');
INSERT INTO student VALUES(2,'黄二',23,'python');
INSERT INTO student VALUES(3,'张三',21,'java');
INSERT INTO student VALUES(4,'李四',20,'C#');
INSERT INTO student VALUES(5,'王五',19,'python');
INSERT INTO student VALUES(6,'赵六',21,'java');
INSERT INTO student VALUES(7,'钱七',21,'java');
INSERT INTO student VALUES(8,'孙八',20,'C++');
INSERT INTO student VALUES(9,'杨九',19,'C++');
vastbase_sql_mode取值包含
ONLY_FULL_GROUP_BY
:(1)查看当前vastbase_sql_mode的值。
SHOW vastbase_sql_mode;
返回结果如下:
vastbase_sql_mode -------------------------------- ONLY_FULL_GROUP_BY,ANSI_QUOTES (1 row)
(2)若上一步查看到的结果中不包含
ONLY_FULL_GROUP_BY
,可以使用如下语句,修改本次会话中的取值。退出会话后,设置将失效。set vastbase_sql_mode='ONLY_FULL_GROUP_BY';
(3)查询1:select的目标列sid没有出现在group by子句中。
select sid from student group by age;
执行失败,报错信息如下:
ERROR: column "student.sid" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: select sid from student group by age; ^
(4)查询2:select的目标列sid包括在group by子句中。
select sid from student group by sid,age;
查询成功,返回结果如下:
sid ----- 1 4 6 5 9 8 7 3 2 (9 rows)
vastbase_sql_mode取值不包含
ONLY_FULL_GROUP_BY
:(1)使用如下语句,修改本次会话中的取值。退出会话后,设置将失效。
set vastbase_sql_mode='';
(2)修改后,查看当前取值:
show vastbase_sql_mode;
返回结果如下:
vastbase_sql_mode ------------------- (1 row)
(3)执行查询:select的目标列sid没有出现在group by子句中。
select sid from student group by age;
执行成功,返回结果如下,表明此时select list中可以使用非分组列。
sid ----- 2 4 1 3 5 (5 rows)
SELECT DISTINCT…ORDER BY
功能描述
ORDER BY子句用于对SELECT语句检索得到的数据进行升序或降序排序。
Vastbase在MySQL兼容模式下,支持通过参数vastbase_sql_mode控制出现在order by中的列,是否一定要出现在select distinct的目标列中。
当vastbase_sql_mode的取值包含ONLY_FULL_GROUP_BY时,出现在order by中的列,一定要出现在select distinct的目标列中。此为默认情况。
当vastbase_sql_mode的取值不包含ONLY_FULL_GROUP_BY时,允许order by指定的列不出现在select distinct的目标列中。
注意事项
从V2.2 Build 10(Patch No.9)开始,参数vastbase_sql_mode同时控制了B模式下的多种SQL校验规则,请注意参数取值对其它功能的影响。
语法格式
SELECT DISTINCT select_list FROM table_name [ WHERE condition] ORDER BY column_name [,...] [ ASC | DESC ];
参数说明
DISTINCT
从SELECT的结果集中删除所有重复的行,使结果集中的每行都是唯一的。
ORDER BY column_name
指定ORDER BY时,将查询结果根据column_name的值按照顺序排序。可以指定单列或多个列,多个列名间用逗号隔开。
对于ORDER BY表达式中包含多列的情况:
首先根据最左边的列进行排序,如果这一列的值相同,则根据下一个表达式进行比较,依此类推。
如果对于所有声明的表达式都相同,则按随机顺序返回。
[ ASC | DESC ]
ASC:升序排列。默认值。
DESC:降序排列。
示例
前置条件:
1、创建兼容MySQL的库db_mysql,并进入。
create database db_mysql dbcompatibility 'B';
\c db_mysql
2、创建测试表并插入数据。
create table test (id varchar(32),names varchar(32));
insert into test values('1','zhangsan');
insert into test values('12','lisi');
insert into test values('2','wangwu');
insert into test values('2','maliu');
vastbase_sql_mode取值包含
ONLY_FULL_GROUP_BY
:(1)查看当前vastbase_sql_mode的值。
SHOW vastbase_sql_mode;
返回结果如下:
vastbase_sql_mode -------------------------------- ONLY_FULL_GROUP_BY,ANSI_QUOTES (1 row)
(2)若上一步查看到的结果中不包含
ONLY_FULL_GROUP_BY
,可以使用如下语句,修改本次会话中的取值。退出会话后,设置将失效。set vastbase_sql_mode='ONLY_FULL_GROUP_BY';
(3)查询1:order by中的列出现在select distinct的目标列中。
select distinct id,names from test order by id;
查询成功,返回结果如下:
id | names ----+---------- 1 | zhangsan 12 | lisi 2 | wangwu 2 | maliu (4 rows)
(4)查询2:order by中的列没有出现在select distinct的目标列中。
select distinct names from test order by id;
查询失败,报错信息如下:
ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list LINE 1: select distinct names from test order by id; ^
vastbase_sql_mode取值不包含
ONLY_FULL_GROUP_BY
:(1)使用如下语句,修改本次会话中的取值。退出会话后,设置将失效。
set vastbase_sql_mode='';
(2)修改后,查看当前取值:
show vastbase_sql_mode;
返回结果如下:
vastbase_sql_mode ------------------- (1 row)
(3)执行查询:order by中的列没有出现在select distinct的目标列中。
select distinct names from test order by id;
查询成功,返回结果如下,表示此时允许order by指定的列不出现在select distinct的目标列中:
names ---------- zhangsan lisi wangwu maliu (4 rows)
使用关键字作为别名
功能描述
Vastbase在MySQL兼容模式下,可以将部分非保留关键字在不加引号(如双引号,单引号或反引号)的情况下,作为SQL语句中的标识符(即别名)。
当前支持作为别名的非保留关键字列表如下:
ENABLE | DAY | VALID |
LABEL | NAME | STATUS |
OWNER | ACCOUNT | VERSION |
注意事项
仅V2.2 Build 10(Patch No.10)及以上补丁版本支持该特性。
语法格式
SELECT select_list FROM table_name [ WHERE condition ] [,...] [ [ AS ] output_name ];
参数说明
[ AS ] output_name
此选项用于为输出字段指定别名,这个别名通常用于输出字段的显示。[ AS ]可以省略。
示例
前置条件 创建兼容MySQL的库db_mysql,并进入。
CREATE DATABASE db_mysql dbcompatibility='B';
\c db_mysql
示例步骤: 关键键字作为查询别名,各个关键字交互使用。
1、创建测试表。
CREATE TABLE user1_1152455 (
id int NOT NULL,
name varchar(32) NOT NULL
);
CREATE TABLE grade_info_1152455 (
owner int(4) NOT NULL,
grade_num int NOT NULL,
type varchar(32) NOT NULL
);
2、向测试表中插入数据。
INSERT INTO user1_1152455 VALUES
(1,'tm'),
(2,'wwy'),
(3,'zk'),
(4,'qq'),
(5,'lm');
INSERT INTO grade_info_1152455 VALUES
(1,3,'add'),
(2,3,'add'),
(1,1,'reduce'),
(3,3,'add'),
(4,3,'add'),
(5,3,'add'),
(3,1,'reduce');
3、通过别名查询表。
select enable.id,enable.name,label.version account
from(
select owner,version,rank()over(order by version desc) day
from(
select owner,sum(if(type='add',grade_num,-1*grade_num)) version
from grade_info_1152455
group by owner
) status
) label
join user1_1152455 enable
on label.owner = enable.id
where day=1;
查询结果为如下,关键字ACCOUNT被作为别名使用:
id | name | account
----+------+---------
2 | wwy | 3
4 | qq | 3
5 | lm | 3
(3 rows)
UNION [ALL] 语句中使用ORDER BY子句
功能描述
UNION计算多个SELECT语句返回行集合的并集。
Vastbase在MySQL兼容模式下支持使用UNION [ALL]语句将两个或多个查询结果合并,并通过ORDER BY子句排序。
注意事项
仅Vastbase G100 V2.2 Build 10(Patch No.7)及以后版本支持此功能。
UNION子句有如下约束条件:
除非声明了ALL子句,否则缺省的UNION结果不包含重复的行。
同一个SELECT语句中的多个UNION操作符是从左向右计算的,除非用圆括弧进行了标识。
语法格式
select_statement UNION [ALL] select_statement ORDER BY column_name [,...] [ ASC | DESC ];
参数说明
select_statement
查询语句select_statement可以是任何没有LIMIT、FOR UPDATE子句的SELECT语句。
如果用圆括弧包围,ORDER BY和LIMIT也可以附着在子表达式里。
ORDER BY column_name
指定ORDER BY时,将查询结果根据column_name的值按照顺序排序。可以指定单列或多个列,多个列名间用逗号隔开。
对于ORDER BY表达式中包含多列的情况:
首先根据最左边的列进行排序,如果这一列的值相同,则根据下一个表达式进行比较,依此类推。
如果对于所有声明的表达式都相同,则按随机顺序返回。
[ ASC | DESC ]
ASC:升序排列。默认值。
DESC:降序排列。
示例
1、创建并切换至兼容模式为MySQL的数据库db_mysql。
CREATE DATABASE db_mysql dbcompatibility='B';
\c db_mysql
2、创建测试表并插入数据。
CREATE TABLE a(id int,msg text);
CREATE TABLE b(id int,msg text);
INSERT INTO a VALUES(1,'a');
INSERT INTO a VALUES(2,'b');
INSERT INTO b VALUES(1,'a');
INSERT INTO b VALUES(2,'b');
3、使用UNION ALL语句返回所有查询结果并使用ORDER BY子句排序。
SELECT * FROM a UNION ALL SELECT * FROM b ORDER BY id;
结果返回如下:
id | msg
----+-----
1 | a
1 | a
2 | b
2 | b
(4 rows)
4、使用UNION 语句压缩重复结果返回数据并使用ORDER BY子句排序。
SELECT * FROM a UNION SELECT * FROM b ORDER BY id;
结果返回如下:
id | msg
----+-----
1 | a
2 | b
(2 rows)