本篇文章主要是本人对学习情况的一个总结,不足之处,欢迎补充😊。
一.MySQL概述
1.1.数据库相关概念
数据库(DataBase):存放数据的容器,主要存储在磁盘当中。
数据库管理系统(DataBase Management System):对数据库进行操作的软件。
SQL(Structured Query guage):结构化查询语言。操作关系型数据库的语言,定义了一套操作关系型数据库的统一标准。
1.2.MySQL数据模型
1.2.1.关系型数据库
MySQL是关系型数据库,个人觉得关系型数据库重点注意关系二字,关系指的是不同二维表(有行有列,Excel表就是二维表)之间存在这关系。
例如:学生表和课程表就存在着关系,一个学生可以选择多门课程,同时一门课程也可以被多个学生选择,这种关系叫做多对多关系,当然关系型数据库中还有一对多,多对一关系。
学生-课程 信息表
1.2.2.数据模型
通过MySQL客户端连接DBMS,然后通过DBMS操作数据库。
使用SQL语句对数据库中的数据库,表,字段进行操作。
一个数据库服务器中可以包含多个数据库,一个数据库中可以包含多张表,一个数据表中可以包含多个字段。
二.SQL(Structured Query Language)
2.1.SQL的分类
DDL:Data Definition Language,数据库定义语言,主要是定义数据库,表,字段。
DML:Data Manipulation Language,数据库操作语言,对数据库表中的数据进行增删改。
DQL:Data Query Language,数据库查询语言,对数据库表中的数据进行查询。
DCL:Data Control Language,数据库控制语言,用来创建数据库角色并分配权限。
2.2.DDL
Data Definition Language,数据库定义语言,主要是定义数据库,表,字段。
2.2.1.数据库操作
(1)查询所有数据库
show databases;
目前展示的是MySQL中自带的数据库,主要保存了MySQL的基本信息。
(2)查询当前数据库
select database();
展示目前所能操作的数据库,目前没有选择任何数据库。
(3)创建数据库
create database [if not exists] 数据库名 [default charset 字符集] [collate 排序规则];
[ ]内的代表可有可无。
示例:
create database niu;
这只是最简单的创建方式,同时,也可以指定一些其他的信息。
(a)当我们再次创建同名数据库的时候:
create database niu;
很明显,报错了。
当我们加上if not exists
create database if not exists niu;
数据库创建成功了,但是数据库还是原来的niu。
if not exists 代表的是当不存在niu数据库的时候才会创建。
(b)而default charset 字符集 代表的是,我们可以指定具体的字符集。
(c)collate 指定字符集下不同字符的比较规则,包括对大小写的敏感程度,以及转化成二进制后进行比较等 。
(4)删除数据库
drop database if exists niu;
if exists 和 if not exists 用法类似,主要是有无not,根据语义可以推断出具体使用哪一种。
(5)切换数据库
use 数据库名;
2.2.2.表操作
2.2.2.1.查询创建
(1)查询当前数据库的所有表
show tables;
注意:执行此项操作之前,一定要切换到需要操作的数据库。
(2)查看指定表结构
use sys; #切换到 sys数据库
show tables; #展示所有表
desc session; #查看session表结构
(3)查询指定表的建表语句
show create table session; #session是一个数据库名
(4)创建表结构
create table tb_user(
id int comment '编号',
name varchar(50) comment '姓名',
age int comment '年龄',
gender varchar(1) comment '性别'
) comment '用户表';
#create table 表名(
字段名 字段类型 注释
)注释
2.2.2.2.表字段的数据类型
(1)数值类型
类型 | 大小 | 描述 |
---|---|---|
TINYINT | 1byte | |
SMALLINT | 2byte | |
MEDIUMINT | 3byte | |
INT/INTEGER | 4byte | |
BIGINT | 8byte | |
FLOAT | 8byte | |
DOUBLE | 8byte | |
DECIMAL |
根据数据类型的实际情况进行选择,年龄一般不会太大,因此,选择TINYINT是最正确的选择,也可以加上unsigned扩大TINYINT的容量。
(2)字符串类型
类型 | 大小 | 描述 |
---|---|---|
CHAR | 0-255byte | 定长字符串 |
VARCHAR | 0-65535byte | 变长字符串 |
同样,也是根据具体情况具体进行选择。
(3)日期类型
类型 | 大小 | 范围 | 格式 | 描述 |
---|---|---|---|---|
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 | 混合日期和时间值,时间戳 |
2.2.2.3.修改表字段信息
(1)添加字段
alter table 表名 add 字段名 类型 comment 注释 [约束]
示例:
alter table tb_user add QQ varchar(10) comment 'QQ账号';
(2)修改数据类型
alter table 表名 modify 字段名 新数据类型
示例:
alter table tb_user modify QQ varchar(11);
(3)修改字段名和数据类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型 (长度) [ COMMENT 注释 ] [ 约束 ];
示例:
alter table tb_user change QQ weixin varchar(30) comment '微信';
(4)删除字段
alter tbale 表名 drop 字段名;
示例:
alter table tb_user drop weixin;
(5)修改表名
alter table 表名 rename to 新表名
示例:
alter table tb_user rename to tb__user;
2.2.2.4.删除表操作
(1)删除表
drop table [if exists] 表名;
示例:
drop table tb__user;
(2)删除的同时又重新创建
此项操作用于快速清空表中的数据,索引等。
truncate table 表名;
示例:
truncate table tb_user;
2.3.DML
2.3.1.添加数据
(1)给指定字段添加数据
insert into 表名(字段名1,字段名2) values(值1,值2);
示例:
添加一条
insert into tb_user values(1,'牛犇',20,'男');
批量添加
insert into tb_user values(1,'牛犇',20,'男'),(2,'牛永成',55,'男');
2.3.2.修改数据
update 表名 set 字段名 = 值 [where 条件];
示例:
update tb_user set age = 18,gender = '女' where name = '牛犇';
2.3.3.删除数据
delect from 表名[where 条件];
示例:
delete from tb_user where name = '牛犇';
如果不指定条件,那么就删除所有数据。同理,update也是。
2.4.DQL
数据库查询语言,查询的时间是远远高于增删改的,因此,查询也是SQL优化的重要部分。
2.4.1基本语法
一条查询SQL的具体结构
select
from
where
group by
having
order by
limit
真正的执行顺序
from
where
group by
having
select
order by
limit
2.4.2.基础查询
(1)查询多个字段
select * from 表名
select 字段 from 表名
(2)字段设置别名
select 字段名 as 别名 from 表名;
别名会展示出来,as可以省略。
(3)去除重复记录
select distinct gender from emp;
2.4.3.条件查询
(1)语法
select 字段 from 表名 where 条件;
(2)条件
比较运算符 | 功能 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<> 或 != | 不等于 |
betweent...and | 在某个范围之间(小-大) |
in(...) | 在in之后的列表中的值,多选一 |
like 占位符 | 一般用于模糊匹配 |
is null | 是null |
逻辑运算符 | 功能 |
---|---|
and 或 && | 并且(多个条件同时成立) |
or 或 || | 或者(多个条件成立一个即可) |
not 或! | 非 |
2.4.3.聚合函数
将一列数据看作一个整体,进行计算
(1)count()
select count(*) from 表名;
count(*)获取有多少行数据,查询效率是最高的。
(2)max()
select max(列名) from 表名;
max()对某一列求最大值。
(3)min()
select min(列名) from 表名;
min()对某一列求最小值。
(4)avg()
select avg(列名) from 表名;
avg()对某一列求平均值。
select sum(列名) from 表名;
sum()对某一列进行求和。
注意:NULL值不参与任何聚合函数的运算。
2.4.4.分组查询
跟在group by 后面的语句。一般搭配聚合函数使用
select gender,count(gender) from emp group by gender;
group by 前面是where,后面是having ,where 是对分组前进行过滤,having是对分组后的信息进一步过滤.
示例:查询年龄小于45的员工 , 并根据工作地址分组 , 获取员工数量大于等于3的工作地址
select workaddress, count(*) as address_count from emp where age < 45 group by workaddress having count(workaddress) >= 3;
2.4.5.排序查询
排序字段通过order by字段来指定,需要排序的字段以及排序的方式。
(1)排序方式
默认为asc (升序),也可以指定为desc(降序),当需要指定多个排序字段时,现根据第一个字段进行排序,如果相同,就根据第二个字段进行排序。
案例:根据年龄对公司的员工进行升序排序 , 年龄相同 , 再按照入职时间进行降序排序
select * from emp order by age asc,entrydate desc;
2.4.6.分页查询
(1)语法
select 字段 from 表名 起始索引,查询记录数;
注意事项:起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数;
分页查询是数据库的方言,不同的数据库有不同的实现,mysql中是limit;
如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10;
案例:查询第二页的数据,每页展示10条数据
select * from emp limit 10,10;
2.5.DCL
DCL是数据库控制语言,只要用来管理数据库成员,以及数据库的访问权限。
2.5.1.管理用户
(1)查询用户
select * from mysql.user;
数据主要部分host代表用户可以访问的主机,如果为localhost,代表只能访问当前主机,是不可以远程访问其他主机的。user代表的是访问该数据库的用户名。在mysql中通过host和user来标识一个用户。
(2)创建用户
create user '用户名'@'主机名' identified by '密码';
(3)修改用户密码
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码' ;
(4)删除用户
DROP USER '用户名'@'主机名' ;
三.函数