-
分页查询 语法如下: 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 test_p2(id INT, class VARCHAR(20), score INT);
gaussdb=# INSERT INTO test_p2 VALUES (1,'math',64), (1,'english',78);
gaussdb=# INSERT INTO test_p2 VALUES (2,'math',98), (2,'english',82);
gaussdb=# INSERT INTO test_p2 VALUES (3,'math',68), (3,'english',59);
gaussdb=# SELECT * FROM test_p2;
id | class | score
----+---------+-------
3 | math | 68
3 | english | 59
1 | math | 64
1 | english | 78
2 | math | 98
2 | english | 82
(6 rows)
--行转列。
gaussdb=# SELECT * FROM test_p2 PIVOT(MAX(score) FOR class IN('math','english'));
id | 'math' | 'english'
----+--------+-----------
3 | 68 | 59
1 | 64 | 78
2 | 98 | 82
(3 rows)
--删除。
gaussdb=# DROP TABLE test_p2; 列转行 --建表并插入数据。
gaussdb=# CREATE TABLE test_p1(id INT, math INT, english INT);
gaussdb=# INSERT INTO test_p1 VALUES (1,84,78), (2,98,82), (3,68,59);
gaussdb=# SELECT * FROM test_p1;
id | math | english
----+------+---------
3 | 68 | 59
1 | 84 | 78
2 | 98 | 82
(3 rows)
--列转行。
gaussdb=# SELECT * FROM test_p1 UNPIVOT(score FOR class IN(math, english));
id | class | score
----+---------+-------
3 | MATH | 68
3 | ENGLISH | 59
1 | MATH | 84
1 | ENGLISH | 78
2 | MATH | 98
2 | ENGLISH | 82
(6 rows)
--删除。
gaussdb=# DROP TABLE test_p1; 父主题: SELECT
-
简化版查询 通过使用TABLE语法,直接指定具体的表进行查询操作。 该操作与使用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
-
示例 --建表并插入数据。
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 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 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 test_p2(id INT, class VARCHAR(20), score INT);
gaussdb=# INSERT INTO test_p2 VALUES (1,'math',64), (1,'english',78);
gaussdb=# INSERT INTO test_p2 VALUES (2,'math',98), (2,'english',82);
gaussdb=# INSERT INTO test_p2 VALUES (3,'math',68), (3,'english',59);
gaussdb=# SELECT * FROM test_p2;
id | class | score
----+---------+-------
3 | math | 68
3 | english | 59
1 | math | 64
1 | english | 78
2 | math | 98
2 | english | 82
(6 rows)
--行转列。
gaussdb=# SELECT * FROM test_p2 PIVOT(MAX(score) FOR class IN('math','english'));
id | 'math' | 'english'
----+--------+-----------
3 | 68 | 59
1 | 64 | 78
2 | 98 | 82
(3 rows)
--删除。
gaussdb=# DROP TABLE test_p2; 列转行 --建表并插入数据。
gaussdb=# CREATE TABLE test_p1(id INT, math INT, english INT);
gaussdb=# INSERT INTO test_p1 VALUES (1,84,78), (2,98,82), (3,68,59);
gaussdb=# SELECT * FROM test_p1;
id | math | english
----+------+---------
3 | 68 | 59
1 | 84 | 78
2 | 98 | 82
(3 rows)
--列转行。
gaussdb=# SELECT * FROM test_p1 UNPIVOT(score FOR class IN(math, english));
id | class | score
----+---------+-------
3 | MATH | 68
3 | ENGLISH | 59
1 | MATH | 84
1 | ENGLISH | 78
2 | MATH | 98
2 | ENGLISH | 82
(6 rows)
--删除。
gaussdb=# DROP TABLE test_p1; 父主题: 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;
-
简化版查询 通过使用TABLE语法,直接指定具体的表进行查询操作。 该操作与使用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
-
示例 将“SELECT courseId FROM course_info WHERE courseName = 'Biology'”定义为公共表达式nv,然后在后续的查询中直接利用nv代替该SELECT语句。 1 WITH nv AS (SELECT courseId FROM course_info WHERE courseName = 'Biology') SELECT DISTINCT courseId FROM nv;