(CN) MySQL Basic

MySQL基础篇

SQL的分类

image-20220624103633642

DDL

  1. 查询所有数据库

    show databases;

  2. 查询当前数据库

    select database();

  3. 创建

    create database [if not exists] DBname [default charset];

  4. 删除

    drop database [if exists] DBname

  5. 使用

    use DBname

进入数据库后

  1. 查询所有表

    show tables;

  2. 创建表

    image-20220624105635490

  3. desc table_name show create table table_name查询表内容

数据类型

  1. 数值类型

    image-20220624110930573

  2. blob 二进制数据[tiny medium long]

  3. text 文本数据[tiny medium long]

  4. char(maxlength) 性能好 ; varchar性能稍差

  5. 时间类型

    image-20220624110643629

  6. 给表添加字段 [修改数据类型 modify /修改字段名和字段类型change ]

    alter table table_name add 字段名 datatype;

  7. 删除字段

    alter table table_name drop 字段名;

  8. 修改表名

    alter table old_table_name rename to new_table_name;

  9. 删除某一张表

    drop table [if exists] table_name;

    删除指定表,并重新创建该表

    truncate table tablename;

DML(manipulate)增删改查

插入

  1. 给指定字段添加数据

    insert into table_name(字段1,字段2……) values (值1,值2……);

    给全部字段添加数据

    insert into table_name values(值1,值2); 需要和实际字段一一对应

    批量添加数据

    insert into table_name(字段1,字段2……) values (值1.值2……),(值1.值2……),();

修改

  1. 修改数据语法

    image-20220626135045249

删除

  1. 删除数据

    image-20220626135544225

    需要注意的是,delete语句不能删除某一个字段的值

DQL 查询操作

基础查询

  1. 语法

    image-20220626140357003

  2. 查询多个字段

    image-20220626140826255

  3. 设置别名

    select 字段1 as 别名1,…… from table_name;

  4. 去重

    select distinct 字段列表 from table_name;

条件查询

  1. select 字段列表 from table_name where 条件列表;

image-20220630112743395

聚合函数

  1. 一列数据作为整体,进行纵向计算

    image-20220630141355684

  2. 用法

    select 聚合函数(字段列表) from table_name;

使用聚合函数是,null值不参与聚合函数的运算

分组查询

  1. 语法

    image-20220630142037554

  2. where 和 having区别

    • 执行时机不同:where是分组之前进行过滤,having是分组之后
    • 判断条件不同:where不能对聚合函数进行判断,而having可以

    image-20220630142922169

分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段没有意义

排序查询

  1. 语法

    image-20220630143317390

  2. 排序方式

    • asc 升序 default

    • desc 降序

如果是多字段排序,当第一个相同时,按照第二个进行排序

案例:

image-20220630143717895

image-20220630143848672

分页查询

  1. 语法

    image-20220630144238591

  2. notice

    image-20220630144318311

    image-20220630144608149

  1. 需要注意的是,不同的数据库分页查询的语法不同,以上为MySQL
  2. limit要位于order by 之后

DQL执行顺序

image-20220630150710877

DCL control

简介:用来管理数据库用户、控制数据库的访问权限

用户管理

  1. 查询用户

    use mysql;

    select * from user;

  2. 创建用户

    create user 'username'@'hostname' identified by 'password';

    image-20220701130623746

    %表示任意主机

  3. 修改用户密码

    image-20220701130659239

  4. 删除用户

    drop user 'username'@'hostname';

权限控制

权限分类:

image-20220701131012668

  1. 查询权限

    show grants for 'username'@'hostname';

  2. 授予权限

    grant 权限列表 on 数据库名.表名 to 'username'@'hostname';

  3. 撤销权限

    image-20220701131219644

函数

字符串函数

image-20220701132408960

​ usage:select func(args);

案例:

image-20220701133709816

数值函数

image-20220701133729688

image-20220701134053643

注意:先是rand,然后取六位,不足补0

image-20220701134707332

日期函数

image-20220701134821435
image-20220701135717560

流程控制函数

image-20220701135816302

案例:

image-20220701140546470

image-20220701140932906

约束

常见约束

  1. 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据

  2. 目的:保证数据库中数据的正确性。有效性和完整性

  3. 分类:

    image-20220701155825456

  4. 案例:

    image-20220701160422285

    image-20220701160949727

外键约束

  1. 概念:外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性

  2. 添加外键:

    image-20220702092147527

    image-20220702092624473

  3. 删除外键

    alter table table_name drop foreign key key_name;

    image-20220702092811111

  4. 删除/更新行为

    image-20220702092937798

    image-20220702093313619

多表查询

  1. 简单案例

image-20220824160439660

  1. 内连接:a和b表的交集
  2. 外连接:
    • 左外:左表以及交集
    • 右外:右表以及交集
  3. 自连接:自连接使用表的别名,当前表与自身的连接查询‘
  4. 子查询

内连接

  1. 隐式内连接:

    image-20220824160830080

image-20220824160439660

  1. 显式内连接:

    image-20220824160934626

给表起了别名以后,不能在使用原名来进行查询

案例:

image-20220824161831438

外连接

  1. 左外连接:左表及交集部分

image-20220914100808647

  1. 右外连接:RIGTH 右表及交集部分

image-20220914102309502

自连接

image-20220914101909456

image-20220914103108642

image-20220914103420301

联合查询 union(all)

  1. image-20220914103622938

image-20220914104236254

union all :直接合并查询的多次结果

union:可以有去重的效果

多张表的列数必须保持一致,字段类型也需要一致

子查询

image-20220918204858079

标量子查询

  1. 子查询的结果为单个值

e.g.

image-20220918205537762

列子查询

  1. 返回结果为一列,可以是多行

  2. 常用:in, not in , any , some, all

    image-20220918210236365

image-20220918210906932

image-20220918211108417

行子查询

  1. 返回一行可以多列的子查询
  2. 常用:= <> in not in

image-20220918211845989

表子查询

image-20220918212724483

e.g.

image-20220918214528758

练习

image-20220919162243683
  1. image-20220919162238983

  2. image-20220919162857424

  3. image-20220919163527706

  4. image-20220919164049772

  5. image-20220919165253744

  6. image-20220920220731429

  7. image-20220921090143512

  8. image-20220921091119145

  9. image-20220921091252230

  10. image-20220921091620903

  11. image-20220921093120809

  12. image-20220921093948007

事务

简介

  • 一组操作的集合,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,这些操作,要么同时成功,要么同时失败

MySQL的事务是自动提交的,当执行一条DML语句时,MySQL会立即隐式的提交事务

事务操作

  1. 正常情况下:

image-20220921103027064

commit;
  1. 报错情况下:

    start transaction/begin 手动控制事务,不需要设置@@autocommit

    image-20220921103902447

  2. image-20220921103950160

事务的四大特性ACID

  • 原子性:事务是不可分割的最小操作单元,要么全部成功,要么全部失败
  • 一致性:事务完成时,必须使所有的数据都保持一致状态
  • 隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
  • 持久性:事务一旦提交或者回滚,它对数据库中的数据的改变是永久的

并发事务问题

image-20220921105554897

并发事务演示及隔离级别

image-20220921124906808

image-20220921125825966

Outis Yang
Outis Yang
2024 Undergraduate in Cyberspace Security

My research interests include Internet of Vehicles(IoV), Penetration Testing and Security research.