# Mysql

# 1、Sql 语句

# (1) DDL—— 数据定义语言,用来定义数据库对象 (数据库、表、字段)

  • 查询所有数据库
show databases;
  • 查询当前数据库
select database();
  • 创建数据库
creat database [if not exists] 数据库名 [default charset 字符集] [collate 排序规则];
--if not exists 表示若数据库存在,则不创建
  • 删除数据库
drop database[if exists]数据库名;
--if exists 表示若数据库不存在,则不删除
  • 使用数据库
use 数据库名;
  • 查询当前数据库所有表
show tables;
  • 查询表结构
desc 表名;
  • 查询指定表的建表语句
show create table 表名;
  • 表创建
create table 表名(
字段1 字段1类型[COMMENT 字段1注释],
字段2 字段2类型[COMMEN+T 字段2注释],
字段3 字段3类型[COMMENT 字段3注释],
......
字段n 字段n类型[COMMENT 字段n注释]
)[COMMENT 表注释];
  • 添加表的字段
alter table 表名 add 字段名 类型(长度)[COMMENT 注释][约束];
  • 修改表的字段名和字段类型
alter table 表名 change 旧字段名 新字段名 类型(长度) [COMMENT 注释][约束];
  • 修改字段的数据类型
alter table 表名 modify 字段名 新数据类型;
  • 修改表名
alter table 表名 reanme to 新表名;
  • 删除字段
alter table 表名 drop 字段名;
  • 删除表
drop table[if exists] 表名;
  • 删除指定表,并重新创建该表
truncate table 表名;
--删除表后,表中的数据也会删除

# (2) DML—— 数据操作语言,用来对数据库表中的数据进行增删改

  • 查询所有数据库
show databases;
  • 查询当前数据库
select database();
  • 创建数据库
creat database [if not exists] 数据库名 [default charset 字符集] [collate 排序规则];
--if not exists 表示若数据库存在,则不创建
  • 删除数据库
drop database[if exists]数据库名;
--if exists 表示若数据库不存在,则不删除
  • 使用数据库
use 数据库名;
  • 查询当前数据库所有表
show tables;
  • 查询表结构
desc 表名;
  • 查询指定表的建表语句
show create table 表名;
  • 表创建
create table 表名(
字段1 字段1类型[COMMENT 字段1注释],
字段2 字段2类型[COMMENT 字段2注释],
字段3 字段3类型[COMMENT 字段3注释],
......
字段n 字段n类型[COMMENT 字段n注释]
)[COMMENT 表注释];
  • 添加表的字段
alter table 表名 add 字段名 类型(长度)[COMMENT 注释][约束];
  • 修改表的字段名和字段类型
alter table 表名 change 旧字段名 新字段名 类型(长度) [COMMENT 注释][约束];
  • 修改字段的数据类型
alter table 表名 modify 字段名 新数据类型;
  • 修改表名
alter table 表名 reanme to 新表名;
  • 删除字段
alter table 表名 drop 字段名;
  • 删除表
drop table[if exists] 表名;
  • 删除指定表,并重新创建该表
truncate table 表名;
--删除表后,表中的数据也会删除

# (3) DQL—— 数据查询语言,用来查询数据库中的表的记录

  1. 基本查询
  • 查询多个字段
select 字段1,字段2,字段3,... from 表名;
select *from 表名;--查询整张表
- 设置别名
select 字段1[as 别名1],字段2[as 别名2],字段3[as 别名3],...from 表名;
- 无处重复记录
select distinct 字段列表 from 表名;
  1. 条件查询
  • 语法

    select 字段列表 from where 条件列表;
    
  • 条件

    image-20220226113100627

select 字段列表 from where 条件列表;
  1. 聚合函数
  • 介绍

    将一列数据作为一个整体,进行纵向计算。

  • 常见聚合函数

    image-20220226112903488

  • 语法

select 聚合函数(字段列表) from 表名;
  1. 分组查询
  • 语法
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件]
  - where和having区别
      - 执行实际不同:where是分组之前进行过滤,不满条件where条件,不参与分组;having是分组之后对结果进行过滤。
      - 判断条件不同:where不能对聚合函数进行判断,而having可以。
  1. 排序查询
  • 语法
select 字段列表 from 表名 order by 字段1 排序方式,字段2 排序方式2;
  • 排序方式
  • ASC:升序 (默认值)
  • DESC:降序
  • 如果是多字段排序,当第一个字段排序值相同时,才会根据第二个字段进行排序
  1. 分页查询
  • 语法
select 字段列表 from 表明 limit 起始索引,查询记录数;
  • 注意
  • 起始索引从 0 开始,起始索引 =(查询页码 - 1)* 咩野显示记录数。
  • 分页茶树是数据库的方言,不同的数据库有不同的实现,Mysql 中是 LIMIT。
  • 如果查询的是第一页数据,起始索引可以省略,直接简写为 [limit 查询记录数]。
  1. 语句执行顺序

image-20220226130917300

# (4) DCL—— 数据控制语言,用来创建数据库用户、控制数据库的访问权限

# 1、管理用户

  1. 查询用户
use mysql;
select *from user;
  1. 创建用户
create user '用户名'@'主机名' IDENTIFIED BY '密码'; 
  1. 修改用户密码
alter user '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';

4. 删除用户

drop user '用户名'@'主机名';

# 2、权限管理

image-20220226131018287

  1. 查询权限
show grants for '用户名'@'主机名';
2. 授予权限
grant 权限列表 on 数据库.表名 to '用户名'@'主机名'; 
3. 撤销权限
revoke 权限列表 on 数据库.表名 from '用户名'@'主机名';
  • 多个权限之间,使用逗号分隔。
  • 授权时,数据库名和表名可以使用 * 进行通配,代表所有。

# 2、数据类型

image-20220226131551577

<img src="http://lgqimg.changzer.cn/image-20220226131643378.png" alt="image-20220226131643378" />

image-20220226131716446

# 3、函数

  • 语法
select 函数(参数);

# 1. 字符串函数

image-20220226131918060

# 2. 数值函数

image-20220226131935009

# 3. 日期函数

image-20220226131952830

# 4. 流程函数

image-20220226132012231

# 4、约束

image-20220226132324447

  • 外键约束
  • 添加外键
create table 表名(
      字段名 数据类型,
       ...
       [constraint][外键名称] foreign key(外键字段名) references 主表(主表列名)
);
alter table 表名 add constraint 外键名称 foreign key(外键字段名) references 主表(主表列名);
  • 删除外键
alter table 表名 drop foreign key 外键名称;
  • 删除 / 更新行为

image-20220226132502323

  • 语法
alter table 表名 add constraint 外键名称 foreign(外键字段) references 主表名(主表字段名) on update 行为 on delete 行为;

# 5、多表查询

# 5.1 多表关系

image-20220226132958716

  • 一对多 (多对一)

image-20220226133130710

  • 多对多

image-20220226133149302

  • 一对一

image-20220226133214313

# 5.2 多表查询概述

image-20220226133344586

  • 多表查询分类

image-20220226133422287

# 5.3 内连接

内连接查询的是两张表交集的部分

  • 隐式内连接
select 字段列表 from 表1,表2 where 条件...;
  • 显式内连接
select 字段列表 from 表1[inner] join 表2 on 连接条件...; 

# 5.4 外连接、

image-20220226133657412

  • 左外连接
select 字段列表 from 表1 left [outer] join 表2 on 条件...;
  • 右外连接
select 字段列表 from 表1 right [outer] join 表1 on 条件...;

# 5.5 自连接、

  • 自连接查询法
select 字段列表 from 表A 别名A join 表A 别名B on 条件...;
  • 自连接查询,可以是内连接查询,也可以是外连接查询.

# 5.6 联合查询

  • 对于 union 查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。
  • 语法
select 字段列表 from 表A
union [all]
select 字段列表 from 表B;
  • 对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致
  • union all 会将全部的数据直接合并在一起,union 会对合并之后的数据去重

# 5.7 子查询

  • 概念 :SQL 语句中嵌套 select 语句,称为嵌套查询,又称子查询

  • 语法

select * from t1 where column1=(select column1 from2);
  • 子查询外部的邮局可以是 insert/update/delete/select 的任何一个
  • 分类

image-20220226134245323

  • 标量子查询

image-20220226134338321

  • 列子查询

image-20220226134402934

  • 行子查询

image-20220226134418954

  • 表子查询

image-20220226134437994

# 6、事务

  • 事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销请求,即这些操作要么同时成功,要么同时失败。
  • 事务操作

  • 查看 / 设置事务提交方式

    select @@autocomit;-- 查看事务提交方式,1 为自动提交,0 为手动提交
    set @@sutiocomit=0;-- 设置提交方式,0 为手动提交
  • 提交事务

    l
    commit;
  • 回滚事务

    rollback;
    • 开启事务
    start transactionbegin;
  • 事务的四大特性

image-20220226135459363

  • 并发事务问题

image-20220226135518825

  • 事务隔离级别

image-20220226135534240

  • 查看事务隔离级别

    select @@transaction_isolation;
  • 设置事务隔离级别

    set [session|global] transaction isolation level {read uncommitted|read committed|repeatable read|serializable};
    --session表示会话级别,表示当前客户端窗口有效
    --session global 表示所有客户端窗口有效