MySQL 基础入门(学习第4天)——约束与 DML 操作详解

前言

知识无底,学海无涯,到今天进入 MySQL 的学习第 4 天了。知识点虽然看起来简单,但数量不少,容易遗忘。于是写一篇博客,把 MySQL 中关于数据约束和**数据操作(DML)**的基础内容整理出来,既方便自己日后复习,也希望能够帮助到同样正在入门的同学。

一、SQL 简述

1. SQL 的概述

Structured Query Language(结构化查询语言)简称 SQL,被 ANSI 定为关系型数据库的标准语言,后被 ISO 采纳为国际标准。通过 SQL,我们可以定义和操作数据、维护数据完整性与安全性。

2. SQL 的优点

  1. 简单易学,操作性强
  2. 主流数据库(MySQL、Oracle、SQL Server 等)均支持
  3. 高度非过程化:大部分工作由 DBMS 自动完成

3. SQL 的分类

分类 说明 常见关键字
DDL 数据定义语言 CREATE、ALTER、DROP
DML 数据操作语言 INSERT、UPDATE、DELETE
DCL 数据控制语言 GRANT、DENY
DQL 数据查询语言 SELECT

二、数据库的三大范式

  1. 第一范式(1NF):字段不可再分,具有原子性
  2. 第二范式(2NF) :在 1NF 基础上,非主键字段必须完全依赖主键
  3. 第三范式(3NF) :在 2NF 基础上,非主键字段之间不能相互依赖

三、数据表的约束

约束的本质:对插入的数据进行限制,保证数据的正确性。

1. 主键约束(PRIMARY KEY)

作用 :唯一标识一行记录

特点

  • 值唯一
  • 不能为 NULL
  • 一张表只能有一个主键(但可以是联合主键)
sql 复制代码
-- 方式一
CREATE TABLE teachers(
    id INT PRIMARY KEY,
    name VARCHAR(50)
);

-- 方式二:联合主键
CREATE TABLE stus(
    first_name VARCHAR(50),
    second_name VARCHAR(50),
    CONSTRAINT pk_name PRIMARY KEY(first_name, second_name)
);

2. 自增约束(AUTO_INCREMENT)

特点

  • 必须配合主键使用
  • 插入 0NULL 时会自动递增
  • 一张表只能有一个自增字段
sql 复制代码
CREATE TABLE students1(
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50)
);

3. 非空约束(NOT NULL)

作用:该字段插入时必须有值

sql 复制代码
CREATE TABLE students2(
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL
);

4. 唯一约束(UNIQUE)

作用:字段值在列中唯一(允许多个 NULL)

sql 复制代码
CREATE TABLE students3(
    id INT UNIQUE,
    name VARCHAR(50)
);

5. 默认值约束(DEFAULT)

作用:未赋值时使用默认值

sql 复制代码
CREATE TABLE students5(
    id INT DEFAULT 1,
    name VARCHAR(50)
);

6. 外键约束(FOREIGN KEY)

用于维护多表之间的数据一致性(此处略作简化)。

四、数据表插入数据(INSERT)

1. 全字段插入

sql 复制代码
CREATE TABLE students6(
    id INT,
    name VARCHAR(50),
    age INT,
    height DOUBLE,
    sex CHAR(1)
);

INSERT INTO students6 VALUES(1, '张伟', 18, 175.5, '男');

2. 指定字段插入

sql 复制代码
INSERT INTO students6(id, name) VALUES(2, '李娜');

3. 一次插入多条记录

sql 复制代码
INSERT INTO students6(id, name)
VALUES
(3, '王磊'),
(4, '刘洋');

五、删除数据(DELETE & TRUNCATE)

1. DELETE 基本语法

sql 复制代码
DELETE FROM students6 WHERE id = 1;

2. 删除全部数据

sql 复制代码
DELETE FROM students6;

3. TRUNCATE 清空表

sql 复制代码
TRUNCATE TABLE students6;

4. DELETE vs TRUNCATE vs DROP

对比项 DELETE TRUNCATE DROP
类型 DML DDL DDL
是否可回滚
自增影响 继续增长 重置为 1 表不存在
删除粒度 行级 表级 表级

六、更新数据(UPDATE)

sql 复制代码
-- 修改指定记录
UPDATE students5 SET id = 2 WHERE name = '李娜';

-- 修改多个字段
UPDATE students5 SET id = 1, name = '陈静' WHERE id = 2;

-- 不加 WHERE 会更新整张表(慎用)
UPDATE students5 SET name = '赵敏';

七、简单查询(DQL)

sql 复制代码
-- 查询所有字段
SELECT * FROM students6;

-- 查询指定字段
SELECT id, name FROM students6;

-- 去重
SELECT DISTINCT sex FROM students6;

-- 算术运算
SELECT name, age + 10 AS future_age FROM students6;

八、条件查询

sql 复制代码
-- 关系运算符
SELECT * FROM students6 WHERE age >= 18;

-- IN
SELECT * FROM students6 WHERE id IN (1, 3);

-- BETWEEN
SELECT * FROM students6 WHERE age BETWEEN 18 AND 22;

-- NULL 判断
SELECT * FROM students6 WHERE age IS NOT NULL;

-- LIKE
SELECT * FROM students6 WHERE name LIKE '张%';

-- LIMIT
SELECT * FROM students6 ORDER BY age ASC LIMIT 3;

九、分组查询与排序

sql 复制代码
-- 分组统计
SELECT sex, COUNT(*) FROM students6 GROUP BY sex;

-- HAVING 筛选
SELECT sex, COUNT(*) FROM students6
GROUP BY sex
HAVING COUNT(*) >= 2;

-- 排序
SELECT * FROM students6 ORDER BY age DESC;

十、别名设置

sql 复制代码
-- 表别名
SELECT s.name FROM students6 AS s;

-- 字段别名
SELECT name AS 姓名, age AS 年龄 FROM students6;

十一、多表连接查询(示例)

sql 复制代码
-- 内连接
SELECT s.name, c.class_name
FROM students s
JOIN classes c ON s.class_id = c.id;

-- 左连接
SELECT c.class_name, s.name
FROM classes c
LEFT JOIN students s ON c.id = s.class_id;

十二、子查询

sql 复制代码
-- 比较子查询
SELECT * FROM classes
WHERE id = (SELECT class_id FROM students WHERE name = '张伟');

-- EXISTS
SELECT * FROM classes
WHERE EXISTS (SELECT 1 FROM students WHERE name = '王磊');

总结

SQL 书写顺序

复制代码
SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT

SQL 执行顺序

复制代码
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT

学习 MySQL 最重要的是:多写 SQL、多验证结果

基于复习,乐于分享,希望这篇笔记对你有帮助!

相关推荐
dear_bi_MyOnly1 小时前
【SpringBoot配置文件】
java·spring boot·后端·学习·spring·java-ee·学习方法
AOwhisky1 小时前
Python 学习笔记(第十四期)——运维自动化(下·中篇):远程文件传输——paramiko进阶篇
运维·python·学习·云原生·自动化·文件传输·paramiko
math_hongfan1 小时前
鸿蒙Flutter setState机制深入理解
学习·flutter·华为·harmonyos·鸿蒙
其实防守也摸鱼2 小时前
补天SRC新手入门指南:从0到1的漏洞挖掘之路
网络·python·学习·安全·web安全·数据挖掘·挖洞
nianniannnn2 小时前
Qt QMessageBox知识点
开发语言·数据库·qt
—Miss. Z—2 小时前
计算机二级MySQL——简单应用题(存储过程&存储函数)
数据库·oracle·php
Vect__3 小时前
MySQL 数据类型和约束:从字段设计到表结构建模
数据库·mysql
糖果店的幽灵3 小时前
langgraph的分支结构之 - 静态分支详解
java·服务器·数据库·langgraph
张人玉3 小时前
C# WinForms——工厂管理系统(C# WinForms)
数据库·sqlite·c#·winform