一、简述MySQL
MySQL 是最流行的关系型数据库管理系统之一,由Oracle公司开发、发布和支持。关系型数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
为了提高存储速度,结构化数据是有组织的存放在物理文件中。数据库、表格、视图、行和列等对象的逻辑模型提供了灵活的编程环境。你可以在指向不同表格的不同数据字段中设置对应关系的规则,如一对一、一对多、唯一、必须和可选。数据库强制执行这些规则,因此,在一个设计良好的数据库中,应用程序永远不会看到不一致的、重复的或者孤立的、过期或者丢失的数据。
数据库的特点:
- 持久化存储数据;其实数据库就是一个文件系统
- 方便存储和管理数据
- 使用了统一的方式操作数据库。(sql语句)
二、连接数据库
这里使用的数据库软件是 navicat
数据库版本是 8.0.26
使用navicat连接数据库
三、创建数据库(了解)
这里我们选择InnoDB引擎、utf8mb4和utf8mb4_general_ci
操作数据库(了解)(后面可以使用可是化操作来创建数据库)
1、【创建】数据库——【create】 database if not exits +数据库名
2、【删除】数据库:【drop】 database +[if exists] +数据库名;
3、【使用/切换】数据库 :【use】 +数据库名 ;
4、【查看】 所有的数据库 :【show】 +databases;
四、创建数据表(设置字段)
1、删除表
drop table [if exists] 表名
2、创建表(并设置存储引擎)
语法:
create table [if not exists] `表名`(
`字段名` 列类型 [属性] [索引] [注释]
`字段名` 列类型 [属性] [索引] [注释]
......
`字段名` 列类型 [属性] [索引] [注释]
)[表类型][字符集设置][注释]
例1:
--创建一个用户表
CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT,
`username` varchar(32) COLLATE utf8mb4_bin NOT NULL,
`password` varchar(32) COLLATE utf8mb4_bin NOT NULL,
PRIMARY KEY (`id`) --主键
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
例2:
【 表的字段属性说明】
- Unsigned:无符号的整数,
·声明该列后【不能为负数】 - zerofill:【0填充的】
·不足的位数,使用0填充,int(3), 5—005 - Auto_InCrement :【自增】:
·自动在上一条记录上+1(默认)
·用来设计唯一的主键~index,必须是整数类型
·可以自定义设计主键自增的起始值和步长 - NULL和NOT NULL 空与非空
默认为NULL,即没有插入该列的数值
如果设置为NOT NULL,则该列必须有值,如果不填写值 就会报错 - DEFAULT :默认的
·用于设置默认值
·例如,性别字段,默认为"男”,否则为“女”;若无指定该列的值﹐则默认值为"男"的值 - comment’…’ ----注释信息…
- 主键primary key (`id`)一般一个表只有1个,放到最后面
- COLLATE :对于mysql中那些字符类型的列,如VARCHAR,CHAR,TEXT类型的列,都需要有一个COLLATE类型来告知mysql如何对该列进行排序和比较。COLLATE通常是和数据编码(CHARSET)相关的,一般来说每种CHARSET都有多种它所支持的COLLATE,并且每种CHARSET都指定一种COLLATE为默认值。例如Latin1编码的默认COLLATE为latin1_swedish_ci,GBK编码的默认COLLATE为gbk_chinese_ci,utf8mb4编码的默认值为utf8mb4_general_ci。
附:【可视化操作】查看创建的数据库/表语句
1、查看创建的数据库语句
show create database +数据库名
【建议:如果想跟我创建一样的数据库可以使用下面的语句(创建跟我一样的后面的举例也运行来看看效果)】
CREATE DATABASE `db001` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin */ /*!80016 DEFAULT ENCRYPTION='N' */
2、查看创建的数据表语句(同上)
show create table +表名
【建议:创建跟我一样的数据表,方便后面查看运行效果】
CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
`age` int DEFAULT NULL,
`password` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL,
`Math` int DEFAULT '0',
`English` int DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
五、alter table修改表的字段(列)
1、修改表名
alter table 旧表名 【rename as】 新表名
2、添加字段
alter table 表名 【add】 字段名 +列属性
alter table 表名 add age int(11)
3、修改表的字段
——3.1修改表的约束类型(列属性)
alter table 表名 【modify】 字段名 新的列属性[]
alter table 表名 modify age varchar(11)
——3.2修改表的字段名
alter table 表名 【change】 旧名字 新名字 (新的)列属性[]
alter table 表名 change age age1 int(10)
说明:字段重命名包括修改约束、但是一般只用来重命名
4、删除表的字段
alter table 表名 【drop】 字段名(列)
六、 MySQL数据管理
DML:数据操作语言
DML(database manage language):数据库操作语言
作用:操作表中的值/数据
0、建议:插入我准备的数据
插入我准备的数据,后面可以同样运行看看效果
1、插入数据【insert into】
insert into 表名(字段名1,字段2,字段3) values(‘值1’),(‘值2’),(‘值3’),(…)
注意事项:
- 字段与字段之间使用英文逗号,末尾不能以逗号结尾
- 可以插入多条数据value(), (), ()
- 如果不写表的字段,从主键开始,默认一一匹配
-- 插入单独字段名,及对应内容
INSERT INTO `user`(`name`) VALUE('小明'),('小红'),('小白')
-- 插入字段及多个内容多条内容
INSERT INTO `user`(`name`,`password`) VALUE('小黑','123'),('小紫','456')
2、更新/修改数据
语法:【update】 表名 【set 】列名=新的值 where [条件]
注意:必须添加条件,否则会将对应表的字段中所有的数据修改
【条件】:where +条件
条件的返回值为Boolean类型 如果为ture才执行
where可以 通过多个条件定位数据,无上限 &&(and) 与 ||(or)
--修改单个属性
update `user` set `name`='长江七号' where id = 1
--修改多个字段属性 用逗号隔开
update `user` set `name`='长江六号' ,`password`= '8888' where id = 2
3、删除数据
语法:【delete】 from 表名 where 条件
注:如果不添加条件,会导致对应表所有的数据被删除
--删除指定数据
DELETE FROM `user` WHERE id = 3
--删除该数据表的所有数据
DELETE FROM `user`
DQL 数据库查询语言【最重要】
Select完整语法
select [distinct]
字段名1 [as +别名], ...
from 表名
DQL是数据库中最核心的语言,最重要的语句,使用频率最高
基础查询:
语法:
select +字段
from +表名
备注:*代表全部字段,如果想查询多个字段可以用 , 隔开
1、查询多个字段
-- 查询学生信息,*代表全部 (不过公司可能不让使用——写注释)
SELECT * FROM `user`
-- 查询(多个)指定字段
SELECT `id`,`name`FROM `user`
2、字段注释
以后假如查询的字段非常多,一般会使用注释来说明(这样就会显得想要查询的字段非常清晰,下面只是列举两个)
3、相同数据去重 distinct
SELECT DISTINCT username FROM user
备注:去重只会【去除完全重复的数据】
1、如果你查询的是username字段,不会显示重复的名字
2、如果你查询的是全部字段,仍然会显示两个重复的名字(因为他们的id不同)
4、起别名 as
可以给表、给字段起别名
作用 :
1、可以显示到查询的数据上面
2、如果涉及重复使用且多个表的查询,可以通过表的别名来使用表
SELECT username as 用户名, `password` as 密码 from user as u
5、显示的结果拼接字符串——函数 :concat(a,b)
可以用于拼接字符串并且显示到查询出来的数据中
注”字符串用’‘ 包围
6、计算多列的值
备注1:两个字段相加 不可以在左右两边加上`` 否则会报错,因为这是一个表达式,而不是字段
SELECT `name`,`Math`,`English`,Math + English as 总分 FROM `user`
备注2:null与任何值计算都为null,但是我们想要的总分是100
——使用函数ifnull(a,b)
a代表需要判断是否为null的数据
b代表替换值
SELECT `name`,`Math`,`English`,Math + IFNULL(English,0)as 总分 FROM `user`
条件查询:
语法 : where +条件
1、常规运算符查询
--比较运算
SELECT * FROM `user` WHERE age > 5
SELECT * FROM `user` WHERE age >= 5
SELECT * FROM `user` WHERE age = 5
SELECT * FROM `user` WHERE age != 5
SELECT * FROM `user` WHERE age >= 5 && age <= 7 -- 和between..and等价
SELECT * FROM `user` WHERE age >= 5 and age <= 7 -- 和between..and等价
SELECT * FROM `user` WHERE age BETWEEN 5 and 7 -- [5,7]
SELECT * FROM `user` WHERE age = 5 or age = 7 or age = 9 -- 等价于下面的in
SELECT * FROM `user` WHERE age in (5,7,9)
--备注:null不能使用 = 和 != 去判断
SELECT * FROM `user` WHERE English = null -- 错误
SELECT * FROM `user` WHERE English is null --正确
2、like(模糊查询)
【占位符】
% 代表0到任意个字符
_ 代表一个字符
查询以小开头的用户名
查询 以小开头(小后面只有1个字)
查询 以小开头(小后面只有2个字)
查询名字是2个字的人
SELECT * FROM user WHERE name like '__'
排序查询
语法 :order by +子句
order by排序字段1排序方式1,排序字段2排序方式2…
排序方式:
ASC:升序,默认的。
DESC:降序。
注意:
*如果有多个排序条件,则当前边的条件值―样时,才会判断第二条件。
SELECT * FROM user ORDER BY Math
SELECT * FROM user ORDER BY Math ASC -- 等价于上方
SELECT * FROM user ORDER BY Math DESC
-- 优先按照第一个排序方式排序,假如第一个数据相同,再按照第二个排序方式排序
SELECT * FROM user ORDER BY Math DESC, English asc
聚合函数
聚合函数:将一列数据作为一个整体,进行纵向的计算。
- count :计算个数
- 一般选择非空的列:主键
- count(*)
- max :计算最大值
- min :计算最小值
- sum:计算和
- avg :计算平均值
*注意:聚合函数的计算,会排除null值。
解决方案︰
1、选择不包含非空的列进行计算(id或者*)
2、IFNULL函数
select count(id) FROM user
select count(*) FROM user -- 不推荐
select max(math) FROM user
select min(math) FROM user
select avg(math) FROM user
select sum(math) FROM user
select count(ifnull(English,0)) FROM user
分组group by和过滤 having
分组查询:
1.语法︰group by 分组字段;
-- 按照性别分组,查询男女同学的数学平均分
SELECT sex ,avg(math) FROM `user` GROUP BY sex
SELECT sex ,avg(math) ,count(id) as 人数 FROM `user` GROUP BY sex
-- 按照性别分组,查询男女同学的数学平均分,要求:分数大于60才参与筛选,
SELECT sex ,avg(math) ,count(id) as 人数 FROM `user` where math >60 GROUP BY sex
-- 按照性别分组,查询男女同学的数学平均分,要求:分数大于60才参与筛选, 分组之后,人数要大于2人
SELECT sex ,avg(math) ,count(id) as 人数 FROM `user` where math >60 GROUP BY sex having 人数 > 2
注意:分组之后查询的字段:分组字段、聚合函数
where和 having 的作用差不多,那where和 having 的区别?
1、 where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
2、where后不可以跟聚合函数,having可以进行聚合函数的判断。
分页查询
limit 开始的索引, 每页查询的条数
备注:开始的索引=(当前的页码- 1)*每页显示的条数
SELECT * FROM `user` limit 0,3 -- 第1页
SELECT * FROM `user` limit 3,3 -- 第2页
SELECT * FROM `user` limit 6,3 -- 第3页