携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情
⭐️前面的话⭐️
✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《王道408》,📚《深入理解 Java 虚拟机-周志明》,📚《Java 核心技术卷》
💬算法刷题:✅力扣🌐牛客网
🎈Github
🎈码云Gitee
课程规划
基础篇
1. 概述(介绍、下载、安装)
介绍
主流的关系型数据库管理系统
下载和安装
-
社区版(MySQL Community Server):免费,MySQL不提供任何技术支持。
- 本课程采用的是 MySQL 的最新社区版(MySQL Community Server 8.0.26)。
-
商业版(MySQL Enterprise Edition):收费,可以试用30天,官方提供技术支持。
-- 启动、停止(mysql80是注册到系统服务的服务名称)
net start mysql80
net stop mysql80
-- 连接
(1)MySQL提供的客户端命令行工具
(2)系统自带的命令行工具执行指令(使用这种方式时,需要配置PATH环境变量。)
mysql [-h 127.0.0.1][-p 3306] -u root -p
# 参考:https://blog.csdn.net/u010565545/article/details/104961184
# 彻底卸载(查找后全部卸载)
[root@192 bin]# find / -name mysql
/data/mysql
/data/mysql/mysql
/usr/share/mysql
/usr/local/mysql
...
/etc/rc.d/init.d/mysql
/var/lib/mysql
[root@192 bin]# rm -rf /data/mysql
[root@192 bin]# rm -rf /data/mysql/mysql
[root@192 bin]# rm -rf /usr/share/mysql
...
[root@192 bin]# rm -rf /var/lib/mysql
# 安装
## (1)下载并上传到/usr/local目录下,解压,重命名
https://dev.mysql.com/downloads/mysql/
[root@192 local]# tar -Jxf mysql-8.0.27-linux-glibc2.12-x86_64.tar.xz
[root@192 local]# mv mysql-8.0.27-linux-glibc2.12-x86_64 mysql8
## (2) 创建用户,并给数据目录赋予权限(出错的话试下绝对路径)
[root@192 sbin]# /usr/sbin/groupadd mysql
[root@192 sbin]# /usr/sbin/useradd -g mysql mysql
[root@192 sbin]# chown -R mysql.mysql /usr/local/mysql8
[root@192 sbin]# chmod 750 /usr/local/mysql8/data/ -R
## 添加到PATH变量中
$ export PATH=$PATH:/usr/local/mysql8/bin
## (3) 修改配置文件(内容错误将导致初始化失败)
[root@192 bin]# vim /etc/my.cnf
## (4) 初始化mysql
[root@192 bin]# ./mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql8 --datadir=/usr/local/mysql8/data --user=mysql --initialize
--defaults-file=/usr/local/etc/my.cnf 指定配置文件(一定要放在最前面,至少 --initialize 前面)
--user=mysql 指定用户(很关键)
--basedir=/usr/local/mysql/ 指定安装目录
--datadir=/usr/local/mysql/data/ 指定初始化数据目录
## 查看mysql.log初始密码并复制出来:qcVusjboq7;y
[root@192 bin]# cat /usr/local/mysql8/mysql.log
[Server] A temporary password is generated for root@localhost: qcVusjboq7;y
## (5) 启动mysql,查看是否启动。
[root@VM-24-10-centos bin]# ./mysqld_safe --defaults-file=/etc/my.cnf &
[root@VM-24-10-centos bin]# ps -ef|grep mysql
[root@VM-24-10-centos bin]# ./mysql -u root -p
## (6)修改root 新密码123456。初始化设置。
ALTER USER 'root'@'localhost' IDENTIFIED with mysql_native_password BY '123456';
flush privileges; # 刷新权限
### 首次改密推荐使用本地密码插件with mysql_native_password
use mysql;
select user,host,plugin,authentication_string from user;
CREATE user 'root'@'%'; # 创建用户任意远程访问
alter user 'root'@'%' identified with mysql_native_password by '123456'; # 修改密码
grant all privileges on *.* to "root"@"%"; # 给用户授权
flush privileges; # 刷新权限
## (7)环境变量配置
### 这是由于系统默认会查找/usr/bin下的命令,如果这个命令不在这个目录下,当然会找不到命令。
### 我们需要做的就是映射一个链接到/usr/bin目录下,相当于建立一个链接文件。
### 首先得知道mysql命令或mysqladmin命令的完整路径,比如mysql的路径是/usr/local/mysql/bin/mysql
ln -s /usr/local/mysql8/bin/mysql /usr/bin
### 还有其它常用命令mysqladmin、mysqldump等不可用时候都可按用此方法解决。
关系模型
2. SQL(操作MySQL的语言)(核心部分)
关键字建议使用大写
SQL分类
DDL(库表字段定义)
- 库操作
-- 查询所有数据库
show databases;
-- 使用
use 数据库名;
-- 查询当前数据库
select database();
-- 创建
create database [if not exists] 数据库名 [default charset 字符集] [collate 排序规则];
-- 删除
drop database [if exists] 数据库名;
- 表操作
-- 查询当前数据库所有表
show tables;
-- 查询表结构
desc 表名;
-- 查询指定表的建表语句
show create table 表名;
-- 创建表
create table user
(
id bigint auto_increment comment 'id'
primary key,
username varchar(256) null comment '用户名',
userAccount varchar(256) null comment '登录账号',
avatarUrl varchar(256) null comment '头像',
gender tinyint null comment '性别',
userPassword varchar(512) null comment '密码',
phone varchar(128) null comment '电话',
email varchar(128) null comment '邮箱',
userStatus int default 1 not null comment '状态 0 - 正常',
createTime datetime default CURRENT_TIMESTAMP null comment '创建时间',
updateTime datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '更新时间',
isDeleted tinyint default 0 not null comment '是否逻辑删除',
userRole int default 0 null comment '角色 0-普通用户 1-管理员'
)
comment '用户表';
-- 添加字段
alter table 表名 add 字段名 类型(长度)[comment 注释][约束]
// 为emp表增加一个新的字段”昵称”为nickname,类型为varchar(20)
alter table emp add nickname varchar(20) comment '昵称';
-- 修改数据类型
alter table 表名 modify 字段名 新数据类型(长度);
-- 修改字段名和字段类型
alter table 表名 change 旧字段名 新字段名 类型(长度)[comment 注释][约束];
// 将emp表的nickname字段修改为username,类型为varchar(30)
alter table emp change nickname username varchar(30) comment '昵称';
-- 删除字段
alter table 表名 drop 字段名;
-- 修改表名
alter table 表名 rename to 新表名;
-- 删除表
drop table [if exists] 表名;
-- 删除指定表,并重新创建该表
truncate table 表名;
// 注意:在删除表时,表中的全部数据也会被删除。
MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型。
根据需求创建表(设计合理的数据类型、长度)
设计一张员工信息表,要求如下:
1. 编号(纯数字)
2. 员工工号 (字符串类型,长度不超过10位)
3. 员工姓名(字符串类型,长度不超过10位)
4. 性别(男/女,存储一个汉字)
5. 年龄(正常人年龄,不可能存储负数)
6. 身份证号(二代身份证号均为18位,身份证中有X这样的字符)
7. 入职时间(取值年月日即可)
MySQL图形化界面
DML(表的增删改)
- 添加数据(INSERT)
- 修改数据(UPDATE)
- 删除数据(DELETE)
insert into 表名 (字段名1,字段名2,...) values (值1,值2,...);
insert into 表名 values (值1,值2,...);
-- 批量添加
insert into 表名 (字段名1,字段名2,...) values (值1,值2,...),(值1,值2,...),(值1,值2,...);
insert into 表名 values (值1,值2,...),(值1,值2,...),(值1,值2,...);
// 字符串和日期型数据应该包含在引号中。
-- 修改数据
update 表名 set 字段名1=值1,字段名2=值2,...[where 条件];
// 注意:修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。
-- 删除数据
delete from 表名 [where 条件];
// 注意:DELETE 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。
DQL(表的查询)
-- 基本查询
select 字段1 [as 别名1],字段2 [as 别名2],字段3 [as 别名3],... from 表名;
select * from 表名;
select distinct 字段列表 from 表名;
// 注意 : * 号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)。
-- 条件查询
select 字段列表 from 表名 where 条件列表;
-- 聚合函数:将一列数据作为一个整体,进行纵向计算 。
count: 统计数量
max: 最大值
min: 最小值
avg: 平均值
sum: 求和
select 聚合函数 (字段列表) from 表名;
// 注意 : null值不参与所有聚合函数运算。
-- 分组查询 group by
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];
// where与having区别
// 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
// 判断条件不同:where不能对聚合函数进行判断,而having可以。
// 执行顺序: where > 聚合函数 > having 。
// 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
-- 排序查询 order by
select 字段列表 from 表名 order by 字段1 排序方式1, 字段2 排序方式2;
// ASC:升序 (默认值)
// DESC:降序
// 注意:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
-- 分页查询 limit
select 字段列表 from 表名 limit 起始索引 查询记录数;
// 起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。
// 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
// 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。
// 练习
1. 查询年龄为20,21,22,23岁的员工信息。
2. 查询性别为 男 ,并且年龄在 20-40 岁(含)以内的姓名为三个字的员工。
3. 统计员工表中, 年龄小于60岁的 , 男性员工和女性员工的人数。
4. 查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按入职时间降序排序。
5. 查询性别为男,且年龄在20-40 岁(含)以内的前5个员工信息,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序。
执行顺序
DCL(访问权限控制)
用户管理
-- 查询用户
use mysql;
select * from user;
-- 创建用户
create user '用户名'@'主机名' identified by '密码';
-- 修改用户密码
alter user '用户名'@'主机名' identified with mysql_native_password by '新密码';
-- 删除用户
drop user '用户名'@'主机名'
// 主机名可以使用 % 通配。
// 这类SQL开发人员操作的比较少,主要是DBA( Database Administrator 数据库管理员)使用。
权限控制
MySQL中定义了很多种权限,但是常用的就以下几种:
| 权限 | 说明 |
|---|---|
| ALL, ALL PRIVILEGES | 所有权限 |
| SELECT | 查询数据 |
| INSERT | 插入数据 |
| UPDATE | 修改数据 |
| DELETE | 删除数据 |
| ALTER | 修改表 |
| DROP | 删除数据库/表/视图 |
| CREATE | 创建数据库/表 |
-- 查询权限
show grants for '用户名'@'主机名';
-- 授予权限
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
-- 撤销权限
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
// 多个权限之间,使用逗号分隔
// 授权时, 数据库名和表名可以使用 * 进行通配,代表所有。
3. 函数(功能强大的内置函数、其应用场景)
是指一段可以直接被另一段程序调用的程序或代码。
字符串函数
| 函数 | 功能 |
|---|---|
| concat (S1,S2,...Sn) | 字符串拼接,将 S1,S2 ,...Sn 拼接成一个字符串 |
| lower(str) | 将字符串 str 全部转为小写 |
| upder(str) | 将字符串 str 全部转为大写 |
| lpad(str, n ,pad) | 左填充,用字符串 pad 对 str 的左边进行填充,达到 n 个字符串长度 |
| Rpad(str, n ,pad) | 左填充,用字符串 pad 对 str 的右边进行填充,达到 n 个字符串长度 |
| trim(str) | 去掉字符串头部和尾部的空格 |
| substring(str, start, len) | 返回字符串 str 从 start 位置起的 len 个长度的字符串 |
select 函数(参数);
// 练习:由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0。比如: 1号员
工的工号应该为00001。
数值函数
| 函数 | 功能 |
|---|---|
| ceil(x) | 向上取整 |
| floor(x) | 向下取整 |
| mod(x/y) | 返回 x/y 的模 |
| rand() | 返回 0~1 内的随机数 |
| rand(x, y) | 求参数 x 的四舍五入的值,保留 y 位小数 |
//通过数据库的函数,生成一个六位数的随机验证码。
日期函数
| 函数 | 功能 |
|---|---|
| curdate() | 返回当前日期 |
| curtime() | 返回当前时间 |
| now() | 返回当前日期和时间 |
| yesr(date) | 获取指定 date 的年份 |
| month(date) | 获取指定 date 的月份 |
| day(date) | 获取指定 date 的日期 |
| date_add(date, interval expr type) | 返回一个日期/时间值加上一个时间间隔 expr 后的时间值 |
| datediff(date1, date1) | 返回起始时间 date1 和 结束时间 date2 之间的天数 |
// 查询所有员工的入职天数,并根据入职天数倒序排序。
流程函数
流程函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率。
| 函数 | 功能 |
|---|---|
| if(value, t, f) | 如果 value 为 true,则返回t ,否则返回f |
| ifnull(value1, value2) | 如果 value 不为空,返回value1 ,否则返回value2 |
| case when [val1] then [res1] ... else [default] end | 如果 val1 为true ,返回res1 , 否则返回 default 默认值 |
| case [expr] when [val1] then [res1]... else [default] end | 如果 expr 的值等于val1 ,返回res1 , 否则返回 default 默认值 |
统计班级各个学员的成绩,展示的规则如下:
• >= 85,展示优秀
• >= 60,展示及格
• 否则,展示不及格
1. 字符串函数
concat lower upper lpad rpad trim sunstring
2. 数值函数
ceil floor mod rand round
3. 日期函数
curdate curtime now year month day date_add adtediff
4. 流程函数
if ifnull case[...]when...then...else...end
\