基础 SELECT

1316
2023/07/29 13:00:13

本章将使用示例数据库中的 customer 作演示。连接到示例数据库,并执行 \dS customer; 可以查看该表的结构:

dvdrental=# \dS customer;
                                             Table "public.customer"
   Column    |            Type             | Collation | Nullable |                    Default                    
-------------+-----------------------------+-----------+----------+-----------------------------------------------
 customer_id | integer                     |           | not null | nextval('customer_customer_id_seq'::regclass)
 store_id    | smallint                    |           | not null | 
 first_name  | character varying(45)       |           | not null | 
 last_name   | character varying(45)       |           | not null | 
 email       | character varying(50)       |           |          | 
 address_id  | smallint                    |           | not null | 
 activebool  | boolean                     |           | not null | true
 create_date | date                        |           | not null | 'now'::text::date
 last_update | timestamp without time zone |           |          | now()
 active      | integer                     |           |          | 

基本查询

-- 查询单个字段
SELECT first_name FROM customer;

-- 查询多个字段
SELECT first_name, last_name FROM customer;

-- 查询所有字段
SELECT * FROM customer;

-- 表达式
SELECT 'AXUM中文网';

-- 运算符和表达式
SELECT first_name || ' ' || last_name, email FROM customer;
  • || 是将多个字符串进行连接的运算符,你可以想象成 MySQL 的 CONCAT()
-- 别名
SELECT first_name || ' ' || last_name AS full_name, email FROM customer;

-- 别名
SELECT first_name || ' ' || last_name AS "full name", email FROM customer;
  • 通过 AS 指定别名,虽然用作别名时AS 通常可以省略,但加上它会更明确且易于理解
  • "":是 PostgreSQL 的定界符。当 SQL 语句中的对象名有特殊字符、关键字等情况时,需要使用定界符将其包裹。
  • 使用 ORDER BY 子句进行排序,可选
    • ASC:默认,升序,从小到大
    • DESC:降序,从大到小
  • 可以有多个排序规则,当第一个排序规则出现冲突(多条记录的排序值相同)时,会使用后面的排序规则继续排序,以此类推。
  • 可以使用 SELECT 中的表达式的值进行排序
  • PostgreSQL 还提供了针对 NULL 的排序
  • NULLS FIRST:将数据为 NULL 的记录排在数据不是NULL的记录的前面
  • NULLS LAST:默认值,将数据为 NULL 的记录排在数据不是NULL的记录的后面

DISTINCT 子句

DISTINCT 子句用于去除 SELECT 中重复的数据。

-- 使用字段1的值来评估是否重复
SELECT DISTINCT 字段1 FROM 表名;

-- 组合字段1和字段2两个字段的值来评估是否重复
SELECT DISTINCT 字段1,字段2 FROM 表名;

-- 保留每组重复项的“第一行”
SELECT DISTINCT ON(字段1) 别名,字段2 FROM 表名 ORDER BY 字段1,字段2;
  • PostgreSQL 提供了 DISTINC ON(表达式) ,用于保留每组重复项的“第一行”
    • 请配合 ORDER BY 使用。如未指定 ORDER BY ,PostgreSQL 的数据顺序是未定的(通常会按写记录(插入、修改)的前后排序)
    • 它的表达式 必须和 ORDER BY 第一个表达式匹配。比如上例中的 字段1
-- 创建一张表,用于演示 DISTINCT
CREATE TABLE distinct_demo (
	id serial NOT NULL PRIMARY KEY,
	bcolor VARCHAR,
	fcolor VARCHAR
);

-- 插入一些数据
INSERT INTO distinct_demo (bcolor, fcolor)
VALUES
	('red', 'red'),
	('red', 'red'),
	('red', NULL),
	(NULL, 'red'),
	('red', 'green'),
	('red', 'blue'),
	('green', 'red'),
	('green', 'blue'),
	('green', 'green'),
	('blue', 'red'),
	('blue', 'green'),
	('blue', 'blue');

-- 使用单个字段
SELECT DISTINCT bcolor FROM distinct_demo ORDER BY bcolor;
/* 结果
 bcolor 
--------
 blue
 green
 red
 [null]
*/

-- 使用多个字段
SELECT DISTINCT bcolor,fcolor FROM distinct_demo ORDER BY bcolor,fcolor;
/* 结果
 bcolor | fcolor 
--------+--------
 blue   | blue
 blue   | green
 blue   | red
 green  | blue
 green  | green
 green  | red
 red    | blue
 red    | green
 red    | red
 red    | [null]
 [null] | red
*/

-- 使用 DISTINCT ON
SELECT DISTINCT ON(bcolor) bcolor,fcolor FROM distinct_demo ORDER BY bcolor,fcolor;
/* 结果
 bcolor | fcolor 
--------+--------
 blue   | blue
 green  | blue
 red    | blue
 [null] | red
*/