课程介绍
数据库:DataBase(DB),是存储和管理数据的仓库。
数据库管理系统:DataBase Management System(DBMS),操纵和管理数据库的大型软件。
SQL:Structured Query Language,操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准。
一、MySQL概述
1、安装
(1)解压并添加环境变量
文件解压后放到自己的路径中
添加环境变量

path环境变量中

验证

(2)对mysql初始化
管理员方式打开命令行输入mysqld --initialize-insecure
此时mysql的安装目录出现这个文件夹,存放mysql的数据文件

(3)注册MySQL服务
管理员方式命令行输入mysqld -install
(4)启动MySQL服务
管理员方式命令行输入net start mysql启动服务
管理员方式命令行输入net stop mysql停止服务
(5)修改默认账户密码
mysqladmin -u root password root
(6)登录MySQL
管理员方式命令行输入mysql -uroot -proot
语法:语法:mysql-u用户名-p密码-h数据库服务器IP地址 -P端口号 默认端口号为3306
(7)卸载
管理员方式命令行输入net stop mysql
mysqld -remove mysql
2、数据库模型
关系型数据库:建立在关系模型基础上,由多张相互连接的二维表组成的数据库。
二维表:有行有列的表
特点: 使用表存储数据,格式统一,便于维护。 使用SQL语言操作,标准统一,使用方便,可用于复杂查询。
mysql中创建数据库:create database db01;
此时在mysql的安装目录的data文件夹中就会出现db01的文件夹,代表该数据库
二、SQL语句
SQL:一门操作关系型数据库的编程语言,定义操作所有关系型数据库的统一标准。


1、数据库操作
sql
--查询所有数据库
show databases;
--查询当前数据库
select database();
--使用/切换数据库
use 数据库名;
--创建数据库
create database[if not exists]数据库名[default charset utf8mb4];
--删除数据库
drop database[if exists]数据库名;
注意:(不常用) 上述语法中的database,也可以替换成schema。
如:create schema dbo1;
MySQL8版本中,默认字符集为utf8mb4。
2、图形化工具
命令行:无提示、操作繁琐、无历史记录
常用的图形化工具

介绍:DataGrip是JetBrains旗下的一款数据库管理工具,是管理和开发MySQL、Oracle、PostgreSQL的理想解决方案。
官网:DataGrip | JetBrains for Data
(1)安装
- 安装完成之后双击安装.bat

-
输入激活码

点击Activate激活,continue
(2)创建项目
创建项目

输入项目名字

创建连接,下载驱动

测试连接,点击Apply和OK

(3)界面使用
-
界面介绍

-
若查询语句不小心关掉了,在这里重新打开

-
新建数据库


-
在这里删除数据库

同时刷新一下

3、表操作-创建
(1)语法
最后一个字段结尾不要加逗号
sql
create table tablename(
字段1 字段类型[约束][comment字段1注释],
字段2 字段类型[约束][comment字段2注释]
)[comment表注释];
在正在使用的数据库中创建表,例如db02
sql
-- 创建表(无约束)
create table user(
id int comment 'ID, 唯一标识',
username varchar(50) comment '用户名',
name varchar(10) comment '姓名',
age int comment '年龄',
gender char(1) comment '性别'
) comment '用户信息表';
此时在db02中会创建一个表,里面有这5个字段,鼠标悬浮可以查看备注信息

(2)插入数据

4、表操作-约束
约束:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
目的:保证数据库中数据的正确性、有效性和完整性。
(1)语法
非空约束:限制该字段值不能为null not null 唯一约束:保证字段的所有数据都是唯一、不重复的 unique 主键约束:主键是一行数据的唯一标识,要求非空且唯一 primary key 默认约束:保存数据时,如果未指定该字段值,则采用默认值 default 外键约束:让两张表的数据建立连接,保证数据的一致性和完整性 foreign key

主键自增关键字:auto_increment
sql
-- 创建表(约束)
create table user(
id int primary key auto_increment comment 'ID, 唯一标识', -- 主键约束 auto_increment
username varchar(50) not null unique comment '用户名', -- 非空 唯一
name varchar(10) not null comment '姓名', -- 非空
age int comment '年龄',
gender char(1) default '男' comment '性别' -- 默认
) comment '用户信息表';
(2)图形化图标解释

右下角钥匙代表主键约束
左边蓝框代表唯一约束
左下角圆圈代表非空约束
5、表操作-数据类型
(1)数值类型
| 类型 | 大小(byte) | 有符号(SIGNED)范围 | 无符号(UNSIGNED)范围 | 描述 | 备注 |
|---|---|---|---|---|---|
| tinyint | 1 | (-128,127) | (0,255) | 小整数值 | |
| smallint | 2 | (-32768,32767) | (0,65535) | 大整数值 | |
| mediumint | 3 | (-8388608,8388607) | (0,16777215) | 大整数值 | |
| int | 4 | (-2147483648,2147483647) | (0,4294967295) | 大整数值 | |
| bigint | 8 | (-2^63,2^63-1) | (0,2^64-1) | 极大整数值 | |
| float | 4 | (-3.402823466 E+38,3.402823466351 E+38) | 0 和 (1.175494351 E-38,3.402823466 E+38) | 单精度浮点数值 | float(5,2):5表示整个数字长度,2 表示小数位个数 |
| double | 8 | (-1.7976931348623157 E+308,1.7976931348623157 E+308) | 0 和 (2.2250738585072014 E-308,1.7976931348623157 E+308) | 双精度浮点数值 | double(5,2):5表示整个数字长度,2 表示小数位个 |
| decimal | 小数值(精度更高) | decimal(5,2):5表示整个数字长度,2 表示小数位个数 |
数值类型的选取原则: 在满足业务需求的前提下, 尽可能选择占用磁盘空间小的数据类型
例如
-
age tinyint unsigned
-
id int unsigned
(2)字符串类型
| 类型 | 大小 | 描述 |
|---|---|---|
| char | 0-255 bytes | 定长字符串 |
| varchar | 0-65535 bytes | 变长字符串 |
| tinyblob | 0-255 bytes | 不超过255个字符的二进制数据 |
| tinytext | 0-255 bytes | 短文本字符串 |
| blob | 0-65 535 bytes | 二进制形式的长文本数据 |
| text | 0-65 535 bytes | 长文本数据 |
| mediumblob | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
| mediumtext | 0-16 777 215 bytes | 中等长度文本数据 |
| longblob | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
| longtext | 0-4 294 967 295 bytes | 极大文本数据 |
以lob为结尾的是以二进制形式存储的
以text为结尾的是以普通文本存储的
数据库开发中主要用到前两个字符串类型
char(10): 固定占用10个字符空间; 存储A, 占用10个空间; 存储ABC, 占用10个空间;性能略高、浪费磁盘空间
varchar(10): 最多占用10个字符空间; 存储A, 占用1个空间; 存储ABC, 占用3个空间;节约磁盘空间、性能略低
例如:
-
username varchar(50)
-
idcard char(18)
-
phone char(11)
(3)日期时间类型
| 类型 | 大小(byte) | 范围 | 格式 | 描述 |
|---|---|---|---|---|
| date | 3 | 1000-01-01 至 9999-12-31 | YYYY-MM-DD | 日期值 |
| time | 3 | -838:59:59 至 838:59:59 | HH:MM:SS | 时间值或持续时间 |
| year | 1 | 1901 至 2155 | YYYY | 年份值 |
| datetime | 8 | 1000-01-01 00:00:00 至 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
| timestamp | 4 | 1970-01-01 00:00:01 至 2038-01-19 03:14:07 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值,时间戳 |
开发中常用到date和datetime类型
例如:
-
bithday date
-
operateTime datetime
(4)小结
1.数值类型在定义的时候,后面加了unsigned关键字是什么意思?
unsigned表示无符号类型,表示只能取o及正数
不加默认是signed,表示可以取负数
2.char与varchar的区别是什么?什么时候用char,什么时候用varchar?
char是定长字符串,varchar是变长字符串
如果一个字段的长度是固定的,建议使用char;如:身份证号、手机号
如果一个字段的长度不是固定的,建议使用varchar;如:用户名、姓名
6、表操作-设计案例2
(1)设计表过程
1.阅读并分析页面原型及需求
2.分析表中包含哪些字段,以及字段的类型、约束
3.创建表结构(添加基础字段id、create_time、update_time)
(2)设计员工表

sql
-- 案例: 设计员工表 emp
-- 基础字段: id 主键, create_time 创建时间, update_time 更新时间
create table emp (
id int unsigned primary key auto_increment comment 'ID,主键',
username varchar(20) not null unique comment '用户名',
password varchar(50) default '123456' comment '密码',
name varchar(10) not null comment '姓名',
gender tinyint unsigned not null comment '性别, 1:男, 2:女',
phone char(11) not null unique comment '手机号',
job tinyint unsigned comment '职位, 1:班主任, 2:讲师, 3:学工主管, 4:教研主管, 5:咨询师',
salary int unsigned comment '薪资',
entry_date date comment '入职日期',
image varchar(300) comment '头像',
create_time datetime comment '创建时间',
update_time datetime comment '更新时间'
) comment '员工表';
7、表操作-查询-修改-删除
(1)语法
sql
-- 查询当前数据库的所有表
show tables;
-- 查询表结构
desc 表名;
-- 查询建表语句
show create table表名;
-- 添加字段
alter table 表名 add 字段名类型(长度) [comment注释][约束];
-- 修改字段类型
alter table 表名 modify 字段名 新数据类型(长度);
-- 修改字段名与字段类型
alter table 表名 change 旧字段名 新字段名 类型(长度)[comment注释][约束];
-- 删除字段
alter table 表名 drop column 字段名;
-- 修改表名
alter table 表名 rename to 新表名;
-- 删除表
-- 注意:在删除表时,表中的全部数据也会被删除。
drop table[if exists]表名;
(2)案例
sql
-- 查询当前数据库所有表
show tables;
-- 查看表结构
desc emp;
-- 查询建表语句
show create table emp;
-- 字段: 添加字段 qq varchar(13)
alter table emp add qq varchar(13) comment 'QQ号码';
-- 字段: 修改字段类型 qq varchar(15)
alter table emp modify qq varchar(15) comment 'QQ号码';
-- 字段: 修改字段名 qq -> qq_num varchar(15)
alter table emp change qq qq_num varchar(15) comment 'QQ号码';
-- 字段: 删除字段 qq_num
alter table emp drop column qq_num;
-- 修改表名
alter table emp rename to employee;
-- 删除表
drop table employee;
(3)图形化操作
-
鼠标悬浮自动显示建表语句

-
修改表结构,右键表

新增字段

字段类型

三、数据操作语言
DML英文全称是DataManipulationLanguage(数据操作语言),用来对数据库中表的数据记录进行增、删、改操作。
添加数据(INSERT)
修改数据(UPDATE)
删除数据(DELETE)
1、insert
(1)语法
sql
-- 指定字段添加数据
insert into 表名(字段名1, 字段名2) values (值1, 值2);
-- 全部字段添加数据
insert into 表名 values (值1, 值2, ...);
-- 批量添加数据(指定字段)
insert into 表名 (字段名1, 字段名2) values (值1, 值2), (值1, 值2);
-- 批量添加数据(全部字段)
insert into 表名 values (值1, 值2, ...), (值1, 值2, ...);
(2)范例
sql
-- DML : 数据操作语言
-- DML : 插入数据 - insert
-- 1. 为 emp 表的 username, password, name, gender, phone 字段插入值
insert into emp(username, password, name, gender, phone) values ('songjiang','12345678','宋江',1,'13300001111');
-- insert into emp(username, password, name, gender, phone) values ('songjiang2songjiang222','12345678','宋江2',1,'13300001117');
-- 2. 为 emp 表的 所有字段插入值
-- 方式1:
insert into emp(id, username, password, name, gender, phone, job, salary, entry_date, image, create_time, update_time)
values(null, 'linchong','12345678','林冲',1,'13300001112',1,6000,'2020-01-01','1.jpg',now(),now());
-- 方式2:
insert into emp values(null, 'likui','12345678','李逵',1,'13300001113',1,6000,'2020-01-01','1.jpg',now(),now());
-- 3. 批量为 emp 表的 username, password, name, gender, phone 字段插入数据
insert into emp(username, password, name, gender, phone) values
('ruanxiaoer','12345678','阮小二',1,'13300001114'),('ruanxiaowu','12345678','阮小五',1,'13300001115');
(3)注意
1.插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
2.字符串和日期型数据应该包含在引号中(单引号、双引号都可以)。
3.插入的数据大小/长度,应该在字段的规定范围内。
2、update
(1)语法
sql
-- 修改数据
update 表名 set 字段名1 = 值1, 字段名2 = 值2, ... [where 条件];
(2)范例
sql
-- DML : 更新数据 - update
-- 1. 将 emp 表的ID为1员工 用户名更新为 'zhangsan', 姓名name字段更新为 '张三'
update emp set username = 'zhangsan' , name = '张三' where id = 1;
-- 2. 将 emp 表的所有员工的入职日期更新为 '2010-01-01'
update emp set entry_date = '2010-01-01';
(3)注意
修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。
2、delete
(1)语法
sql
-- 删除数据
delete from 表名 [where条件];
(2)范例
sql
-- DML : 删除数据 - delete
-- 1. 删除 emp 表中 ID为1的员工
delete from emp where id = 1;
-- 2. 删除 emp 表中的所有员工
delete from emp ;
(3)注意
1.DELETE语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。
2.DELETE语句不能删除某一个字段的值(如果要操作,可以使用UPDATE,将该字段的值置为NULL)。
四、DQL
DQL英文全称是Data Query Language(数据查询语言),用来查询数据库表中的记录。
关键字:SELECT


1、基础查询
(1)语法
sql
-- 查询多个字段
select 字段1,字段2,字段3 from 表名;
-- 查询所有字段(通配符)
select * from 表名;
-- 为查询字段设置别名,as关键字可以省略
select 字段1 [as 别名1], 字段2 [as 别名2] from 表名;
-- 去除重复记录
select distinct 字段列表 from 表名;
(3)范例
sql
-- =================== DQL: 基本查询 ======================
-- 1. 查询指定字段 name,entry_date 并返回
select name, entry_date from emp;
-- 2. 查询返回所有字段
-- 方式1: 推荐
select id, username, password, name, gender, phone, job, salary, entry_date, image, create_time, update_time from emp;
-- 方式2: 不推荐
select * from emp;
-- 3. 查询所有员工的 name,entry_date, 并起别名(姓名、入职日期),as可以省略
select name as 姓名, entry_date as 入职日期 from emp;
select name 姓名, entry_date 入职日期 from emp;
-- 4. 查询已有的员工关联了哪几种职位(不要重复) - distinct
select distinct job from emp;
2、条件查询
(1)语法
sql
-- 条件查询
select 字段列表 from 表名 where 条件列表;
(2)运算符


(3)范例
sql
-- =================== DQL: 条件查询 ======================
-- 1. 查询 姓名 为 柴进 的员工
select * from emp where name = '柴进';
-- 2. 查询 薪资小于等于5000 的员工信息
select * from emp where salary <= 5000;
-- 3. 查询 没有分配职位 的员工信息
select * from emp where job is null;
-- 4. 查询 有职位 的员工信息
select * from emp where job is not null ;
-- 5. 查询 密码不等于 '123456' 的员工信息
select * from emp where password != '123456';
select * from emp where password <> '123456';
-- 6. 查询 入职日期 在 '2000-01-01' (包含) 到 '2010-01-01'(包含) 之间的员工信息
select * from emp where entry_date between '2000-01-01' and '2010-01-01';
-- select * from emp where entry_date between '最小值' and '最大值';
-- 7. 查询 入职时间 在 '2000-01-01' (包含) 到 '2010-01-01'(包含) 之间 且 性别为女 的员工信息
select * from emp where entry_date between '2000-01-01' and '2010-01-01' and gender = 2;
select * from emp where (entry_date between '2000-01-01' and '2010-01-01') and gender = 2;
-- 8. 查询 职位是 2 (讲师), 3 (学工主管), 4 (教研主管) 的员工信息
select * from emp where job = 2 or job = 3 or job = 4;
select * from emp where job in (2,3,4);
-- 9. 查询 姓名 为两个字的员工信息 (_: 单个字符; % 任意个字符)
select * from emp where name like '__';
-- 10. 查询 姓 '李' 的员工信息
select * from emp where name like '李%';
-- 11. 查询 姓名中包含 '二' 的员工信息
select * from emp where name like '%二%';
(4)小结
1.如何进行null值的判断?
is null,is not null
2.模糊匹配中的通配符?
%[任意个字符】,_[一个字符】
3.如何组装多个查询条件?
and/or
3、分组查询
(1)聚合函数

sql
-- 聚合函数
-- 注意: 所有的聚合函数不参与null的统计
-- 1. 统计该企业员工数量 - count
-- count(字段)
select count(id) from emp;
-- count(*) : 推荐
select count(*) from emp;
-- count(常量): 推荐
select count(1) from emp;
-- 2. 统计该企业员工的平均薪资 - avg
select avg(salary) from emp;
-- 3. 统计该企业员工的最低薪资 - min
select min(salary) from emp;
-- 4. 统计该企业员工的最高薪资 - max
select max(salary) from emp;
-- 5. 统计该企业每月要给员工发放的薪资总额(薪资之和) - sum
select sum(salary) from emp;
(2)语法
sql
-- 分组查询
select 字段列表 from 表名[where 条件列表] group by 分组字段名 [having 分组后过滤条件];
where与having的区别:
1.执行时机不同:where是分组之前 进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
2.判断条件不同:where不能对聚合函数进行判断,而having可以。
(3)范例
sql
-- 分组
-- 注意: 分组之后, select后的字段列表不能随意书写, 能写的一般是 分组字段 + 聚合函数;
-- 1. 根据性别分组 , 统计男性和女性员工的数量
select gender, count(*) from emp group by gender;
-- 2. 先查询入职时间在 '2015-01-01' (包含) 以前的员工 , 并对结果根据职位分组 , 获取员工数量大于等于2的职位
select job, count(*) from emp where entry_date <= '2015-01-01' group by job having count(*) >= 2;
(4)注意
1,分组之后,查询的字段 一般为聚合函数和分组字段,查询其他字段无任何意义。
2.执行顺序:where>聚合函数>having。
4、排序查询
(1)语法
sql
-- 排序查询
select 字段列表 from 表名 [where 条件列表] [group by 分组字段名 having 分组后过滤条件] order by 排序字段排序方式;
排序方式:升序(asc),降序(desc);默认为升序asc,是可以不写的。
注意:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
(2)范例
sql
-- =================== 排序查询 ======================
-- 1. 根据入职时间, 对员工进行升序排序 - asc
select * from emp order by entry_date asc;
select * from emp order by entry_date;
-- 2. 根据入职时间, 对员工进行降序排序 - desc
select * from emp order by entry_date desc;
-- 3. 根据 入职时间 对公司的员工进行 升序排序 , 入职时间相同 , 再按照 更新时间 进行降序排序
select * from emp order by entry_date , update_time desc;
5、分页查询
(1)语法
sql
-- 排序查询
select 字段 from 表名 [where条件] [group by 分组字段 having 过滤条件] [order by排序字段] limit 起始索引,查询记录数;
说明:
起始索引从0开始。
分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
如果起始索引为0,起始索引可以省略,直接简写为limit 10。
(2)范例
sql
-- =================== 分页查询 ======================
-- 1. 从起始索引0开始查询员工数据, 每页展示5条记录
select * from emp limit 0,5;
select * from emp limit 5;
-- 2. 查询 第1页 员工数据, 每页展示5条记录
select * from emp limit 0,5;
-- 3. 查询 第2页 员工数据, 每页展示5条记录
select * from emp limit 5,5;
-- 4. 查询 第3页 员工数据, 每页展示5条记录
select * from emp limit 10,5;
-- 页码
-- 起始索引 = (页码 - 1) * 每页展示记录数