1. 首页 > PostgreSQL教程 > 正文

PostgreSQL教程FG008-SQL语言基础:PG支持的标准SQL核心语法

本文详细介绍PostgreSQL支持的标准SQL核心语法,包括SQL的基本概念、数据定义语言(DDL)、数据操作语言(DML)、数据查询语言(DQL)和事务管理等内容,帮助读者掌握SQL语言的基础用法。风哥教程参考PostgreSQL官方文档The SQL Language等内容。

本文档风哥主要介绍SQL语言基础:PG支持的标准SQL核心语法相关内容。风哥教程参考PostgreSQL官方文档SQL Language, SQL Syntax内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

本文档介绍PostgreSQL支持的SQL语言基础,包括数据定义、数据操作、查询语句等核心语法,帮助读者掌握SQL基础。风哥教程参考PostgreSQL官方文档SQL Language, SQL Syntax内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 SQL语言概述

SQL(Structured Query Language,结构化查询语言)是用于管理关系型数据库的标准语言。PostgreSQL支持SQL:2016标准,并提供了许多扩展功能。学习交流加群风哥微信: itpux-com

1.2 SQL语句类型

SQL语句主要分为以下几类:

– 数据定义语言(DDL):CREATE、ALTER、DROP等

– 数据操作语言(DML):INSERT、UPDATE、DELETE等

– 数据查询语言(DQL):SELECT等

– 数据控制语言(DCL):GRANT、REVOKE等

– 事务控制语言(TCL):BEGIN、COMMIT、ROLLBACK等

风哥教程针对风哥教程针对风哥教程针对生产环境建议:在编写SQL语句时,应遵循SQL标准,避免使用特定数据库的扩展语法,以提高代码的可移植性。学习交流加群风哥QQ113257174

Part02-数据定义语言(DDL)

2.1 CREATE语句

CREATE语句用于创建数据库对象,如数据库、表、视图、索引等。

# 登录PostgreSQL
# su – pgsql $ psql

# 创建数据库
postgres=# CREATE DATABASE fgedudb;
CREATE DATABASE

# 连接到数据库
postgres=# \c fgedudb

# 创建表
fgedudb=# CREATE TABLE fgedu_products (
product_id SERIAL PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
category VARCHAR(50),
price DECIMAL(10,2) NOT NULL CHECK (price > 0),
stock_quantity INTEGER DEFAULT 0 CHECK (stock_quantity >= 0),
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE fgedu_# 创建索引
fgedudb=# CREATE INDEX idx_fgedu_products_category ON fgedu_products(category);
CREATE INDEX

# 创建视图
fgedudb=# CREATE VIEW v_fgedu_available_products AS
SELECT product_id, product_name, category, price, stock_quantity
FROM fgedu_products
WHERE stock_quantity > 0;
CREATE VIEW

2.2 ALTER语句

ALTER语句用于修改数据库对象的结构。

# 修改表结构
fgedudb=# ALTER TABLE fgedu_products
ADD COLUMN description TEXT,
ALTER COLUMN price TYPE DECIMAL(12,2),
ADD CONSTRAINT unique_product_name UNIQUE (product_name);
ALTER TABLE

# 修改索引
fgedudb=# ALTER INDEX idx_fgedu_products_category RENAME TO idx_products_category;
ALTER INDEX

# 修改视图
fgedudb=# CREATE OR REPLACE VIEW v_fgedu_available_products AS
SELECT product_id, product_name, category, price, stock_quantity, description
FROM fgedu_products
WHERE stock_quantity > 0;
CREATE VIEW

2.3 DROP语句

DROP语句用于删除数据库对象。

# 删除索引
fgedudb=# DROP INDEX IF EXISTS idx_products_category;
DROP INDEX

# 删除视图
fgedudb=# DROP VIEW IF EXISTS v_fgedu_available_products;
DROP VIEW

# 删除表(谨慎操作)
# DROP TABLE IF EXISTS fgedu_products;
# DROP TABLE

风哥提示:DROP语句是不可逆操作,在生产环境中务必谨慎执行,建议先备份数据。

Part03-数据操作语言(DML)

3.1 INSERT语句

INSERT语句用于向表中插入数据。

# 插入单条数据
fgedudb=# INSERT INTO fgedu_products (product_name, category, price, stock_quantity, description)
VALUES (‘PostgreSQL数据库实战’, ‘计算机图书’, 89.90, 100, ‘PostgreSQL数据库从入门到精通’);
INSERT 0 1

# 插入多条数据
fgedudb=# INSERT INTO fgedu_products (product_name, category, price, stock_quantity, description) VALUES
(‘Python编程基础’, ‘计算机图书’, 59.90, 200, ‘Python语言入门教程’),
(‘Java核心技术’, ‘计算机图书’, 129.90, 150, ‘Java语言高级编程’),
(‘数据结构与算法’, ‘计算机图书’, 79.90, 80, ‘数据结构与算法分析’),
(‘机器学习实战’, ‘人工智能’, 99.90, 60, ‘机器学习算法与应用’);
INSERT 0 4

# 查看插入的数据
fgedudb=# SELECT * FROM fgedu_products;
product_id | product_name | category | price | stock_quantity | created_at | description
————+———————-+————–+———+—————-+—————————-+——————————-
1 | PostgreSQL数据库实战 | 计算机图书 | 89.90 | 100 | 2026-04-02 13:00:00.123456 | PostgreSQL数据库从入门到精通
2 | Python编程基础 | 计算机图书 | 59.90 | 200 | 2026-04-02 13:00:00.123456 | Python语言入门教程
3 | Java核心技术 | 计算机图书 | 129.90 | 150 | 2026-04-02 13:00:00.123456 | Java语言高级编程
4 | 数据结构与算法 | 计算机图书 | 79.90 | 80 | 2026-04-02 13:00:00.123456 | 数据结构与算法分析
5 | 机器学习实战 | 人工智能 | 99.90 | 60 | 2026-04-02 13:00:00.123456 | 机器学习算法与应用
(5 rows)

3.2 UPDATE语句

UPDATE语句用于更新表中的数据。

# 更新单条数据
fgedudb=# UPDATE fgedu_products
SET price = 85.90, stock_quantity = 95
WHERE product_id = 1;
UPDATE 1

# 更新多条数据
fgedudb=# UPDATE fgedu_products
SET price = price * 1.1
WHERE category = ‘计算机图书’;
UPDATE 4

# 查看更新后的数据
fgedudb=# SELECT product_id, product_name, category, price, stock_quantity FROM fgedu_products;
product_id | product_name | category | price | stock_quantity
————+———————-+————–+———+—————-
1 | PostgreSQL数据库实战 | 计算机图书 | 94.49 | 95
2 | Python编程基础 | 计算机图书 | 65.89 | 200
3 | Java核心技术 | 计算机图书 | 142.89 | 150
4 | 数据结构与算法 | 计算机图书 | 87.89 | 80
5 | 机器学习实战 | 人工智能 | 99.90 | 60
(5 rows)

3.3 DELETE语句

DELETE语句用于删除表中的数据。

from oracle:www.itpux.com

# 删除单条数据
fgedudb=# DELETE FROM fgedu_products WHERE product_id = 5;
DELETE 1

# 删除多条数据
fgedudb=# DELETE FROM fgedu_products WHERE stock_quantity < 90; DELETE 2 # 查看剩余数据 fgedudb=# SELECT * FROM fgedu_products; product_id | product_name | category | price | stock_quantity | created_at | description ------------+----------------------+--------------+---------+----------------+----------------------------+------------------------------- 1 | PostgreSQL数据库实战 | 计算机图书 | 94.49 | 95 | 2026-04-02 13:00:00.123456 | PostgreSQL数据库从入门到精通 2 | Python编程基础 | 计算机图书 | 65.89 | 200 | 2026-04-02 13:00:00.123456 | Python语言入门教程 3 | Java核心技术 | 计算机图书 | 142.89 | 150 | 2026-04-02 13:00:00.123456 | Java语言高级编程 (3 rows) # 恢复数据以便后续练习 fgedudb=# INSERT INTO fgedu_products (product_name, category, price, stock_quantity, description) VALUES ('数据结构与算法', '计算机图书', 79.90, 80, '数据结构与算法分析'), ('机器学习实战', '人工智能', 99.90, 60, '机器学习算法与应用'); INSERT 0 2

Part04-数据查询语言(DQL)

4.1 SELECT基础语法

SELECT语句用于查询表中的数据。

# 查询所有列
fgedudb=# SELECT * FROM fgedu_products;

# 查询特定列
fgedudb=# SELECT product_name, category, price FROM fgedu_products;
product_name | category | price
———————-+————–+———
PostgreSQL数据库实战 | 计算机图书 | 94.49
Python编程基础 | 计算机图书 | 65.89
Java核心技术 | 计算机图书 | 142.89
数据结构与算法 | 计算机图书 | 79.90
机器学习实战 | 人工智能 | 99.90
(5 rows)

# 使用别名
fgedudb=# SELECT product_name AS “产品名称”, price AS “价格” FROM fgedu_products;
产品名称 | 价格
——————–+———-
PostgreSQL数据库实战 | 94.49
Python编程基础 | 65.89
Java核心技术 | 142.89
数据结构与算法 | 79.90
机器学习实战 | 99.90
(5 rows)

4.2 SELECT子句详解

SELECT语句可以包含多个子句,如WHERE、GROUP BY、HAVING、ORDER BY和LIMIT等。

# WHERE子句:过滤数据
fgedudb=# SELECT product_name, price, stock_quantity
FROM fgedu_products
WHERE category = ‘计算机图书’ AND price < 100; product_name | price | stock_quantity ----------------------+--------+---------------- PostgreSQL数据库实战 | 94.49 | 95 Python编程基础 | 65.89 | 200 数据结构与算法 | 79.90 | 80 (3 rows) # GROUP BY子句:分组数据 fgedudb=# SELECT category, COUNT(*) AS product_count, AVG(price) AS avg_price FROM fgedu_products GROUP BY category; category | product_count | avg_price --------------+---------------+---------------------- 人工智能 | 1 | 99.90000000000000 计算机图书 | 4 | 95.79250000000000 (2 rows) # HAVING子句:过滤分组数据 fgedudb=# SELECT category, COUNT(*) AS product_count, AVG(price) AS avg_price FROM fgedu_products GROUP BY category HAVING COUNT(*) > 1;
category | product_count | avg_price
————–+—————+———————-
计算机图书 | 4 | 95.79250000000000
(1 row)

# ORDER BY子句:排序数据
fgedudb=# SELECT product_name, price FROM fgedu_products ORDER BY price DESC;
product_name | price
———————-+———
Java核心技术 | 142.89
机器学习实战 | 99.90
PostgreSQL数据库实战 | 94.49
数据结构与算法 | 79.90
Python编程基础 | 65.89
(5 rows)

# LIMIT子句:限制返回行数
fgedudb=# SELECT product_name, price FROM fgedu_products ORDER BY price DESC LIMIT 3;
product_name | price
———————-+———
Java核心技术 | 142.89
机器学习实战 | 99.90
PostgreSQL数据库实战 | 94.49
(3 rows)

4.3 高级查询技巧

包括连接查询、子查询、聚合函数等高级查询技巧。

# 创建订单表
fgedudb=# CREATE TABLE fgedu_orders (
order_id SERIAL PRIMARY KEY,
customer_name VARCHAR(50) NOT NULL,
order_date DATE DEFAULT NOW(),
total_amount DECIMAL(10,2)
);
CREATE TABLE fgedu_# 创建订单项表
fgedudb=# CREATE TABLE fgedu_order_items (
order_item_id SERIAL PRIMARY KEY,
order_id INTEGER NOT NULL REFERENCES fgedu_orders(order_id),
product_id INTEGER NOT NULL REFERENCES fgedu_products(product_id),
quantity INTEGER NOT NULL CHECK (quantity > 0),
unit_price DECIMAL(10,2) NOT NULL CHECK (unit_price > 0)
);
CREATE TABLE fgedu_# 插入测试数据
fgedudb=# INSERT INTO fgedu_orders (customer_name, order_date, total_amount) VALUES
(‘风哥1号’, ‘2026-04-01’, 244.38),
(‘风哥2号’, ‘2026-04-02’, 142.89);
INSERT 0 2

fgedudb=# INSERT INTO fgedu_order_items (order_id, product_id, quantity, unit_price) VALUES
(1, 1, 1, 94.49),
(1, 2, 2, 65.89),
(2, 3, 1, 142.89);
INSERT 0 3

# 连接查询
fgedudb=# SELECT o.order_id, o.customer_name, o.order_date,
p.product_name, i.quantity, i.unit_price
FROM fgedu_orders o
JOIN fgedu_order_items i ON o.order_id = i.order_id
JOIN fgedu_products p ON i.product_id = p.product_id
ORDER BY o.order_id;
order_id | customer_name | order_date | product_name | quantity | unit_price
———-+—————+————+———————-+———-+————
1 | 风哥1号 | 2026-04-01 | PostgreSQL数据库实战 | 1 | 94.49
1 | 风哥1号 | 2026-04-01 | Python编程基础 | 2 | 65.89
2 | 风哥2号 | 2026-04-02 | Java核心技术 | 1 | 142.89
(3 rows)

# 子查询
fgedudb=# SELECT product_name, price
FROM fgedu_products
WHERE price > (SELECT AVG(price) FROM fgedu_products);
product_name | price
———————-+———
Java核心技术 | 142.89
机器学习实战 | 99.90
PostgreSQL数据库实战 | 94.49
(3 rows)

# 聚合函数
fgedudb=# SELECT
COUNT(*) AS total_products,
MAX(price) AS max_price,
MIN(price) AS min_price,
AVG(price) AS avg_price,
SUM(price * stock_quantity) AS total_value
FROM fgedu_products;
total_products | max_price | min_price | avg_price | total_value
—————-+———–+———–+———————-+————–
5 | 142.89 | 65.89 | 95.79200000000000 | 48845.90
(1 row)

Part05-事务管理

5.1 事务基本概念

事务是一组原子性的SQL操作,要么全部执行成功,要么全部失败回滚。PostgreSQL支持ACID(原子性、一致性、隔离性、持久性)事务。

5.2 事务控制语句

事务控制语句包括BEGIN、COMMIT、ROLLBACK和SAVEPOINT等。

# 开始事务
fgedudb=# BEGIN;
BEGIN

# 执行SQL操作
fgedudb=# INSERT INTO fgedu_products (product_name, category, price, stock_quantity, description)
VALUES (‘深度学习入门’, ‘人工智能’, 119.90, 50, ‘深度学习基础教程’);
INSERT 0 1

fgedudb=# UPDATE fgedu_products SET stock_quantity = stock_quantity – 10 WHERE product_id = 5;
UPDATE 1

# 保存点
fgedudb=# SAVEPOINT savepoint1;
SAVEPOINT

# 继续执行操作
fgedudb=# DELETE FROM fgedu_products WHERE product_id = 6;
DELETE 1

# 回滚到保存点
fgedudb=# ROLLBACK TO savepoint1;
ROLLBACK

# 提交事务
fgedudb=# COMMIT;
COMMIT

# 查看结果
fgedudb=# SELECT product_id, product_name, category, stock_quantity FROM fgedu_products;
product_id | product_name | category | stock_quantity
————+———————-+————–+—————-
1 | PostgreSQL数据库实战 | 计算机图书 | 95
2 | Python编程基础 | 计算机图书 | 200
3 | Java核心技术 | 计算机图书 | 150
4 | 数据结构与算法 | 计算机图书 | 80
5 | 机器学习实战 | 人工智能 | 50
6 | 深度学习入门 | 人工智能 | 50
(6 rows)

Part06-实战操作与示例

6.1 完整语法实战

完整的SQL语法实战示例。

# 1. 创建测试数据库
# su – pgsql $ psql -c “CREATE DATABASE testdb;”

# 2. 连接数据库
$ psql -d testdb

# 3. 创建表
postgres=# CREATE TABLE fgedu_employees (
id SERIAL PRIMARY KEY,
employee_id VARCHAR(20) UNIQUE NOT NULL,
name VARCHAR(50) NOT NULL,
department VARCHAR(50),
position VARCHAR(50),
salary DECIMAL(10,2),
hire_date DATE,
email VARCHAR(100) UNIQUE
);
CREATE TABLE fgedu_# 4. 插入数据
postgres=# INSERT INTO fgedu_employees (employee_id, name, department, position, salary, hire_date, email) VALUES
(‘E001’, ‘风哥1号’, ‘技术部’, ‘软件工程师’, 8000.00, ‘2023-01-15’, ‘zhangsan@fgedu.net.cn’),
(‘E002’, ‘风哥2号’, ‘技术部’, ‘高级软件工程师’, 12000.00, ‘2022-03-20’, ‘lisi@fgedu.net.cn’),
(‘E003’, ‘王五’, ‘销售部’, ‘销售经理’, 10000.00, ‘2021-07-10’, ‘wangwu@fgedu.net.cn’),
(‘E004’, ‘赵六’, ‘人事部’, ‘人事专员’, 6000.00, ‘2023-05-01’, ‘zhaoliu@fgedu.net.cn’),
(‘E005’, ‘孙七’, ‘技术部’, ‘测试工程师’, 7000.00, ‘2023-09-15’, ‘sunqi@fgedu.net.cn’);
INSERT 0 5

# 5. 查询数据
postgres=# SELECT * FROM fgedu_employees;

# 6. 条件查询
postgres=# SELECT name, department, salary FROM fgedu_employees WHERE department = ‘技术部’ AND salary > 7500;

# 7. 分组查询
postgres=# SELECT department, COUNT(*) AS employee_count, AVG(salary) AS avg_salary FROM fgedu_employees GROUP BY department;

# 8. 排序查询
postgres=# SELECT name, position, salary FROM fgedu_employees ORDER BY salary DESC;

# 9. 更新数据
postgres=# UPDATE fgedu_employees SET salary = salary * 1.05 WHERE department = ‘技术部’;

# 10. 删除数据
postgres=# DELETE FROM fgedu_employees WHERE employee_id = ‘E004’;

# 11. 事务操作
postgres=# BEGIN;
postgres=# INSERT INTO fgedu_employees (employee_id, name, department, position, salary, hire_date, email) VALUES (‘E006’, ‘周八’, ‘销售部’, ‘销售代表’, 5000.00, ‘2024-01-10’, ‘zhouba@fgedu.net.cn’);
postgres=# UPDATE fgedu_employees SET salary = salary + 500 WHERE employee_id = ‘E003’;
postgres=# COMMIT;

# 12. 查看最终结果
postgres=# SELECT * FROM fgedu_employees ORDER BY department, salary DESC;
id | employee_id | name | department | position | salary | hire_date | email
—-+————-+——+————+—————-+———-+————+————————
2 | E002 | 风哥2号 | 技术部 | 高级软件工程师 | 12600.00 | 2022-03-20 | lisi@fgedu.net.cn
1 | E001 | 风哥1号 | 技术部 | 软件工程师 | 8400.00 | 2023-01-15 | zhangsan@fgedu.net.cn
5 | E005 | 孙七 | 技术部 | 测试工程师 | 7350.00 | 2023-09-15 | sunqi@fgedu.net.cn
3 | E003 | 王五 | 销售部 | 销售经理 | 10500.00 | 2021-07-10 | wangwu@fgedu.net.cn
6 | E006 | 周八 | 销售部 | 销售代表 | 5000.00 | 2024-01-10 | zhouba@fgedu.net.cn
(5 rows)

6.2 常用SQL示例

一些常用的SQL语句示例。

# 1. 查看表结构
\d fgedu_employees

# 2. 查看数据库中的所有表
\dt

# 3. 查看当前数据库
SELECT current_fgedudb();

# 4. 查看当前用户
SELECT current_fgedu;

# 5. 查看表的记录数
SELECT COUNT(*) FROM fgedu_employees;

# 6. 查看表的大小
SELECT pg_size_pretty(pg_total_relation_size(‘fgedu_employees’));

# 7. 查看索引
\di

# 8. 查看视图
\dv

# 9. 查看函数
\df

# 10. 查看当前连接
SELECT * FROM pg_stat_activity;

风哥教程针对风哥教程针对风哥教程针对生产环境建议:在生产环境中,应避免使用SELECT *查询所有列,而是明确指定需要的列,以提高查询性能。同时,应合理使用索引,避免在WHERE子句中对索引列进行函数操作。更多视频教程www.fgedu.net.cn

本文介绍了PostgreSQL支持的标准SQL核心语法,包括数据定义语言(DDL)、数据操作语言(DML)、数据查询语言(DQL)和事务管理等内容。通过学习本文,读者可以掌握SQL语言的基础用法,并能够进行基本的数据库操作和查询。更多学习教程公众号风哥教程itpux_com

from PostgreSQL:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息