第 2 章 SQL 语言入门:数据表的基础操作(CRUD)
章节介绍
- 本章学习目标 :
掌握结构化查询语言(SQL)的基础语法,能够独立完成数据表的创建、以及数据的增加(Create)、查询(Read)、更新(Update)与删除(Delete)四大基础操作,为后续复杂查询和 PHP 编程打下坚实的 SQL 基础。 - 在整个教程中的作用 :
本章是连接"数据库概念"(第 1 章)与"PHP 操作数据库"(第 4 章)的核心桥梁。如果说数据库是数据的仓库,那么 SQL 就是管理和使用这个仓库的"语言"。只有熟练掌握了这门语言,才能有效地让 PHP 脚本与数据库进行对话,实现数据的动态存取。 - 与前面章节的衔接 :
在第 1 章中,你已经成功安装了 MySQL,并创建了一个练习用的数据库(例如my_practice_db)。本章将在这个数据库内,使用 SQL 语句来创建具体的"货架"(数据表)并摆放"货物"(数据)。 - 本章主要内容概览 :
本章首先介绍 SQL 语言的基本分类和语法特点。然后,我们将围绕 CRUD 四大操作展开:学习如何使用CREATE TABLE定义表结构;使用INSERT INTO添加数据;使用SELECT检索数据;最后使用UPDATE和DELETE修改和删除数据。本章将以一个users用户表的创建和操作为主线,贯穿所有知识点。
核心概念讲解
1. 什么是 SQL?
SQL(Structured Query Language,结构化查询语言)是专门用来与关系型数据库通信的标准语言。你可以用它来定义数据库结构、管理数据权限以及执行数据的增、删、改、查。几乎所有的主流关系型数据库(如 MySQL、PostgreSQL、SQLite、SQL Server)都支持 SQL 标准,但可能会有一些特有的"方言"。
2. CRUD:数据操作的基石
CRUD 代表了四种最基本的数据操作,是任何数据驱动应用的底层核心逻辑:
- C (Create / 创建) :向数据库中添加新记录。对应 SQL 语句
INSERT。 - R (Read / 读取) :从数据库中查询和检索记录。对应 SQL 语句
SELECT。这是最常用、最复杂的操作。 - U (Update / 更新) :修改数据库中已有的记录。对应 SQL 语句
UPDATE。 - D (Delete / 删除) :从数据库中删除记录。对应 SQL 语句
DELETE。
理解并掌握 CRUD,你就掌握了操作数据库的"方向盘"。
3. SQL 语句分类
为了更系统地学习,SQL 语句通常被分为以下几类:
- DDL (Data Definition Language,数据定义语言) :用于定义和管理数据库、表、索引等结构。本章涉及的
CREATE TABLE就属于 DDL。它主要用来"搭建框架"。 - DML (Data Manipulation Language,数据操作语言) :用于对表中的数据进行操作。本章的
INSERT、SELECT、UPDATE、DELETE都属于 DML。它主要用来"处理货物"。 - DCL (Data Control Language,数据控制语言) :用于控制数据库的访问权限和安全级别,如
GRANT、REVOKE。 - TCL (Transaction Control Language,事务控制语言) :用于管理数据库的事务,如
COMMIT、ROLLBACK。
本章我们将重点学习 DDL 中的CREATE TABLE和所有 DML 核心语句。
代码示例
我们将通过创建一个 users 表并对其进行一系列操作,来演示所有核心 SQL 语句。请确保你已经连接到你的练习数据库(例如 my_practice_db)。
示例 1:使用 CREATE TABLE 创建数据表(DDL)
首先,我们需要一个"容器"来存放用户数据。CREATE TABLE 语句用于定义一个新表的结构,包括表名、字段名和每个字段的数据类型。
sql
-- 选择要在哪个数据库下创建表
USE my_practice_db;
-- 创建 users 表
CREATE TABLE users (
-- 定义字段:字段名 数据类型 [可选约束]
id INT, -- 用户ID,整数类型
username VARCHAR(50), -- 用户名,可变长度字符串,最大50字符
email VARCHAR(100), -- 电子邮箱,可变长度字符串,最大100字符
age INT, -- 年龄,整数类型
created_at DATE -- 创建日期,日期类型(仅包含年-月-日)
);
-- 使用 DESC 或 DESCRIBE 命令查看表结构
DESC users;
预期输出(表结构概览):
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| username | varchar(50) | YES | | NULL | |
| email | varchar(100) | YES | | NULL | |
| age | int | YES | | NULL | |
| created_at | date | YES | | NULL | |
+------------+--------------+------+-----+---------+-------+
代码注释详解:
USE my_practice_db;:指定后续操作在my_practice_db数据库中进行。CREATE TABLE users (...):创建名为users的表。INT:表示整数数据类型(如 1, 100, -5)。VARCHAR(n):表示可变长度字符串,n定义最大字符数。比固定长度类型更节省空间。DATE:仅存储日期(格式:YYYY-MM-DD),无时间部分。DESC users;:是DESCRIBE users;的简写,用于展示表的字段、类型、是否允许为 NULL 等信息。
示例 2:使用 INSERT INTO 添加数据(C - Create)
表创建好后是空的。INSERT INTO 语句用于向表中插入新的数据行。
sql
-- 向 users 表中插入一条完整记录(为所有字段赋值)
INSERT INTO users (id, username, email, age, created_at)
VALUES (1, '张三', 'zhangsan@example.com', 25, '2023-10-01');
-- 插入多条记录,用逗号分隔 VALUES 列表
INSERT INTO users (id, username, email, age, created_at)
VALUES
(2, '李四', 'lisi@example.com', 30, '2023-10-02'),
(3, '王五', 'wangwu@example.com', 28, '2023-10-03');
-- 如果 VALUES 值的顺序与表定义时字段的顺序完全一致,可以省略字段列表(不推荐)
INSERT INTO users
VALUES (4, '赵六', 'zhaoliu@example.com', 35, '2023-10-05');
-- 查看插入后的数据(使用简单的 SELECT)
SELECT * FROM users;
预期输出:
+------+----------+----------------------+------+------------+
| id | username | email | age | created_at |
+------+----------+----------------------+------+------------+
| 1 | 张三 | zhangsan@example.com | 25 | 2023-10-01 |
| 2 | 李四 | lisi@example.com | 30 | 2023-10-02 |
| 3 | 王五 | wangwu@example.com | 28 | 2023-10-03 |
| 4 | 赵六 | zhaoliu@example.com | 35 | 2023-10-05 |
+------+----------+----------------------+------+------------+
代码注释详解:
INSERT INTO users (字段列表) VALUES (值列表);:标准插入语法。字段列表和值列表必须一一对应。SELECT * FROM users;:SELECT语句用于查询。*是通配符,表示选择所有字段。FROM users指定从users表查询。- 注意事项:省略字段列表的写法虽然简洁,但极易因表结构变更(如增减字段)而导致语句失败或数据错乱,生产环境强烈不推荐。
示例 3:使用 SELECT 查询数据(R - Read)
SELECT 是 SQL 中最强大、最常用的语句,用于从表中检索数据。
sql
-- 1. 查询所有数据(已演示)
SELECT * FROM users;
-- 2. 查询指定列的数据
SELECT username, email FROM users;
-- 3. 使用 WHERE 子句进行条件过滤
-- 查询年龄大于 28 的用户
SELECT * FROM users WHERE age > 28;
-- 查询用户名为'张三'的用户
SELECT * FROM users WHERE username = '张三';
-- 查询邮箱包含'example'的用户(模糊查询 LIKE)
SELECT * FROM users WHERE email LIKE '%example%'; -- % 匹配任意多个字符
-- 4. 组合多个条件
-- 查询年龄大于25且小于32的用户(AND)
SELECT * FROM users WHERE age > 25 AND age < 32;
-- 查询ID为1或用户名为'李四'的用户(OR)
SELECT id, username FROM users WHERE id = 1 OR username = '李四';
预期输出(示例 3.4 的 AND 查询):
+------+----------+--------------------+------+------------+
| id | username | email | age | created_at |
+------+----------+--------------------+------+------------+
| 2 | 李四 | lisi@example.com | 30 | 2023-10-02 |
| 3 | 王五 | wangwu@example.com | 28 | 2023-10-03 |
+------+----------+--------------------+------+------------+
代码注释详解:
WHERE子句是SELECT语句的灵魂,用于指定筛选数据的条件。=:等于比较。>,<,>=,<=:数值比较。LIKE:用于字符串的模糊匹配。%代表零个、一个或多个字符。'%example%'表示任何位置包含'example'的字符串。AND:逻辑"与",要求两边条件都成立。OR:逻辑"或",要求至少一边条件成立。
示例 4:使用 UPDATE 修改数据(U - Update)
UPDATE 语句用于修改表中已有的记录。使用时必须非常小心,务必配合 WHERE 子句,否则将更新表中所有行!
sql
-- 1. 更新特定行:将张三的年龄改为26
UPDATE users SET age = 26 WHERE username = '张三';
-- 2. 同时更新多个字段:更新李四的邮箱和年龄
UPDATE users
SET email = 'new_lisi@example.com', age = 31
WHERE id = 2;
-- 3. 使用表达式更新:将所有用户的年龄增加1岁
UPDATE users SET age = age + 1;
-- 查看更新后的数据
SELECT * FROM users;
预期输出(执行完 1,2,3 后):
+------+----------+-----------------------+------+------------+
| id | username | email | age | created_at |
+------+----------+-----------------------+------+------------+
| 1 | 张三 | zhangsan@example.com | 27 | 2023-10-01 | -- 26+1
| 2 | 李四 | new_lisi@example.com | 32 | 2023-10-02 | -- 31+1
| 3 | 王五 | wangwu@example.com | 29 | 2023-10-03 | -- 28+1
| 4 | 赵六 | zhaoliu@example.com | 36 | 2023-10-05 | -- 35+1
+------+----------+-----------------------+------+------------+
代码注释与警告:
UPDATE users SET 字段1=新值1, 字段2=新值2 WHERE 条件;是标准语法。WHERE子句至关重要! 示例 3 中的语句UPDATE users SET age = age + 1;没有WHERE子句,导致所有用户的年龄都被更新了。这在业务中通常是严重事故。- 最佳实践:在执行
UPDATE或DELETE前,先用一个同条件的SELECT语句确认要操作的目标数据,例如:SELECT * FROM users WHERE username = '张三';。
示例 5:使用 DELETE 删除数据(D - Delete)
DELETE 语句用于从表中删除记录。和 UPDATE 一样,必须谨慎使用 WHERE 子句!
sql
-- 1. 删除特定行:删除用户名为'王五'的记录
DELETE FROM users WHERE username = '王五';
-- 2. 删除所有记录(清空表)-- 极度危险!
-- DELETE FROM users;
-- 查看删除后的数据
SELECT * FROM users;
预期输出:
+------+----------+-----------------------+------+------------+
| id | username | email | age | created_at |
+------+----------+-----------------------+------+------------+
| 1 | 张三 | zhangsan@example.com | 27 | 2023-10-01 |
| 2 | 李四 | new_lisi@example.com | 32 | 2023-10-02 |
| 4 | 赵六 | zhaoliu@example.com | 36 | 2023-10-05 |
+------+----------+-----------------------+------+------------+
代码注释与警告:
DELETE FROM 表名 WHERE 条件;是标准语法。DELETE FROM users;会删除users表中的所有数据,但表结构本身还在。这是一个不可逆的毁灭性操作(除非有备份)。- 与
DELETE不同,DROP TABLE users;会连表带数据全部删除,属于 DDL 操作。
实战项目:简易用户管理系统(控制台版)
项目需求
使用纯 SQL(在 MySQL 命令行或 Workbench 中),模拟一个简易的用户管理系统。实现以下功能:
- 初始化:创建数据库和用户表。
- 用户注册:向系统中添加新用户。
- 用户查询:支持按 ID、用户名、年龄范围查询用户。
- 信息更新:更新指定用户的信息(如邮箱)。
- 用户注销:从系统中删除指定用户。
技术方案与分步实现
第 1 步:创建数据库与表
我们创建一个更健壮的用户表,引入一些基本约束(第 3 章会详解),为实战打下基础。
sql
-- 1. 创建专用数据库
CREATE DATABASE IF NOT EXISTS user_management_system;
USE user_management_system;
-- 2. 创建用户表,增加主键、非空、默认值等约束
DROP TABLE IF EXISTS users; -- 如果表存在,先删除(仅用于练习重置)
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT, -- 主键,自增。这是最重要的约束。
username VARCHAR(50) NOT NULL UNIQUE, -- 非空,且唯一
email VARCHAR(100) NOT NULL UNIQUE, -- 非空,且唯一
age INT CHECK (age >= 0), -- 检查约束,年龄不能为负数(MySQL 8.0+支持CHECK)
status ENUM('active', 'inactive') DEFAULT 'active', -- 枚举类型,默认'活跃'
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 时间戳,默认当前时间
);
-- 查看表结构
DESC users;
解释 :AUTO_INCREMENT 让我们插入数据时无需指定 id,数据库会自动分配一个唯一递增值。DEFAULT 设置了字段的默认值。
第 2 步:批量插入初始用户数据(模拟用户注册)
sql
-- 批量插入初始用户。注意,id字段由于自增,我们可以不提供值。
INSERT INTO users (username, email, age, status) VALUES
('刘一', 'liuyi@system.com', 22, 'active'),
('陈二', 'chener@system.com', 29, 'active'),
('张三', 'zhangsan@system.com', 35, 'inactive'),
('李四', 'lisi@system.com', 18, 'active');
-- 查询所有用户,验证插入成功
SELECT id, username, email, age, status, created_at FROM users;
第 3 步:实现查询功能
我们将执行一系列查询来模拟管理后台的搜索功能。
sql
-- 查询1:查看所有活跃用户
SELECT * FROM users WHERE status = 'active';
-- 查询2:查找邮箱包含'system.com'的用户
SELECT username, email FROM users WHERE email LIKE '%system.com';
-- 查询3:查找年龄在20到30岁之间的用户
SELECT username, age FROM users WHERE age BETWEEN 20 AND 30;
-- 查询4:按注册时间倒序排列所有用户(最新注册的在前)
SELECT username, created_at FROM users ORDER BY created_at DESC;
第 4 步:实现更新功能
模拟用户修改个人资料或管理员调整用户状态。
sql
-- 更新1:用户'陈二'修改了邮箱
UPDATE users SET email = 'new_chener@system.com' WHERE username = '陈二';
-- 更新2:管理员将用户'张三'的状态改为活跃
UPDATE users SET status = 'active' WHERE username = '张三';
-- 验证更新
SELECT username, email, status FROM users WHERE username IN ('陈二', '张三');
第 5 步:实现删除功能
模拟用户注销账号或管理员封禁账号(先标记为inactive,再考虑物理删除)。
sql
-- 删除前先查询确认
SELECT * FROM users WHERE username = '李四';
-- 执行删除(模拟账号注销)
DELETE FROM users WHERE username = '李四';
-- 再次查询,确认已删除
SELECT * FROM users;
项目测试与部署指南
- 测试 :在 MySQL 命令行或 Workbench 中,按顺序执行以上所有 SQL 代码块。每执行一个"第 X 步",都用
SELECT语句验证结果是否符合预期。 - 部署:此项目为 SQL 脚本练习。在生产环境中,这些 SQL 语句会由 PHP 程序(如第 4 章内容)根据用户输入动态生成并执行。
项目扩展建议
- 增加日志表 :创建一个
user_audit_log表,记录用户的所有重要操作(注册、更新、注销),使用INSERT触发器自动填充。 - 复杂查询:尝试统计不同状态用户的数量、计算平均年龄等(需用到聚合函数,第 3 章内容)。
- 前端界面:学完第 4 章后,可以为这个"系统"编写简单的 HTML 表单和 PHP 处理页面,使其成为真正的 Web 应用。
最佳实践
1. 行业标准与开发规范
- 清晰的命名 :表名、字段名使用小写字母、数字和下划线,如
user_profiles。做到见名知义。 - 使用注释 :对于复杂的表或字段,使用
COMMENT子句添加说明(例如:CREATE TABLE ... COMMENT '用户主表';)。 - 始终指定字段列表 :在
INSERT语句中,即使为所有字段赋值,也显式写出字段列表。这提高了代码的稳定性和可读性。 - SQL 格式化 :将 SQL 关键字(如
SELECT,FROM)大写,字段名、表名小写,有助于区分。
2. 常见错误与避坑指南
- 忘记 WHERE 子句 :
UPDATE和DELETE时忘记加WHERE是初学者最常见的"灾难"。务必先 SELECT 后写 UPDATE/DELETE。 - SQL 语法错误 :字符串值必须用单引号(
'')括起来,数字不用。例如:WHERE username = '张三'(正确) vsWHERE username = 张三(错误)。 - 字符集问题 :如果插入中文出现乱码,请确保创建数据库/表时指定了正确的字符集(如
UTF8MB4),连接客户端时也设置了相应字符集。第 1 章创建的数据库应已考虑此点。 - 空值(NULL)处理 :
NULL表示"未知"或"无值"。在条件查询中,要使用IS NULL或IS NOT NULL,而非= NULL。
3. 性能优化技巧(入门级)
SELECT *的取舍 :SELECT *会返回所有字段,如果表字段很多或包含大文本(如文章内容),会消耗大量网络和内存资源。实际开发中,应只查询需要的字段,如SELECT id, username FROM ...。- 为常用查询条件建立索引 :在
WHERE或ORDER BY子句中频繁使用的字段(如username,email),后续可以通过创建索引来大幅提高查询速度(属于高级优化话题)。
4. 安全性考虑:SQL 注入攻击与防护(重中之重)
这是 Web 安全领域的头号威胁(OWASP Top 10 长期位居榜首),必须从学习 SQL 的第一天就建立深刻认知。
攻击案例演示 :
假设一个 PHP 程序员写了一段不安全的代码来验证登录:
php
// 危险代码!千万不要模仿!
$username = $_POST['username']; // 用户从表单输入
$password = $_POST['password'];
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
// 执行 $sql...
如果用户在登录名输入框输入:admin' -- (注意有单引号和两个减号,空格),密码随意。
那么拼接后的 SQL 语句将变成:
sql
SELECT * FROM users WHERE username = 'admin' -- ' AND password = '随意密码'
在 SQL 中,-- 是注释符,后面的 AND password... 被注释掉了!这意味着攻击者只需知道用户名 admin,无需密码即可登录系统。甚至可以通过输入更复杂的字符串来删除表('; DROP TABLE users; -- )。
防护方案:预处理语句(Prepared Statements)
这是防范 SQL 注入的唯一正确且主流 的方法。其原理是将 SQL 语句的结构 与数据分离。
- 定义模板 :SQL 语句中使用占位符(
?)代替变量。
sql
SELECT * FROM users WHERE username = ? AND password = ?
- 预处理:数据库预编译这个 SQL 模板,确定其执行计划。
- 绑定参数 :将用户输入的
$username和$password作为"参数"绑定到对应的占位符上。 - 执行 :数据库将参数视为纯数据,而非 SQL 代码的一部分,因此即使用户输入包含 SQL 元字符(如单引号),也只会被当作字符串值处理,而不会改变 SQL 语句的原有结构。
防护代码示例(PHP mysqli, 详见第 4 章):
php
// 安全代码示例(使用mysqli预处理)
$stmt = $mysqli->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password); // "ss" 表示两个字符串参数
$stmt->execute();
$result = $stmt->get_result();
// ... 处理结果
本章的启示 :作为 SQL 学习者,你现在需要明白:永远不要相信任何来自用户输入的数据。在设计任何接收用户输入并拼接 SQL 语句的程序时,预处理是必须采用的方案。
练习题与挑战
基础练习题
- 【难度:★☆☆☆☆】创建商品表
- 题目 :创建一个名为
products的商品表,包含以下字段:商品 ID (id, 整数)、商品名称 (name, 字符串,最长 100 字符)、价格 (price, 小数,精确到两位)、库存数量 (stock, 整数)、上架时间 (listed_at, 日期时间类型)。请写出完整的CREATE TABLE语句。
- 题目 :创建一个名为
- 提示 :小数类型考虑使用
DECIMAL(10, 2),日期时间使用DATETIME。 - 参考答案:
sql
CREATE TABLE products (
id INT,
name VARCHAR(100),
price DECIMAL(10, 2),
stock INT,
listed_at DATETIME
);
- 【难度:★☆☆☆☆】基础数据操作 - 题目 :基于上一题创建的
products表(或你已创建的任意表)。
a) 插入 3 条不同的商品记录。
b) 查询所有价格大于 50 元的商品名称和价格。
c) 将其中一件商品的库存减少 10。
d) 删除一件库存为 0 的商品。
- 提示 :注意每个操作的顺序和
WHERE条件的使用。 - 参考答案(示例):
sql
-- a)
INSERT INTO products (id, name, price, stock, listed_at) VALUES
(1, '鼠标', 99.99, 50, '2023-10-10 09:00:00'),
(2, '键盘', 199.00, 30, '2023-10-11 10:30:00'),
(3, 'USB线', 19.50, 100, '2023-10-09 14:15:00');
-- b)
SELECT name, price FROM products WHERE price > 50;
-- c) 假设鼠标的id是1
UPDATE products SET stock = stock - 10 WHERE id = 1;
-- d) 先插入一条库存为0的记录,或更新某条记录库存为0后再删除
-- 例如:UPDATE products SET stock = 0 WHERE id = 3;
DELETE FROM products WHERE stock = 0;
进阶练习题
- 【难度:★★☆☆☆】条件更新与逻辑运算
- 题目 :在
users表中,我们需要进行一次"用户关怀"操作:将所有状态为'inactive'并且 注册时间早于'2023-10-01'的用户的年龄字段更新为NULL(表示未知)。请写出该UPDATE语句。
- 题目 :在
- 提示 :使用
AND连接多个条件,日期比较可以直接使用>,<。 - 参考答案:
sql
UPDATE users
SET age = NULL
WHERE status = 'inactive'
AND created_at < '2023-10-01';
- 【难度:★★☆☆☆】数据筛选与排序
- 题目 :查询
users表中所有用户,要求只显示username、email和age三个字段,并且按照age从大到小排序,如果age相同,则按照username的字母顺序正序(A-Z)排列。请写出SELECT语句。
- 题目 :查询
- 提示 :
ORDER BY子句可以指定多个排序字段和排序方式。DESC表示降序,ASC表示升序(默认)。 - 参考答案:
sql
SELECT username, email, age
FROM users
ORDER BY age DESC, username ASC;
综合挑战题
- 【难度:★★★☆☆】模拟数据备份与清理 - 题目 :假设我们有一个
login_logs表,记录了每次用户登录的 ID (log_id),用户 ID (user_id),登录时间 (login_time)。公司政策要求只保留最近 30 天的登录日志。
a) 请写出创建此表的语句(合理定义字段类型)。
b) 为了安全备份,请写出将 30 天前的所有日志记录查询 出来(仅查询)的语句。
c) (高阶)假设你已经备份完毕,请写出删除这些 30 天前日志的语句。
- 提示 :日期计算可以使用 MySQL 的日期函数
CURDATE()获取当前日期,DATE_SUB(CURDATE(), INTERVAL 30 DAY)计算 30 天前的日期。 - 参考答案:
sql
-- a)
CREATE TABLE login_logs (
log_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
login_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- b) 查询30天前的日志
SELECT * FROM login_logs WHERE login_time < DATE_SUB(CURDATE(), INTERVAL 30 DAY);
-- c) 删除30天前的日志(执行前请再三确认!)
DELETE FROM login_logs WHERE login_time < DATE_SUB(CURDATE(), INTERVAL 30 DAY);
章节总结
- 本章重点知识回顾:
- SQL 及其分类:SQL 是与数据库交互的标准语言,分为 DDL(定义结构)、DML(操作数据)等。
- CRUD 四大操作 :这是所有数据应用的基石,对应
INSERT©、SELECT®、UPDATE(U)、DELETE(D)。 - 核心语句语法:
CREATE TABLE:定义表,指定字段名和数据类型。INSERT INTO ... VALUES ...:插入新数据。SELECT ... FROM ... WHERE ...:查询数据,WHERE子句用于过滤。UPDATE ... SET ... WHERE ...:更新数据,必须注意WHERE。DELETE FROM ... WHERE ...:删除数据,必须注意WHERE。
- 安全意识:初步了解了 SQL 注入的巨大危害及其根本防护策略------预处理语句。
- 技能掌握要求 :
学完本章,你应该能够:独立在 MySQL 中创建符合简单需求的表;熟练编写 SQL 语句完成数据的增、删、改、查;深刻理解WHERE子句在UPDATE和DELETE中的重要性,并养成先SELECT确认再操作的习惯;建立起初步的数据库安全意识。 - 进一步学习建议 :
当前创建的表和查询还比较简单。下一章(第 3 章)我们将深入学习如何设计更规范、健壮的表结构(如主键、自增、唯一约束),并掌握更强大的查询技巧,如聚合统计、复杂条件组合和分页查询,让你的 SQL 能力再上一个台阶。