云服务器内容精选

  • GROUP BY转换 MySQL/ADB分组查询的时候允许查询非分组字段,不报错;DWS分组查询时只能查询分组字段和聚集函数,报错。因此补齐没有group by的查询分组字段。 输入示例 1 SELECT e.department_id, department_name, ROUND(AVG(salary), 0) avg_salary FROM employees e JOIN departments d on e.department_id = d.department_id GROUP BY department_name ORDER BY department_name; 输出示例 1 2 3 4 5 6 7 8 9 10 11 12 SELECT e.department_id, department_name, ROUND (AVG(salary), 0) AS "avg_salary" FROM employees "e" JOIN departments "d" ON e.department_id = d.department_id GROUP BY department_name, 1 ORDER BY department_name; 父主题: SELECT
  • 分页查询 语法如下: SELECT query_list FROM table_name [ LIMIT { [offset,] count | ALL } ] offset :表示从第几行向后开始。 count:表示向后查询几条数据。 ALL:表示向后查询所有的数据。 -- 建表并插入100条数据。 gaussdb=# CREATE TABLE testl(id int PRIMARY KEY, flag varchar(10)); gaussdb=# INSERT INTO testl (id, flag) VALUES (generate_series(1,100),'flag'||generate_series(1,100)); --查询前5条数据。 gaussdb=# SELECT * FROM testl ORDER BY 1 LIMIT 5; id | flag ----+------- 1 | flag1 2 | flag2 3 | flag3 4 | flag4 5 | flag5 (5 rows) --从第20条向后查询4条数据。 gaussdb=# SELECT * FROM testl ORDER BY 1 LIMIT 20,4; id | flag ----+-------- 21 | flag21 22 | flag22 23 | flag23 24 | flag24 (4 rows) --从第96条向后查询出所有数据。 gaussdb=# SELECT * FROM testl ORDER BY 1 LIMIT 96,ALL; id | flag -----+--------- 97 | flag97 98 | flag98 99 | flag99 100 | flag100 (4 rows) --删除。 gaussdb=# DROP TABLE testl; 父主题: SELECT
  • 连接查询 连接查询也可称为跨表查询,需要关联多个表进行查询。 --建表并插入数据。 gaussdb=# CREATE TABLE emp( id int, --员工编号 name varchar, --员工姓名 deptno int --所属部门编号 ); gaussdb=# CREATE TABLE dept( deptno int, --部门编号 depname varchar --部门名 ); gaussdb=# INSERT INTO emp VALUES (1, 'Joe', 10), (2, 'Scott', 20), (3, 'Ben', 999); --Ben还没有确认是哪一个部门所以部门编号是999 gaussdb=# INSERT INTO dept VALUES (10, 'hr'), (20, 'it'), (30, 'sal'); --sal部门没有员工 内连接(INNER JOIN) gaussdb=# SELECT t1.id,t1.name,t2.depname FROM emp t1 JOIN dept t2 ON t1.deptno = t2.deptno; id | name | depname ----+-------+--------- 1 | Joe | hr 2 | Scott | it (2 rows) 左连接(LEFT JOIN) gaussdb=# SELECT t1.id,t1.name,t2.depname FROM emp t1 LEFT JOIN dept t2 ON t1.deptno = t2.deptno; id | name | depname ----+-------+--------- 1 | Joe | hr 2 | Scott | it 3 | Ben | (3 rows) 右连接(RIGHT JOIN) gaussdb=# SELECT t1.id,t1.name,t2.depname FROM emp t1 RIGHT JOIN dept t2 ON t1.deptno = t2.deptno; id | name | depname ----+-------+--------- 1 | Joe | hr 2 | Scott | it | | sal (3 rows) 全连接(FULL JOIN) gaussdb=# SELECT t1.id,t1.name,t2.depname FROM emp t1 FULL JOIN dept t2 ON t1.deptno = t2.deptno; id | name | depname ----+-------+--------- 1 | Joe | hr 2 | Scott | it | | sal 3 | Ben | (4 rows) --删除。 gaussdb=# DROP TABLE emp,dept; 父主题: SELECT
  • 分页查询 语法如下: SELECT query_list FROM table_name [ LIMIT { [offset,] count | ALL } ] offset :表示从第几行向后开始。 count:表示向后查询几条数据。 ALL:表示向后查询所有的数据。 --建表并插入100条数据。 gaussdb=# CREATE TABLE testl(id int PRIMARY KEY, flag varchar(10)); gaussdb=# INSERT INTO testl (id, flag) VALUES (generate_series(1,100),'flag'||generate_series(1,100)); --查询前5条数据。 gaussdb=# SELECT * FROM testl ORDER BY 1 LIMIT 5; id | flag ----+------- 1 | flag1 2 | flag2 3 | flag3 4 | flag4 5 | flag5 (5 rows) -- 从第20条向后查询4条数据。 gaussdb=# SELECT * FROM testl ORDER BY 1 LIMIT 20,4; id | flag ----+-------- 21 | flag21 22 | flag22 23 | flag23 24 | flag24 (4 rows) --从第96条向后查询出所有数据。 gaussdb=# SELECT * FROM testl ORDER BY 1 LIMIT 96,ALL; id | flag -----+--------- 97 | flag97 98 | flag98 99 | flag99 100 | flag100 (4 rows) --删除。 gaussdb=# DROP TABLE testl; 父主题: SELECT
  • 窗口函数查询 窗口函数对数据集中的相关行集执行计算,返回一个结果集。与聚集函数所完成的计算相比,窗口函数并不会使多行被聚集成一个单独的输出行。 --建表并插入数据。 gaussdb=# CREATE TABLE fruit_sale ( "statistical_date" date, "product" varchar(255), "year" varchar(5), "sales_quantity" numeric(8), "amount" numeric(8) ); gaussdb=# INSERT INTO fruit_sale VALUES ('2024-01-01', '西瓜', '2024', 1721, 253541); gaussdb=# INSERT INTO fruit_sale VALUES ('2024-01-01', '苹果', '2024', 5559, 269419); gaussdb=# INSERT INTO fruit_sale VALUES ('2024-02-01', '西瓜', '2024', 4711, 129644); --统计所有水果的销售量。 gaussdb=# SELECT *,SUM(sales_quantity) OVER (PARTITION by null) total_qty FROM fruit_sale; statistical_date | product | year | sales_quantity | amount | total_qty ------------------+---------+------+----------------+--------+----------- 2024-01-01 | 西瓜 | 2024 | 1721 | 253541 | 11991 2024-01-01 | 苹果 | 2024 | 5559 | 269419 | 11991 2024-02-01 | 西瓜 | 2024 | 4711 | 129644 | 11991 (3 rows) --删除。 gaussdb=# DROP TABLE fruit_sale; 父主题: SELECT
  • 分区查询 查询指定分区的数据。 --创建范围分区表。 gaussdb=# CREATE TABLE test_range1( id INT, info VARCHAR(20) ) PARTITION BY RANGE (id) ( PARTITION p1 VALUES LESS THAN (200), PARTITION p2 VALUES LESS THAN (400), PARTITION p3 VALUES LESS THAN (600), PARTITION p4 VALUES LESS THAN (800), PARTITION pmax VALUES LESS THAN (MAXVALUE) ); --插入1000数据。 gaussdb=# INSERT INTO test_range1 VALUES(GENERATE_SERIES(1,1000),'abcd'); --查询p1分区有多少条数据。 gaussdb=# SELECT COUNT(*) FROM test_range1 PARTITION (p1); count ------- 199 (1 row) --删除。 gaussdb=# DROP TABLE test_range1; 父主题: SELECT
  • 连接查询 连接查询也可称为跨表查询,需要关联多个表进行查询。 -- 建表并插入数据。 gaussdb=# CREATE TABLE emp( id int, --员工编号 name varchar, --员工姓名 deptno int --所属部门编号 ); gaussdb=# CREATE TABLE dept( deptno int, --部门编号 depname varchar --部门名 ); gaussdb=# INSERT INTO emp VALUES (1, 'Joe', 10), (2, 'Scott', 20), (3, 'Ben', 999); --Ben还没有确认是哪一个部门所以部门编号是999 gaussdb=# INSERT INTO dept VALUES (10, 'hr'), (20, 'it'), (30, 'sal'); --sal部门没有员工 内连接(INNER JOIN) gaussdb=# SELECT t1.id,t1.name,t2.depname FROM emp t1 JOIN dept t2 ON t1.deptno = t2.deptno; id | name | depname ----+-------+--------- 1 | Joe | hr 2 | Scott | it (2 rows) 左连接(LEFT JOIN) gaussdb=# SELECT t1.id,t1.name,t2.depname FROM emp t1 LEFT JOIN dept t2 ON t1.deptno = t2.deptno; id | name | depname ----+-------+--------- 1 | Joe | hr 2 | Scott | it 3 | Ben | (3 rows) 右连接(RIGHT JOIN) gaussdb=# SELECT t1.id,t1.name,t2.depname FROM emp t1 RIGHT JOIN dept t2 ON t1.deptno = t2.deptno; id | name | depname ----+-------+--------- 1 | Joe | hr 2 | Scott | it | | sal (3 rows) 全连接(FULL JOIN) gaussdb=# SELECT t1.id,t1.name,t2.depname FROM emp t1 FULL JOIN dept t2 ON t1.deptno = t2.deptno; id | name | depname ----+-------+--------- 1 | Joe | hr 2 | Scott | it | | sal 3 | Ben | (4 rows) --删除。 gaussdb=# DROP TABLE emp,dept; 父主题: SELECT
  • 示例 --建表并插入数据。 gaussdb=# CREATE TABLE test1(c11 INT, c12 VARCHAR); gaussdb=# INSERT INTO test1 VALUES (1,'a'),(2,'b'),(4,'d'); gaussdb=# CREATE TABLE test2(c21 INT, c22 VARCHAR); gaussdb=# INSERT INTO test2 VALUES (1,'a'),(3,'c'); UNION gaussdb=# SELECT * FROM test1 UNION SELECT * FROM test2; c11 | c12 -----+----- 1 | a 4 | d 2 | b 3 | c (4 rows) UNION ALL gaussdb=# SELECT * FROM test1 UNION ALL SELECT * FROM test2; c11 | c12 -----+----- 1 | a 2 | b 4 | d 1 | a 3 | c (5 rows) INTERSECT gaussdb=# SELECT * FROM test1 INTERSECT SELECT * FROM test2; c11 | c12 -----+----- 1 | a (1 row) MINUS gaussdb=# SELECT * FROM test1 MINUS SELECT * FROM test2; c11 | c12 -----+----- 4 | d 2 | b (2 rows) -- 删除。 gaussdb=# DROP TABLE test1,test2;
  • 分区查询 查询指定分区的数据。 --创建范围分区表。 gaussdb=# CREATE TABLE test_range1( id INT, info VARCHAR(20) ) PARTITION BY RANGE (id) ( PARTITION p1 VALUES LESS THAN (200), PARTITION p2 VALUES LESS THAN (400), PARTITION p3 VALUES LESS THAN (600), PARTITION p4 VALUES LESS THAN (800), PARTITION pmax VALUES LESS THAN (MAXVALUE) ); --插入1000数据。 gaussdb=# INSERT INTO test_range1 VALUES(GENERATE_SERIES(1,1000),'abcd'); -- 查询p1分区有多少条数据。 gaussdb=# SELECT COUNT(*) FROM test_range1 PARTITION (p1); count ------- 199 (1 row) -- 删除。 gaussdb=# DROP TABLE test_range1; 父主题: SELECT
  • 简单查询 简单查询指从一个或多个表或视图中检索一个或多个列数据的操作。 --建表并插入数据。 gaussdb=# CREATE TABLE student( sid INT PRIMARY KEY, class INT, name VARCHAR(50), sex INT CHECK(sex = 0 OR sex = 1) --性别,1为男,0为女 ); gaussdb=# INSERT INTO student (sid, class, name, sex) VALUES (1, 1, 'Michael', 0); gaussdb=# INSERT INTO student (sid, class, name, sex) VALUES (2, 2, 'Bob', 1); gaussdb=# INSERT INTO student (sid, class, name, sex) VALUES (3, 2, 'Gary', 0); --查询部分列。 gaussdb=# SELECT sid, name FROM student; sid | name -----+--------- 1 | michael 2 | bob 3 | Gary (3 rows) --查询所有列。 gaussdb=# SELECT * FROM student; sid | class | name | sex -----+-------+---------+----- 1 | 1 | michael | 0 2 | 2 | bob | 1 3 | 2 | Gary | 0 (3 rows) --给列取别名。 gaussdb=# SELECT sid student_id, name FROM student; student_id | name ------------+--------- 1 | michael 2 | bob 3 | Gary (3 rows) --删除。 gaussdb=# DROP TABLE student; 父主题: SELECT
  • 简版化查询 --创建表。 gaussdb=# CREATE TABLE t1(c1 int, c2 int, c3 int); --插入数据。 gaussdb=# INSERT INTO t1 VALUES (1,2,3); c1 | c2 | c3 ----+----+---- 1 | 2 | 3 (1 row) --查询表的数据。 gaussdb=# TABLE t1; c1 | c2 | c3 ----+----+---- 1 | 2 | 3 (1 row) --删除。 gaussdb=# DROP TABLE t1; 父主题: SELECT
  • 语法格式 1 2 3 4 5 6 7 SELECT [ALL | DISTINCT] attr_expr_list FROM table_reference [WHERE where_condition] [GROUP BY col_name_list] [ORDER BY col_name_list][ASC | DESC] [CLUSTER BY col_name_list | DISTRIBUTE BY col_name_list] [SORT BY col_name_list]] [LIMIT number];
  • 关键字 表1 SELECT关键字说明 参数 描述 ALL ALL关键字用于返回数据库所有匹配的行,包括重复的行。ALL关键字的后面只能跟*,否则执行语句会出错。 ALL是SQL语句的默认行为,通常不会被明确写出,如果不指定ALL或DISTINCT,查询结果将包含所有的行,即使是重复的行数据也将被返回。 DISTINCT 在SELECT语句中使用DISTINCT关键字时,系统会在查询结果中去除重复的数据,确保结果的唯一性。 WHERE 指定查询的过滤条件,支持算术运算符、关系运算符和逻辑运算符。 where_condition 过滤条件。 GROUP BY 指定分组的字段,支持单字段及多字段分组。 col_name_list 字段列表。 ORDER BY 对查询结果进行排序。 ASC/DESC ASC为升序,DESC为降序,默认为ASC。 CLUSTER BY 为分桶且排序,按照分桶字段先进行分桶,再在每个桶中依据该字段进行排序,即当DISTRIBUTE BY的字段与SORT BY的字段相同且排序为降序时,两者的作用与CLUSTER BY等效。 DISTRIBUTE BY 指定分桶字段,不进行排序。 SORT BY 将会在桶内进行排序。 LIMIT 对查询结果进行限制,number参数仅支持INT类型。
  • 简单查询 简单查询指从一个或多个表或视图中检索一个或多个列数据的操作。 --建表并插入数据。 gaussdb=# CREATE TABLE student( sid INT PRIMARY KEY, class INT, name VARCHAR(50), sex INT CHECK(sex = 0 OR sex = 1) --性别,1为男,0为女 ); gaussdb=# INSERT INTO student (sid, class, name, sex) VALUES (1, 1, 'Michael', 0); gaussdb=# INSERT INTO student (sid, class, name, sex) VALUES (2, 2, 'Bob', 1); gaussdb=# INSERT INTO student (sid, class, name, sex) VALUES (3, 2, 'Gary', 0); --查询部分列。 gaussdb=# SELECT sid, name FROM student; sid | name -----+--------- 1 | michael 2 | bob 3 | Gary (3 rows) --查询所有列。 gaussdb=# SELECT * FROM student; sid | class | name | sex -----+-------+---------+----- 1 | 1 | michael | 0 2 | 2 | bob | 1 3 | 2 | Gary | 0 (3 rows) --给列取别名。 gaussdb=# SELECT sid student_id, name FROM student; student_id | name ------------+--------- 1 | michael 2 | bob 3 | Gary (3 rows) --删除。 gaussdb=# DROP TABLE student; 父主题: SELECT
  • 关键字 GROUP BY:按列可分为单列GROUP BY与多列GROUP BY。 单列GROUP BY:指GROUP BY子句中仅包含一列,col_name_list中包含的字段必须出现在attr_expr_list的字段内,attr_expr_list中可以使用多个聚合函数,比如count(),sum(),聚合函数中可以包含其他字段。 多列GROUP BY:指GROUP BY子句中不止一列,查询语句将按照GROUP BY的所有字段分组,所有字段都相同的记录将被放在同一组中,同样,GROUP BY中出现的字段必须在attr_expr_list的字段内,attr_expr_list也可以使用聚合函数。