mysql基础

1、表操作-数据类型

1、数值类型

类型大小有符号(SIGNED)范围无符号(UNSIGNED)范围描述
TINYINT1byte(-128,127)(0,255)小整数值
SMALLINT2bytes(-32768,32767)(0,65535)大整数值
MEDIUMINT3bytes(-8388608,8388607)(0,16777215)大整数值
INT/INTEGER4bytes(-2147483648,2147483647)(0,4294967295)大整数值
BIGINT8bytes(-263,263-1)(0,2^64-1)极大整数值
FLOAT4bytes(-3.402823466 E+38, 3.402823466351 E+38)0 和 (1.175494351 E-38,3.402823466 E+38)单精度浮点数值
DOUBLE8bytes(-1.7976931348623157E+308,1.7976931348623157E+308)0 和(2.2250738585072014E-308,1.7976931348623157E+308)双精度浮点数值
DECIMAL依赖于M(精度)和D(标度)的值(例如123.245精度就是整个数值的长度6,标度就是小数点位数3)依赖于M(精度)和D(标度)的值小数值(精确定点数)

2、字符串类型

类型大小描述
CHAR0-255 bytes定长字符串(需要指定长度)
VARCHAR0-65535 bytes变长字符串(需要指定长度)
TINYBLOB0-255 bytes不超过255个字符的二进制数据
TINYTEXT0-255 bytes短文本字符串
BLOB0-65 535 bytes二进制形式的长文本数据
TEXT0-65 535 bytes长文本数据
MEDIUMBLOB0-16 777 215 bytes二进制形式的中等长度文本数据
MEDIUMTEXT0-16 777 215 bytes中等长度文本数据
LONGBLOB0-4 294 967 295 bytes二进制形式的极大文本数据
LONGTEXT0-4 294 967 295 bytes极大文本数据

3、日期时间类型

类型大小**范围 **格式描述
DATE31000-01-01 至9999-12-31YYYY-MM-DD日期值
TIME3-838:59:59 至838:59:59HH:MM:SS时间值或持续时间
YEAR11901 至 2155YYYY年份值
DATETIME81000-01-01 00:00:00 至 9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值
TIMESTAMP41970-01-01 00:00:01 至 2038-01-19 03:14:07YYYY-MM-DD HH:MM:SS混合日期和时间值,时间戳

2、DDL语句

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

数据库操作

# 查询所有数据库
show database;
# 查询当前数据库
select database;
# 创建数据库  if exists 表示不存在再创建存在即不操作  可省略   default charset指定字符集 可忽略
create database [if exists]  数据库名称 [default charset  字符集];
# 删除数据库  if exists 表示不存在再创建存在即不操作  可省略
drop database [if exitsts]  数据库名称;
# 使用数据库 进行数据库切换
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 表名 RENAME TO 新表名;
# 添加字段
ALTER TABLE 表名 	ADD  字段名  类型(长度)  [COMMENT '注释']  [约束];
# 修改数据类型
ALTER TABLE 表名 MODIFY  字段名 新数据类型(长度);
# 修改字段名和字段类型
ALTER TABLE 表名 CHANGE 旧字段名  新字段名  类型(长度)  [COMMENT 注释]  [约束];
删除
# 删除表
DROP TABLE [IF EXISTS] 表名;
# 删除指定表,并重新创建该表
TRUNCATE TABLE 表名
# 删除字段
ALTER TABLE 表名 DROP 字段名;

3、DML语句

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

添加
# 给指定字段添加数据
INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (1,2, ...);
# 给全部字段添加数据
INSERT INTO 表名 VALUES (1,2, ...); 
# 批量添加数据
INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (1,2, ...), (1,2, ...), (1,2, ...) ;
# 注意事项:
# • 插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
# • 字符串和日期型数据应该包含在引号中。
# • 插入的数据大小,应该在字段的规定范围内。
修改
# 修改数据
UPDATE 表名 SET 字段名1 =1 , 字段名2 =2 , .... [ WHERE 条件 ] ;
删除
DELETE FROM 表名 [WHERE 条件];

4、DQL语句

DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记

查询语句

# 查询语句语法结构
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段列表
HAVING
分组后条件列表
ORDER BY
排序字段列表
LIMIT
分页参数
#
基本查询(不带任何条件)
条件查询(WHERE)
聚合函数(count、max、min、avg、sum)
分组查询(group by)
排序查询(order by)
分页查询(limit# 查询多个字段
SELECT 字段1, 字段2, 字段3 ... FROM 表名 ; 
SELECT * FROM 表名 ;# 注意 : * 号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)。
# 字段设置别名
SELECT 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] ... FROM 表名;
SELECT 字段1 [ 别名1 ] , 字段2 [ 别名2 ] ... FROM 表名;
# 去除重复记录
SELECT DISTINCT 字段列表 FROM 表名;
# 条件查询
SELECT 字段列表 FROM 表名 WHERE 条件列表 ;

常用的比较运算符如下

**比较运算符 **功能
>大于
>=大于等于
<小于
<=小于等于
=等于
<>或!=不等于
BETWEEN … AND …在某个范围之内(含最小、最大值)
IN(…)在in之后的列表中的值,多选一
LIKE 占位符模糊匹配(_匹配单个字符, %匹配任意个字符)
IS NULL是NULL

常用的逻辑运算符如下

逻辑运算符功能
AND 或 &&并且 (多个条件同时成立)
OR 或 ||或者 (多个条件任意一个成立)
NOT 或 !非 , 不是

聚合函数

函数功能
count统计数量
max最大值
min最小值
avg平均值
sum求和
# 语法
SELECT 聚合函数(字段列表) FROM 表名 ;
# 注意 : NULL值是不参与所有聚合函数运算的。

分组查询

# 语法
SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组
后过滤条件 ];

# where与having区别
执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组
之后对结果进行过滤。
判断条件不同:where不能对聚合函数进行判断,而having可以。
注意事项:
• 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
• 执行顺序: where > 聚合函数 > having 。
• 支持多字段分组, 具体语法为 : group by columnA,columnB

排序查询

# 语法
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2 ;
# 排序方式
ASC : 升序(默认值)
DESC: 降序
注意事项:
• 如果是升序, 可以不指定排序方式ASC ;
• 如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序 ;

分页查询

# 语法
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;
# 注意事项:
• 起始索引从0开始,起始索引 = (查询页码 - 1* 每页显示记录数。
• 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
• 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10

执行顺序

image.png

5、DCL语句

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

管理用户

查询用户
# 查询用户
SELECT * FROM MYSQL.USER;

查询的结果如下:
image.png
其中Host代表当前用户访问的主机, 如果为localhost, 仅代表只能够在当前本机访问,是不可以
远程访问的。User代表的是访问该数据库的用户名。在MySQL中需要通过Host和User来唯一标识一
个用户。

创建用户
CREATE USER '用户名'@'主机名' IDENTIFIEDBY '密码';
修改用户密码
ALTER USER  '用户名'@'主机名'  IDENTIFIED WITH mysql_native_password BY '新密码';
删除用户
DROP USER '用户名'@'主机名';

注意事项:
• 在MySQL中需要通过用户名@主机名的方式,来唯一标识一个用户。
• 主机名可以使用% 通配。
• 这类SQL开发人员操作的比较少,主要是DBA(Database Administrator 数据库
管理员)使用。

权限控制

常用权限
权限说明
ALL, ALL PRIVILEGES所有权限
SELECT查询数据
INSERT插入数据
UPDATE修改数据
DELETE删除数据
ALTER修改表
DROP删除数据库/表/视图
CREATE创建数据库/表
查询权限
SHOW GRANTS  FOR'用户名'@'主机名';
授予权限
GRANT 权限列表 ON 数据库名.表名  TO '用户名'@'主机名';
撤销权限
REVOKE  权限列表  ON  数据库名.表名  FROM  '用户名'@'主机名';

6、函数

函数是指一段可以直接被另一段程序调用的程序或代码

字符串函数

常用的字符串函数
函数功能
CONCAT(S1,S2,…Sn)字符串拼接,将S1,S2,… Sn拼接成一个字符串
LOWER(str)将字符串str全部转为小写
UPPER(str)将字符串str全部转为大写
LPAD(str,n,pad)左填充,用字符串pad对str的左边进行填充,达到n个字符串长度
RPAD(str,n,pad)右填充,用字符串pad对str的右边进行填充,达到n个字符串长度
TRIM(str)去掉字符串头部和尾部的空格
SUBSTRING(str,start,len)返回从字符串str从start位置起的len个长度的字符串

数值函数

常见的数值函数
函数功能
CEIL(x)向上取整
FLOOR(x)向下取整
MOD(x,y)返回x/y的模
RAND()返回0~1内的随机数
ROUND(x,y)求参数x的四舍五入的值,保留y位小数

日期函数

常见的日期函数
函数功能
CURDATE()返回当前日期
CURTIME()返回当前时间
NOW()返回当前日期和时间
YEAR(date)获取指定date的年份
MONTH(date)获取指定date的月份
DAY(date)获取指定date的日期
DATE_ADD(date, INTERVAL exprtype)返回一个日期/时间值加上一个时间间隔expr后的时间值
DATEDIFF(date1,date2)返回起始时间date1 和结束时间date2之间的天数

流程函数

常见的流程函数
函数功能
IF(value , t , f)如果value为true,则返回t,否则返回f
IFNULL(value1 , value2)如果value1不为空,返回value1,否则返回value2
CASE WHEN [ val1 ] THEN [res1] … ELSE [ default ] END如果val1为true,返回res1,… 否则返回default默认值
CASE [ expr ] WHEN [ val1 ] THEN [res1] … ELSE [ default ] END如果expr的值等于val1,返回 res1,… 否则返回default默认值

7、约束

概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
目的:保证数据库中数据的正确、有效性和完整性。

约束分类

约束描述关键字
非空约束限制该字段的数据不能为nullNOT NULL
唯一约束保证该字段的所有数据都是唯一、不重复的UNIQUE
主键约束主键是一行数据的唯一标识、要求非空且唯一PRIMARY KEY
默认约束保存数据时,如果未指定该字段的值,则采用默认值DEFAULT
检查约束(8.0.16版本之后)保证字段值满足某一个条件CHECK
外键约束用来让两张表的数据之间建立连接,保证数据的一致性和完整性FOREIGN KEY
外键约束

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

添加外键
# 创建表时添加
CREATE TABLE 表名(
  字段名 数据类型,
  ...
  [CONSTRAINT] [外键名称]  FOREIGN KEY (外键字段名) PEFERENCES  主表(主表列名)
);
# 创建表后添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY  (外键字段名)  PEFERENCES 主表(主表列名);
删除外键
# 删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
外键删除/更新行为
行为说明
NO ACTION当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与RESTRICT一致) 默认行为
RESTRICT当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与RESTRICT一致) 默认行为
CASCADE当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录
SET NULL当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(这就要求该外键允许取null)
SET DEFAULT父表有变更时,子表将外键列设置成一个默认值 (Innodb不支持)
具体语法
# 创建表时添加
CREATE TABLE 表名(
字段名 数据类型,
...
[CONSTRAINT] [外键名称]  FOREIGN KEY (外键字段名) PEFERENCES  主表(主表列名)
[ON UPDATE 行为] [ON DELETE 行为]
);
# 创建表后添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY  (外键字段名)  PEFERENCES 主表(主表列名) [ON UPDATE 行为] [ON DELETE 行为];  

8、多表查询

连接查询

类别作用
内连接相当于查询两个表交集部分数据
左外连接查询左表所有数据,以及两张表交集部分数据
右外连接查询右表所有数据,以及两张表交集部分数据
自连接当前表与自身的连接查询,自连接必须使用表别名
内连接
隐式内连接
SELECT 字段列表 FROM1,2  WHERE  条件  ... ;
显示内连接
SELECT 字段列表 FROM1  [INNER] JOIN2  ON  连接条件  ... ;
外连接
左外连接
SELECT 字段列表 FROM1  LEFT [OUTER] JOIN2  ON  条件 ...;
右外连接
SELECT 字段列表 FROM1  RIGHT [OUTER] JOIN2  ON  条件 ...;
自连接
# 对于自连接可以是内连接也可以是外连接
SELECT 字段列表 FROM  表A 别名A  JOIN 表A  别名B ON 条件 ...;

联合查询

UNION就是把多次查询的结果合并起来,形成一个新的查询结果集

# 联合查询要求列数保持一致 UNION ALL是将两个结果进行拼接起来 UNION则是拼接起来后进行去重 
SELECT 字段列表 FROM 表A  ...
UNION [ALL]
SELECT 字段列表 FROM 表B  ...

子查询

SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询

# 子查询外部的语句可以是INSERT / UPDATE / DELETE / SELECT 的任何一个
SELECT 字段列表  FROM  表A  WHERE1  操作符 (SELECT1 FROM 表B [WHERE 条件 ...]);
标量子查询

子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。
常用的操作符:

操作符描述
=等于
<>或!=不等于
>=大于等于
<=小于等于
>大于
<小于
# 子查询(SELECT 列1 FROM 表B [WHERE 条件 ...]) 的值是唯一单个值,单行单列
SELECT 字段列表 FROM  表A  WHERE1 操作符  (SELECT1 FROM 表B [WHERE 条件 ...])
列子查询

子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。
常用的操作符:

操作符描述
IN在指定的集合范围之内,多选一
NOT IN不在指定的集合范围之内
ANY子查询返回列表中,有任意一个满足即可(一般配合标量子查询的操作符使用)
SOME与ANY等同,使用SOME的地方都可以使用ANY
(一般配合标量子查询的操作符使用)
ALL子查询返回列表的所有值都必须满足
(一般配合标量子查询的操作符使用)
# 子查询(SELECT 列1 FROM 表B [WHERE 条件 ...]) 的值是一列多行的情况
SELECT 字段列表 FROM  表A  WHERE1 操作符  (SELECT1 FROM 表B [WHERE 条件 ...])
# 子查询(SELECT 列1 FROM 表B [WHERE 条件 ...]) 的值是一列多行的情况
SELECT 字段列表 FROM  表A  WHERE1 标量子查询操作符 操作符  (SELECT1 FROM 表B [WHERE 条件 ...])
行子查询

子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。
常用的操作符:

操作符描述
=等于
<>或!=不等于
IN在指定的集合范围之内,多选一
NOT IN不在指定的集合范围之内
# 子查询(SELECT 列1,列2 FROM 表B [WHERE 条件 ...]) 的值是一行多列的情况 关系是并且 类似于(表A.列1=表B.列1 and 表A.列2 = 表B.列2) 
SELECT 字段列表 FROM  表A  WHERE (1,2) 操作符  (SELECT1,2 FROM 表B [WHERE 条件 ...])
表子查询

常用的操作符:IN

# 子查询(SELECT 列1,列2 FROM 表B [WHERE 条件 ...]) 的值是多行多列的情况 关系是并且 类似于(表A.列1 in 表B.列1 and 表A.列2 in 表B.列2) 
SELECT 字段列表 FROM  表A  WHERE (1,2 ...) 操作符  (SELECT1,2 ... FROM 表B [WHERE 条件 ...])

9、事务

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

控制事务一

查看事务提交方式
# 查看事务提交的方式 1为自动提交  0为手动提交
SELECT @@AUTOCOMMIT;
设置事务提交方式
# 事务提交的方式 1为自动提交  0为手动提交
SET @@AUTOCOMMIT = 0;
提交事务
# 提交事务
COMMIT;
回滚事务
# 回滚事务
ROLLBACK;

控制事务二

开启事务
# 开启事务
START TRANSACTIONBEGIN ;

事务的四大特性

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

并发事务问题

问题描述
脏读一个事务读到另一个事务还没有提交的数据
不可重复读一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读
幻读一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了幻影
脏读

image.png

不可重复读

image.png

幻读

image.png

事务的隔离级别

隔离级别脏读不可重复读幻读
Read uncommitted
读未提交
  • [x]

|

  • [x]

|

  • [x]

|
| Read committed
读已提交 |

  • [ ]

|

  • [x]

|

  • [x]

|
| Repeatable Read(默认)
可重复读 |

  • [ ]

|

  • [ ]

|

  • [x]

|
| Serializable
串行化 |

  • [ ]

|

  • [ ]

|

  • [ ]

|

查看事务的隔离级别
# 查看事务的隔离级别
SELECT @@TRANSACTION_ISOLATION;
设置事务的隔离级别
# 设置事务的隔离级别 SESSION针对于会话 GLOBAL针对于全局
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨辰李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值