1.MySQL介绍
1.1数据库介绍
数据库概念
数据库就是用于存储数据的一个空间
数据存储方式的发展史
甲骨文(材料太昂贵)竹简(太沉了,运输不方便)纸(易损坏)计算机(办公软件,传输不方便)互联网(数据库-管理)云存储(空间)
MySQL数据库的结构体系
常见的数据库
1.关系型数据库
a.MySQL(轻量级、简单易上手、开源、免费,缺点是安全系数低、存储量级小)
b.Oracle(重量级、收费,功能多且强大)
c.SQL Server(只能在微软的系统上使用)
2.非关系型数据库
a.MongoDB(不需要考虑安全、不考虑关系) 一般都是json数据(文档数据)
b.Redis(nosql,数据缓存)
MySQL的数据引擎(出过面试题)
InnoDB(MySQL的默认引擎,支持事务)MyISAM(不支持事务、效率高)MemoryArchive
2.MySQL安装及卸载
2.1 安装
a.在安装文件中创建指定的目录
b.配置文件
[mysql]# 设置mysql客户端默认字符集default-character-set=utf8[mysqld]# 设置3306端口port = 3306# 设置mysql的安装目录basedir=F:/mysql-8.0.22-winx64# 设置数据存储目录datadir=F:/mysql-8.0.22-winx64/data# 允许最大的连接数max_connections=20# 服务端的字符编码character-set-server=utf8# 表的默认存储引擎default-storage-engine=INNODB# 创建模式sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
c.服务安装
需要有vcruntime140_1.dll系统文件的支持
下载该.dll文件,直接下一步安装完成即可下载链接
执行初始化操作(用管理员权限打开CMD,切换到MySQL的安装目录中的bin目录下,因为需要执行mysqld.exe)
mysqld.exe --initialize
执行完成后,在data目录中存在一个后缀为.err的文件,其中localhost:后面的就是系统给默认的root账户生成的随机密码(在登录后进行修改)
安装服务
mysqld --install
d.启动服务
net start MySQL
e.关闭服务
net stop MySQL
也可以选择在服务中手动进行开启及关闭(CMD中输入下面的命令)
services.msc
f.环境变量配置(参考jdk配置方式)
g.登录命令
mysql -u root -p
h.退出
exit;
2.2 卸载
1.通过.msi文件进行安装的
a.打开计算机中的卸载或更改程序,找到mysql相关的服务(两个),进行卸载
b.msi文件默认的安装目录是在C盘下的C:\Program Files\MySQL,将该文件删除(通常:通过卸载程序卸载后,该文件就已经没有了)
c.找到C:\ProgramData目录(这是一个系统隐藏目录),其中就有MySQL文件,删掉
d.在cmd窗口中输入regedit打开注册表
e.建议重启电脑(防止注册表删除后没有立即生效)
2.解压方式,通过命令安装服务
a.安装文件删除(需要先将服务关闭)
b.删注册表
c.重启电脑
2.3 修改密码
在数据中是可以创建用户账号的,所以所有的用户信息,都在默认的mysql数据库中的user表中
alter user 'root'@'localhost' identified with mysql_native_password by '新密码';
3.MySQL基础语法
3.1 数据库操作
# 查看所有的数据库show databases;# 选择一个数据库use 数据库名;# 查看当前所在的数据库select database();# 创建数据库create database 数据库名;# 删除数据库drop database 数据库名;
3.2 数据类型
1.数字类型,包含了整数和小数
decimal是没有精度缺失败规的价格之类的使用double即可
2.字符类型(string)
char:代表字符,长度固定,容易浪费空间资源,但效率高
例如:年龄、手机号、身份证号、身高、婚姻状态、性别…
varchar:字符串,长度可变,不浪费空间,但效率低
3.日期类型
date:只有年月日
time:只有时分秒
year:只有年
datetime:年月日时分秒
timestamp:年月日时分秒(时间戳)
datetime和timestamp的区别
datetime默认值是是null,timestamp默认是当前系统时间
3.3 表操作
注意:所有对表的操作,前提是需要先选择数据库
# 查看表show tables;# 创建表create table 表名(field 数据类型 [约束],field...);# 例如 创建部门表create table t_depart(dno int,dname varchar(255),loc varchar(255));# 查看表结构desc 表名;# 删除表drop table 表名;# 修改表名rename table 旧表名 to 新表名;
3.3.1 表字段操作
# 添加字段alter table 表名 add field 数据类型 [约束];alter table depart add departphone varchar(11);# 修改字段数据类型alter table 表名 modify field 数据类型 [约束];alter table depart modify departphone char(11);# 修改字段名alter table 表名 change 老字段名 新字段名 数据类型;alter table depart change departphone phone char(11);# 删除指定字段alter table drop [column] field;alter table 表名 drop phone;
创建员工表
create table emp(eno int,ename varchar(50),sex varchar(5),birthday date,phone varchar(11),dno int);
3.3.2 设计规范
数据库中表的设计要遵循三范式,这是数据库通用的设计标准
第一范式:要求数据必须达到原子性,使其不可再分第二范式:要求数据必须具有唯一性,要消除数据之间的"部分依赖"(表中不能出现其它不相关的字段)第三范式:独立性,消除依赖传递
4.MySQL数据操作
对于数据的操作,就是增删改查(CURD),区别点在于实际对应的需求不同,所以写的SQL的复杂程度不同
4.1 添加数据
# 语法一 insert into 表名 values(值,...); 值的顺序与类型要和创建表时给定的字段顺序及类型保持一致insert into depart values(10,'研发部','上海市浦东新区XXX大厦16楼1603');# 语法二 insert into 表名(filed,...) values(值,...); 值的顺序与类型要和前面指定的字段的顺序及类型保持一致insert into emp(eno,ename,sex,phone,dno) values(1,'小阿飞','男','16864543487',10);# 批量添加数据 insert into 表名(field,...) values(val,...),(val,...),...;insert into depart values(20,'客服部','郑州市高新区中移在线5楼'),(30,'运维部','郑州市高新区中移在线3楼');
insert into emp values(2,'郑世豪','男','1997-01-05','13456469726',20),(3,'石坤坤','男','1999-09-05','16398949753',30),(4,'雷玉静','女','1998-05-25','13578974975',10),(5,'张甜甜','女','1998-04-02','13456789459',20),(6,'小戴','男','1994-04-25','15737156589',30);
4.2 修改数据
在进行数据的修改时要注意,如果没有指定条件的话,会将表中的所有的数据都进行修改
# 修改数据 update 表名 set field=val,field=val,... where 条件;update emp set birthday='2000-02-28' where eno=1;update emp set birthday='2000-02-27',phone='13687487469' where eno=1;
4.3 删除数据
在删除数据时要注意,如果没有指定条件的话,会将表中的数据清空
# 删除数据 delete from 表名 where 条件delete from depart where deptno=50;
# truncate 清空数据 truncate table 表名;truncate table depart;
4.4 查询数据
# 使用通配符*查看select * from 表名;# 查询指定字段的数据select ename,birthday,phone from emp;
思考:使用通配符和使用字段名的区别
*代表通配,需要先去表中查看表都有哪些字段,然后在匹配对应的字段信息
直接使用字段名,直接去表中匹配对应的字段
所以*会影响性能,开发要求不能使用通配符
5.MySQL关键字
5.1 排序
排序是对已经查出来的结果进行排序的
关键词:order by / desc(降序) asc(升序默认的)
# 需求:按编号进行降序排列select * from emp order by eno desc;# 需求:根据部门编号升序排列,如果部门一致,那就按照日期降序排列select * from emp order by dno asc,birthday desc;
5.2 运算符
# 需求:找出性别为男的员工制here sex='男';
5.3 连接符
# 需求:性别为男且部门为20的员工select * from emp where sex='男' and dno=20;# 需求:性别为男或部门编号为20的select * from emp where sex='男' or dno=20;# 需求:性别为男且部门编号为20的员工或员工id<5select * from emp where sex='男' and dno=20 or eno<5;
非空查询(is null)
# 需求:删除部门编号为空的数据delete from emp where dno is null;
5.4 in/not in
在in的括号中可以给定多个参数值,参数值之间的条件是或关系,且不一定非要满足
# 需求:查询指定部门的员工信息select * from emp where dno in(10,11,12,20,30,31,55,66,77);
5.5 聚合函数
行求和(如果列的值存在null,结果也是null,此时可以使用ifnull()进行运算时默认值的设置)
# 需求:求员工编号与部门编号的和select eno + dno from emp;# ifnull(arg0,arg1) arg0代表可能为null的列,arg1代表如果为空要进行代替的值select eno + ifnull(dno,0) from emp;
求总行数(count())
# 需求:求总行数 *代表以行数最多的结果为导向select count(*) from emp;# count也可以指定列,如果列中有null值,则不计入总数select count(dno) from emp;
求最大值(max())
# 求最大的部门编号select max(dno) from emp;
求平均值(avg())
# 求部门的平均值select avg(dno) from emp;
5.6 分组(group by)
根据数据中的某一个特征对数据进行划分,这种形式叫分组
# 需求:求男生和女生的人数select sex,count(sex) from emp group by sex;
having条件(结合group by使用,在分组的基础上再次进行筛选)
# 需求:求男生女生人数在3个以上的员工信息select sex,count(sex) from emp group by sex having count(sex)>3;
having和where有什么区别
1.where是直接跟在表的后面的条件,having是跟在group by后面的条件
2.having的使用需要结合group by,group by在进行分组的时候是很耗性能的
5.7 别名
别名仅仅只是在当前要显示的结果中生效,起到简化及通俗易懂的效果
关键词:as
# 需求:显示员工的信息(as可以省略不写)select eno as 员工编号,ename as 员工姓名,dno 部门编号 from emp;
5.8 分页(limit)
limit在MySQL中称为方言(该关键词只能在MySQL中使用)
语法:limit arg0,arg1; arg0代表起始下标(数据库中的下标是从0开始的),arg1代表要查询的条数
# 需求:查询前三条数据select * from emp limit 0,3;# 需求:查询第二页的数select * from emp limit 3,3;
5.9 模糊查询(like)
使用场景
根据区域查询信息、根据日期范围、根据姓查询、查询包含了某个字的数据等等
关键字符
a.% 任意字符(任意个数及任意字符)
# 查询以小字开头的员工select * from emp where ename like '小%';# 查询以13开头的手机号select * from emp where phone like '13%';# 查询以9结尾的手机号select * from emp where phone like '%9';#查询包含有89的手机号select * from emp where phone like '%8%9%';
b._ 单个的下划线代表一个任意的字符
# 找'小'的后面只有一个字符的姓名select * from emp where ename like '小_'
6. 约束
约束就是给字段添加对应的规则,用户在进行数据的操作时必须要符合对应的规则,才能进行操作,可以有效的保证数据的安全性
# 指定手机号不能为空alter table emp modify phone varchar(11) not null;
# 指定手机号是唯一的(null值是可以重复的)alter table emp modify phone varchar(11) unique;
# 指定手机号不能为null且唯一alter table emp modify phone varchar(11) not null unique;
# 指定员工编号为主键alter table emp modify eno int primary key;
思考:表中一定要存在主键嘛
建议每张表都要有一个主键,因为其他的字段中的数据可能存在重复的,就没有办法区分数据,所以主键的存在就是一个唯一标识
一般用户(程序员)会给每张表都设置一个id字段,作为主键,该字段如果是数字类型,为了方便管理,可以让其自增长(auto_increment)
# 让员工编号自增长alter table emp modify eno int auto_increment;
外键用于多张表之间的关联关系(主从关系)
# 给员工表中的部门编号设置外键约束alter table 表名 add constraint 约束名 foreign key(当前表中约束的字段) references 主表表名(要约束的字段名);alter table emp add constraint fk_emp_dno foreign key(dno) references depart(dno);
注意
1.主表中作为外键使用的字段要求一定是非空且唯一的
2.如果此时要删除主表中的数据,前提是该外键字段的值在从表中没有被使用
创建表时添加约束
create table salarys(sid int primary key auto_increment,salary double(8,2) not null,eno int not null,constraint fk_salarys_eno foreign key(eno) references emp(eno));
7. 多表查询
当多张表存在关联关系时,根据需求的不同可能会同时需要多张表一起使用
7.1 子查询
注意:每一个查询的SQL语句其结果本身就是一张表
将某个SQL的查询结果作为另一个SQL的查询条件
# 查询员工编号为7的员工所在的部门信息select dno,dname,loc from depart where dno=(select dno from emp where eno=7);
注意:= > <等等后面只能跟一个值(子查询的结果必须是唯一的)
# 查询性别为男的员工对应的部门信息select dno,dname,loc from depart where dno in(select dno from emp where sex='男');
7.2 多表查询
# 查询员工编号为7的员工信息及其所在的部门信息select depart.dno,dname,loc,eno,ename,sex,birthday,phone,emp.dno from depart,emp where eno=7 and emp.dno=depart.dno;
表别名(直接空格隔开,仅在本次查询中生效)
# 查询员工编号为7的员工信息及其所在的部门信息select d.dno,dname,loc,eno,ename,sex,birthday,phone,e.dno from depart d,emp e where eno=7 and e.dno=d.dno;
思考:使用别名的意义
1.为了简化,在开发过程中,为了让表信息更加的清晰,通常表名会很长
2.子查询中可能存在子查询的结果中的字段和其他表的字段名一样,此时就需要区分
7.3 连接查询
a.左连接 left join
以左边的表为主,查询出左边表中的所有数据和右边表中符合条件的数据,如果右表中的数据条数少于左表则以null代替
# 查看部门信息及对应的员工信息select d.*,e.* from depart d left join emp e on d.dno=e.dno;
b.右连接 right join
以右边表为主,查询出右边表中所有数据和左边表中符合条件的数据,如果左边表中的数据条数少于右边,则以null代替
# 查看部门信息及对应的员工信息select d.*,e.* from emp e right join depart d on e.dno=d.dno;
c.内连接 inner join
查询出符合条件的数据,不符合条件(on后面的条件)的数据直接过滤掉
# 查看已有员工的部门及员工信息select d.*,e.* from depart d inner join emp e on d.dno=e.dno;
d.合并查询 union/union all
将多张表中相同字段的结果在同一张表中显示出来
create table t_web(id int primary key auto_increment,name varchar(25) not null,country varchar(50) not null);insert into t_web values(1,'微博','cn'),(2,'Google','usa'),(3,'stactoverflow','ind');create table t_apps(id int primary key auto_increment,appname varchar(25) not null,country varchar(50) not null);insert into t_apps values(1,'QQ','cn'),(2,'wechat','cn');
select country from t_webunion allselect country from t_apps;
select country from t_webunionselect country from t_apps;
union和union all的区别
union all将两张表中的数据(相同字段)全部显示出来
union将两张表中的数据(相同字段)去重复后显示出来
8.常用函数
MySQL的底层使用的是SQL语言,该语言本身也类似于Java等开发语言,其中提供了相关的函数、子程序等等方式,以方便开发使用。
数据库的主要作用是用于存储数据的,而非做业务处理的,在数据库中处理业务是需要消耗性能的,因此,不建议在数据库中使用过多的函数,建议在开发语言中处理。
concat(arg0,arg1,…) 拼接
select concat('你','好','呀','!');# 使用mybatis框架进行模糊查询时的使用方案(假设变量名为name)select * from emp where ename like concat('%',name,'%');
now() 获取当前的系统时间
unix_timestamp() 获取当前时间的时间戳
date_format() 格式化日期
select date_format(now(),'%Y年%m月%d号 %H:%i:%s');
from_unixtime() 格式化时间戳
select from_unixtime(unix_timestamp(),'%Y年%m月%d号 %H:%i:%s');
mysql日期格式
常用函数与聚合函数的区别
聚合函数是直接操作数据的,函数是操作获取的数据的
9. 数据备份
每家公司通常都会有自己的服务器,存储公司相关的一些信息数据,在使用的过程中可能会出现需要进行数据迁移(搬家),为了防止数据丢失,可以进行数据备份
9.1 数据导出
导出数据需要退出MySQL的环境
语法:mysqldump -u root -p 数据库名 [表名] > 导出的地址
# 导出整个数据库(所有表-表结构及数据)mysqldump -u root -p tongbaishan > e:/tongbaishan.sql# 导出指定表mysqldump -u root -p tongbaishan emp > e:/emp.sql# 只导出表结构mysqldump -u root -p -d tongbaishan > e:/tongbaishan2.sql
9.2 数据导入
在数据中运行指定的SQL文件
注意:导入数据库前提是要先选择一个数据库
source e:/tongbaishan.sql
10.视图
视图就是一张虚拟的表(和表的使用方式【增删改查】类似)
使用场景
甲方公司简称A公司,乙方公司简称B公司,A公司将项目外包给了B公司,要求B公司派遣人员到A公司的办公地点进行办公(驻场办公),A公司的工作人员都需要有门禁权限,所以A公司需要给B公司的工作人员开权限(需要B公司将对应的开发人员的信息给到A公司),同时如果开发团队人员发生了改变,B公司需要及时将改变的情况和人员信息发给A公司
上述场景中需要考虑的问题
思考:B公司如何将人员的信息给到A公司
思考:给的信息中如何对保密的信息进行屏蔽处理(B公司的人员表中有很多员工,信息中包含公司的敏感信息)
思考:如果人员信息发生了改变,如何能够更方便快捷的将变更后的信息发送给甲方
思考:B公司承接了很多公司的外包项目,B公司就需要对应多家公司,上述的几个问题都需要进行再次考虑
语法:create view 视图名 as 查询语句;
create view v_a_empasselect ename,sex,phone from emp;
# 需求 查看部门的薪资总和select dno,sum(salary) from emp e join salarys s on e.eno=s.eno group by dno;
# 需求 计算部门的薪资总和create view v_sal asselect dno,sum(salary) total from emp e join salarys s on e.eno=s.eno group by dno;
注意点:在创建视图时,如果结果中的字段有使用函数或聚合函数,需要给一个别名作为视图中的字段名
# 尝试去修改视图中的薪资总和数据update v_sal set total=19500 where dno=10;#ERROR 1288 (HY000): The target table v_sal of the UPDATE is not updatable#v_sal表中不支持update操作
当视图中的数据修改后无法推断出原表中的数据应该如何改变时,该操作就不能执行
思考:通过哪些关键词或函数等创建出来的视图中的数据是不能进行修改操作的
聚合函数、分组等等
通常情况下,B公司在给出对应的视图后,需要提供一个账号给甲方公司,该账号是可以设置权限的(通常只给查询的权限)
总结
视图提高了数据的安全性,用户只能看到提供的数据,同时可以设置权限
简化用户操作复杂度,可以将复杂的SQL操作包装成视图,方便下次使用
Mysql(软件安装 Mysql基本语法 Mysql数据操作 Mysql关键字 约束 多表查询 Mysql多表查询 数据备份 数据导入 视图)