PostgreSQL SQL 入门
最后修改于 2025 年 2 月 25 日
SQL(Structured Query Language,结构化查询语言)是一种用于管理和操作关系型数据库的标准语言。PostgreSQL 是一种功能强大、开源的关系型数据库系统。本教程将使用 PostgreSQL 讲解 SQL 的基础知识,包括创建表、插入数据和查询数据。
我们将使用一个书籍数据集来演示 SQL 概念。该数据集包含有关书籍的信息,例如书名、作者、类型、价格和出版年份。
设置数据库
首先,我们创建 books
表并插入示例数据。
-- 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_id
、title
、author
、genre
、price
和 publication_year
列。PRIMARY KEY
(主键)、NOT NULL
(非空)和 CHECK
(检查)等约束可确保数据完整性。
基本 SQL 查询
本节介绍从 books
表检索数据的基本 SQL 查询。
选择所有书籍
要检索表中的所有书籍,请使用以下 SQL 查询:
SELECT * FROM books;
此查询使用 SELECT
语句从 books
表中获取所有列和行。星号(*
)是通配符,代表表中的所有列。
选择特定列
要仅从 books
表中检索 title
和 author
列,请使用以下 SQL 查询:
SELECT title, author FROM books;
此查询使用 SELECT
语句从 books
表中指定 title
和 author
列。该查询将仅返回表中所有行的这两列。
过滤数据
要检索在 2020 年之后出版的书籍,请使用以下 SQL 查询:
SELECT * FROM books WHERE publication_year > 2020;
此查询使用 WHERE
子句根据条件 publication_year > 2020
过滤行。仅返回 2020 年后出版的书籍。
排序数据
要按价格升序检索书籍,请使用以下 SQL 查询:
SELECT * FROM books ORDER BY price ASC;
此查询使用 ORDER BY
子句按 price
列升序(ASC
)对结果进行排序。书籍将按价格从低到高的顺序返回。
聚合数据
要计算 books
表中的书籍总数,请使用以下 SQL 查询:
SELECT COUNT(*) AS total_books FROM books;
此查询使用 COUNT
函数,该函数返回 books
表中的总行数。结果被别名为 total_books
。
按类型过滤
要检索所有“科幻”(Sci-Fi)类型的书籍,请使用以下 SQL 查询:
SELECT * FROM books WHERE genre = 'Sci-Fi';
此查询使用 WHERE
子句过滤 genre
列与值“Sci-Fi”匹配的行。仅返回“科幻”类型的书籍。
按价格范围过滤
要检索价格在 10 美元到 20 美元之间的书籍,请使用以下 SQL 查询:
SELECT * FROM books WHERE price BETWEEN 10 AND 20;
此查询在 WHERE
子句中使用 BETWEEN
运算符,以过滤 price
列在 10 美元到 20 美元(含)之间的行。
按多个条件过滤
要检索 2020 年后出版的“奇幻”(Fantasy)类型书籍,请使用以下 SQL 查询:
SELECT * FROM books WHERE publication_year > 2020 AND genre = 'Fantasy';
此查询使用带有 AND
运算符的 WHERE
子句来过滤满足两个条件:publication_year > 2020
和 genre = 'Fantasy'
的行。
按出版年份降序排序
要按出版年份降序检索所有书籍,请使用以下 SQL 查询:
SELECT * FROM books ORDER BY publication_year DESC;
此查询使用 ORDER BY
子句按 publication_year
列降序(DESC
)对结果进行排序。书籍将按出版年份从近到远的顺序返回。
限制结果
要检索 books
表中的前 5 本书,请使用以下 SQL 查询:
SELECT * FROM books LIMIT 5;
此查询使用 LIMIT
子句将返回的行数限制为 5。仅检索表中的前 5 本书。
按类型统计书籍数量
要计算每种类型的书籍数量,请使用以下 SQL 查询:
SELECT genre, COUNT(*) AS book_count FROM books GROUP BY genre;
此查询使用 GROUP BY
子句按 genre
列对结果进行分组。COUNT
函数用于计算每种类型的书籍数量,结果被别名为 book_count
。
按类型计算平均价格
要计算每种类型书籍的平均价格,请使用以下 SQL 查询:
SELECT genre, AVG(price) AS avg_price FROM books GROUP BY genre;
此查询使用 GROUP BY
子句按 genre
列对结果进行分组。AVG
函数用于计算每种类型书籍的平均价格,结果被别名为 avg_price
。
查找最昂贵的书
要检索价格最高的那本书,请使用以下 SQL 查询:
SELECT * FROM books ORDER BY price DESC LIMIT 1;
此查询使用 ORDER BY
子句按 price
列降序(DESC
)对结果进行排序。LIMIT 1
子句确保仅返回价格最高的那本书。
查找最古老的书
要检索最古老的书(出版年份最早的书),请使用以下 SQL 查询:
SELECT * FROM books ORDER BY publication_year ASC LIMIT 1;
此查询使用 ORDER BY
子句按 publication_year
列升序(ASC
)对结果进行排序。LIMIT 1
子句确保仅返回最古老的那本书。
按作者过滤
要检索“Jane Doe”撰写的所有书籍,请使用以下 SQL 查询:
SELECT * FROM books WHERE author = 'Jane Doe';
此查询使用 WHERE
子句过滤 author
列与值“Jane Doe”匹配的行。仅返回“Jane Doe”撰写的书籍。
更新书籍价格
要将 book_id
为 101 的书籍价格更新为 14.99 美元,请使用以下 SQL 查询:
UPDATE books SET price = 14.99 WHERE book_id = 101;
此查询使用 UPDATE
语句来修改 book_id = 101
的行的 price
列。SET
子句指定了新价格。
删除一本书
要删除 book_id
为 130 的书籍,请使用以下 SQL 查询:
DELETE FROM books WHERE book_id = 130;
此查询使用 DELETE
语句从 books
表中删除 book_id = 130
的行。
查找标题中包含某个单词的书籍
要检索标题中包含“The”这个词的书籍,请使用以下 SQL 查询:
SELECT * FROM books WHERE title LIKE '%The%';
此查询使用 WHERE
子句中的 LIKE
运算符来过滤 title
列包含“The”这个词的行。%
符号是通配符,可以匹配任何字符序列。
查找特定年份出版的书籍
要检索 2022 年出版的书籍,请使用以下 SQL 查询:
SELECT * FROM books WHERE publication_year = 2022;
此查询使用 WHERE
子句过滤 publication_year
列与值 2022 匹配的行。仅返回 2022 年出版的书籍。
按类型计算总收入
要计算每种类型的总收入(价格总和),请使用以下 SQL 查询:
SELECT genre, SUM(price) AS total_revenue FROM books GROUP BY genre;
此查询使用 GROUP BY
子句按 genre
列对结果进行分组。SUM
函数用于计算每种类型的总收入,结果被别名为 total_revenue
。
SQL 最佳实践
- 使用有意义的列名:为列选择描述性的名称以提高可读性。
- 规范化数据:将数据组织到相关表中以减少冗余。
- 使用约束:应用
PRIMARY KEY
和NOT NULL
等约束以确保数据完整性。 - 优化查询:使用索引并避免在
SELECT
语句中使用不必要的列。
来源
在本文中,我们通过实际示例探讨了使用 PostgreSQL 进行 SQL 的基础知识,包括创建表、插入数据和查询数据。