1.数据库
数据库就是存储和管理数据的仓库,数据按照一定格式进行存储,用户可以对数据库中的数据进行增加、修改、删除、查询等操作。
1.1.数据库的分类
- 关系型数据库
- 非关系型数据库
关系型数据库:
是指采用了关系模型来组织数据的数据库,简单来说,关系模型指的就是二维表格模型,好比Excel文件中的表格,强调使用表格的方式存储数据。
关系型数据库中核心元素
- 数据行
- 数据列
- 数据表
- 数据库(数据表的集合)
常用的关系型数据库:
- Oracle
- Microsoft SQL Server
- Mysql
- SQLite
非关系型数据库:
非关系型数据库,又被称为NoSQL(Not Only SQL),意为不仅仅是SQL,对NoSQL最普遍的定义是"非关联型的",强调Key-Value 的方式存储数据。
常用的非关系型数据库:
- MongoDB
- Redis
1.2.数据库的作用
数据库的作用就是存储和管理数据的,比如:我们在京东网站上的浏览的商品商品列表数据,这些数据都会存储在数据库。
用户浏览商品列表效果图:

1.3.数据库的特点
1.持久化存储
2.读写速度极高
3.保证数据的有效性
1.4小结
- 数据库就是存储和管理数据的一个仓库,用来持久化存储和快速读取数据的。
- 数据库可以分为关系型数据库和非关系型数据库。
2.关系型数据库管理系统
2.1 关系型数据库管理系统的介绍
关系型数据库管理系统(Relational Database Management System,简称RDBMS)是为管理关系型数据库而设计的软件系统,如果想要使用关系型数据库就需要安装数据库管理系统。
关系型数据库管理系统可以分为:
- 关系型数据库服务端软件
- 关系型数据库客户端软件
关系型数据库服务端软件:
主要负责管理不同的数据库,而每个数据库里面会有一系列数据文件,数据文件是用来存储数据的,数据库就是一系列数据文件的集合
关系型数据库客户端软件:
主要负责和关系型数据库服务端软件进行通信,向服务端传输数据或者从服务端获取数据。
关系型数据库管理系统的效果图:

说明:
1.用户操作关系型数据库客户端,实现数据库相关操作
2.关系型数据库客户端借助网络使用SQL语言和关系型数据库服务端进行数据通信
2.2SQL的介绍
SQL(Structured Query Language)是结构化查询语言,是一种用来操作RDBMS的数据库的语言。也就是说通过SQL可以操作 oracle,sql server,mysql,sqlite等关系型的数据库。
SQL的作用是实现数据库客户端和数据库服务端之间的通信,SQL就是通信的桥梁
SQL语言主要分为:
- DQL: 数据查询语言,用于对数据进行查询,如select
- DML: 数据操作语言,对数据进行增加、修改、删除,如insert、update、delete
- TPL: 事务处理语言,对事务进行处理,包括begin transaction、commit、rollback
- DCL: 数据控制语言,进行授权与权限回收,如grant、revoke
- DDL:数据定义语言,进行数据库、表的管理等,如 create、drop
说明:
- SQL语言不区分大小写
2.3小结
- 关系型数据库管理系统是一个软件,它可以管理不同的数据库,想要对数据库进行操作安装对应的关系型数据库管理系统软件即可
- SQL的作用是实现数据库客户端和数据库服务端之间的通信,好比是通信桥梁
3.数据类型和约束
数据库中的数据保存在数据表中,在表中为了更加准确的存储数据,保证数据的正确有效,可以在创建表的时候,为表添加一些强制性的验证,比如:数据类型和约束。
3.1数据类型
数据类型是指在创建表的时候为表中字段指定数据类型,只有数据符合类型要求才能存储起来,使用数据类型的原则是:能用就行,尽量使用取值范围小的,而不用大的,这样可以更多的节省存储空间。
常用数据类型如下:
- 整数: int,bit
- 小数: decimal
- 字符串: varcher,char
- 日期时间: date,time,datetime
- 枚举类型(enum)
数据类型说明:
- decimal表示浮点数,如 decimal(5,2)表示共存5位数,小数占2位
- char表示固定长度的字符串,如char(3)表示填充'ab'时会补一个空格,3表示字符数
- varchar表示可变长度的字符串,如varchar(3),填充'ab'时就会存储'ab',3表示字符数
- 对于图片、音频、视频等文件,不存储在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径
- 字符串text表示存储大文本,当字符大雨4000时推荐使用,比如技术博客
3.2数据约束
约束是指在数据在数据类型限定的基础上额外增加的要求。
常见的约束如下:
- 主键约束(PRIMARY KEY)
- 唯一标识表中的每条记录,确保不重复且不为空
- 一个表只能有一个主键,可由单个或多个字段组合而成
- 外键约束(FOREIGN KEY)
- 用于关联两个表,确保子表中的数据在主表中存在
- 维护表之间的参照完整性
- 唯一约束(UNIQUE)
- 确保字段的值在表中唯一,但允许为空(与主键的区别)
- 非空约束(NOT NULL)
- 强制字段必须有值,不能为 NULL
- 检查约束(CHECK)
- 限制字段值的范围或条件
- 默认约束(DEFAULT)
- 当插入记录未指定该字段值时,自动使用默认值
4.数据库操作的SQL语句
4.1 数据库的基本操作(SQL语句)
1.查看所有数据库
show databases;
2.创建数据库
create database 数据库名 charset=utf8;
create database demo charset=utf8;
3.使用数据库
use 数据库名;
use demo;
4.查看当前使用的数据库
select database();
5.删除数据库
drop database 数据库名;
drop database demo
4.2 表结构操作的SQL语句
1.查看当前数据库中所有表
show tables;
2.创建表
create table students(
id int unsigned primary key auto_increment not null,
name varchar(20) not null,
age tinyint unsigned default 0,
height decimal(5,2),
gender enum('男','女')
);
说明:
create table 表名(
字段1 数据类型 约束条件,
字段2 数据类型 约束条件,
...
字段n 数据类型 约束条件
);
3.修改表-添加字段
-- 基本语法
ALTER TABLE 表名
ADD COLUMN 字段名 数据类型 [约束条件];
示例:
alter table students add birthday datetime;

4.修改表-修改字段类型
-- 基本语法
ALTER TABLE 表名
MODIFY COLUMN 字段名 新数据类型 [新约束条件];
示例:
alter table students modify birthday date not null;

说明:
- modify:只能修改字段类型或者约束,不能修改字段名
5.修改表-修改字段名和字段类型
-- 基本语法
ALTER TABLE 表名
CHANGE COLUMN 旧字段名 新字段名 新数据类型 [约束条件];
示例:
alter table students change column birthday birth date null;

说明:
- change: 既能对字段重命名又能修改字段类型还能修改约束
6.修改表-删除字段
-- 基本语法
ALTER TABLE 表名 DROP COLUMN 字段名;
示例:
alter table students drop birth;
7.查看创表SQL语句
show create table 表名;
示例:
mysql> show create table students;
8.查看创库SQL语句
show create database 数据库名;
示例:
mysql> show create database demo;
9.删除表
drop table 表名
示例:
mysql> drop table students;
4.3 表数据操作的SQL语句
1.查询数据
- 查询所有字段所有数据
-- 语法:查询指定表中所有字段的所有记录
SELECT * FROM 表名;
-- 示例:查询 students 表中所有数据
SELECT * FROM students;
- 查询指定字段数据
-- 语法:查询指定表中特定字段的所有记录
SELECT 字段1, 字段2, ... FROM 表名;
-- 示例:查询 students 表中的 id、name、age 字段
SELECT id, name, age FROM students;
- 为字段设置别名
-- 语法:使用 AS 为字段或表设置别名(AS 可省略)
SELECT 字段1 [AS] 别名1, 字段2 [AS] 别名2 FROM 表名 [AS] 表别名;
-- 示例:查询学生姓名和年龄,并设置别名
SELECT name AS 学生姓名, age 年龄 FROM students;
2.添加数据
核心语法结构:
INSERT INTO 表名 (字段1, 字段2, ..., 字段n)
VALUES (值1, 值2, ..., 值n);
- 指定字段插入单条数据
-- 模板
INSERT INTO 表名 (字段1, 字段2, 字段3)
VALUES (值1, 值2, 值3);
-- 示例:向 students 表插入一条学生数据(指定name、age 字段)
insert into students (name,age) values('张三',18);
- 不指定字段插入单条数据(需匹配全字段)
-- 模板
INSERT INTO 表名
VALUES (值1, 值2, ..., 值n); -- n 为表中字段总数,顺序与表结构一致
-- 示例:向 students 表插入一条完整数据(表字段顺序:id, name, age, height, gender,)
insert into students values(3,'李四',19,1.9,'男');
-- 注意:
-- 1. 必须按表的字段顺序传值,少传、多传或顺序错误都会报错;
-- 2. 若某字段允许 NULL,可传入 NULL(如 address 为 NULL:..., NULL)。
- 批量插入多条数据
-- 模板1:指定字段批量插入
INSERT INTO 表名 (字段1, 字段2, 字段3)
VALUES
(值1_1, 值1_2, 值1_3), -- 第一条数据
(值2_1, 值2_2, 值2_3), -- 第二条数据
(值3_1, 值3_2, 值3_3); -- 第三条数据(末尾无逗号)
-- 模板2:不指定字段批量插入(需匹配全字段)
INSERT INTO 表名
VALUES
(值1_1, 值1_2, ..., 值1_n),
(值2_1, 值2_2, ..., 值2_n),
(值3_1, 值3_2, ..., 值3_n);
-- 示例:向 students 表批量插入2条学生数据 (需匹配全字段)
insert into students values
(0,'王五',18,1.88,'男'),
(0,'小红',16,1.6,'女');
说明:
- 主键列是自动增长,但是在全列插入时需要占位,通常使用空值(0或者null或者default)
- 在全列插入时,如果字段列有默认值可以使用default来占位,插入后的数据就是之前设置的默认值
- 插入时忽略主键/唯一键冲突 (INSERT IGNORE)
适用场景: 若插数据的主键 / 唯一键已存在,执行不报错且不插入(跳过冲突数据)。
-- 模板
INSERT IGNORE INTO 表名 (字段1, 字段2)
VALUES (值1, 值2);
-- 示例:插入 id=1 的学生,若 id=1 已存在则跳过
mysql> insert ignore into students(id,name,age)
values(1,'小张',11); -- 若 id=1 已存在,此语句无效果,不报错
- 插入时更新主键 / 唯一键冲突的数据(REPLACE)
适用场景: 若插入数据的主键 / 唯一键已存在,删除原数据后插入新数据(相当于 “覆盖更新”)。
-- 模板
REPLACE INTO 表名 (字段1, 字段2)
VALUES (值1, 值2);
-- 示例:插入 id=1 的学生,若 id=1 已存在则更新 name 和 age
replace into students(id,name,age)
values(1,'小张',13); -- 若 id=1 已存在,删除原记录后插入新记录
3.修改数据
-- 模板
UPDATE 表名
SET 字段1 = 新值1, 字段2 = 新值2
WHERE 唯一条件; -- 通常用主键筛选
-- 示例:修改 students 表中 id=1 的学生信息(姓名和年龄)
UPDATE students
SET name = 'new_张三', age = 19
WHERE id = 1; -- 用主键 id 定位唯一记录
-- 说明:
-- 1. 字符串新值需用单引号包裹(如 '张三_更新');
-- 2. 数值类型直接写新值(如 age = 19);
-- 3. WHERE 条件需确保唯一,避免误改多条记录。
4.删除数据
-- 模板
DELETE FROM 表名
WHERE 唯一条件; -- 通常用主键筛选
-- 示例:删除 students 表中 id=5 的学生记录
DELETE FROM students
WHERE id = 5; -- 用主键 id 定位唯一记录
-- 说明:
-- 1. 主键具有唯一性,确保只会删除一条记录;
-- 2. 执行前建议先用 SELECT 验证记录是否存在:
-- SELECT * FROM students WHERE id = 5;
4.4 AS 和 DISTINCT关键字
1.AS关键字
AS 用于给表、列或表达式起别名(Alias),使查询结果更易读,或简化复杂的表达式。
-- 给列起别名
select id as 用户id,name as 姓名 from students;
-- 省略 AS(可以直接用空格代替)
SELECT name 用户名 FROM students;
-- 给表起别名(常用于多表查询)
mysql> select s.name,s.id from students as s;
2. DISTINCT 关键字
DISTINCT 用于过滤查询结果中的重复记录,只返回唯一的值。
- 去除单列中的重复值
- 去除多列组合后的重复记录(所有指定列的值都相同时才视为重复)
-- 单列去重:查询所有不重复的名字
SELECT DISTINCT name FROM students;
-- 多列去重:查询不重复的(年龄+性别)组合
select distinct name,gender from students;
-- 与 COUNT 配合使用:统计不重复的名字数量
select count(distinct name) as 名字数量 from students;
DISTINCT作用于其后所有的列,而不仅仅是紧跟的那一列DISTINCT作用于其后所有的列,而不仅仅是紧跟的那一列
5.where条件查询
5.1基础比较查询(=, !=, >, <,>=, <=)
- 等于(=)
-- 查询性别为“男”的学生
SELECT * FROM students WHERE gender = '男';
- 不等于(!= 或 <>)
-- 查询年龄不等于19的学生
SELECT * FROM students WHERE age <> 19;
- 大于(>)和小于(<)
-- 查询年龄大于18且身高大于1.80的学生
mysql> select * from students where age > 18 and height > 1.8;
5.2.模糊查询(LIKE):% 和 _ 的区别
核心作用:按字符模式匹配,用于不确定完整内容的查询。
%符号:匹配任意长度的字符(包括 0 个字符)
-- 示例 1:查询姓名以 “张” 开头的学生
select * from students where name like '张%';
-- 示例 2:查询姓名里包含"李"的学生
select * from students where name like '%李%';
-- 示例 3:查询姓名以"李"结尾的学生
select * from students where name like '%李';
_符号:仅匹配单个字符(必须有且仅有一个字符)
-- 示例 1:查询姓名为两个字且第二个字是"李"的学生
select * from students where name like "_李";
-- 示例 2:查询姓名以"张"开头且总长度为 2 个字的学生
select * from students where name like "张_";
-- 示例 3:查询姓名中间有 "三" 且总长度为 3 个字的学生
select * from students where name like "_三_";
5.3 逻辑组合查询(AND, OR, NOT)
- AND(并且): 所有条件必须同时满足
-- 查询年龄18岁且性别为男的学生
select * from students where age=18 and gender = '男';
- OR(或者):至少满足一个条件
-- 查询身高为NULL,或者年龄小于18的学生
select * from students where height is null or age < 18;
- NOT(否定): 排除满足条件的记录
-- 查询姓名不是“小李”的学生
SELECT * FROM students WHERE NOT name = '小李';
5.4 范围查询(BETWEEN...AND... , IN)
- BETWEEN...AND...:匹配闭区间内的数值(包含边界)
-- 查询年龄在16到19岁之间的学生(包含16和19)
select * from students where age between 16 and 19;
- IN:匹配枚举列表中的任意一个值
-- 查询姓名为“小红”或“王五”的学生
select * from students where name in ('小红','王五');
5.5 空值查询(IS NULL, IS NOT NULL)
- 筛选 NULL 或非 NULL 的记录(注意: NULL 不能用
=或!=判断)。
-- 查询性别为NULL的学生
select * from students where gender is null;
-- 查询身高和性别都不为NULL的学生
select * from students where height is not null and gender is not null;
5.6 小结
- 模糊查询中,
%匹配任意长度字符,_仅匹配单个字符; - 逻辑运算符(AND/OR/NOT)用于多条件组合;
- 范围查询(BETWEEN/IN)适合已知可选值的场景;
- 空值必须用
IS NULL而非= NULL判断
6.排序
在 MySQL 中,使用ORDER BY子句对查询结果进行排序,它可以按照一个或多个列的值进行升序(ASC)或降序(DESC)排列。以下是ORDER BY子句的详细用法和示例:
6.1 按单列排序
- 升序排序(
ASC):ASC是升序排序的关键字,在ORDER BY子句中,ASC为默认排序方式,即如果不指定排序方式,默认就是升序。
-- 从students表中查询所有数据,并按照年龄(age)列进行升序排序
select * from students order by age asc;
-- 也可以省略ASC,效果相同
select * from students order by age;
- 降序排序(
DESC):如果要按照降序排序,需要明确指定DESC关键字。
-- 从students表中查询所有数据,并按照身高(height)列进行降序排序
mysql> select * from students order by height desc;
6.2 按多列排序
当需要按照多个列进行排序时,ORDER BY子句中列出多个列名,并且可以为每个列单独指定排序方式。MySQL 会先按照第一个列进行排序,如果第一个列的值相同,再按照第二个列进行排序,以此类推。
-- 从students表中查询所有数据,先按照年龄(age)升序排序,
-- 如果年龄相同,再按照身高(height)降序排序
select * from students order by age asc, height desc;
6.3 对表达式或函数结果排序
除了对表中的列进行排序,还可以对表达式或函数的计算结果进行排序。
-- 计算每个学生"当前年龄+5年后的年龄"的总和,并按这个总和降序排序
select id,name,age,(age+(age+5)) as age_sum from students order by age_sum desc;
6.4小结
ORDER BY子句必须放在查询语句的最后(除了LIMIT子句,LIMIT用于限制返回结果的行数,在有LIMIT时,ORDER BY在LIMIT之前)。- 将 NULL 视为极值,升序时作为最小值放最前,降序时作为最大值放最后。
7.分页查询
在 MySQL 中,分页查询通常使用 LIMIT 子句实现,用于限制查询结果返回的行数,适用于大量数据时分页展示(如网页中的第 1 页、第 2 页数据)。
基本语法:
SELECT 字段列表 FROM 表名
[WHERE 条件]
[ORDER BY 排序字段]
LIMIT 偏移量, 每页记录数;
- 偏移量: 表示从第几条记录开始查询(从 0 开始计数,即第一条记录偏移量为 0)。
- 每页记录数: 表示本次查询返回的最大记录数。
-- 示例 1:查询第 1 页数据(每页 3 条)
select * from students limit 0,3;
-- 示例 2:查询第 2 页数据(每页 3 条)
select * from students limit 3,3;
-- 示例 3: 分页 + 排序(按年龄降序, 每页 2 条)
select * from students order by age desc limit 0,2;
分页公式(通用)
若要查询第 n 页数据(每页显示 m 条),偏移量计算公式:
偏移量 = (n - 1) * m
LIMIT 位置: 必须放在查询语句的最后(在 ORDER BY 之后)。