Mysql 基础篇 SQL语句与事务相关

本文介绍了SQL中的四大类别:DDL用于数据库和表的创建、删除,DML涉及数据的插入、更新和删除,DQL关注数据查询,而DCL关注权限管理和用户控制。详细阐述了各种操作的语法,包括查询所有数据库、创建表、修改表结构、删除表、查询数据、事务处理和用户权限设置等。
摘要由CSDN通过智能技术生成

SQL-DDL

查询所有数据库

show databases

查询当前数据库

select database()

创建数据库

create database [if not exists] 数据库名 [default charset 字符集] [collate 排序规则]

# 例 创建名称为newdb默认字符集为utf8mb4的数据库
create database if not exists newdb default charset utf8mb4

删除数据库

drop database [if exists] 数据库名

# 例 删除名称为newdb的数据库
drop database if exists newdb

使用数据库

use 数据库名
# 例
use testdb

查询当前数据库所有表

show tables

查询表结构

desc 表名

# 例 查询t_table的表结构
desc t_table

查询指定表的建表语句

show create table 表名

# 例 查看t_table的建表语句
show create table t_table

创建表 (字段类型参照文末表格 约束列表参考文末约束表)

create table 表名(
	字段1 字段1类型 约束列表 [comment 字段1注释],
	字段2 字段2类型 约束列表 [comment 字段2注释],
	...
	字段n 字段n类型 约束列表 [comment 字段n注释]
)[comment 表注释];

# 例 创建一个用户表
create table z_user(
	id int primary key auto_increment comment '主键',
	name varchar(10) not null unique comment '姓名',
	age int check (age > 0 && age <=120) comment '年龄',
	status char(1) default '1' comment '状态',
	gender char(1) comment '性别'

) comment '用户表';

表中添加字段

alter table 表名 add 字段名 类型(长度) [comment 注释] [约束]

修改表中字段数据类型

alter table 表名 modify 字段名 新数据类型(长度)

修改字段名和字段类型

alter table 表名 change 旧字段名 新字段名 类型(长度) [comment 注释] [约束]

修改表名

alter table 表名 rename to 新表名

添加外键字段

alter 表名 add constraint 外键名称 foreign key (外键字段) references 主表名(主表字段名) onupdate cascade on delete cascade

删除表中字段

alter table 表名 drop 字段名

删除表

drop table [if exists] 表名

SQL-DML

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

给指定字段添加数据

insert into 表名(字段名1, 字段名2, ...) values(1,2, ...)

给全部字段添加数据

# 所有字段的值都必须写
insert into 表名 values(1,2, ...)

批量增加数据

insert into 表名(字段1, 字段2, ...) values(1,2, ...), (1,2, ...), (1,2, ...)
# 所有字段的值都必须写
insert into 表名 values(1,2, ...), (1,2, ...), (1,2, ...)

修改数据

# 条件不写表示修改表中所有数据
update 表名 set 字段名1 =1, 字段名2 =2, ... [where 条件]

删除数据

# 条件不写表示删除表中所有数据
delete from 表名 [where 条件]

SQL-DQL

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

查询语法

// 执行顺序 from -> where -> group by -> having -> select -> order by -> limit
select 字段列表 from 表名列表 where 条件列表 group by 分组字段列表 having 分组后条件列表 order by 排序字段列表 limit 分页参数

查询多个字段

select 字段1, 字段2, ... from 表名
select * from 表名

设置别名

select 字段1 [as 别名1], 字段2 [as 别名2], ... from 表名

去除重复记录

select distinct 字段列表 from 表名

条件查询 where 运算符参考文末运算符表

select 字段列表 from 表名 where 条件列表

聚合函数查询 常用聚合函数参考聚合函数表

# 注意🚧 null值不参与聚合函数运算
select 聚合函数(字段列表) from 表名

分组查询

// where 与 having区别
// where是分组之前执行,不满足不参与分组,having分组之后对结果进行过滤
// where不能对聚合函数进行判断,having可以
// 执行顺序 where > 分组函数 > having
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件]

排序查询

// ASC 升序(默认)  DESC 降序
// 如果多字段排序,当第一个字段相同时,才会根据第二个字段进行排序
select 字段列表 from 表名 order by 字段1 排序方式1,字段2 排序方式2

分页查询

// 起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数
// 分页查询是数据库的方言, 不同的数据库有不同的实现
// 如果查询的是第一页数据,起始索引可以省略
select 字段列表 from 表名 limit 起始索引, 查询记录数

SQL-DCL

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

查询用户

// 所有用户信息都是存在mysql数据库中的user表中
use mysql;
select * from user

创建用户

// 用户名用%表示可以访问任意主机 
create user '用户名'@'主机名' identified by '密码'

修改用户密码

alter user '用户名'@'主机名' identified with mysql_naive_password by '新密码'

删除用户

drop user '用户名'@'主机名'

查询用户权限

show grants for '用户名'@'主机名'

授予权限 参考文末常用权限列表

// 多个权限使用逗号分隔
// 授权时,数据库名和表名可以使用*代表所有
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名'

撤销权限

revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名'

内置函数

字符串函数

concat(s1, s2, s3…) 字符串拼接,将s1, s2, s3 … 拼接成一个字符串

select concat('hello ', 'mysql') # hello mysql

lower(str) 将字符串全部转为小写

select lower('hhhh') # HHHH

upper(str) 全部转为大写

select upper('HHHH') # hhhh

lpad(str, n, pad) 左填充,用字符串pad对str的左边进行填充,达到n个字符串长度

select lpad('hh', 5, '~') # ~~~hh

rpad(str, n, pad) 右填充,用字符串pad对str的右边进行填充,达到n个字符串长度

select rpad('hh', 5, '~') # hh~~~

trim(str) 去掉字符串头部和尾部的空格

select trim(' hello ') # hello

substring(str, start, len) 返回字符串从start开始的len个长度的字符串

select substring('hello mysql', 1, 5) # hello

数值函数

ceil(x) 向上取整

select ceil(1.5) # 2
select ceil(1.1) # 2

floor(x) 向下取整

select floor(1.5) # 1
select floor(1.1) # 1

mod(x, y) 返回x/y的模

select mod(3, 4) # 3%4 = 3

rand() 返回0~1内的随机值

select rand()

round(x, y) 求参数x的四舍五入的值,保留y位小数

select round(2.345, 2) # 2.35

日期函数

curdate() 返回当前日期

select curdate()

curtime() 返回当前日期

select curtime()

now() 返回当前日期和时间

select now()

year(date) 获取指定date的年份

select year('2023-02-10') # 2023

month(date) 获取指定date的月份

select month('2023-02-10') # 2

day(date) 获取指定date的日期

select day('2023-02-10') # 10

date_add(date, INTERVAL expr type) 返回一个日期/时间值加上一个时间间隔expr后的时间值

select date_add('2023-02-10', INTERVAL 70 DAY) # 2023-04-21

datediff(date1, date2) 返回起始时间date1和结束时间date2之间的天数

select datediff('2023-02-10', '2023-03-10') # -28

流程控制函数

if(value, t, f) 如果value为true,则返回t,否则返回f

select if(true, 'a', 'b') # a

ifnull(value1, value2) 如果value1不为空,返回value1,否则返回value2

select ifnull(null, 'a') # a
select ifnull('b', 'a') # b
select ifnull('', 'a') # ''

case when [val] then [res1] … else [default] end 如果val1为true,返回res1,… 否则返回default默认值

# 查询emp表中的员工姓名和工作地址(北京/上海 ----> 一线城市, 其他 ------> 二线城市)
select name, (case address when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end) as '工作地址'  from emp

case [expr] when [val1] then [res1] … else [default] end 如果expr的值等于val1,返回res1,否则返回default默认值

# 分数>=85 展示优秀 >=60 展示及格 否则不及格
select id, name, (case when math >= 85 then '优秀' when math >= 60 then '及格' else '不及格' end) as '数学' from score

多表查询

内连接查询

隐式内连接查询

select 字段列表 from1,2 where 条件...
# 例 查询每一个员工的姓名,及关联的部门的名称
select emp.name, dept.name from emp, dept where emp.dept_id = dept.id
// 给表起别名,这是就不能使用表名了,只能使用别名
select e.name, d.name from emp e, dept d where e.dept_id = d.id

显示内连接查询

select 字段列表 from1 [inner] join2 on 连接条件...
# 例 查询每一个员工的姓名,及关联的部门的名称
select e.name, d.name from emp e join dept d on e.dept_id = d.id

外连接查询

左外连接查询

# 相当于查询表1的全部数据 包含表1和表2交集部分的数据
select 字段列表 from1 left [outer] join2 on 条件...

右外连接查询

# 相当于查询表2的全部数据 包含表1和表2交集部分的数据
select 字段列表 from1 right [outer] join2 on 条件...

自连接查询

自连接查询

# 相当于查询表2的全部数据 包含表1和表2交集部分的数据
select 字段列表 from1 别名A join1 别名B on 条件...

联合查询

自连接查询

# 把多次查询的结果合并形成新的查询结果集 加上all直接合并,不加会对结果进行去重 
# 对于联合查询的多张表列数必须保持一致,字段类型也需保持一致
select 字段列表 from1... union [all] select 字段列表 from2... 

列子查询

常用操作符

in # 在指定的集合范围之内,多选一
not in # 不在指定的集合范围内
any # 子查询返回列表中,有任意一个满足即可
some # 与any相同,使用some的地方都可以使用any
all # 子查询返回列表中的所有值都必须满足

事务相关

查询当前提交方式

# 1 自动提交 0 手动提交
select @@autocommit

设置提交方式

set @@autocommit = 0 # 手动提交

开启事务

start transactionbegin

提交事务

commit

回滚事务

rollback

查看事务隔离级别 (隔离级别参照文末事务隔离级别表)

select @@transaction_isolation

设置事务隔离级别

# session 当前窗口有效 global 全局有效
set [session|global] transaction isolation level 隔离级别

事务四大特性

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

并发事务问题

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

事务隔离级别表

隔离级别脏读不可重复读幻读
read uncommitted会发生会发生会发生
read committed不会发生会发生会发生
repeatable Read(默认)不会发生不会发生会发生
serializable不会发生不会发生不会发生

字段类型表

类型大小 (byte)描述
tinyint1小整数值
smallint2大整数值
mediumint3大整数值
int或integer4大整数值
bigint8极大整数值
float4单精度浮点数值
double8双精度浮点数值
decimal小数值 (精确点数)
char0-255定长字符串
varchar0-65535变长字符串
tinyblob0-255不超过255个字符的二进制数据
tinytext0-255短文本字符串
blob0-65 535二进制形式的长文本数据
text0-65 535长文本数据
mediumblob0-16 777 215二进制形式的中等长文本数据
mediumtext0-16 777 215中等长文本数据
longblob0-4 294 967 295二进制形式的极大文本数据
longtext0-4 294 967 295极大文本数据
date0-4 294 967 295YYYY-MM-DD
time0-4 294 967 295HH:MM:SS
year0-4 294 967 295YYYY
datetime0-4 294 967 295YYYY-MM-DD HH:MM:SS
timestamp0-4 294 967 295YYYY-MM-DD HH:MM:SS(时间戳)

运算符表

运算符功能
>大于
>=大于等于
<小于
<=小于等于
=等于
<> 或 !=不等于
between … and …在某个范围之内
in(…)在in之后的列表中的值,多选一
like 占位符模糊匹配 (_匹配单个字符,%匹配任意个字符)
is null是null
and 或 &&并且 (多个条件同时成立)
or 或 ||或 (多个条件有一个成立)
not 或 !非,不是

聚合函数表

运算符功能
count统计数量
max最大值
min最小值
avg平均值
sum求和

用户权限表

权限说明
all, all privileges所有权限
select查询数据
insert插入数据
update修改数据
delete删除数据
alter修改表
drop删除表/数据库库/视图
create创建数据库/表

约束表

约束说明关键字
非空约束限制该字段数据不能为空not null
唯一约束该字段数据不能重复unique
主键约束主键是一行数据的唯一标识,非空唯一primary key
默认约束保存数据时,如果未指定该字段的值,则采用默认值default
检查约束保证字段值满足某一个条件check
外键约束用来让两张表的数据之间建立连接,保证数据的一致性和完整性foreign key
自增约束插入时不用管该字段,会自动增长auto_increment

外键删除/更新行为

行为说明
no action不允许删除/更新
restrict不允许删除/更新
cascade同样删除/更新外键所在表中的数据
set null删除子表中的数据时,当前表的外键被设置为null
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值