域名 AXUM.RS 将于2025年10月到期。我们无意再对其进行续费,我们希望你能够接续这个域名,让更多 AXUM 开发者继续受益。
  • 方案1️⃣AXUM.RS 域名 = 3000
  • 方案2️⃣方案1️⃣ + 本站所有专题原始 Markdown 文档 = 5000
  • 方案3️⃣方案2️⃣ + 本站原始数据库 = 5500
如果你有意接续这份 AXUM 情怀,请与我们取得联系。
说明:
  1. 如果有人购买 AXUM.RS 域名(方案1️⃣),或者该域名到期,本站将启用新的免费域名继续提供服务。
  2. 如果有人购买了 AXUM.RS 域名,且同时购买了内容和/或数据库(方案2️⃣/方案3️⃣),本站将关闭。届时我们或许会以另一种方式与你再相遇。

基础 SELECT

本章将讨论如何使用简单的 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;
-- 别名
SELECT first_name || ' ' || last_name AS full_name, email FROM customer;

-- 别名
SELECT first_name || ' ' || last_name AS "full name", email FROM customer;
-- 排序
SELECT first_name, last_name FROM customer ORDER BY first_name;

-- 排序(同上)
SELECT first_name, last_name FROM customer ORDER BY first_name ASC;

-- 复合排序
SELECT first_name, last_name FROM customer ORDER BY first_name ASC, last_name DESC;

-- 使用表达式的值进行排序
SELECT first_name, LENGTH(last_name) AS len FROM customer ORDER BY len DESC;
  • 使用 ORDER BY 子句进行排序,可选
    • ASC:默认,升序,从小到大
    • DESC:降序,从大到小
  • 可以有多个排序规则,当第一个排序规则出现冲突(多条记录的排序值相同)时,会使用后面的排序规则继续排序,以此类推。
  • 可以使用 SELECT 中的表达式的值进行排序
  • PostgreSQL 还提供了针对 NULL 的排序
  • ASC:默认,升序,从小到大
  • DESC:降序,从大到小
-- 创建新表
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
  • 请配合 ORDER BY 使用。如未指定 ORDER BY ,PostgreSQL 的数据顺序是未定的(通常会按写记录(插入、修改)的前后排序)
  • 它的表达式 必须和 ORDER BY 第一个表达式匹配。比如上例中的 字段1
要查看完整内容,请先登录