PostgreSQL11快速入门(六)-SQL语言基础
PostgreSQL11快速入门(六)-SQL语言基础
作为一名研发人员 , 熟练掌握 SQL 语言是与数据库交互的基础。有了前面几个章节的铺垫,这个章节将开始介绍 PostgreSQL 中的 SQL 语言 , 包括数据定义语言(DDL)、数据操纵语言(DML)、事务控制等内容。
1. 数据定义语言(DDL)
数据定义语言 ( Data Definition Language , DDL )用于定义和管理数据库对象 , 如数据库、模式、表、视图、索引等。下面来介是几个常用的 DDL 语句。
小提示: 大部分数据执行 DDL 是不需要执行 commit
的,记住这个可以更好的区分 DDL 跟 DML 的定义 (后面章节涉及)。
1.1 CREATE
CREATE 语句用于创建数据库对象。例如 , 创建一个新的数据库:
CREATE DATABASE mydb;
创建一个新的表:
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(50) UNIQUE,
age INTEGER CHECK (age >= 18)
);
这里我们定义了一个 users 表 , 包含 id、name、email、age 四个字段 , 并设置了主键、唯一约束、检查约束等。
1.2 ALTER
ALTER 语句用于修改已有的数据库对象。例如,给 users 表添加一个新的字段:
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
修改字段的数据类型:
ALTER TABLE users ALTER COLUMN age TYPE SMALLINT;
1.3 DROP
DROP 语句用于删除数据库对象。例如,删除 users 表:
DROP TABLE users;
删除 mydb 数据库:
DROP DATABASE mydb;
2. 数据操纵语言(DML)
数据操纵语言(Data Manipulation Language, DML)用于操作和查询数据库中的数据。主要包括 INSERT、UPDATE、DELETE、SELECT 四种语句。
小提示: 大部分数据执行 DML 是需要执行 commit
的,记住这个可以更好的区分 DDL 跟 DML 的定义 ( DDL 在大部分数据库实现中是不需要 commit
的 )。
2.1 INSERT
INSERT 语句用于向表中插入新的行。例如,向 users 表插入一条记录:
INSERT INTO users (name, email, age)
VALUES ('Tom', 'tom@qq.com', 25);
我们也可以一次插入多条记录:
INSERT INTO users (name, email, age)
VALUES
('Jack', 'jack@example.com', 30),
('Rose', 'rose@example.com', 28);
2.2 UPDATE
UPDATE 语句用于修改数据库表中的现有数据。例如将 Tom 的年龄更新为 26 岁:
UPDATE users SET age = 26 WHERE name = 'Tom';
这里的 WHERE 子句指定了需要更新的行的条件。如果省略 WHERE 子句,则会更新表中的所有行。
注意: 更新数据操作务必谨慎,大部分时候应该要指定更新条件,否则很危险!
2.3 DELETE
DELETE 语句用于删除表中的行。例如删除 name 为 ‘Tom’ 的记录:
DELETE FROM users WHERE name = 'Tom';
同样,WHERE 子句指定了需要删除的行的条件。如果省略 WHERE 子句,则会删除表中的所有行。
注意: 删除数据操作务必谨慎,大部分时候应该要指定删除条件,否则数据删除后恢复比较麻烦!
2.4 SELECT
SELECT 语句用于查询表中的数据。它是 SQL 中最常用、最强大的语句,也是我们在实际项目开发中写的最多的 SQL 语句。例如 , 查询 users 表中的所有数据:
SELECT * FROM users;
这里的 * 表示查询所有字段。我们也可以指定需要查询的字段:
SELECT name, email FROM users;
通过 WHERE 子句,我们可以指定查询条件:
SELECT * FROM users WHERE age > 25;
除了基本的查询外 , SELECT 语句还支持各种高级查询 , 如连接查询、嵌套查询、分组查询、排序等。这个将在后面的章节中详细介绍,如果要详细展开的话可以写好几个章节。
小提示: 实际项目中,尽量少使用 select * from xxx
语句,应该用到哪些列名显示写出来,比如 select user_name, pass_word from xxxx
,这样可以降低网络传输开销以及数据读取开销。
3. 事务控制语言 (TCL)
事务控制语言(Transaction Control Language , TCL)说的其实就是事务。
事务 (Transaction) 是数据库操作的基本单位。一个事务中可以包含多个 SQL 语句,要么全部执行成功,要么全部回滚。
PG 支持完整的 ACID 特性 , 保证了事务的可靠性和一致性,ACID 特性如下:
原子性 ( Atomicity ) : 原子性要求事务中的所有操作要么全部完成,要么全部不完成。如果事务执行过程中发生错误或异常,数据库会自动回滚 ( Rollback ) 事务,撤销已经执行的操作,使数据恢复到事务开始前的状态。
一致性 ( Consistency ) : 一致性要求事务执行前后,数据库始终保持一致的状态。这里的一致性包括数据的完整性约束,如主键、外键、非空、唯一、检查等。事务不能破坏这些约束条件,否则就会导致数据不一致。
隔离性 ( Isolation ): 隔离性要求多个事务并发执行时,每个事务看到的数据状态是一致的,不受其他事务的影响。也就是说,事务只能看到已经提交的数据 , 而不能看到未提交的数据变更。如果不同的事务看到了不同的数据状态,就会导致数据的不一致。
持久性 (Durability) : 事务一旦提交,其结果就会被永久保存到数据库中,即使系统崩溃或重启,已提交的数据也不会丢失。
PG 中的事务控制主要通过以下语句来实现:
- BEGIN: 开始一个新的事务。
- COMMIT: 提交当前事务,使其变化永久生效。
- ROLLBACK: 回滚当前事务,撤销其中的所有操作。
例如 , 在一个事务中执行两条 SQL 语句:
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
如果在执行过程中发生了错误,我们可以通过 ROLLBACK 来回滚事务:
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- 某些错误发生
ROLLBACK;
4. 小结
这个章节主要是讲解了 PG 中的 SQL 基础知识 , 主要包括:
- DDL 语句:CREATE、ALTER、DROP , 用于定义和管理数据库对象。
- DML 语句:INSERT、UPDATE、DELETE、SELECT , 用于操作和查询数据。
- TCL 语句:BEGIN、COMMIT、ROLLBACK , 用于保证数据库操作的原子性和一致性。