VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

SELECT

功能描述

SELECT用于从表或视图中查询数据。

SELECT语句就像叠加在数据库表上的过滤器,利用SQL关键字从数据表中过滤出用户需要的数据。

本文档只介绍SELECT语句兼容MySQL的特性,原Vastbase的SELECT语法未做删除和修改,详见SELECT

Vastbase在MySQL兼容模式下,支持SELECT语句如下特性用法:

注意事项

该功能仅在数据库兼容模式为MySQL时支持(即数据库初始化时指定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子句中。

注意事项

无。

语法格式

SELECT select_list FROM table_name [ WHERE condition ] GROUP BY column_name [,...];

参数说明

GROUP BY column_name

  • 指定GROUP BY时,将查询结果按column_name列的值分组,值相等的为一组。

  • 可以指定单列或多个列,多个列名间用逗号隔开。

示例

1、创建测试表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的目标列中。

注意事项

无。

语法格式

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、创建测试表并插入数据。

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语句中的标识符(即别名)。

表1 支持作为别名的非保留关键字

ABORT_P ABSOLUTE_P ACCESS ACCOUNT ACTION ADD_P ADMIN
AGGREGATE ALGORITHM ALSO ALTER ALWAYS APP APPEND
ASSERTION ASSIGNMENT ATTRIBUTE AUDIT AUTOEXTEND AUTOMAPPED AUTOEXTEND_SIZE
AVG_ROW_LENGTH BACKWARD BARRIER BEFORE BEGIN_P BEGIN_NON_ANOYBLOCK BLANKS
BLOCKCHAIN CACHE CALL CALLED CANCELABLE CASCADE CASCADED
AFTER ARCHIVE AUTO_INCREMENT BLOB_P CATALOG_P CLASS COLUMN_ENCRYPTION_KEY
CHAIN CHANGE CHARACTERISTICS CHARACTERSET CHARSET CHECKPOINT CHECKSUM
CLEAN CLIENT CLIENT_MASTER_KEY CLIENT_MASTER_KEYS CLOB CLOSE CLUSTER
COLUMN_ENCRYPTION_KEYS COLUMNS COMMENT COMMENTS COMMIT COMMITTED COMPATIBLE_ILLEGAL_CHARS
COMPLETION COMPRESS COMPRESSION CONDITION CONFIGURATION CONNECT CONNECTION
CONSTRAINTS CONTAINS CONTENT_P CONTINUE_P CONTVIEW CONVERSION_P COORDINATOR
COPY COST CSV CUBE CURRENT_P CURSOR CYCLE
DATABASE DATABASES DATAFILE DATANODE DATANODES DATATYPE_CL DATE_FORMAT_P
COMPLETE CONSTANT COORDINATORS DATA_P DAY_HOUR_P DEFAULTS DESCRIBE
DISK DUPLICATE LISTEN LOAD LOCAL LOCATION LOCK_P
DAY_MICROSECOND_P DAY_MINUTE_P DAY_P DAY_SECOND_P DBCOMPATIBILITY_P DEALLOCATE DECLARE
DEFERRED DEFINER DEFINER DELETE_P DELIMITER DELIMITERS DELTA
DETERMINISTIC DICTIONARY DIRECT DIRECTORY DISABLE_P DISCARD DISCONNECT
DISTRIBUTE DISTRIBUTION DOCUMENT_P DOMAIN_P DOUBLE_P DROP DUMPFILE
EACH ESCAPE EXTENSION FORCE HOUR_SECOND_P INHERITS KEYS
ELASTIC ESCAPED EXTERNAL FORMATTER HOLD INITIAL_P KEY_BLOCK_SIZE
ENABLE_P ESCAPING FAMILY FORWARD IDENTIFIED INITRANS KEY_PATH
ENCLOSED EVENT FAST FUNCTION IDENTITY_P INLINE_P KEY_STORE
ENCODING EVENTS FEATURES FUNCTIONS IGNORE_EXTRA_DATA INPLACE KILL
ENCRYPTED EVERY FENCED GENERATED IMMEDIATE INPUT_P LABEL
ENCRYPTED_VALUE EXCHANGE FIELDS GLOBAL IMMUTABLE INSENSITIVE LANGUAGE
ENCRYPTION EXCLUDE FILEHEADER_P GRANTED IMPLICIT_P INSERT LARGE_P
ENCRYPTION_TYPE EXCLUDING FILLER GRANTS INCLUDE INSERT_METHOD LAST_P
ENDS EXCLUSIVE FILL_MISSING_FIELDS HANDLER INCLUDING INSTEAD LC_COLLATE_P
ENGINE_ATTRIBUTE EXECUTE FILTER HEADER_P INCREMENT INTERNAL LC_CTYPE_P
ENGINE_P EXPANSION FIRST_P HOSTS INCREMENTAL INVISIBLE LEAKPROOF
ENFORCED EXPIRED_P FLUSH HOUR_MICROSECOND_P INDEXES INVOKER LEVEL
EOL EXPLAIN FOLLOWING HOUR_MINUTE_P INFILE IP LINES
ERRORS EXTENDED FOLLOWS_P HOUR_P INHERIT ISOLATION LIST
MASKING MODE NOTIFY PACKAGE PRECEDING QUARTER REINDEX
MASTER MODEL NOWAIT PACKAGES PREDICT QUERY RELATIVE_P
LOCKED LOG_P LOGGING LOGIN_ANY LOGIN_FAILURE LOGIN_SUCCESS LOGOUT
LOGS LOOP MAPPING REUSE REVOKE ROLE ROLES
MATCH MODIFIES NULLCOLS PARSER PREFERRED QUICK RELEASE
MATCHED MONTH_P NULLS_P PARTIAL PREFIX QUOTE RELOPTIONS
MATERIALIZED MOVE NUMSTR PARTIAL_EMPTY_PREC PREPARE RANDOMIZED REMOTE_P
MAX_ROWS MOVEMENT OBJECT_P PARTITION PREPARED RANGE REMOVE
MAXEXTENTS NAME_P OF PARTITIONS PRESERVE RATIO RENAME
ROLLBACK ROLLUP ROTATION ROUTINE ROWS RULE ROW_FORMAT
MAXSIZE NAMES OFF PASSING PRIOR RAW REORGANIZE
MAXTRANS NEXT OIDS PASSWORD PRIORER RAW REPEAT
MEMORY NGRAM OPTIMIZATION PCTFREE PRIVATE READ REPEATABLE
MERGE NO OPTIMIZE PER_P PRIVILEGE READS REPLACE
SAMPLE SAVEPOINT SCHEDULE SCHEMA SCHEMAS SCROLL SEARCH
MICROSECOND_P NO_WRITE_TO_BINLOG OPTION PERCENT PRIVILEGES REASSIGN REPLICA
MIN_ROWS NOCOMPRESS OPTIONALLY PERM PROCEDURAL REBUILD RESET
MINEXTENTS NODE OPTIONS PLAN PROCESSLIST RECHECK RESIZE
MINUTE_MICROSECOND_P NOLOGGING OUTFILE PLANS PROFILE RECURSIVE RESOURCE
MINUTE_P NOMAXVALUE OWNED POLICY PUBLICATION REDISANYVALUE RESTART
MINUTE_SECOND_P NOMINVALUE OWNER POOL PUBLISH REF RESTRICT
MINVALUE NOTHING PACK_KEYS PRECEDES_P PURGE REFRESH RETURNS
SECOND_MICROSECOND_P SHUTDOWN STANDALONE_P STORED TEMPLATE TSTIME USE
SECOND_P SIBLINGS START STRATIFY TEMPORARY TYPE_P USEEOF
SECONDARY_ENGINE_ATTRIBUTE SIMPLE STARTING STREAM TEMPTABLE TYPES_P VACUUM
SECURITY SIZE STARTS STRICT_P TERMINATED UNBOUNDED VALID
SEPARATOR_P SKIP STATEMENT STRIP_P THAN UNCOMMITTED VALIDATE
SEQUENCE SLAVE STATEMENT_ID SUBPARTITION TIMESTAMP_FORMAT_P UNENCRYPTED VALIDATION
SEQUENCES SLICE STATISTICS SUBPARTITIONS TIME_FORMAT_P UNDEFINED VALIDATOR
SERIALIZABLE SMALLDATETIME_FORMAT_P STATS_AUTO_RECALC SUBSCRIPTION TRANSACTION UNKNOWN VALUE_P
SERVER SNAPSHOT STATS_PERSISTENT SYNONYM TRANSFORM UNLIMITED VARIABLES
SESSION SOURCE_P STATS_SAMPLE_PAGES SYSID TRIGGER UNLISTEN VCGROUP
SET SPACE STATUS SYS_REFCURSOR TRIGGERS UNLOCK VERSION_P
SETS SPILL STDIN SYSTEM_P TRUNCATE UNLOGGED VIEW
SHARE SPLIT STDOUT TABLES TRUSTED UNTIL VISIBLE
SHIPPABLE SQL STORAGE TABLESPACE TSFIELD UNUSABLE VOLATILE
SHOW STABLE STORE_P TEMP TSTAG WORK WORKLOAD
WEAK WHILE_P WHITESPACE_P WRAPPER WRITE XML_P YEAR_MONTH_P
YEAR_P YES_P ZONE WAIT UPDATE

注意事项

无。

示例

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;

查询结果为如下:

 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子句排序。

注意事项

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)

JOIN不加关联条件

功能描述

支持JOIN不加关联条件,返回结果为笛卡尔积的形式。即JOIN不带on/using,效果与CROSS JOIN一致。

语法格式

[JOIN | INNER JOIN] {ON join_condition | USING ( join_column [, ...] ) }

参数说明

UNION子句

UNION计算多个SELECT语句返回行集合的并集。

UNION子句有如下约束条件:

  • 除非声明了ALL子句,否则缺省的UNION结果不包含重复的行。
  • 同一个SELECT语句中的多个UNION操作符是从左向右计算的,除非用圆括弧进行了标识。
  • FOR UPDATE,FOR NO KEY UPDATE,FOR SHARE和FOR KEY SHARE不能在UNION的结果或输入中声明。

一般表达式:

select_statement UNION [ALL] select_statement

select_statement可以是任何没有ORDER BY、LIMIT、FOR UPDATE,FOR NO KEY UPDATE,FOR SHARE或FOR KEY SHARE子句的SELECT语句。如果用圆括弧包围,ORDER BY和LIMIT可以附着在子表达式里。

示例

1、创建两张测试表并插入数据。

create table student(sid int, name varchar(30), class_id int);
create table class (cid int, class_name varchar(30));
insert into student values(1,'a1',100);
insert into student values(2,'a2',101);
insert into class values(100,'class1');
insert into class values(101,'class2');
insert into class values(102,'class3');

2、有关联条件JOIN。

select * from student inner join class;

返回结果为:

 sid | name | class_id | cid | class_name
-----+------+----------+-----+------------
   1 | a1   |      100 | 100 | class1
   2 | a2   |      101 | 100 | class1
   1 | a1   |      100 | 101 | class2
   2 | a2   |      101 | 101 | class2
   1 | a1   |      100 | 102 | class3
   2 | a2   |      101 | 102 | class3
(6 rows)

3、Vastbase在MySQL兼容模式下支持无关联条件的JOIN,也就是说下面语句等价于步骤2,返回结果也与步骤2相同。

select * from student,class;

支持指定多个分区查询数据

功能描述

SELECT语句中支持PARTITION子句指定多个分区查询数据。

注意事项

无。

示例

1、创建测试表并插入数据。

CREATE TABLE devices_list(
id serial primary key not null,
col int)
PARTITION BY LIST (col)
(
PARTITION p1 VALUES (10),
PARTITION p2 VALUES (20),
PARTITION p3 VALUES (30)
);
insert into devices_list(col) values(10),(10),(20),(20),(30);

2、指定多个分区查询数据。

select * from devices_list partition(p1,p2);
select * from devices_list partition(p2,p3);
select * from devices_list partition(p1,p2,p3);
select * from devices_list partition(p3,p2,p1);

返回结果分别如下:


 id | col
----+-----
  1 |  10
  2 |  10
  3 |  20
  4 |  20
(4 rows)

 id | col
----+-----
  3 |  20
  4 |  20
  5 |  30
(3 rows)

 id | col
----+-----
  1 |  10
  2 |  10
  3 |  20
  4 |  20
  5 |  30
(5 rows)

 id | col
----+-----
  1 |  10
  2 |  10
  3 |  20
  4 |  20
  5 |  30
(5 rows)