概述
是一种 关系型数据库:建立在关系模型上,由多张互相连接的二维表组成的数据库。关系数据库 特点:1. 使用表存储数据,格式统一,便于维护2. 使用SQL语言操作,标准统一,使用方便
MySQL的数据模型从客户端到DBMS,再到数据库,最后到达数据库中的表
MySQL启动的命令
1 | net start mysql80 # 这里的mysql80是注册在Windows中的服务名称 |
MySQL客户端连接MySQL自带的客户端命令行CMD执行命令:
1 | mysql -h 127.0.0.1 -P 3306 -u root -p |
SQLSQL通用语法1. SQL语句单行,多行均可,默认分号结尾2. 使用空格/缩进以增加可读性3. 不区分大小写,推荐关键字使用大写4. 注释:单行注释:– 通用,# MySQL独有多行注释:/**/
SQL分类:DDL: Data Definition Language 数据定义语言,用来定义数据库对象 (数据库,表,字段)DML: Data Manipulation Language 数据操作语言,用来对数据库表中的数据进行增删改DQL: Data Query Language 数据查询语言,用来查询数据库中表的记录DCL: Data Control Language 数据控制语言,用来创建数据库用户、控制数据库的访问权限
DDL-数据库操作:查询查询所有数据库
1 | SHOW DATABASES; |
查询当前数据库
1 | SELECT DATABASE(); |
创建
1 | CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则] |
案例:
1 | create database if not exists test; -- 如果不存在,创建test数据库 |
删除
1 | DROP DATABASE [IF EXISTS] 数据库名 |
使用数据库
1 | USE 数据库名 |
查询当前数据库全部表
1 | SHOW TABLES; |
查询表结构
1 | DESC 表名 或者 DESCRIBE 表名 |
查询指定表的建表语句
1 | SHOW CREATE TABLE 表名 |
DDL-表操作-创建
1 | CREATE TABLE 表名( |
第二章讲解InnoDB底层原理
DDL-表操作-数据类型主要分三类:数值类型,字符串类型,日期时间类型数值类型
实例:
1 | age TINYINT UNSIGNED # 0~255的整数 |
字符串类型
定长/变长字符串的区别
1 | char(10) |
实例:用户名 username 用那个更好呢?答案:varchar(50)更好。因为用户的用户名不是定长的,使用varchar可以节约空间性别 gender 用哪个?答案:char(1)
日期类型
实例:
1 | birthday date # 生日用date类型更合适 |
案例:根据需求创建表(设计合理的数据类型、长度)
答案:
1 | create table emp ( |
DDL-表操作-修改添加字段
1 | ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束]; |
案例:为emp表添加一个字段“昵称”为nickname,类型为varchar(20)答案:
1 | ALTER TABLE emp add nickname varchar(20) comment '昵称'; |
修改数据类型
1 | ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度); |
修改字段名和字段类型
1 | ALTER TABLE 表名 CHANGE 旧字段名 新字段名称 类型(长度) [COMMENT 注释] [约束]; |
案例:将emp表的nickname 修改为username,类型为varchar(30)答案:
1 | ALTER TABLE emp change nickname username varchar(30) comment '用户名'; |
删除字段
1 | ALTER TABLE 表名 DROP 字段名; |
案例:删除emp中的username列答案:
1 | ALTER TABLE emp drop username; |
修改表名
1 | ALTER TABLE 表名 RENAME TO 新表名; |
案例:将emp表表名修改为employee
1 | ALTER TABLE emp RENAME TO employee; |
删除表
1 | DROP TABLE [IF EXISTS] 表名; |
删除指定表,并重新创建该表
1 | TRUNCATE TABLE 表名; |
MySQL图形化界面:
MySQL Workbench
DML-介绍DML的全称是Data Manipulation Lanagage (数据操作语言),用来对数据表中的数据记录进行增删改操作。添加数据 (INSERT)修改数据 (UPDATE)删除数据 (DELETE)
DML-添加数据1. 给指定字段添加数据
1 | INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...); |
2. 给全部字段添加数据
1 | INSERT INTO 表名 VALUSE (值1, 值2, ...); |
3. 批量添加数据
1 | INSERT INTO 表名 (字段名1,字段名2,...) VALUSE (值1,值2,...), VALUSE (值1,值2,...); |
注意:
DML-修改数据UPDATE 表名 SET 字段名1=值1, 字段名2=值2, … [WHERE 条件];注意:如果修改的条件没有,则会修改整张表的数据。案例:
1 | -- id = 1 的名字修改为it 黑马 |
DML-删除数据DELETE FROM 表名 [WHERE 条件];注意:DELETE语句的条件可有可无,没有的情况下会删除整张表的数据。DELETE语句不能删除某一个字段的值(可以使用UPDATE)。案例:
1 | -- 删除gender为W的员工 |
DQL-介绍DQL是Data Query Language 的缩写,用来查询数据库中表的记录。查询关键字:SELECT
DQL-语法
1 | SELECT 字段列表 FROM 表名列表 |
基本查询条件查询 WHERE聚合函数 count(), max(), min(), avg(), sum()分组查询 GROUP BY排序查询 ORDER BY分页查询 LIMIT
DQL-基本查询1. 查询返回多个字段
1 | SELECT 字段1,字段2,字段3... FROM 表名; |
2. 设置别名
1 | SELECT 字段1 [AS 别名1], 字段2 [AS 别名2] ... FROM 表名; |
其中AS可以省略3. 去除重复记录
1 | SELECT DISTINCT 字段列表 FROM 表名; |
案例:数据准备:
1 | -- 数据准备 |
1 | -- 基本查询 |
DQL-条件查询1. 语法
1 | SELECT 字段列表 FROM 表名 WHERE 条件列表; |
2. 条件比较运算符![]
逻辑运算符
案例:
1 | -- 条件查询 |
DQL-分组查询语法:
1 | SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件] |
WHERE和HAVING的区别- 执行时间不同,WHER是分组前过滤,HAVING是分组后过滤- 判断条件不同,WHERE不能对聚合函数进行判断,HAVING可以
案例:
1 | -- 分组查询 |
注意:- 执行顺序:where > 聚合函数 > having- 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无意义
DQL-排序查询语法:
1 | SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1, 字段2 排序方式2; |
排序方式:
1 | ASC: 升序 (默认值) |
案例:
1 | -- 排序查询 |
DQL-分页查询语法:
1 | SELECT 字段列表 FROM 表名 LIMIT 起始索, 查询返回记录数; |
注意:- 起始索引从0开始,其实索引 = (查询页码 - 1) * 每页显示记录数- 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL是LIMIT- 如果查询的是第一页的数据,起始索引可以省略,直接简写为LIMIT 10
案例:
1 | -- 分页查询 |
DQL 案例课
1 | -- 案例 |
DQL - 执行顺序
1 | SELECT (4) |
案例:
1 | -- 查询年龄大于15的员工的姓名、年龄、并根据年龄进行升序排序 |
DCL-介绍DCL 全称 Data Control Language (数据控制语言),用来管理数据库用户、控制数据库的访问权限
DCL-管理用户1. 查询用户
1 | USE mysql; |
2. 创建用户
1 | CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码'; |
3. 修改用户密码
1 | ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码'; |
4. 删除用户
1 | DROP USER '用户名'@'主机名'; |
案例:
1 | -- DCL |
注意:- 主机名可以用’%‘通配- 这类SQL开发人员使用较少,主要是DBA (Database Administrator 数据库管理员)使用
DCL-权限控制
1. 查询权限
1 | SHOW GRANTS FOR '用户名'@‘主机名’; |
2. 授予权限
1 | GRANT 权限列表 ON 数据库.表名 TO '用户名'@‘主机名’; |
3. 撤销权限
1 | REMOVE 权限列表 ON 数据库名.表名 FROM '用户名'@‘主机名’; |
案例:
1 | -- 查询权限 |
注意:
总结:1. 用户管理
1 | CREATE USER 'username'@'host' IDENTIFIED BY 'password'; |
2. 权限控制
1 | GRANT 权限列表 ON 数据库名.表名 TO ‘用户名'@'主机名'; |
函数函数是指可以被另一段程序直接调用的的程序或代码。
字符串函数
数值函数
日期函数
流程函数
字符串函数
演示:
1 | -- 函数演示 |
案例:由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补充0。比如1号员工应该为00001。答案:
1 | -- 1. 员工号补0. |
数值函数常见的数值函数如下:
演示
1 | -- 数值函数 |
案例通过数据库的函数,生成一个六位数的随机验证码
1 | -- 2.通过数据库的函数,生成一个六位数的随机验证码 |
日期函数常见的日期函数
演示:
1 | -- 日期函数 |
案例:
1 | -- 查询所有员工的入职天数,并根据入职天数倒序排序 |
流程函数流程函数实现条件筛选,提高语句的效率:
1 | IF(value, t, f) |
演示:
1 | -- 流程函数 |
案例:
1 | -- 案例:统计班级各个学员的成绩,展示的规则如下:-- >= 85,展示优秀 |
总结字符串函数
1 | concat |
数值函数
1 | ceil |
日期函数
1 | curdate |
流程函数
1 | if |
约束概述:常见的约束有哪些
概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据
目的:保证数据库中数据的正确,有效性和完整性
分类:
约束演示案例:根据需求,完成表的创建
1 | id: primary key, auto_increment |
拓展:约束的修改
1 | -- 发现建表的时候约束设置的不正确,如何修改 |
外键约束概念外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性
具有外键的表称为子表,被关联的表叫做父表注意:数据库层面,未建立外键关联,所以无法保证数据的一致性和完整性。演示:
1 | -- 外键约束 |
语法:添加外键
1 | CREATE TABLE 表名( |
删除/更新行为
1 | ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) |
案例:
1 | -- 外键的删除和更新行为 |
总结1. 非空约束 not null2. 唯一约束 unique3. 主键约束 primary key (自增: AUTO_INCREMENT, ORACLE没有这个,而是SEQUENCE)4. 默认约束 default5. 检查约束 check6. 外键约束 foreign key
多表查询多表关系各个表结构之间存在各种联系:一对多 (多对一)多对多一对一一对多(多对一)案例:部门 与 员工 的关系关系:一个部门对应多个员工,一个员工对应一个部门实现:再多的一方建立外键,只想一的一方的主键
多对多案例:学生 与 课程的关系关系:一个学生可以选择多门课程,一门课程也可以供多个学生选择实现:建立第三张中间表,中间层至少包含两个外键,分别关联两方主键
案例:
1 | -- 多对多 |
.一对一案例:用户 和 用户详情的关系关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率实现:在任意一方加入外键,关联另一方的主键,并且设置外键为唯一的(UNIQUE)图例:![]
案例:
1 | -- 一对一 |
多表查询概述概述:指从多张表中查询数据笛卡尔积:指在数学中,两个集合的所有组合情况(在多表查询时,需要消除无效的笛卡尔积)
案例:
1 | -- 数据准备 |
多表查询分类- 连接查询 - 内连接: 相当于查询A.B交集部分的数据
- 外连接:
左外连接: 查询左表中的所有数据,以及交集部分数据
右外连接:查询右表中的所有数据,以及交集部分数据 - 自连接:当前表与自身的连接查询,自连接必须使用表别名\
- 子查询
内连接内连接查询语法:
隐式内连接:
1 | select 字段列表 from 表1, 表2 where 条件...; |
显式内连接:
1 | select 字段列表 from 表1 [INNER] join 表2 on 连接条件...; |
案例:
1 | -- 内连接演示 |
外连接语法: 左外:
1 | select 字段名 from 表1 left [outer] join 表2 on 条件... ; |
右外:
1 | select 字段名 from 表1 right [outer] join 表2 on 条件... ; |
案例:
1 | -- 外连接演示 |
自连接语法:
1 | select 字段列表 from 表A 别名A join 表A 别名B on 条件... ; |
自联结查询可以是内连接也可以是外连接案例:
1 | -- 内连接演示 |
联合查询关键字:union, union all语法:
1 | select 字段列表 表A ... |
案例:
1 | -- union all, union |
小结:
联合查询多张表的列数必须保持一致,字段类型也必须一致
union all 直接合并,union则会去重
子查询概念:SQL语句中嵌套SELECT语句,成为嵌套查询,又称子查询语法:
1 | select * from t1 where column1 = (select column1 from t2); |
注意 - 子查询外部语句可以是insert/update/delete/select的任何一个。
分类:子查询结果不同,可以分为: 标量子查询 (子查询结果为单个值) 列子查询 (子查询结果为一列) 行子查询 (子查询结果为一行) 表子查询 (子查询结果为多行多列)
根据子查询位置,分为:WHERE之后,FROM之后,SELECT之后。
标量子查询:概念:子查询返回结果为单个值(数字,字符串,日期等),最简单的形式,这种子查询称为标量子查询。常用的操作符:= <> > >= < <=
案例:
1 | -- 标量子查询 |
列子查询:概念:子查询返回的结果是一列(可以是多行),这种子查询称为列子查询常用的操作符:IN, NOT IN, ANY, SOME, ALL
案例:
1 | -- 列子查询 |
行子查询概念:子查询返回的结果是一行(多列的)常用操作符:=, <>, IN, NOT IN案例:
1 | -- 行子查询 |
表子查询概念:子查询返回的结果是多行多列,这种子查询叫做表子查询常用操作符:IN案例:
1 | -- 表子查询 |
多表查询案例:
1 | -- 多表查询案例 |
多表查询-总结1. 多表关系多表之间的关系分为三类: 一对多:在多的一方设置外键,关联一的一方的主键 多对多:建立中间表,中间表包含两个外键,关联两张表的主键 一对一:用于表结构拆分,在其中任何一方设置外键(UNIQUE),关联另一方的主键
(一对一注:xx_order与xx_order_det就是这样的关系)
2. 多表查询内连接 隐式:
1 | select * from 表A, 表B where 条件....; |
显式:
1 | select * from 表A inner join 表B on 条件.....; |
外连接 左外:
1 | select ... from 表A left join 表B on 条件...; |
右外:
1 | select ... from 表A right join 表B on 条件...; |
自连接:
1 | select * from 表A 别名1, 表B 别名2 where 条件...; |
子查询:标量子查询,列子查询,行子查询,表子查询。
事务事务简介事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。注意:默认MySQL的事务是自动提交的,即当执行一条DML语句,MySQL会隐式的提交事务。
事务操作案例:
1 | -- 事务操作 |
事务操作方式一:查看/设置事务的提交方式
1 | select @@autocommit; |
提交事务
1 | commit; |
回滚事务
1 | rollback; |
案例:
1 | set @@autocommit = 0; |
事务操作方式二:开启事务
1 | start transaction 或者 begin |
提交事务
1 | commit |
回滚事务
1 | rollback |
案例:
1 | -- 方式2 |
commit 之前:
commit 之后:
出错了就rollback
事务四大特性(ACID)原子性 A - atomicity 事务是不可分割的最小操作单元,要么全部成功,要么全部失败。一致性 C - consistency 事务完成时,必须使所有数据都保持一致隔离性 I - isolation 数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境运行持久性 D - durability 事务一旦提交或回滚,它对数据库中数据的修改就是永久的
并发事务问题
1 | select @@transaction_isolation; |
设置事务隔离级别:
1 | set [session|global] transaction isolation level |
案例:
1 | -- 设置事务隔离级别案例 |
注意:事务隔离级别越高,数据越安全,但是效率也越低。
总结:1. 事务简介事务是一组操作的集合,一荣俱荣,一损俱损2. 事务操作
1 | start transaction; 或者 begin; -- 开启事务 |
事务3. 事务四大特性原子性A、一致性C、隔离性I、持久性D4. 并发事务问题脏读、不可重复读、幻读5. 事务隔离级别read uncommitted, read committed, repeatable read, serializable
基础篇总结MySQL概述 - SQL -函数 - 约束 - 多表查询 - 事务
转载自本人公众号笔记:MySQL数据库 - 基础篇,归类为原创。
原文链接: https://xqtony.github.io/2023/05/23/MySQL_DB_basic/
版权声明: 转载请注明出处.