Skip to content

SQL 语言

后端核心 SQL CRUD

一、SQL 概览

SQL = Structured Query Language — 用于操作关系型数据库的专用语言。

  • 关键字通常 大写SELECT, FROM, WHERE...)
  • 每条语句以 分号 结尾
  • W3Schools SQL 教程:w3schools.com/sql

二、CREATE — 创建表

sql
CREATE TABLE products (
  id INT NOT NULL,
  name VARCHAR(100),
  price MONEY,
  PRIMARY KEY (id)
);

关键概念:

概念说明示例
PRIMARY KEY唯一标识每条记录id
NOT NULL字段不能为空id INT NOT NULL
数据类型定义字段存储格式VARCHAR, INT, MONEY

注意事项

  • 最后一个字段后面 不能有逗号
  • 语句末尾必须有 分号

三、INSERT — 插入数据

sql
-- 方式 1:全部字段插入(不需要指定列名)
INSERT INTO products
VALUES (1, 'Pen', 1.20);

-- 方式 2:指定列名(可跳过某些字段)
INSERT INTO products (id, name)
VALUES (2, 'Pencil');
-- price 会是 NULL

如果字段设置了 NOT NULL 但未提供值,会报错:

NOT NULL constraint failed: products.id

四、SELECT — 读取数据

4.1 基础查询

sql
-- 查询所有数据(* 通配符 = 所有列)
SELECT * FROM products;

-- 查询特定列
SELECT name, price FROM products;

-- 查询多列(逗号分隔)
SELECT country, wheat_production FROM world_food;

4.2 条件查询(WHERE)

sql
-- 精确匹配
SELECT * FROM products WHERE id = 1;

-- 获取特定值
SELECT rice_production FROM world_food
WHERE country = 'United States';

-- 比较操作符
SELECT country FROM world_food
WHERE wheat_production > 20;
-- 可用: =, <, >, <=, >=, <>(不等于)

4.3 模糊匹配(LIKE)

sql
-- 查找以 'U' 开头的国家
SELECT country FROM world_food
WHERE country LIKE 'U' || '%';
-- || 是 SQL 的字符串拼接符
-- 等同于: WHERE country LIKE 'U%'

-- 查找以 'a' 结尾的国家
SELECT country FROM world_food
WHERE country LIKE '%' || 'a';
-- 结果: Australia, China, Ethiopia, India

-- 查找包含 'united' 的国家(忽略大小写)
SELECT * FROM countries
WHERE LOWER(country_name) LIKE '%' || 'united' || '%';

通配符规则:

模式含义示例
'A%'以 A 开头Alice, Angela
'%a'以 a 结尾China, India
'%an%'包含 anFrance, Japan

💡 || 在 SQL 中是 拼接(concatenate),不是 JavaScript 中的"或"。


五、UPDATE — 更新数据

5.1 更新记录

sql
UPDATE products
SET price = 0.80
WHERE id = 2;

危险操作

sql
-- ❌ 没有 WHERE → 更新所有记录!
UPDATE products SET price = 0.80;

-- ✅ 始终加 WHERE 条件
UPDATE products SET price = 0.80 WHERE id = 2;

5.2 添加列(ALTER TABLE)

sql
ALTER TABLE products
ADD stock INT;

-- 然后更新数据
UPDATE products SET stock = 32 WHERE id = 1;
UPDATE products SET stock = 12 WHERE id = 2;

六、DELETE — 删除数据

sql
DELETE FROM products WHERE id = 2;

危险操作

sql
-- ❌ 删除所有数据
DELETE FROM products;

-- ✅ 始终指定条件
DELETE FROM products WHERE id = 2;

七、外键与关系

7.1 PRIMARY KEY vs FOREIGN KEY

概念作用位置
PRIMARY KEY唯一标识本表中的记录当前表
FOREIGN KEY引用另一个表的 PRIMARY KEY关联表

7.2 建立关系

sql
-- 订单表:通过外键关联客户表和产品表
CREATE TABLE orders (
  id INT NOT NULL,
  order_number INT,
  customer_id INT,
  product_id INT,
  PRIMARY KEY (id),
  FOREIGN KEY (customer_id) REFERENCES customers(id),
  FOREIGN KEY (product_id) REFERENCES products(id)
);
┌─ Customers ──┐     ┌─ Orders ─────────┐     ┌─ Products ──┐
│ id (PK)      │←────│ customer_id (FK)  │     │ id (PK)     │
│ name         │     │ product_id (FK)   │────→│ name        │
│ address      │     │ order_number      │     │ price       │
└──────────────┘     └───────────────────┘     └─────────────┘

7.3 INNER JOIN — 表连接

sql
-- 将订单与客户信息连接
SELECT orders.order_number,
       customers.first_name,
       customers.last_name,
       customers.address
FROM orders
INNER JOIN customers
ON orders.customer_id = customers.id;

-- 将订单与产品信息连接
SELECT orders.order_number,
       products.name,
       products.price,
       products.stock
FROM orders
INNER JOIN products
ON orders.product_id = products.id;

结果: 从多个表中提取相关数据,组合成一张完整的视图。


八、三种关系类型

8.1 一对一(1:1)

一个学生 → 一条联系方式记录

sql
CREATE TABLE students (
  id SERIAL PRIMARY KEY,
  first_name TEXT,
  last_name TEXT
);

CREATE TABLE contact_details (
  id INT REFERENCES students(id) UNIQUE,
  tel VARCHAR(15),
  address TEXT
);

用途: 拆分大表,模块化数据(表太宽时拆成多个表)。

8.2 一对多(1:N) ⭐ 最常用

一个学生 → 多份作业提交

sql
CREATE TABLE homework_submissions (
  id SERIAL PRIMARY KEY,
  mark INT,
  student_id INT REFERENCES students(id)
  -- student_id 可以重复!(多份作业指向同一学生)
);

其他示例:

  • 一个用户 → 多篇博客文章
  • 一个客户 → 多个订单
  • 一个分类 → 多个产品

8.3 多对多(M:N)

多个学生 ↔ 多门课程(通过 中间表 连接)

sql
CREATE TABLE student_courses (
  id SERIAL PRIMARY KEY,
  student_id INT REFERENCES students(id),
  course_id INT REFERENCES courses(id)
);
Students ──── student_courses ──── Courses
  (M)          (中间表)              (N)

九、SQL 速查表

操作SQL 语句
创建表CREATE TABLE name (columns...);
插入INSERT INTO table VALUES (...);
查询全部SELECT * FROM table;
查询特定列SELECT col1, col2 FROM table;
条件查询SELECT * FROM table WHERE condition;
模糊匹配WHERE col LIKE 'pattern%';
更新UPDATE table SET col = val WHERE condition;
删除DELETE FROM table WHERE condition;
添加列ALTER TABLE table ADD column TYPE;
内连接SELECT ... FROM A INNER JOIN B ON A.id = B.fk;
主键PRIMARY KEY (id)
外键FOREIGN KEY (fk) REFERENCES table(pk)

← 返回 Web 开发研究