《零基础学PHP:从入门到实战》教程-模块七:MySQL 数据库基础-2

第 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 检索数据;最后使用 UPDATEDELETE 修改和删除数据。本章将以一个 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,数据操作语言) :用于对表中的数据进行操作。本章的 INSERTSELECTUPDATEDELETE 都属于 DML。它主要用来"处理货物"。
  • DCL (Data Control Language,数据控制语言) :用于控制数据库的访问权限和安全级别,如 GRANTREVOKE
  • TCL (Transaction Control Language,事务控制语言) :用于管理数据库的事务,如 COMMITROLLBACK
    本章我们将重点学习 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 子句,导致所有用户的年龄都被更新了。这在业务中通常是严重事故。
  • 最佳实践:在执行 UPDATEDELETE 前,先用一个同条件的 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 中),模拟一个简易的用户管理系统。实现以下功能:

  1. 初始化:创建数据库和用户表。
  2. 用户注册:向系统中添加新用户。
  3. 用户查询:支持按 ID、用户名、年龄范围查询用户。
  4. 信息更新:更新指定用户的信息(如邮箱)。
  5. 用户注销:从系统中删除指定用户。

技术方案与分步实现

第 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 章内容)根据用户输入动态生成并执行。

项目扩展建议

  1. 增加日志表 :创建一个 user_audit_log 表,记录用户的所有重要操作(注册、更新、注销),使用 INSERT 触发器自动填充。
  2. 复杂查询:尝试统计不同状态用户的数量、计算平均年龄等(需用到聚合函数,第 3 章内容)。
  3. 前端界面:学完第 4 章后,可以为这个"系统"编写简单的 HTML 表单和 PHP 处理页面,使其成为真正的 Web 应用。

最佳实践

1. 行业标准与开发规范

  • 清晰的命名 :表名、字段名使用小写字母、数字和下划线,如 user_profiles。做到见名知义。
  • 使用注释 :对于复杂的表或字段,使用 COMMENT 子句添加说明(例如:CREATE TABLE ... COMMENT '用户主表';)。
  • 始终指定字段列表 :在 INSERT 语句中,即使为所有字段赋值,也显式写出字段列表。这提高了代码的稳定性和可读性。
  • SQL 格式化 :将 SQL 关键字(如 SELECTFROM)大写,字段名、表名小写,有助于区分。

2. 常见错误与避坑指南

  • 忘记 WHERE 子句UPDATEDELETE 时忘记加 WHERE 是初学者最常见的"灾难"。务必先 SELECT 后写 UPDATE/DELETE
  • SQL 语法错误 :字符串值必须用单引号('')括起来,数字不用。例如:WHERE username = '张三'(正确) vs WHERE username = 张三(错误)。
  • 字符集问题 :如果插入中文出现乱码,请确保创建数据库/表时指定了正确的字符集(如 UTF8MB4),连接客户端时也设置了相应字符集。第 1 章创建的数据库应已考虑此点。
  • 空值(NULL)处理NULL 表示"未知"或"无值"。在条件查询中,要使用 IS NULLIS NOT NULL,而非 = NULL

3. 性能优化技巧(入门级)

  • SELECT * 的取舍SELECT * 会返回所有字段,如果表字段很多或包含大文本(如文章内容),会消耗大量网络和内存资源。实际开发中,应只查询需要的字段,如 SELECT id, username FROM ...
  • 为常用查询条件建立索引 :在 WHEREORDER BY 子句中频繁使用的字段(如 usernameemail),后续可以通过创建索引来大幅提高查询速度(属于高级优化话题)。

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 语句的结构数据分离。

  1. 定义模板 :SQL 语句中使用占位符(?)代替变量。
sql 复制代码
    SELECT * FROM users WHERE username = ? AND password = ?
  1. 预处理:数据库预编译这个 SQL 模板,确定其执行计划。
  2. 绑定参数 :将用户输入的 $username$password 作为"参数"绑定到对应的占位符上。
  3. 执行 :数据库将参数视为纯数据,而非 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 语句的程序时,预处理是必须采用的方案。

练习题与挑战

基础练习题

  1. 【难度:★☆☆☆☆】创建商品表
    • 题目 :创建一个名为 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
      );
  1. 【难度:★☆☆☆☆】基础数据操作 - 题目 :基于上一题创建的 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;

进阶练习题

  1. 【难度:★★☆☆☆】条件更新与逻辑运算
    • 题目 :在 users 表中,我们需要进行一次"用户关怀"操作:将所有状态为 'inactive' 并且 注册时间早于 '2023-10-01' 的用户的年龄字段更新为 NULL(表示未知)。请写出该 UPDATE 语句。
  • 提示 :使用 AND 连接多个条件,日期比较可以直接使用 ><
  • 参考答案
sql 复制代码
      UPDATE users
      SET age = NULL
      WHERE status = 'inactive'
        AND created_at < '2023-10-01';
  1. 【难度:★★☆☆☆】数据筛选与排序
    • 题目 :查询 users 表中所有用户,要求只显示 usernameemailage 三个字段,并且按照 age 从大到小排序,如果 age 相同,则按照 username 的字母顺序正序(A-Z)排列。请写出 SELECT 语句。
  • 提示ORDER BY 子句可以指定多个排序字段和排序方式。DESC 表示降序,ASC 表示升序(默认)。
  • 参考答案
sql 复制代码
      SELECT username, email, age
      FROM users
      ORDER BY age DESC, username ASC;

综合挑战题

  1. 【难度:★★★☆☆】模拟数据备份与清理 - 题目 :假设我们有一个 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);

章节总结

  • 本章重点知识回顾
  1. SQL 及其分类:SQL 是与数据库交互的标准语言,分为 DDL(定义结构)、DML(操作数据)等。
  2. CRUD 四大操作 :这是所有数据应用的基石,对应 INSERT©、SELECT®、UPDATE(U)、DELETE(D)。
  3. 核心语句语法
  • CREATE TABLE:定义表,指定字段名和数据类型。
  • INSERT INTO ... VALUES ...:插入新数据。
  • SELECT ... FROM ... WHERE ...:查询数据,WHERE 子句用于过滤。
  • UPDATE ... SET ... WHERE ...:更新数据,必须注意 WHERE
  • DELETE FROM ... WHERE ...:删除数据,必须注意 WHERE
  1. 安全意识:初步了解了 SQL 注入的巨大危害及其根本防护策略------预处理语句。
  • 技能掌握要求
    学完本章,你应该能够:独立在 MySQL 中创建符合简单需求的表;熟练编写 SQL 语句完成数据的增、删、改、查;深刻理解 WHERE 子句在 UPDATEDELETE 中的重要性,并养成先 SELECT 确认再操作的习惯;建立起初步的数据库安全意识。
  • 进一步学习建议
    当前创建的表和查询还比较简单。下一章(第 3 章)我们将深入学习如何设计更规范、健壮的表结构(如主键、自增、唯一约束),并掌握更强大的查询技巧,如聚合统计、复杂条件组合和分页查询,让你的 SQL 能力再上一个台阶。
相关推荐
一 乐28 分钟前
水果销售|基于springboot + vue水果商城系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端
JIngJaneIL29 分钟前
校园任务平台|校园社区系统|基于java+vue的校园悬赏任务平台系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·校园任务平台
霸王大陆35 分钟前
《零基础学PHP:从入门到实战》教程-模块七:MySQL 数据库基础-1
数据库·mysql·php
云半S一1 小时前
春招准备之Redis篇
数据库·经验分享·redis·笔记·缓存
移远通信1 小时前
配网-复杂场景
服务器·开发语言·php
康不坦丁1 小时前
MySQL 的 order by 简化(使用列序号和列别名排序)
后端·mysql
IndulgeCui1 小时前
【金仓数据库产品体验官】KingbaseES-性能优化深度体验
数据库·性能优化
+VX:Fegn08951 小时前
计算机毕业设计|基于springboot + vue零食商城管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
雨中飘荡的记忆1 小时前
Redis_实战指南
数据库·redis·缓存