MySQL复习总结(一):基础篇

文章目录

  • 一、MySQL概述
  • 二、SQL语句
    • [2.1 SQL分类](#2.1 SQL分类)
    • [2.2 DDL语言](#2.2 DDL语言)
      • [2.2.1 数据库操作](#2.2.1 数据库操作)
      • [2.2.2 表操作:通用](#2.2.2 表操作:通用)
      • [2.2.3 表操作:修改](#2.2.3 表操作:修改)
      • [2.2.4 表操作:删除](#2.2.4 表操作:删除)
    • [2.3 DML语言](#2.3 DML语言)
      • [2.3.1 添加数据](#2.3.1 添加数据)
      • [2.3.2 修改数据](#2.3.2 修改数据)
      • [2.3.3 删除数据](#2.3.3 删除数据)
    • [2.4 DQL语言](#2.4 DQL语言)
    • [2.5 DCL语言](#2.5 DCL语言)
  • 三、函数
  • 四、约束
  • 五、多表查询
    • [5.1 多表关系](#5.1 多表关系)
  • 六、事务
    • [6.1 事务概念](#6.1 事务概念)
    • [6.2 控制事务](#6.2 控制事务)
    • [6.3 事务四大特性](#6.3 事务四大特性)
    • [6.4 并发事务问题](#6.4 并发事务问题)
    • [6.5 事务隔离级别](#6.5 事务隔离级别)

一、MySQL概述

1.1 数据库相关概念


1.2 启动停止

可以手动的通过指令启动停止,以管理员身份运行cmd,进入命令行执行如下指令:

sql 复制代码
#这里的mysql80是自己的服务名称
net start mysql80
net stop mysql80

1.3 客户端连接

sql 复制代码
mysql [-h 127.0.0.1] [-P 3306] -u root -p
#参数:
#-h : MySQL服务所在的主机IP
#-P : MySQL服务端口号, 默认3306
#-u : MySQL数据库用户名
#-p : MySQL数据库用户名对应的密码

[ ]内为可选参数,如果需要连接远程的MySQL,需要加上这两个参数来指定远程主机IP、端口,如果连接本地的MySQL,则无需指定这两个参数。


二、SQL语句

2.1 SQL分类

SQL语句,根据其功能,主要分为四类:DDLDMLDQLDCL

2.2 DDL语言

Data Definition Language,数据定义语言,用来定义数据库对象(数据库,表,字段) 。

2.2.1 数据库操作

查询所有数据库:

sql 复制代码
show databases ; 

查询当前数据库:

sql 复制代码
select database() ;

创建数据库

sql 复制代码
create database [ if not exists ] 数据库名
# 例如create database if not exists cabbage default charset utf8mb4;

在同一个数据库服务器中,不能创建两个名称相同的数据库,否则将会报错。

删除数据库:

sql 复制代码
drop database [ if exists ] 数据库名 ;

切换数据库:

sql 复制代码
use 数据库名 ;

2.2.2 表操作:通用

查询当前数据库所有表:

sql 复制代码
show tables;

查看指定表结构:

sql 复制代码
desc 表名 ;

查询指定表的建表语句:

sql 复制代码
show create table 表名 ;

创建表结构:

sql 复制代码
CREATE TABLE 表名(
字段1 字段1类型 [ COMMENT 字段1注释 ],
字段2 字段2类型 [COMMENT 字段2注释 ],
......
字段n 字段n类型 [COMMENT 字段n注释 ]
) [ COMMENT 表注释 ] ;

注意: [...] 内为可选参数,最后一个字段后面没有逗号。


MySQL中的数据类型有很多,主要分为三类:数值类型字符串类型日期时间类型。(具体的分类细节可网上查询)


2.2.3 表操作:修改

添加字段:

sql 复制代码
ALTER TABLE 表名 ADD 字段名 类型 (长度) [ COMMENT 注释 ] [ 约束 ]; 

修改数据类型:

sql 复制代码
ALTER TABLE 表名 MODIFY 字段名 新数据类型 (长度);

修改字段名和字段类型:

sql 复制代码
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型 (长度) [ COMMENT 注释 ] [ 约束 ];

删除字段:

sql 复制代码
ALTER TABLE 表名 DROP 字段名;

修改表名:

sql 复制代码
ALTER TABLE 表名 RENAME TO 新表名;

2.2.4 表操作:删除

删除表:

sql 复制代码
DROP TABLE [ IF EXISTS ] 表名;

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

sql 复制代码
TRUNCATE TABLE 表名;

2.3 DML语言

DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增、删、改操作。

2.3.1 添加数据

给指定字段添加数据:

sql 复制代码
INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);

给全部字段添加数据:

sql 复制代码
INSERT INTO 表名 VALUES (值1, 值2, ...);

批量添加数据:

sql 复制代码
INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...), (值1, 值2, ...), (值
1, 值2, ...) ;

或者是

sql 复制代码
INSERT INTO 表名 VALUES (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...) ;

注意事项:

• 插入数据时,指定的字段顺序与值的顺序是一一对应的。

• 字符串和日期型数据应该包含在引号中。

• 插入的数据大小,应该在字段的规定范围内。


2.3.2 修改数据

修改数据的具体语法为:

sql 复制代码
UPDATE 表名 SET 字段名1 = 值1 , 字段名2 = 值2 , .... [ WHERE 条件 ] ;

注意事项:

• 修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。


2.3.3 删除数据

删除数据的具体语法为:

sql 复制代码
DELETE FROM 表名 [ WHERE 条件 ] ;

注意事项:

• DELETE 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。

• DELETE 语句不能删除某一个字段的值。


2.4 DQL语言

DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记录。查询关键字: SELECT

DQL 查询语句,语法结构如下:

sql 复制代码
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段列表
HAVING
分组后条件列表
ORDER BY
排序字段列表
LIMIT
分页参数

在以往的学习中,可分为以下几个部分(专栏中详细写过这部分的文章):

  • 基本查询(不带任何条件)
    条件查询(WHERE)
    聚合函数(count、max、min、avg、sum)
    分组查询(group by)
    排序查询(order by)
    分页查询(limit)

最后来了解一下DQL语句在执行时的执行顺序,也就是先执行哪一部分,后执行哪一部分?


2.5 DCL语言

DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访问权限。

我们SQL开发人员操作的比较少,主要是DBA( Database Administrator 数据库管理员)使用,就不做详细的了解了。


三、函数

MySQL中的函数主要分为以下四类: 字符串函数数值函数日期函数流程函数


四、约束

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

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

注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。

五、多表查询

5.1 多表关系

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

  • 一对多(多对一)
  • 多对多
  • 一对一

一对多:

案例: 部门与员工的关系

关系: 一个部门对应多个员工,一个员工对应一个部门

实现: 在多的一方建立外键,指向一的一方的主键


多对多:

案例: 学生与课程的关系

关系: 一个学生可以选修多门课程,一门课程也可以供多个学生选择 实现: 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键


一对一:

案例: 用户与用户详情的关系

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

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


六、事务

6.1 事务概念

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

比如: 张三给李四转账1000块钱,张三银行账户的钱减少1000,而李四银行账户的钱要增加

1000。 这一组操作就必须在一个事务的范围内,要么都成功,要么都失败。不能出现,我给李四转1000块钱后,李四由于网络的原因,收款失败,而张三的1000也无法寻回的情况。

注意: 默认MySQL的事务是自动提交的,也就是说,当执行完一条DML语句时,MySQL会立即隐 式的提交事务。

6.2 控制事务


控制事务方式一:

1)查看/设置事务提交方式

sql 复制代码
SELECT @@autocommit ;
SET @@autocommit = 0 ;

2)提交事务

sql 复制代码
COMMIT;

3)回滚事务

sql 复制代码
ROLLBACK;

注意:上述的这种方式,我们是修改了事务的自动提交行为, 把默认的自动提交修改为了手动提交, 此时我们执行的DML语句都不会提交, 需要手动的执行commit进行提交(不常用)。


控制事务方式二:

1)开启事务

sql 复制代码
START TRANSACTION 或 BEGIN ; 

2)提交事务

sql 复制代码
COMMIT;

3)回滚事务

sql 复制代码
ROLLBACK; 

转账案例:

sql 复制代码
-- 开启事务
start transaction
-- 1. 查询张三余额
select * from account where name = '张三';
-- 2. 张三的余额减少1000
update account set money = money - 1000 where name = '张三';
-- 3. 李四的余额增加1000
update account set money = money + 1000 where name = '李四';
-- 如果正常执行完毕, 则提交事务
commit;
-- 如果执行过程中报错, 则回滚事务
-- rollback;

6.3 事务四大特性

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

上述就是事务的四大特性,简称ACID。

6.4 并发事务问题

1). 赃读一个事务读到另外一个事务还没有提交的数据。

在事务A中,执行到2(update)后,还没有提交事务;事务B开始查询数据库,这就是脏读。


2). 不可重复读一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。

在事务A中,首先查询数据库中id为1的数据,接着事务B对id为1的数据进行了修改;当事务A再次查询id为1的数据时,发现跟第一次查询到的数据不一样,这就是不可重复读。


3). 幻读一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 "幻影"。

在事务A中,首先查询id为1的数据时,没有查询到;接着事务B向数据库中插入了一条id值为1的数据,当事务A尝试插入一条id值为1的数据时,发现数据库中已经存在了数据。在解决了不可重复读的情况下,事务A再次查询数据库,发现id值为1的数据仍然不存在,这就是幻读。


6.5 事务隔离级别

为了解决并发事务所引发的问题,在数据库中引入了事务隔离级别。主要有以下几种:

查看事务隔离级别:

sql 复制代码
SELECT @@TRANSACTION_ISOLATION; 

设置事务隔离级别:

sql 复制代码
SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED |
READ COMMITTED | REPEATABLE READ | SERIALIZABLE }

注意:事务隔离级别越高,数据越安全,但是性能越低。

隔离级别为SERIALIZABLE时,只有一个事务commit完,另一个事务才能commit。

相关推荐
苹果醋326 分钟前
2020重新出发,MySql基础,MySql表数据操作
java·运维·spring boot·mysql·nginx
小蜗牛慢慢爬行27 分钟前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
hanbarger31 分钟前
nosql,Redis,minio,elasticsearch
数据库·redis·nosql
微服务 spring cloud1 小时前
配置PostgreSQL用于集成测试的步骤
数据库·postgresql·集成测试
先睡1 小时前
MySQL的架构设计和设计模式
数据库·mysql·设计模式
弗罗里达老大爷1 小时前
Redis
数据库·redis·缓存
仰望大佬0072 小时前
Avalonia实例实战五:Carousel自动轮播图
数据库·microsoft·c#
学不透java不改名2 小时前
sqlalchemy连接dm8 get_columns BIGINT VARCHAR字段不显示
数据库
一只路过的猫咪2 小时前
thinkphp6使用MongoDB多个数据,聚合查询的坑
数据库·mongodb