1.DDL数据定义语言
DDL是什么——————创建、修改、删除 数据库和表结构的命令。
基本语法
针对数据库的操作
-- 创建数据库
CREATE DATABASE 数据库名;
-- 比如
CREATE DATABASE myschool;
--查看所有数据库
SHOW DATABASES;
--使用某个数据库
USE myschool;
-- 删除数据库//需谨慎
DROP DATABASE myschool;
针对表的操作
-- 创建表
CREATE TABLE 表名 (字段名1 数据类型,字段名2 数据类型,...
);
-- 比如
CREATE TABLE LI(
name VARCHAR(10),
age INT,
hobby VARCHAR(20);
)--1.2.2 数据类型(常用)
--表格
--复制
--类型 说明 例子
--INT 整数 10, 20
--VARCHAR(n) 字符串 '张三'
--DATE 日期 '2025-08-09'
--FLOAT 小数 3.14--查看当前数据库的所有表
SHOW TABLES;
--查看表结构
DESC students;
--删除表
DROP TABLE students;-- 修改表结构(ALTER)
--添加一列
ALTER TABLE students ADD COLUMN email VARCHAR(50);
--删除一列
ALTER TABLE students DROP COLUMN email;
--修改列名或类型
ALTER TABLE students CHANGE COLUMN name fullname VARCHAR(30);
-- COLUMN :列 ALTER ;改变
--“建库用 CREATE,看库用 SHOW,用库写 USE,删库要小心!”
--“建表写 CREATE TABLE,看表结构用 DESC,改表结构用 ALTER。”
小练习
1.创建一个数据库叫 testdb
2.创建一个表叫 users,字段有:id INT,username VARCHAR(20)
3.查看表结构
4.添加一个字段 email VARCHAR(50)
5.删除这个表
1
CREATE DATABASE testdb;
2
CREATE TABLE users(
id INT,
username VARCHAR(20)
);
3
DESC users;
4
ALTER TABLE users ADD COLUMN email VARCHAR(50);
5
DROP TABLE users;
2.DML (Data Manipulation Language)数据操纵语言
核心语法
插入数据(INSERT)
假设我们已经有了这张表
CREATE DATABASE testdb;
USE testdb;CREATE TABLE users (id INT,username VARCHAR(20),email VARCHAR(50)
);
但是现在我们想给这个数据库表插入数据我们可以选择运行
-- 单个数据插入
INSERT INTO users (id, username, email)
VALUES
(1, '张三', 'zhangsan@qq.com');
这样子我们就有了张三这个数据库实例
当然一个一个添加太麻烦了我们可以批量添加
-- 多个数据插入
INSERT INTO users (id, username, email)
VALUES
(2, '李四', 'lisi@qq.com'),
(3, '王五', 'wangwu@qq.com');
相对于来说就是加个逗号结尾还是用常规结束符;
我们也可以选择插入部分字段(其余为NULL)
-- 插入部分字段(其余为NULL)
INSERT INTO users (id, username)
VALUES (4, '赵六');
数据修改(UPDATE)
UPDATE users
SET email = 'new_email@qq.com'
WHERE id = 1;、
-- 意为修改id=1 的email为'new_email@qq.com'
数据删除(DELETE)
--从users表中删除一个id=4的数据
DELETE FROM users
WHERE id = 4;
练习
1插入 3 个用户:张三、李四、王五
2把张三的邮箱改成 zhangsan@new.com
3删除王五
4查看剩下的人
1
INSERT INTO users(username)
VALUES
('张三'),
('李四'),
('王五');
2
UPDATE users SET email ='zhangsan@new.com' WHERE username ='张三'
3
DELETE FROM users WHERE username ='王五'
4
SELECT * FROM users;
3.约束
什么是约束?
约束就是给表里的字段加“规矩”,让数据不能乱填,保证数据的正确性和一致性
3.1主键约束(PRIMARY KEY)
作用:唯一标识一条记录(就像身份证号)
要求:不能重复,不能为 NULL
通常配合:AUTO_INCREMENT(自动增长)(常用于id)
-- id 会自动从 1、2、3……往上加,保证每个学生都有独一无二的编号。
CREATE TABLE students (id INT PRIMARY KEY AUTO_INCREMENT
);
联合主键
由多个列组成的主键称为联合主键:
CREATE TABLE student (
student_id INT,
seat_id INT ,
...
PRIMARY KEY (student_id,seat_id))
修改表结构添加主键
ALTER TABLE student ADD PRIMARY KEY(cours_id )
删除主键
ALTER TABLE student DROP PRIMARY KEY;
3.2非空约束(NOT NULL)
作用:这个字段必须填,不能空着
name VARCHAR(20) NOT NULL
-- 如果你插入数据时不写 name,就会报错!
3.3唯一约束(UNIQUE)
作用:这个字段的值不能重复
email VARCHAR(50) UNIQUE
-- 两个人的邮箱不能一样,否则会报错。
3.4默认值约束(DEFAULT)
作用:如果你不填这个字段,就用默认值
age INT DEFAULT 18
-- 插入数据时不写 age,MySQL 自动填 18。
3.5零填充约束(ZEROFILL)!! mysql8.0以后版本已删除
作用:数字前面自动补 0
student_number INT(4) ZEROFILL
-- 插入 1,实际显示 0001;插入 25,显示 0025。
3.6自增约束(AUTO_INCREMENT)
作用:每次插入数据,自动加 1
只能用于:整数类型,并且必须是 主键 或 唯一键
id INT PRIMARY KEY AUTO_INCREMENT
-- 你不需要手动写 id,MySQL 帮你自动填。
3.7外键约束(FOREIGN KEY) (重点)!!!
作用:让两个表产生“关联”,保证数据一致性
class_id INT,
FOREIGN KEY (class_id) REFERENCES classes(id)
-- 学生表里的 class_id 必须是班级表里已经存在的 id,否则插不进去。
一、想像两份 Excel 表
班级表
id | class_name |
---|---|
1 | 三年二班 |
2 | 四年一班 |
学生表
id | name | class_id |
---|---|---|
1 | 张三 | 1 → 指向三年二班 |
2 | 李四 | 2 → 指向四年一班 |
3 | 王五 | 99 → ❌ 指向一个根本不存在的班级! |
如果允许王五这条记录存在,数据就“脏”了。
外键的作用就是:
“students 表里的 class_id 只能填 classes 表里已经出现过的 id”
我们先创建一个父表
CREATE TABLE classes (id INT PRIMARY KEY AUTO_INCREMENT,class_name VARCHAR(20)
);
再建(子表),并声明外键
CREATE TABLE students (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(20) NOT NULL,class_id INT,-- 外键声明:students.class_id 必须来自 classes.idCONSTRAINT fk_stu_clsFOREIGN KEY (class_id) --外键REFERENCES classes(id)
);
说明:
• fk_stu_cls 是外键的名字,可以随便取,最好见名知意。
• 数据类型必须一致:students.class_id 与 classes.id 都是 INT。
一对多关系-创建外键约束
CREATE TABLE father_table (
id INT PRIMARY KEY,
son_id INT
);
CREATE TABLE son_table (
id INT PRIMARY KEY ,
father_id INT,
FOREIGN KEY (father_id) REFERENCES father_table(son_id)
);.
练习1:外键创建
创建一个
orders 订单表,包含订单ID、订单号、客户ID、订单日期字段,其中客户ID作为外键引用
customers 表的主键。
练习2:外键验证
向e
mployees 表中插入一条dept_id为100的记录,会发生什么?为什么?
练习3:复合外键
如何创建一个
order_items 表,使其包含订单ID和产品ID两个外键,分别引用
orders 和
products
表?
删除外键
-- 查看表
SHOW CREATE TABLE 表名;
-- 删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
4.查询
DQL = Data Query Language,就是用来 查询数据 的语言。它的核心命令是 SELECT。
简单查询
-- 查询表的所有列
SELECT * FROM studentl;
-- 查询指定列
SELECT name, age, id FROM student
-- 给予列别名
SELECT name AS 姓名 , age AS 年龄, her AS MY_LOVE FROM student;-- 去重
SELECT DISTINCT id FROM student;
条件查询(WHERE 子句)
-- 等于
SELECT * FROM students WHERE age = 18;
-- 不等于
SELECT * FROM LOVE WHERE age != 20;
-- 大于
SELECT * FROM students WHERE score > 80;-- BETWEEN...AND
SELECT * FROM LOVE WHERE lover BETWEEN she love me AND I love she ;
-- IN
SELECT * FROM TOBELOVE WHERE IAM IN her heart;
-- IS NULL
SELECT * FROM why_she WHERE my-heart IS NULL ;
-- 逻辑运算符
SELECT * FROM LOVE WHERE me = 'Remance' AND me = 'rich' AND me = 'love she '
常用查询
排序查询
-- 升序 上小下大
SELECT * FROM MYBRO ORDER BY AGE ASC;
-- 降序 上大下小
SELECT * FROM MYBRO ORDER BY AGE DESC;
-- 多列排序
SELECT * FROM students ORDER BY id ASC, age DESC;
聚合查询
-- 统计总数
SELECT COUNT(*) AS 好友总数 FROM friends;
-- 统计我列表的男性总数
SELECT COUNT(*) AS 我的好兄弟有多少 FROM friends WHERE gender = '男';
-- 计算平均身高
select COUNT(*) AS 平均身高 FROM men_high;
-- 计算总成绩
SELECT SUM(score) AS 总成绩 FROM students;
-- 最高分和最低分
SELECT MAX(score) AS 最高分, MIN(score) AS 最低分 FROM students;
聚合查询-null值处理
COUNT(*) 包含NULL值的行
COUNT(列名) 不包含NULL值的行
SUM、AVG、MAX、MIN 忽略NULL值
分组查询
分组查询: GROUP BY 列名;
分组后筛选: HAVING 条件;
-- 按班级分组,统计每个班级的学生数量
SELECT class_id, COUNT(*) AS 学生数量 FROM students GROUP BY class_id;
-- 按班级分组,计算每个班级的平均成绩
SELECT class_id, AVG(score) AS 平均成绩 FROM students GROUP BY class_id;
-- 分组后筛选,只显示学生数量大于2的班级
SELECT class_id, COUNT(*) AS 学生数量 FROM students GROUP BY class_id HAVING COUNT(*) >2;
分页查询
核心内容
分页查询: LIMIT 偏移量, 每页数量;
偏移量从0开始
-- 每页显示2条数据,查询第一页
SELECT * FROM students LIMIT 0, 2;
-- 每页显示2条数据,查询第三页
SELECT * FROM students LIMIT 2, 2
练习题
- 什么是约束?MySQL支持哪些类型的约束?
约束 是一组规则,用于限制表中数据的类型、取值范围或数据之间的关系,从而保证数据的完整性和一致性
约束类型 | 关键字 | 作用说明 |
---|---|---|
主键约束 | PRIMARY KEY | 唯一标识每一行记录,不能为 NULL,且不能重复。 |
唯一约束 | UNIQUE | 保证某列或某组合列的值唯一,但允许 NULL(不同版本对 NULL 的处理略有差异)。 |
非空约束 | NOT NULL | 禁止该列的值为 NULL。 |
默认值约束 | DEFAULT | 当未指定值时,自动使用默认值。 |
外键约束 | FOREIGN KEY | 建立表与表之间的关系,确保引用完整性(子表中的值必须在父表中存在)。 |
检查约束 | CHECK | 限制列中的值必须满足特定条件(MySQL 8.0.16+ 才支持,早期版本语法支持但无效)。 |
- 简述主键约束和唯一约束的区别。
对比项 | 主键约束(PRIMARY KEY) | 唯一约束(UNIQUE) |
---|---|---|
是否允许 NULL | 不允许 | 允许(可有多条 NULL) |
表中个数 | 只能有 1 个(或复合主键 1 组) | 可以有多个 |
用途 | 唯一标识整行记录 | 仅保证列值不重复 |
自动索引 | 自动创建聚簇索引 | 自动创建二级索引 |
-
自增约束有哪些特点?
-
-
编写SQL语句,查询students表中年龄大于20且成绩大于85的学生信息。
SELECT * FROM students WHERE age > 20 AND grand > 85;
- 编写SQL语句,按班级分组,统计每个班级的学生数量和平均成绩,并按平均成绩降序排序。
SELECTclass_id,COUNT(*) AS student_count,AVG(score) AS avg_score
FROMstudents
GROUP BYclass_id
ORDER BYavg_score DESC;
- 编写SQL语句,查询students表中成绩排名前3的学生信息
SELECT *
FROM students
ORDER BY score DESC
LIMIT 3;
联合查询
联合查询是同时查询多个表中的数据,包括
交叉连接(CROSS JOIN)
交叉连接(CROSS JOIN)是 SQL 中最简单、最暴力的一种多表查询方式。它把左表的每一行和右表的每一行全部拼在一起,形成一张“大表”。
实际生产中很少直接使用,除非:
你想生成笛卡尔积(例如做组合测试、穷举所有配对)。
两张表本来就很确定只有 1 行(比如常量表)。
语法示例
-- 显式写法
SELECT *
FROM A
CROSS JOIN B;-- 隐式写法(逗号分隔,效果相同,但不推荐)
SELECT *
FROM A, B;
内连接查询
内连接(INNER JOIN)是关系型数据库里最常用、最“安全”的连接方式。它只保留两张表中满足连接条件的行,其余全部丢弃,因此结果集不会爆炸,语义也最贴近“匹配”这一业务需求。
SELECT * FROM table1 INNER JOIN table2 ON 连接条件;-- 或
SELECT * FROM table1 JOIN table2 ON 连接条件;-- 或(隐式内连接)
SELECT * FROM table1, table2 WHERE 连接条件-- 显式内连接
SELECT e.id, e.name, d.name AS dept_name, e.salary
FROM employees e INNER JOIN departments d
ON e.dept_id = d.id;-- 隐式内连接
SELECT e.id, e.name, d.name AS dept_name, e.salary
FROM employees e, departments d
WHERE e.dept_id = d.id
比如现有两个表
Employees(emp_id, dept_id, name) | Departments(dept_id, dept_name) |
---|---|
1, 10, ‘Alice’ | 10, ‘Sales’ |
2, 20, ‘Bob’ | 30, ‘HR’ |
3, 10, ‘Cara’ |
我们运行
SELECT e.emp_id, e.name, d.dept_name
FROM Employees AS e
JOIN Departments AS dON e.dept_id = d.dept_id;
结果为
emp_id | name | dept_name |
---|---|---|
1 | Alice | Sales |
3 | Cara | Sales |