对大多数业务开发来说,日常和数据库打交道,最常见的就是四类操作:
INSERTSELECTUPDATEDELETE它们合在一起,通常叫 CRUD:
这一篇不追求把 SQL 讲全,而是用一张简单的表,把最常见的路径串起来。
CREATE TABLE books (id integer PRIMARY KEY,title text NOT NULL,price numeric(10, 2),in_stock boolean DEFAULT true,created_at timestamp DEFAULT NOW());
这张表有几个常见字段:
id:图书编号title:图书标题price:价格in_stock:是否有库存created_at:创建时间下面所有示例都围绕这张表展开。
INSERT 用来新增一行或多行记录。
INSERT INTO books (id, title, price)VALUES (1, 'PostgreSQL 入门', 69.00);
这里没有显式写 in_stock 和 created_at,所以它们会使用默认值。
INSERT INTO books (id, title, price, in_stock)VALUES(2, 'SQL 实战', 88.00, true),(3, '数据库设计', 99.00, false);
当你已经明确知道要插入哪些列时,建议总是把列名写出来。这样更清晰,也不容易因为表结构变化而出错。
SELECT 是最常用的一类 SQL。
它的作用是把数据查出来。
SELECT * FROM books;
这条语句适合学习和临时检查,但在正式查询里,通常更建议只取需要的列。
SELECT id, title, price FROM books;
这样结果更清晰,也能减少不必要的数据返回。
很多查询真正有用,是因为加了 WHERE。
SELECT id, title, priceFROM booksWHERE price >= 80;
这表示只查价格大于等于 80 的书。
再例如:
SELECT id, titleFROM booksWHERE in_stock = true;
这表示只看有库存的书。
可以把 WHERE 理解成“先筛选,再返回”。
如果你想控制结果顺序,可以用 ORDER BY。
SELECT id, title, priceFROM booksORDER BY price ASC;
SELECT id, title, created_atFROM booksORDER BY created_at DESC;
通常:
ASC 表示升序DESC 表示降序如果不写,很多情况下默认是升序。
当结果很多时,可以先只看前几条:
SELECT id, title, priceFROM booksORDER BY created_at DESCLIMIT 5;
这很适合:
UPDATE 用来修改已有记录。
UPDATE booksSET price = 79.00WHERE id = 1;
这表示把 id = 1 的图书价格更新为 79.00。
UPDATE booksSET in_stock = false,price = 59.00WHERE id = 3;
DELETE 用来删除记录。
DELETE FROM booksWHERE id = 3;
这表示删除 id = 3 的那一行。
对初学者来说,UPDATE 和 DELETE 最重要的提醒只有一个:
先确认过滤条件,再执行。
例如下面这两条语句就非常危险:
UPDATE books SET price = 0;
DELETE FROM books;
因为它们没有 WHERE,会影响整张表。
所以实际操作里,建议养成这个习惯:
SELECT ... WHERE ... 检查会命中哪些数据UPDATE 或 DELETE这是很重要的基本功。
学习 CRUD 时,不需要一开始掌握很多函数。先记住几个最常见的就够了。
COUNT()统计行数:
SELECT COUNT(*) FROM books;
如果要统计有库存的书:
SELECT COUNT(*)FROM booksWHERE in_stock = true;
NOW()返回当前时间:
SELECT NOW();
它也经常用在默认值里:
created_at timestamp DEFAULT NOW()
COALESCE()COALESCE() 用来在值为空时给一个替代值。
SELECT title, COALESCE(price, 0)FROM books;
这表示如果 price 是 NULL,就用 0 显示。
下面把最常见操作连起来看一遍。
INSERT INTO books (id, title, price)VALUES (10, 'PostgreSQL 实战', 79.00);
SELECT id, title, priceFROM booksWHERE id = 10;
UPDATE booksSET price = 85.00WHERE id = 10;
SELECT id, title, priceFROM booksWHERE id = 10;
DELETE FROM booksWHERE id = 10;
这就是一条最小 CRUD 路径。
学习 CRUD 时,最值得尽早建立的不是“记更多语法”,而是这些习惯:
WHERE 精准过滤ORDER BYLIMIT只要这些习惯养成了,后面学 JOIN、聚合、索引和事务都会更稳。
下一篇会进入索引:为什么同样一条查询,在大表里可能会慢很多,以及索引到底在帮你省什么。