一、前言
数据库是后端开发必不可少的核心工具,我们写的聊天系统、图书管理系统,所有用户信息、业务数据都需要存放在数据库中。很多刚接触后端的同学,对数据库概念陌生,分不清DDL、DML、DQL,写查询语句经常出错。本文从零开始,从概念、软件安装,到库、表操作,再到全套查询语句,全部搭配可直接复制运行的SQL示例,小白跟着敲代码就能学会。掌握本章,为后续JavaWeb开发铺路。
二、数据库基础与MySQL环境搭建
1、数据库相关概念
1.1 数据库
• 存储数据的仓库,数据是有组织的进行存储,运行在服务器上,可以持久保存数据
• 英文:DataBase,简称DB
1.2 数据库管理系统
• 管理数据库的大型软件
• 英文:DataBase Management System,简称DBMS
1.3 SQL
• 英文:Structured Query Language,简称SQL,结构化查询语言
• 操作关系型数据库的编程语言
• 定义操作所有关系型数据库的统一标准
1.4 常见的关系型数据库管理系统
• Oracle:收费的大型数据库,Oracle公司的产品
• MySQL:开源免费的中小型数据库。后来Sun公司收购了MySQL,而Sun公司又被Oracle收购
• SQL Server:MiscroSoft公司收费的中型的数据库。C#、.net等语言常使用
• PostgreSQL:开源免费中小型的数据库
• DB2:IBM公司的大型收费数据库产品
• SQLite:嵌入式的微型数据库。如:作为Android内置数据库
• MariaDB:开源免费中小型的数据库
2、MySQL安装/配置/登录/卸载
2.1 下载 安装解压
https://downloads.mysql.com/archives/community/

到对应官网下载压缩包,安装MySQL服务本体,提供数据库服务。
2.2 配置
2.2.1 添加环境变量
右键此电脑 → 属性,点击高级系统设置,点击环境变量,在系统变量中新建MYSQL_HOME,点击确定

确定后编译一下Path,添加bin目录

2.2.2 新建配置文件
新建一个文本文件,内容如下(更改设置mysql的安装目录和设置mysql数据库 的数据的存放目录(双斜线)):
sql
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
# 设置3306端口
port = 3306
# 设置mysql的安装目录
basedir = D:\\MySQL\\mysql-5.7.24-winx64
# 设置mysql数据库的数据的存放目录
datadir = D:\\MySQL\\mysql-5.7.24-winx64\\data
# 允许最大连接数
max_connections=20
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 创建模式
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
把上面的文本文件另存为,在保存类型里选所有文件(* . *),文件名叫my.ini,存放的路径为MySQL的根目录(例如我的是D:\MySQL\mysql-5.7.24-winx64,根据自己的MySQL位置修改)。

2.2.3 初始化MySQL
在cmd里面输入 mysqld --initialize-insecure,注意这里要用管理员方式运行cmd

回车后会发现文件夹下会多出一个新的文件夹data

2.2.4 注册MySQL服务
在cmd里敲入 mysqld -install,回车
bash
mysqld -install

现在计算机上已经安装好了MySQL服务了
2.2.5 启动MySQL服务
在cmd里敲入 net start mysql,回车
bash
net start mysql // 启动mysql服务
net stop mysql // 停止mysql服务

2.2.6 修改默认账户密码
在cmd里敲入 mysqladmin -u root password 1119,这里的1119就是指默认管理员(即root账户)的密码,可以自行修改。
bash
mysqladmin -u root password 1119

2.3 登录/退出MySQL
在cmd中敲入 mysql -uroot -p 后输入密码回车
bash
mysql -uroot -p

退出mysql(以下两种都可以):
bash
exit
quit

上面是连接本机的MySQL,如若要连接别人的MySQL,注意以下登陆参数:
bash
mysql -u用户名 -p密码 -h要连接的mysql服务器ip地址(默认127.0.0.1) -p端口号(默认3306)
2.4 卸载MySQL
① 敲入 net stop mysql ,回车
bash
net stop mysql
② 再敲入 mysql -remove mysql ,回车
bash
mysql -remove mysql
③ 最后删除MySQL目录及相关的环境变量
3、MySQL数据模型
关系型数据库
关系型数据库是建立在关系模型基础上的数据库,简单说,关系型数据库是由多张能互相连接的二维表组成的数据库。
数据库 → 多张数据表 → 表里面多行数据,每行分为多个字段(列)。
类比Excel:一个数据库=一个Excel文件;一张数据表=Excel里面的一个工作表。
• 优点
① 都是使用表结构,格式一致,易于维护
② 使用通用的SQL语言操作,使用方便,可用于复杂查询
③ 数据存储在磁盘中,安全

在MySQL里数据库就相当于硬盘上的文件夹
三、SQL简介、通用语法及分类
1、SQL简介
• 英文:Structured Query Language,简称SQL
• 结构化查询语言,一门操作关系型数据库的编程语言
• 定义操作所有关系型数据库的统一标准
• 对于同一个需求,每一种数据库操作的方式可能会存在一些不一样的地方,我们称为"方言"
2、SQL通用语法
① SQL语句可以单行或多行书写,以分号结尾
② MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
③ 注释
• 单行注释:-- 注释内容(一定要有空格,否则会报错) 或 #注释内容(MySQL特有)
• 多行注释:/* 注释 */
3、分类
• DDL(Data Definition Language)数据定义语言,用来定义数据库对象:数据库,表,列等
• DML(Data Manipulation Language)数据操作语言,用来对数据库中表的数据进行增删改
• DQL(Data Query Language)数据查询语言,用来查询数据库中表的记录(数据)
• DCL(Data Control Language)数据控制语言,用来定义数据库的访问权限和安全级别,及创建对象
四、DDL:库与表的管理语法
1、DDL操作数据库
1.1 查询所有数据库
sql
show databases;


1.2 创建数据库
• 创建数据库
sql
create database 数据库名称;


• 创建数据库(判断,如果不存在则创建)
sql
create database if not exists 数据库名称;

使用判断,即使存在该数据库也不会报错。

1.3 删除数据库
• 删除数据库
sql
drop database 数据库名称;

• 删除数据库(判断,如果存在则删除)
sql
drop database if exists 数据库名称;

1.4 使用数据库
• 查看当前使用的数据库
sql
select database();
• 使用数据库
sql
use 数据库名称;

2、DDL操作数据表
2.1 查询表
• 查询当前数据库下所有表名称
sql
show tables;

• 查询表结构
sql
desc 表名称;

2.2 创建表
sql
create table 表名(
字段名1 数据类型1,
字段名2 数据类型2,
...
字段名n 数据类型n
);
❗注意:最后一行末尾,不能加逗号

2.3 表的数据类型
• MySQL支持多种类型,可以分为三类:
• 数值
• 日期
• 字符串
|---------|-------------|------------------------------------|------------------|
| 分类 | 数据类型 | 大小/格式 | 描述 |
| 数值类型 | TINYINT | 1字节 | 小范围整数 |
| 数值类型 | SMALLINT | 2字节 | 中等范围整数 |
| 数值类型 | MEDIUMINT | 3字节 | 较大范围整数 |
| 数值类型 | INT/INTEGER | 4字节 | 大整数类型 |
| 数值类型 | BIGINT | 8字节 | 极大范围整数 |
| 数值类型 | FLOAT | 4字节 | 单精度浮点数 |
| 数值类型 | DOUBLE | 8字节,格式:score double(总长度,小数点后保留的位数) | 双精度浮点数 |
| 数值类型 | DECIMAL | | 小数值 |
| 日期和时间类型 | DATE | 格式为YYYY-MM-DD | 存储日期 |
| 日期和时间类型 | TIME | 格式为HH:MM:SS | 存储时间 |
| 日期和时间类型 | YEAR | 格式为YYYY | 存储年份 |
| 日期和时间类型 | DATETIME | 格式为YYYY-MM-DD HH:MM:SS | 存储日期和时间 |
| 日期和时间类型 | TIMESTAMP | | 存储时间戳 |
| 字符串类型 | CHAR | 0-255字节 | 定长字符串 |
| 字符串类型 | VARCHAR | 0-65535字节 | 变长字符串 |
| 字符串类型 | TINYBLOB | 0-255字节 | 不超过255个字符的二进制字符串 |
| 字符串类型 | TINYTEXT | 0-255字节 | 短文本字符串 |
| 字符串类型 | BLOB | 0-65535字节 | 二进制形式的长文本数据 |
| 字符串类型 | TEXT | 0-65535字节 | 长文本数据 |
| 字符串类型 | MEDIUMBLOB | 0-16777215字节 | 二进制形式的中等长度文本数据 |
| 字符串类型 | MEDIUMTEXT | 0-16777215字节 | 中等长度文本数据 |
| 字符串类型 | LONGBLOB | 0-4294967295字节 | 二进制形式的极大文本数据 |
| 字符串类型 | LONGTEXT | 0-4294967295字节 | 极大文本数据 |
2.4 修改表
2.4.1 修改表名
sql
alter table 表名 rename to 新的表名;

2.4.2 添加一列
sql
alter table 表名 add 列名 数据类型;

2.4.3 修改数据类型
sql
alter table 表名 modify 列名 新数据类型;

2.4.4 修改列名和数据类型
sql
alter table 表名 change 列名 新列名 新数据类型;

2.4.5 删除列
sql
alter table 表名 drop 列名;

2.5 删除表
• 删除表
sql
drop table 表名;

• 删除表时判断表是否存在
sql
drop table if exists 表名;

五、图形化客户端工具-Navicat
• Navicat for MySQL 是管理和开发 MySQL 或 MariaDB 的理想解决方案
• 这套全面的前端工具为数据库管理、开发和维护提供了一款直观而强大的图形界面
• 官网:http://www.navicat.com.cn
下载安装成功后连接本机MySQL

想要修改表,只需要右键点击设计表

要想在客户端工具里写SQL语句,只需要点击查询后,点击新建查询,在面板中就可以写SQL语句。写完的语句选中右键运行即可

六、DML:数据增删改操作
DDL改表结构 ,DML改表里真实的数据行。
1、添加数据 insert
1.1 给指定列添加数据
sql
insert into 表名(列名1,列名2,...) values(值1,值2,...);


1.2 给全部列(整行插入)添加数据
sql
insert into 表名 values(值1,值2,...);


1.3 批量添加数据(一次性插入多条)
sql
insert into 表名(列名1,列名2,...) values(值1,值2,...),(值1,值2,...)...;
insert into 表名 values(值1,值2,...),(值1,值2,...)...;


2、修改数据 update
sql
update 表名 set 列名1=值1,列名2=值2,... where 条件;
❗重点:不加 where 条件,会修改整张表全部数据!新手务必带上 where !!!

3、删除数据 delete
sql
delete from 表名 where 条件;
❗重点:不加where条件,清空整张表所有数据!!!

七、DQL:数据查询核心语法
DQL是开发使用最多,只读取数据,不会修改数据库内容,可以放心练习。
准备一张练习student表

• 基础查询 • 条件查询(where) • 分组查询(group by) • 排序查询(order by) • 分页查询(limit)
sql
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组后条件
order by
排序字段
limit
分页限定
1、基础查询
1.1 查询多个字段
sql
select 字段列表 from 表名;
select * from 表名; -- 查询所有数据


1.2 去除重复记录
sql
select distinct 字段列表 from 表名;

1.3 起别名
sql
as: as 也可以省略

2、条件查询
2.1 条件查询语法
sql
select 字段列表 from 表名 where 条件列表;
2.2 条件运算符
|---------------------|----------------------|
| 符号 | 功能 |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
| = | 等于 |
| <> 或 != | 不等于 |
| between ... and ... | 在某个范围内(都包含) |
| in(...) | 多选一 |
| like 占位符 | 模糊查询 _单个任意字符 %多个任意字符 |
| is null | 是null |
| is not null | 不是null |
| and 或 && | 并且 |
| or 或 || | 或者 |
| not 或 ! | 非,不是 |
• 查询年龄等于18岁

• 年龄大于19

• 年龄18并且性别女

• 分数80-100之间

• 模糊查询,名字以张开头

• 查询第二个是红的学生信息

3、排序查询 order by
sql
select 字段列表 from 表名 order by 排序字段名1 [排序方式1],排序字段名2 [排序方式2] ...;
排序方式:asc(升序排列,默认值),desc(降序排列)
注意:如果有多个排序条件,当前边的条件值一样时,才会根据第二条件进行排序
• 分数降序排序

• 先按年龄升序,年龄相同再按分数降序

4、聚合函数
4.1 概念
将一列数据作为一个整体,进行纵向计算。
4.2 聚合函数分类
|-----------|--------------------|
| 函数名 | 功能 |
| count(列名) | 统计数量(一般选用不为null的列) |
| max(列名) | 最大值 |
| min(列名) | 最小值 |
| sum(列名) | 求和 |
| avg(列名) | 平均值 |
4.3 聚合函数语法
sql
select 聚合函数名(列名) from 表名;
注意:null值不参与所有聚合函数运算
4.4 聚合函数演示
• 总记录数量

• 最高分

• 最低分

• 分数总和

• 平均分

5、分组查询 group by
sql
select 字段列表 from 表名 [where 分组前条件限定] group by 分组字段名 [having 分组后条件过滤];
注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义
❗where 和 having 区别:
• 执行时机不一样:where 是分组之前进行限定,不满足where条件,则不参与分组,而having是分组之后对结果进行过滤
• 可判断条件不一样:where 不能对聚合函数进行判断,having 可以
执行顺序:where > 聚合函数 > having
• 查询男同学和女同学各自的平均分

• 查询男同学和女同学各自的平均分,以及各自人数,要求:分数低于60分的不参与分组

• 查询男同学和女同学各自的平均分,以及各自人数,要求:分组之后人数大于两个的

select后面写的字段,要么是group by分组字段,要么是聚合函数,其他字段不要写。
6、分页查询 limit
sql
select 字段列表 from 表名 limit 起始索引,每页条数;
• 起始索引:从0开始
计算公式:起始索引=(当前页码-1)* 每页显示的条数
tips:
• 分页查询 limit 是MySQL数据库的方言
• Oracle 分页查询使用 rownumber
• SQL Server 分页查询使用 top
• 从0开始查询,查询2条数据

• 每页显示2条数据,查询第1页数据

• 每页显示2条数据,查询第2页数据

• 每页显示2条数据,查询第3页数据

7、小结
查询完整执行顺序:
from 表 → where条件 → group by分组 → having → select查询字段 → order by排序 → limit分页
八、结语
本篇完整覆盖MySQL入门阶段核心知识点,我们学习了数据库概念、环境部署、DDL库表操作、DML数据增删改、DQL各类查询。SQL是后端的基本功,多动手写练习SQL,避免只看不动手。掌握本篇内容,为后续JavaWeb、SpringBoot项目开发打下扎实基础。