MySQL学习笔记

1、概述

1.1、什么是数据库?

数据库:DataBase ( DB),是存储和管理数据的仓库。

数据库管理系统:DataBase Management System (DBMS),操纵和管理数据库的大型软件。

SQL:Structured Query Language,操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准。

1.2、SQL分类

SQL语句通常被分为四大类:

2、DDL

2.1、数据库操作

  • 创建数据库:create database [ if not exists ] 数据库名;
  • 查询所有数据库:show databases;
    • 查询当前数据库:select database();
  • 使用数据库:use 数据库名;
  • 删除数据库:drop database [ if exists ] 数据库名;

以上 "[...]" 内容表示可以省略, database 可以替换成 schema

2.2、表操作

2.2.1、语法

创建表

sql 复制代码
create table 表名(
	字段1 字段类型 [约束] [comment '字段1注释'],
	...
	字段2 字段类型 [约束] [comment '字段2注释']
) [comment '注释信息'];

查询表

  • 查询当前数据库所有表:show tables;
  • 查询表结构:desc 表名;
  • 查询建表语句:show create table 表名;

修改表

  • 添加字段: alter table 表名 add 字段名类型(长度) [ comment 注释 ] [ 约束 ];
  • 修改字段类型:alter table 表名 modify 字段名 新数据类型(长度);
  • 修改字段名和字段类型:alter table 表名 change 旧字段名 新字段名 类型(长度) [ comment注释 ] [ 约束 ];
  • 删除字段:alter table 表名 drop column 字段名;
  • 修改表名:rename table 表名 to 新表名;

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

删除表时,表中的全部数据也被删除。

2.2.2、约束

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

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

以下是创建表对字段的约束:

2.2.2、数据类型

无符号数据类型要在数据类型后面加上 unsigned

varchar 和 char 的区别:

3、DML

添加数据(INSERT)

  • 指定字段添加数据:insert into 表名 (字段名1,字段名2, ...) values (值1,值2, ...);
  • 全部字段添加数据:insert into 表名 values (值1,值2,.....);
  • 批量添加数据(指定字段):insert into 表名 (字段名1,字段名2) values (值1,值2), (值1,值2);
  • 批量添加数据(全部字段):insert into 表名 values (值1, 值2,...), (值1, 值2, ...);

注意事项:

  • 插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
  • 字符串和日期型数据应该包含在引号中。
  • 插入的数据大小,l应该在字段的规定范围内。

修改数据(UPDATE):update 表名 set 字段名1=值1,字段名2=值2, ...[ where条件];

删除数据(DELETE):delete from 表名 [ where条件];

注意事项:

  • DELETE语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。
  • DELETE 语句不能删除某一个字段的值(如果要操作,可以使用UPDATE,将该字段的值置为NULL。

4、DQL

sql 复制代码
select
	字段列表
from
	表名列表
where
	条件列表
group by
	分组字段列表
having
	分组后条件列表
order by
	排序字段列表
limit
	分页参数

4.1、基本查询

  • 查询多个字段:select 字段1, 字段2, 字段3 from 表名;
  • 查询所有字段(通配符):select * from 表名;
  • 设置别名:select字段1 [ as 别名1 ], 字段2 [ as 别名2 ] from 表名;
  • 去除重复记录:select distinct 字段列表 from 表名;

4.2、条件查询(where)

条件查询:select 字段列表 from 表名 where 条件列表;

条件列表中的运算符:

4.3、分组查询(group by)

分组查询: select 字段列表 from 表名 [ where 条件 ] group by 分组字段名 [ having 分组后过滤条件 ];

where与having区别:

  • 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。

  • 判断条件不同:where不能对聚合函数进行判断,而having可以。
    注意事项:

  • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。

  • 执行顺序: where >聚合函数>having 。

使用聚合函数查询:

语法:select 聚合函数(字段列表) from 表名;

聚合函数:

  • 统计数量:count()
  • 最大值:max()
  • 最小值:min()
  • 平均值:avg()
  • 求和:sum()

提示:

  • null 值不参与所有聚合函数运算。
  • 统计数量可以使用: count( * )、count(字段)、count(常量),推荐使用count( * )。

4.4、排序查询(order by)

条件查询: select 字段列表 from 表名 [ where 条件列表 ] [ group by 分组字段 ] order by 字段1 排序方式1, 字段2 排序方式2, ... ;

排序方式:

  • 升序(默认):ASC
  • 降序:DESC

如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。

4.5、分页查询(limit)

分页查询:select 字段列表 from 表名 limit 起始索引, 查询记录数;

注意事项:起始索引从O开始,起始索引=(查询页码--1)*每页显示记录数。

分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。

如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。

5、多表

5.1、多表设计

项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:

5.1.1、一对多(多对一)

案例:员工与部门的关系

关系:每个员工归属于其中一个部门,一个部门有多个员工

实现:在数据库表中多的一方,添加字段,来关联一的一方的主键

外键约束:

5.1.2、一对一

案例:用户与身份证信息的关系

关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他字段放在另一张表中,以提升操作效率

实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)

5.1.3、多对多

案例:学生与课程的关系

关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择

实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

5.2、多表查询

多表查询是指从多张数据表中查询数据。

5.2.1、分类

多表查询分类:

  • 连接查询
    • 内连接:相当于查询A、B交集部分数据
    • 外连接
      • 左外连接:查询左表所有数据(包括两张表交集部分数据)
      • 右外连接:查询右表所有数据(包括两张表交集部分数据)
  • 子查询

5.2.2、内连接

隐式内连接:select 字段列表 from 表1,表2 where条件 ... ;

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

5.2.3、外连接

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

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

5.2.4、子查询

介绍:SQL语句中嵌套select语句,称为嵌套查询,又称子查询。

形式:select * from 表1 where 字段1 = ( select 字段2 from 表2 ...);

子查询外部的语句可以是insert / update / delete / select 的任何一个,最常见的是select。

分类:

  • 标量子查询:子查询返回的结果为单个值。常用的操作符:=、<>、>、>=、<、<=
  • 列子查询:子查询返回的结果为一列。常用的操作符:in、not in 等
  • 行子查询:子查询返回的结果为一行。常用的操作符:=、<>、in、not in 等
  • 表子查询:子查询返回的结果为多行多列。常用的操作符:in

6、事务

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

事务控制操作:

  • 开启事务:start transaction; / begin ;
  • 提交事务:commit;
  • 回滚事务:rollback;

事务的四大特性(ACID):

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

7、索引(Index)

7.1、什么是索引?

索引(index)是帮助数据库高效获取数据的数据结构。

优缺点

优:

提高数据查询的效率,降低数据库的 lO 成本。

通过索引列对数据进行排序,降低数据排序的成本,降低 CPU 消耗。

缺:

索引会占用存储空间。

索引大大提高了查询效率,同时却也降低了 insert、update、delete 的效率。

7.2、索引结构

MySQL数据库支持的索引结构有很多,如:Hash索引、B+Tree索引、Full-Text索引等。我们平常所说的索引,如果没有特别指明,都是指默认的 B+Tree (多路平衡搜索树)结构组织的索引。

7.3、索引语法

创建索引:create [ unique ] index 索引名 on 表名(字段名,...);

查看索引:show index from 表名;

删除索引:drop index 索引名 on 表名;

注意事项:

  • 主键字段,在建表时,会自动创建主键索引。
  • 添加唯一约束时,数据库实际上会添加唯一索引。
相关推荐
Hello.Reader9 分钟前
Redis大Key问题全解析
数据库·redis·bootstrap
靖顺2 小时前
【OceanBase 诊断调优】—— packet fly cost too much time 的根因分析
数据库·oceanbase
liuxin334455662 小时前
学籍管理系统:实现教育管理现代化
java·开发语言·前端·数据库·安全
海绵波波1072 小时前
flask后端开发(10):问答平台项目结构搭建
后端·python·flask
神秘打工猴3 小时前
Flink 集群有哪些⻆⾊?各⾃有什么作⽤?
大数据·flink
网络风云3 小时前
【魅力golang】之-反射
开发语言·后端·golang
小刘鸭!3 小时前
Flink的三种时间语义
大数据·flink
Q_19284999063 小时前
基于Spring Boot的电影售票系统
java·spring boot·后端
天冬忘忧3 小时前
Flink优化----FlinkSQL 调优
大数据·sql·flink
LinkTime_Cloud4 小时前
GitLab 将停止为中国区用户提供服务,60天迁移期如何应对? | LeetTalk Daily
大数据·运维·gitlab