ZetCode

PostgreSQL SQL 入门

最后修改于 2025 年 2 月 25 日

SQL(Structured Query Language,结构化查询语言)是一种用于管理和操作关系型数据库的标准语言。PostgreSQL 是一种功能强大、开源的关系型数据库系统。本教程将使用 PostgreSQL 讲解 SQL 的基础知识,包括创建表、插入数据和查询数据。

我们将使用一个书籍数据集来演示 SQL 概念。该数据集包含有关书籍的信息,例如书名、作者、类型、价格和出版年份。

设置数据库

首先,我们创建 books 表并插入示例数据。

create_table.sql
-- Create the books table
CREATE TABLE books (
    book_id INTEGER PRIMARY KEY,
    title VARCHAR(100) NOT NULL,
    author VARCHAR(100) NOT NULL,
    genre VARCHAR(50) NOT NULL,
    price NUMERIC(5,2) NOT NULL CHECK (price >= 0),
    publication_year INTEGER NOT NULL CHECK (publication_year BETWEEN 1900 AND 2025)
);

-- Insert 30 sample book entries
INSERT INTO books (book_id, title, author, genre, price, publication_year) VALUES
(101, 'The Silent Forest', 'Jane Doe', 'Mystery', 12.99, 2020),
(102, 'Code of Tomorrow', 'John Smith', 'Sci-Fi', 15.50, 2022),
(103, 'Cooking Basics', 'Maria Lopez', 'Non-Fiction', 9.99, 2019),
(104, 'Whispers in the Dark', 'Emily Carter', 'Horror', 13.75, 2021),
(105, 'The Last Empire', 'Robert King', 'Fantasy', 18.99, 2018),
(106, 'Data Driven', 'Alex Chen', 'Non-Fiction', 22.00, 2023),
(107, 'Echoes of Time', 'Sarah Miles', 'Sci-Fi', 14.25, 2020),
(108, 'The Red Shadow', 'Tom Harris', 'Thriller', 11.50, 2017),
(109, 'Garden of Dreams', 'Lily Evans', 'Romance', 8.99, 2022),
(110, 'Quantum Leap', 'David Patel', 'Sci-Fi', 16.80, 2024),
(111, 'Broken Chains', 'Anna Reed', 'Historical', 17.45, 2015),
(112, 'The Hungry Flame', 'Mark Stone', 'Fantasy', 19.99, 2021),
(113, 'Simple Joys', 'Clara White', 'Self-Help', 10.25, 2019),
(114, 'Nightmare City', 'Greg Holt', 'Horror', 12.60, 2023),
(115, 'Love in Bloom', 'Sophie Bell', 'Romance', 7.99, 2020),
(116, 'The Codebreaker', 'James Fox', 'Thriller', 14.99, 2018),
(117, 'Stars Unseen', 'Rachel Kim', 'Sci-Fi', 15.75, 2022),
(118, 'The Lost Recipe', 'Elena Ortiz', 'Non-Fiction', 11.20, 2016),
(119, 'Winds of Fate', 'Henry Blake', 'Fantasy', 20.50, 2023),
(120, 'Silent Witness', 'Laura Dean', 'Mystery', 13.30, 2019),
(121, 'Beyond the Veil', 'Chris Ward', 'Horror', 14.00, 2021),
(122, 'The Art of Calm', 'Nina Patel', 'Self-Help', 9.50, 2020),
(123, 'Empire of Dust', 'Oliver Grant', 'Historical', 18.25, 2014),
(124, 'Twist of Trust', 'Kate Lynn', 'Thriller', 12.85, 2022),
(125, 'Heartstrings', 'Emma Rose', 'Romance', 8.75, 2023),
(126, 'The Infinite Loop', 'Sam Carter', 'Sci-Fi', 16.99, 2024),
(127, 'Bread & Soul', 'Luis Gomez', 'Non-Fiction', 10.85, 2018),
(128, 'Dragon's Breath', 'Tara Hill', 'Fantasy', 21.00, 2020),
(129, 'The Locked Door', 'Peter Shaw', 'Mystery', 11.95, 2021),
(130, 'Mind Over Matter', 'Vikram Singh', 'Self-Help', 13.50, 2022);

books 表包含 book_idtitleauthorgenrepricepublication_year 列。PRIMARY KEY(主键)、NOT NULL(非空)和 CHECK(检查)等约束可确保数据完整性。

基本 SQL 查询

本节介绍从 books 表检索数据的基本 SQL 查询。

选择所有书籍

要检索表中的所有书籍,请使用以下 SQL 查询:

select_all.sql
SELECT * FROM books;

此查询使用 SELECT 语句从 books 表中获取所有列和行。星号(*)是通配符,代表表中的所有列。

选择特定列

要仅从 books 表中检索 titleauthor 列,请使用以下 SQL 查询:

select_columns.sql
SELECT title, author FROM books;

此查询使用 SELECT 语句从 books 表中指定 titleauthor 列。该查询将仅返回表中所有行的这两列。

过滤数据

要检索在 2020 年之后出版的书籍,请使用以下 SQL 查询:

filter_books.sql
SELECT * FROM books
WHERE publication_year > 2020;

此查询使用 WHERE 子句根据条件 publication_year > 2020 过滤行。仅返回 2020 年后出版的书籍。

排序数据

要按价格升序检索书籍,请使用以下 SQL 查询:

sort_books.sql
SELECT * FROM books
ORDER BY price ASC;

此查询使用 ORDER BY 子句按 price 列升序(ASC)对结果进行排序。书籍将按价格从低到高的顺序返回。

聚合数据

要计算 books 表中的书籍总数,请使用以下 SQL 查询:

count_books.sql
SELECT COUNT(*) AS total_books FROM books;

此查询使用 COUNT 函数,该函数返回 books 表中的总行数。结果被别名为 total_books

按类型过滤

要检索所有“科幻”(Sci-Fi)类型的书籍,请使用以下 SQL 查询:

filter_by_genre.sql
SELECT * FROM books
WHERE genre = 'Sci-Fi';

此查询使用 WHERE 子句过滤 genre 列与值“Sci-Fi”匹配的行。仅返回“科幻”类型的书籍。

按价格范围过滤

要检索价格在 10 美元到 20 美元之间的书籍,请使用以下 SQL 查询:

filter_by_price_range.sql
SELECT * FROM books
WHERE price BETWEEN 10 AND 20;

此查询在 WHERE 子句中使用 BETWEEN 运算符,以过滤 price 列在 10 美元到 20 美元(含)之间的行。

按多个条件过滤

要检索 2020 年后出版的“奇幻”(Fantasy)类型书籍,请使用以下 SQL 查询:

filter_by_multiple_conditions.sql
SELECT * FROM books
WHERE publication_year > 2020 AND genre = 'Fantasy';

此查询使用带有 AND 运算符的 WHERE 子句来过滤满足两个条件:publication_year > 2020genre = 'Fantasy' 的行。

按出版年份降序排序

要按出版年份降序检索所有书籍,请使用以下 SQL 查询:

sort_by_year_desc.sql
SELECT * FROM books
ORDER BY publication_year DESC;

此查询使用 ORDER BY 子句按 publication_year 列降序(DESC)对结果进行排序。书籍将按出版年份从近到远的顺序返回。

限制结果

要检索 books 表中的前 5 本书,请使用以下 SQL 查询:

limit_results.sql
SELECT * FROM books
LIMIT 5;

此查询使用 LIMIT 子句将返回的行数限制为 5。仅检索表中的前 5 本书。

按类型统计书籍数量

要计算每种类型的书籍数量,请使用以下 SQL 查询:

count_by_genre.sql
SELECT genre, COUNT(*) AS book_count
FROM books
GROUP BY genre;

此查询使用 GROUP BY 子句按 genre 列对结果进行分组。COUNT 函数用于计算每种类型的书籍数量,结果被别名为 book_count

按类型计算平均价格

要计算每种类型书籍的平均价格,请使用以下 SQL 查询:

avg_price_by_genre.sql
SELECT genre, AVG(price) AS avg_price
FROM books
GROUP BY genre;

此查询使用 GROUP BY 子句按 genre 列对结果进行分组。AVG 函数用于计算每种类型书籍的平均价格,结果被别名为 avg_price

查找最昂贵的书

要检索价格最高的那本书,请使用以下 SQL 查询:

most_expensive_book.sql
SELECT * FROM books
ORDER BY price DESC
LIMIT 1;

此查询使用 ORDER BY 子句按 price 列降序(DESC)对结果进行排序。LIMIT 1 子句确保仅返回价格最高的那本书。

查找最古老的书

要检索最古老的书(出版年份最早的书),请使用以下 SQL 查询:

oldest_book.sql
SELECT * FROM books
ORDER BY publication_year ASC
LIMIT 1;

此查询使用 ORDER BY 子句按 publication_year 列升序(ASC)对结果进行排序。LIMIT 1 子句确保仅返回最古老的那本书。

按作者过滤

要检索“Jane Doe”撰写的所有书籍,请使用以下 SQL 查询:

filter_by_author.sql
SELECT * FROM books
WHERE author = 'Jane Doe';

此查询使用 WHERE 子句过滤 author 列与值“Jane Doe”匹配的行。仅返回“Jane Doe”撰写的书籍。

更新书籍价格

要将 book_id 为 101 的书籍价格更新为 14.99 美元,请使用以下 SQL 查询:

update_price.sql
UPDATE books
SET price = 14.99
WHERE book_id = 101;

此查询使用 UPDATE 语句来修改 book_id = 101 的行的 price 列。SET 子句指定了新价格。

删除一本书

要删除 book_id 为 130 的书籍,请使用以下 SQL 查询:

delete_book.sql
DELETE FROM books
WHERE book_id = 130;

此查询使用 DELETE 语句从 books 表中删除 book_id = 130 的行。

查找标题中包含某个单词的书籍

要检索标题中包含“The”这个词的书籍,请使用以下 SQL 查询:

filter_by_title.sql
SELECT * FROM books
WHERE title LIKE '%The%';

此查询使用 WHERE 子句中的 LIKE 运算符来过滤 title 列包含“The”这个词的行。% 符号是通配符,可以匹配任何字符序列。

查找特定年份出版的书籍

要检索 2022 年出版的书籍,请使用以下 SQL 查询:

filter_by_year.sql
SELECT * FROM books
WHERE publication_year = 2022;

此查询使用 WHERE 子句过滤 publication_year 列与值 2022 匹配的行。仅返回 2022 年出版的书籍。

按类型计算总收入

要计算每种类型的总收入(价格总和),请使用以下 SQL 查询:

total_revenue_by_genre.sql
SELECT genre, SUM(price) AS total_revenue
FROM books
GROUP BY genre;

此查询使用 GROUP BY 子句按 genre 列对结果进行分组。SUM 函数用于计算每种类型的总收入,结果被别名为 total_revenue

SQL 最佳实践

来源

PostgreSQL 文档

在本文中,我们通过实际示例探讨了使用 PostgreSQL 进行 SQL 的基础知识,包括创建表、插入数据和查询数据。

作者

我的名字是 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在教学编程方面拥有十多年的经验。