MYSQL使用总结

目录

MYSQL使用总结

MYSQL的基本概念

MYSQL服务的启动与停止

MYSQL服务的登录和退出

MYSQL常见命令

SQL的分类

DML数据操纵语言

插入

修改

删除

DQL数据查询语言

基础查询

条件查询

排序查询

分组查询

连接查询

子查询

分页查询

联合查询

查询顺序

DDL数据定义语言

库的定义

表的定义

DCL数据控制语言

TCL事务控制语言

事务的特性(ACID)

隐式提交

显式提交

并发问题

隔离级别

数据类型

数值型

字符型

日期型

常见的约束

非空约束

唯一约束

默认约束

检查约束

主键约束

外键约束

视图

视图的两种实现

变量

系统变量

自定义变量

存储过程

函数

内置函数

单行函数

分组函数/聚合函数/统计函数/组函数

自定义函数

流程控制结构

顺序结构

分支结构

IF结构

CASE结构

循环结构

索引

explain执行计划

点击跳转到explain执行计划详解


MYSQL使用总结

MYSQL的基本概念

DB:数据库.是指长期储存在计算机内的,有组织的,可共享的数据集合.

DBS:数据库系统.由数据库,硬件,软件和人员组成,管理的对象是数据.

DBMS:数据库管理系统.是一种操纵和管理数据库的大型软件,用于建立,使用和维护数据库.DBMS通常分三类:关系数据库系统RDBS,面向对象的数据库系统OODBS,对象关系数据库系统ORDBS.

DBA:数据库管理员.

MYSQL是C/S架构.

MYSQL服务的启动与停止

启动服务
net start 服务名
停止服务
net stop 服务名

MYSQL服务的登录和退出

登录
mysql [-h主机名 -p端口号] -u用户名 -p密码
[]中的内容表示可选,本机登录可不写

退出
exit
ctrl+c

MYSQL常见命令

1.查看当前所有的数据库
show databases;
2.打开指定的库
use 库名
3.查看当前库的所有表
show tables;
4.查看其它库的所有表
show tables from 库名;
5.创建表
create table 表名(
    列名 列类型,
    列名 列类型,
    ...
);
6.查看表结构
describe 表名;
desc 表名;
7.查看服务器的版本
方式一:登录到mysql服务端
select version();
方式二:没有登录到mysql服务端,即DOS命令
mysql --version
mysql --V

SQL的分类

DDL针对数据结构与约束.

DML针对数据.

DCL针对权限.

TCL针对事务控制.


DML数据操纵语言

插入

方式一:
insert into 表名(字段名...) values(值,值,...);
字段名可以省略,默认所有列.
支持一次插入多行,且支持子查询(insert into 表名 查询语句;).

方式二:
insert into 表名 set 字段=值,字段=值,...;

修改

修改单表:
update 表名 set 字段=值,字段=值 [where 筛选条件];

修改多表:
update 表名1 别名1
left|right|inner join 表名2 别名2
on 连接条件
set 字段=值,字段=值
[where 筛选条件];

删除

方式一:使用delete
删除单表:
delete from 表名 [where 筛选条件] [limit 条目数/起始索引,条目数];
级联删除:
delete 别名1,别名2 from 表1 别名1
inner|left|right join 表2 别名2
on 连接条件
[where 过滤条件];

方式二:使用truncate
truncate table 表名;

两种删除方式的区别

  • 自增:truncate删除后,插入新记录,标识列(自增)从1开始.delete删除后,插入新纪录,标识列(自增)从断点开始.
  • 回滚,日志,触发器:truncate不可以回滚,不记录日志,不会触发该表的删除触发器.delete可以回滚,记录日志,可以触发该表的删除触发器.
  • 筛选条件:delete可以添加筛选条件.truncate不可以添加筛选条件.
  • 效率:truncate效率较高.delete相对效率较低
  • 返回值:truncate没有返回值.delete可以返回受影响的行数.

DQL数据查询语言

DQL属于DML中的一员.

基础查询

select 查询列表 from 表名;
查询列表可以是字段,常量,表达式,函数.

字符+数值,先转换再运算,转换不了变为0再运算.

null+值,结果为null.

条件查询

select 查询列表
from 表名
where 筛选条件;

筛选条件的分类:

  • 简单条件运算符:<,<=,=,<=>,>,>=,!=,<>.
  • 逻辑运算符:&&,and,||,or,!,not.
  • 模糊查询:like,搭配通配符使用(%任意多个字符,_任意单个字符)
  • 范围查询:between and,in.
  • 判断null值:is null/is not null
 普通类型值null值可读性
is null不支持支持
<=>支持支持

排序查询

select 查询列表
from 表名
where 筛选条件
order by 排序列表 [asc]|desc;

分组查询

select 分组函数,分组后的字段
from 表
[where 筛选条件]
group by 分组的字段
[having 分组后的筛选]
[order by 排序列表];
 使用关键字筛选的表位置
分组前筛选where原始表group by的前面
分组后筛选having分组后的结果group by的后面

连接查询

SQL92语法支持的连接方式

  • 内连接
  1. 等值连接
  2. 非等值连接
  3. 自连接

SQL99语法支持的连接方式

  • 内连接
  1. 等值连接
  2. 非等值连接
  3. 自连接
  • 外连接
  1. 左外连接
  2. 右外连接
  3. 全外连接(MYSQL不支持)
  • 交叉连接(笛卡尔乘积)

SQL92等值连接:

select 查询列表
from 表1 别名,表2 别名
where 表1.key=表2.key
[and 筛选条件]
[group by 分组字段]
[having 分组后的筛选]
[order by 排序字段];

一般为表起别名
多表的顺序可以调换
n表连接至少需要n-1个连接条件
等值连接的结果是多表的交集部分

SQL92非等值连接:

select 查询列表
from 表1 别名,表2 别名
where 非等值的连接条件
[and 筛选条件]
[group by 分组字段]
[having 分组后的筛选]
[order by 排序字段];

SQL92自连接:

select 查询列表
from 表1 别名1,表1 别名2
where 等值的连接条件
[and 筛选条件]
[group by 分组字段]
[having 分组后的筛选]
[order by 排序字段]

SQL99内连接

select 查询列表
from 表1 别名
[inner] join 表2 别名 on 连接条件
where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
limit子句;

表的顺序可以调换
内连接的结果=多表的交集
n表连接至少需要n-1个连接条件

SQL99外连接

select 查询列表
from 表1 别名
left|right|full[outer] join 表2 别名 on 连接条件
where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
limit子句;

查询的结果=主表中的所有行,如果从表和它匹配的将显示匹配行,如果从表没有匹配的则显示null
left join 左边的是主表
right join 右边的是主表
full join 两边都是主表
一般用于查询除了交集部分的剩余的不匹配的行

SQL99交叉连接

select 查询列表
from 表1 别名
cross join 表2 别名;

执行效率慢,不推荐,平时也不用,可用无条件的内连接代替,执行效率快

七种JOIN连接

select 查询列表
from 表A 别名A
inner join 表B 别名B
on 别名A.key=别名B.key;

select 查询列表
from 表A 别名A
left join 表B 别名B
on 别名A.key=别名B.key;

select 查询列表
from 表A 别名A
right join 表B 别名B
on 别名A.key=别名B.key;

select 查询列表
from 表A 别名A
left join 表B 别名B
on 别名A.key=别名B.key
where 别名B.key is null;

select 查询列表
from 表A 别名A
right join 表B 别名B
on 别名A.key=别名B.key
where 别名A.key is null;

select 查询列表 from 表A 别名A left join 表B 别名B on 别名A.key=别名B.key
union
select 查询列表 from 表A 别名A right join 表B 别名B on 别名A.key=别名B.key;

select 查询列表 from 表A 别名A left join 表B 别名B on 别名A.key=别名B.key
where 别名B.key is null
union
select 查询列表 from 表A 别名A right join 表B 别名B on 别名A.key=别名B.key
where 别名A.key is null;

子查询

子查询的分类:

  • 标量子查询/单行子查询:结果集为一行一列.
  • 列子查询/多行子查询:结果集为多行一列.
  • 行子查询:结果集为一行多列.
  • 表子查询:结果集为多行多列.

各位置支持的子查询类型:

  • select后面
  1. 标量子查询.
  • from后面
  1. 表子查询
  • where或having后面
  1. 标量子查询
  2. 列子查询
  3. 行子查询
  • exists后面
  1. 标量子查询
  2. 列子查询
  3. 行子查询
  4. 表子查询

分页查询

select 查询列表
from 表
limit 起始角标/页码,条目数量;

公式:
select 查询列表
from 表
limit (page-1)*size,size;

总页数公式:
总页数=(总记录数+条目数-1)/条目数;

联合查询

查询语句1
union [all]
查询语句2
union [all]
...;

查询的列需要一致.
列的类型,顺序一致.
union默认去重,union all不去重.

查询顺序

书写顺序与大概执行顺序

select 查询列表            7
from 表1 别名              1
连接类型 join 表2 别名      2
on 连接条件                3
where 筛选条件             4
group by 分组列表          5
having 分组后筛选          6
order by 排序列表          8
limit 起始角标,条目数;      9
select语句在SQL解析器中的顺序

FROM 左表
ON 连接条件
连接类型 JOIN 右表
WHERE where过滤条件
GROUP BY 分组列表
HAVING having过滤条件
SELECT 
DISTINCT 查询列表
ORDER BY 排序列表
LIMIT 分页数

找到左表,选取左表中第一个符合连接条件的行,去右表中找到匹配行,返回左表找第二个行,依次类推(嵌套-循环连接算法).

 


DDL数据定义语言

库的定义

create database [if not exists] 库名 [character set 字符集名];     创建库
alter database 库名 character set 字符集名;                        修改库
drop database [if exists] 库名;                                   删除库

表的定义

create table [if not exists] 表名(
    字段名 字段类型 [约束],
    字段名 字段类型 [约束],
    ...
    字段名 字段类型 [约束]
);      创建表

添加列
alter table 表名 add column 列名 类型 [first|after 字段名];
修改列的类型或约束
alter table 表名 modify column 列名 新类型 [新约束];
修改列名
alter table 表名 change column 旧列名 新列名 类型;
删除列
alter table 表名 drop column 列名;
修改表名
alter table 表名 rename [to] 新表名;

删除表
drop table [if exists] 表名;

复制表的结构
create table 表名 like 旧表;
复制表的结构+数据
create table 表名
select 查询列表 from 旧表 [where 筛选条件];

DCL数据控制语言

系统管理员,数据库创建者,数据库拥有者,数据库安全管理员关心,程序员不关心.


TCL事务控制语言

事务的特性(ACID)

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

隐式提交

隐式提交:隐式地结束当前会话中活动的任何事务,就好像在执行语句之前已经执行了COMMIT一样.

大多数的DDL语言都会导致在执行完语句之前进行隐式提交.即使DDL语句本身执行失败,但是之前的语句依旧会被提交.

显式提交

开启显式提交
set autocommit=0;
start transaction;

insert update delete也会开启事务.

设置回滚点
savepoint 回滚点名;

结束事务
commit 提交
rollback 回滚
rollback to 回滚点名    回滚到指定回滚点

并发问题

脏读:事务可以读取未提交的数据.

不可重复读:两次执行同样的查询,可能会得到不一样的结果.

幻读:当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行.

隔离级别

  • read uncommitted:读未提交
  • read committed:读已提交/不可重复读
  • repeatable read:可重复读
  • serializable:串行化
 脏读不可重复读幻读
读未提交存在存在存在
读已提交解决存在存在
可重复读解决解决存在
串行化解决解决解决

数据类型

数值型

如果超如范围,会报out or range警告并插入临界值.

都可以设置无符号或有符号,默认有符号,通过unsigned设置无符号.

  • 整型
tinyintsmallintmediumintint/integerbigint
12348

长度可以不指定,默认会有长度.长度只是用来显示的,存储占用空间大小不变.显示宽度如果不够,左边用0填充,但需要搭配zerofill使用,并且默认变成无符号数.

  • 浮点型
  1. 定点数decimal(M,D) M表示整数部分+小数部分,默认为10  D表示小数部分,默认为0
  2. 浮点数float(M,D) 4字节/double(M,D) 8字节

字符型

  • char定长字符char(M),M可以省略.
  • varchar变长字符varchar(M),M不可以省略.
  • binary定长二进制串
  • varbinary变长二进制串
  • enum枚举
  • set集合
  • text文本字符
  • blob二进制大对象

日期型

  • year年
  • date日期
  • time时间
  • datetime日期时间8
  • timestamp时间戳4

常见的约束

非空约束

  • NOT NULL 字段不可为空

唯一约束

  • UNIQUE 字段值必须唯一,不可重复

默认约束

  • DEFAULT 设置默认值

检查约束

  • CHECK MYSQL不支持

主键约束

  • PRIMARY KEY 主键=唯一+非空 实体完整性约束

外键约束

  • FOREIGN KEY 外键 引用别的表的字段 参照完整性约束 数据的操作约束

设置外键约束后,插入数据要先插入主表(主键被引用的表),删除数据要先删除从表(拥有外键的表).

级联删除
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE CASCADE;
级联置空
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE SET NULL;
 支持类型是否能起约束名
列级约束除了外键不可以
表级约束除了非空和默认可以,但对主键无效

列级约束可以在一个字段上追加多个,中间用空格隔开,没有顺序要求.

添加非空约束
alter table 表名 modify column 字段名 字段类型 not null;
删除非空约束
alter table 表名 modify column 字段名 字段类型 ;

添加默认约束
alter table 表名 modify column 字段名 字段类型 default 值;
删除默认约束
alter table 表名 modify column 字段名 字段类型 ;


添加主键约束
alter table 表名 add [constraint 约束名] primary key(字段名);
删除主键约束
alter table 表名 drop primary key;

添加唯一约束
alter table 表名 add [constraint 约束名] unique(字段名);
删除唯一约束
alter table 表名 drop index 索引名;

添加外键约束
alter table 表名 add [constraint 约束名] foreign key(字段名) references 主表(被引用列);
删除外键约束
alter table 表名 drop foreign key 约束名;

自增长列

create table 表名(
    字段名 字段类型 约束 auto_increment
);

修改表时设置自动增长列
alter table 表 modify column 字段名 约束 auto_increment;

删除自增长列
alter table 表 modify column 字段名 约束;

自动增长从1开始,默认步长为1.
更改起始值,手动插入值.
更改步长,更改系统变量.
set auto_increment_increment=值;
一个表至多有一个自增长列.
自增长列必须为数值型.
自增长列必须为一个key.

视图

视图:调用时产生结果集的存储查询.视图充当虚拟表.也就是说数据在执行时动态产生.

创建视图
create view 视图名
as
查询语句;

修改视图
create or replace view 视图名
as
查询语句;

alter view 视图名
as
查询语句;

删除视图
drop view 视图1,视图2,...;

查看视图
desc 视图名;
show create view 视图名;

视图一般用于查询,而不是更新,所以包含以下特点的视图都不允许更新:

  • 分组函数,group by,distinct,having,union.
  • join
  • 常量视图.
  • where后的子查询用到了from中的表.
  • 用到了不可更新的视图.
 关键字是否占用空间使用
视图view占用少,只保存SQL逻辑,不保存数据一般用于查询
table占用多,保存实际的数据增删改查

视图的两种实现

链接地址:视图的两种实现.


变量

系统变量

系统变量变量分为全局系统变量(需要有super权限)和会话系统变量.

查看系统变量
show [global|session] variable like '';
查看指定的系统变量的值
select @@[global|session].变量名;          无指定则默认为session

为系统变量赋值
set [global|session] 变量名=值;
set @@global.变量名=值;
set 变量名=值;

系统变量跨重新启动无效,如要永久有效则需修改配置文件.

自定义变量

用户变量

用户变量作用域:当前连接/会话.

用户变量位置:begin end里面,也可以放在begin end外.

声明并赋值
set @变量名=值;
set @变量名:=值;
select @变量名:=值;

更新用户变量值
set @变量名=值;
set @变量名:=值;
select @变量名:=值;
select xx into @变量名 from 表;

使用用户变量
select @变量名;

局部变量

局部变量作用域:仅仅在begin end中有效.

局部变量位置:只能放在begin end中的第一句.

声明局部变量
declare 变量名 类型 [default 值];

赋值或更新
set 变量名=值;
set 变量名:=值;
select @变量名:=值;
select xx into 变量名 from 表;

使用局部变量
select 变量名;

存储过程

存储过程可以封装复杂业务逻辑,减少网络流量.配合call使用.类似于子程序.

存储过程按需编译,编译后放入缓存,每个客户端连接维护自己的缓存,单个连接多次使用存储过程,则使用编译版本.否则和执行查询没什么区别.

声明分隔符
delimiter 分隔符

创建存储过程
create procedure 存储过程名(参数模式 参数名 参数类型)
begin
    存储过程体;
end 分隔符

还原分隔符
delimiter ;

参数模式:in out inout 默认为in,可省略
存储过程体的每一句都需要用分号结尾

调用存储过程
call 存储过程名(实参列表);

查看存储过程
show create procedure 存储过程名;

删除存储过程
drop procedure 存储过程名;

存储过程创建后,存储过程体和存储过程名称就不可以被修改了,只能更改存储过程的特征/信息

函数

内置函数

调用方法:select 函数名(实参列表);

单行函数

  • 字符函数:
  1. concat连接.
  2. substr截取子串
  3. upper变大写
  4. lower变小写
  5. replace替换
  6. length字节长度
  7. trim前后去空白
  8. lpad左填充
  9. rpad右填充
  10. instr获取子串第一次出现的位置.
  • 数学函数:
  1. ceil向上取整
  2. round四舍五入
  3. mod取模
  4. floor向下取整
  5. truncate截断
  6. rand获取0-1之间的随机小数
  • 日期函数:
  1. now返回当前日期+时间
  2. curdate返回当前日期.
  3. curtime返回当前时间
  4. year返回年
  5. month返回月
  6. monthname以英文形式返回月
  7. day返回日
  8. hour小时
  9. minute分
  10. second秒
  11. date_format将日期转换为字符.
  12. str_to_date将字符转换为日期.
  13. datediff返回两个日期相差的天数.
  • 其他函数:
  1. ifnull(字段名,0) 字段为null则用0替代,不为null则用原来的值.
  2. isnull(表达式/字段) 判断是否为null,1或0.
  3. version当前数据库服务器的版本.
  4. database当前打开的数据库.
  5. user当前用户.
  6. password('字符')返回该字符的密码形式.
  7. md5('字符')返回该字符的MD5加密形式.
  • 流程控制函数:
if(条件表达式,表达式1,表达式2)   如果条件成立,返回表达式1,否则返回表达式2

分组函数/聚合函数/统计函数/组函数

  1. max最大,忽略null,可搭配distinct实现去重统计
  2. min最小,忽略null,可搭配distinct实现去重统计
  3. sum求和,处理数值,忽略null,可搭配distinct实现去重统计
  4. avg求平均值,处理数值,忽略null,可搭配distinct实现去重统计
  5. count计数,忽略null,可搭配distinct实现去重统计.count(字段)统计字段非空值的个数,count(*)统计结果集的个数.

和分组函数一同查询的字段,要求是group by后出现的字段.

where字句中不能使用分组函数.

自定义函数

函数可以封装功能逻辑,可以单独调用.类似于函数.

声明分隔符
delimiter 分隔符

创建函数
create function 函数名(参数名 参数类型) returns 返回类型
begin
    函数体;
    return xx;
end 分隔符

还原分隔符
delimiter ;

调用函数
select 函数名(实参列表);

查看函数
show create function 函数名;

删除函数
drop function 函数名;

函数创建后,函数体和函数名称就不可以被修改了,只能更改函数的特征/信息

存储过程和函数的区别

  • 单独调用:存储过程不可以单独调用,需要使用call,函数可以单独调用,可以写在SQL中.
  • 封装内容:存储过程通常封装业务逻辑,函数通常封装功能逻辑.
  • 参数模式:存储过程有参数模式,函数没有参数模式.
  • 返回值:存储过程可以返回多个返回值,函数有且只有一个返回值.
  • 互相调用:存储过程可以调用函数,函数不可以调用存储过程.
  • 递归调用:存储过程中可以调用存储过程,但不支持递归,函数可以调用函数,且支持递归.

流程控制结构

顺序结构

略.哈哈

分支结构

IF结构

类似于Java中的IF结构.

IF函数

if(条件表达式,表达式1,表达式2)   如果条件成立,返回表达式1,否则返回表达式2

可以作为表达式放在任何位置

IF结构

if 条件1 then 语句1;
elseif 条件2 then 语句2;
...
else 语句n;
end if;

只能放在begin end中

CASE结构

可以放在任何位置.
如果放在begin end 外面,作为表达式结合着其他语句使用.
如果放在begin end 里面,一般作为独立的语句使用.

类似于Java中的IF ELSE结构.

case 
when 条件1 then 语句1;
when 条件2 then 语句2;
...
else 语句n;
end [case];

类似于Java中的SWITCH结构

case 变量/表达式/字段
when 常量1 then 值1
when 常量2 then 值2
...
else 值n
end [case];

循环结构

只能放在begin end中.

WHILE循环

先判断后执行.

[名称:]while 循环条件 do
    循环体
end while [名称];

REPEAT循环

先执行,后判断.

[名称:]repeat
    循环体
until 结束条件
end repeat [名称];

LOOP循环

死循环.

[名称:]loop
    循环体
end loop [名称];

循环控制语句

  • LEAVE

leave类似于Java语言中的break语句,跳出循环.

  • ITERATE

iterate类似于Java语言中的continue语句,跳过本次循环,继续执行下一次.


索引

创建索引

create [unique] index 索引名 on 表名(列名(长度));
alter 表名 add [unique] index 索引名 on(列名(长度));

删除索引

drop index 索引名 on 表名;

查看索引

show index from 表名;

explain执行计划

基本语法

explain SQL语句;

点击跳转到explain执行计划详解

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值