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 的基础知识,包括创建表、插入数据和查询数据。