本章将讨论如何使用简单的 SELECT
语句从 PostgreSQL 查询数据。PostgreSQL 的 SELECT
语句有诸多独特的特性,让我们一起感受一下。
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
的排序
-- 创建新表
CREATE TABLE sort_demo(
-- 由于未加 NOT NULL 约束,num 字段将允许 NULL 值
num INT
);
-- 插入一些数据
INSERT INTO sort_demo(num)
VALUES(1),(2),(3),(null);
-- 按 num 升序
SELECT num FROM sort_demo ORDER BY num;
/* 结果
num
-----
1
2
3
[null]
*/
-- 将 NULL 值 放在非NULL值后面
SELECT num FROM sort_demo ORDER BY num NULLS LAST;
/* 结果
num
-----
1
2
3
[null]
*/
-- 将NULL值放在非NULL值前面
SELECT num FROM sort_demo ORDER BY num NULLS FIRST;
/* 结果
num
-----
[null]
1
2
3
*/
NULLS FIRST
:将数据为NULL
的记录排在数据不是NULL
的记录的前面NULLS LAST
:默认值,将数据为NULL
的记录排在数据不是NULL
的记录的后面
DISTINCT
子句
DISTINCT
子句用于去除 SELECT
中重复的数据。
- 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
*/