1.数据库

数据库就是存储和管理数据的仓库,数据按照一定格式进行存储,用户可以对数据库中的数据进行增加、修改、删除、查询等操作。

1.1.数据库的分类

  • 关系型数据库
  • 非关系型数据库

关系型数据库:

是指采用了关系模型来组织数据的数据库,简单来说,关系模型指的就是二维表格模型,好比Excel文件中的表格,强调使用表格的方式存储数据。

关系型数据库中核心元素

  • 数据行
  • 数据列
  • 数据表
  • 数据库(数据表的集合)

常用的关系型数据库:

  • Oracle
  • Microsoft SQL Server
  • Mysql
  • SQLite

非关系型数据库:

非关系型数据库,又被称为NoSQL(Not Only SQL),意为不仅仅是SQL,对NoSQL最普遍的定义是"非关联型的",强调Key-Value 的方式存储数据。

常用的非关系型数据库:

  • MongoDB
  • Redis

1.2.数据库的作用

数据库的作用就是存储和管理数据的,比如:我们在京东网站上的浏览的商品商品列表数据,这些数据都会存储在数据库。

用户浏览商品列表效果图:

image-20250908212748286

1.3.数据库的特点

1.持久化存储

2.读写速度极高

3.保证数据的有效性

1.4小结

  • 数据库就是存储和管理数据的一个仓库,用来持久化存储和快速读取数据的。
  • 数据库可以分为关系型数据库和非关系型数据库。

2.关系型数据库管理系统

2.1 关系型数据库管理系统的介绍

关系型数据库管理系统(Relational Database Management System,简称RDBMS)是为管理关系型数据库而设计的软件系统,如果想要使用关系型数据库就需要安装数据库管理系统。

关系型数据库管理系统可以分为:

  • 关系型数据库服务端软件
  • 关系型数据库客户端软件

关系型数据库服务端软件:

主要负责管理不同的数据库,而每个数据库里面会有一系列数据文件,数据文件是用来存储数据的,数据库就是一系列数据文件的集合

关系型数据库客户端软件:

主要负责和关系型数据库服务端软件进行通信,向服务端传输数据或者从服务端获取数据。

关系型数据库管理系统的效果图:

image-20250908214414505

说明:

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;
image-20250909170101174

4.修改表-修改字段类型

-- 基本语法
ALTER TABLE 表名
MODIFY COLUMN 字段名 新数据类型 [新约束条件];

示例:

alter table students modify birthday date not null;
image-20250909170332920

说明:

  • modify:只能修改字段类型或者约束,不能修改字段名

5.修改表-修改字段名和字段类型

-- 基本语法
ALTER TABLE 表名 
CHANGE COLUMN 旧字段名 新字段名 新数据类型 [约束条件];

示例:

alter table students change column birthday birth date null;
image-20250909184935658

说明:

  • 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 BYLIMIT之前)。
  • 将 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 之后)。