MySQL基础--sql基础一篇就够了
DQL基础查询select * from 表名; 条件查询select * from 表明 where 条件 排序查询select * from table where 条件 order by 字段名 desc/asc; 常见函数分组查询select* from 表名 where 条件 group by 字段名 having 组筛选条件 连接查询select * from a 【inner/left/right】join b on 连接条件 子查询select * from (select * from a) where 条件 分页查询select * from 表名 limit 起始下标,数量 联合查询select * from a union select * from b |
|||||||||
DML插入:insert into 表名 (字段名1,字段名2) values(值1,值2) ,(值11,值22) 修改:updata 表名 set 字段名1=值, 字段名2=值 where 筛选条件 删除:delect from 表名 where 筛选条件 |
|||||||||
DDL库的管理(1)创建库 [ character set 字符集名] (2)修改库
[ if exists] 库名; 表的管理:(1)创建:1.create table 表名 ( (2)修改: 1.添加列 [ first| after 字段名] ;
modify column 列名新类型[ 新约束] ;
新列名类型;
drop colnmn 列名;
(3)删除drop table 表名;
(4)复制表1、复制表的结构
数据类型
常见的约束通用写法: create table stuinfo( 外键约束写入表级约束,其他约束写入列级约束 查看表结构:desc 表名; 查看索引:show index from 表名; 索引包括;主键,外键,唯一 添加表的非空约束:alter table stuinfo modify stu_name varchar(5) not null; 添加表的默认约束:alter table stuinfo modify age default 18; 添加主键约束:alter table stuinfo modify id int(5) primary key; alter table stuinfo add constraint pk_stuinfo_major primary key(id); 添加唯一约束:alter table stuinfo modify id int(5) unique; alter table stuinfo add unique(id); 添加外键:alter table stuinfo add foreign key(major_id) references major(id); 删除非空约束和默认约束:alter table stuinfo modify 字段名 字段类型; 删除主键约束:alter table stuinfo drop primary key; alter table stuinfo modify id int(2); 删除唯一约束: alter table stuinfo drop index 唯一键名; 删除外键约束:alter table stuinfo drop foreign key 外键名; 标识列create table stuinfo( id int(5) primary key auto_increment, name varchar(5)); 修改标识列:alter table 表名 modify id int(5) primary key atuo_increment; 删除标识列: alter table 表名 modify id int(5) primary key;
|
|||||||||
TCL事务mysql 默认是开启事务自动提交的 关闭事物的自动提交:SET autocommit=0 开启事务的自动提交:SET autocommit=1 开启事务:START TRANSACTION (标记事务的开启,在这之后的sql语句都在同一个事务内 ) 提交事务:COMMIT 回滚事务:ROLLBACK
保存点: 设置一个是事物的保存点:SAVEPOINT 保存点名称 回滚到某个保存点:ROLLBACK TO SAEPOINT 保存点名称 撤销保存点:RELEASE SAVEPOINT 保存点名称
一个事务的完整执行流程: 手动开启处理事务(关闭自动提交):SET sutocommit=0 开启事务:START TRANSATION 执行sql语句:select,delete,insert,update(不包含DDL语句) 提交事务或者回滚事务:commit/rollback 事务结束,开启自动提交:SET autocommit=1 查看当时数据库的隔离级别:select @@tx_isolation 设置数据库的隔离级别:set 【global / session】 transaction isolation level (隔离名称)read uncommitted; 事务隔离级别: read uncommitted 都可以发生 read committed 脏读不会发生 repeatable read; 脏数据和重复读不会发生 serializable 脏读不可重复的和幻读都不会发生 设置保存点:savepoint 保存点名称
保存点演示: SET autocommit=0; 会发现id为25的数据并没有删除,是应为保存点回到了a。 事务之转账实例:
脏读(更新): 事务一:开启事务,更新了数据(此时数据库表数据更新了),但未提交事务。 事务二:开启事务,读取数据,是事务一更新单位提交的数据。此为脏读
不可重复读(更新): 事务一:开启事务,更新新了数据,单位提交。 事务二:开启了事务,查询事务一更新的数据,是更新之后的数据。 事务一:执行回滚,提交事务。 事务二:第二次读取数据,数据变了。此为不可重读
幻读(针对插入): 事务一:开启事务,查询一下有5条数据,准备对这五条数据执行更新操作,但还未执行 事务二;开启事务,插入5数据,提交事务。 事务一:执行对5条数据的更新操作,会发现受影响行数为10,此为幻读。
演示delete 和truncate的区别 set autocommit=0;
set autocommit=0; trunate删除表数据后,回滚不能将数据找回 而delete 可以将删除的数据找回 |
|||||||||
其他视图create view 视图名 as 查询语句; drop view 视图名; create or replace 视图名 as 查询语句; alter view 视图名 as 查询语句; desc 视图名; show create view 视图名; 使用: insert into 视图名(字段名) values(字段值); delete from 视图 名 where 筛选条件; update 视图名 set 字段名=值 where 筛选条件; select * from 视图名 where 筛选条件; 变量 :查看所有的系统变量: show 【global | session】 variables; 查看指定条件的系统变量: show 【global | session】 variables like '%char%' 查看某个系统变量: select @@【globla | sesssion】.系统变量名
为某个系统变量赋值: set 【global | session】 系统变量名=值 set @@【global | session】.系统变量名=值 用户变量名赋值和更新: set @用户变量名=值; set @用户变量名:=值; select @用户变量名:=值;
select 字段名 into 用户变量名from 表名 查看用户变量名: select @用户变量名;
局部变量: declare 变量名 类型 set 局部变量名=值 select 局部变量名 存储过程和函数:创建: delimiter $ create procedure 存储过程名(in 参数名1 参数类型) begin 存储体,sql语句 end $ 调用存储过程 call 存储构过程名(参数1); |
DQL基础查询一、语法 4、查询常量 9、+
12、[补充] isnul1函数 条件查询一、语法 like:-般搭配通配符使用,可以判断字符型或数值型 is null /is not null: 用于判断nul1值 排序查询一、语法 常见函数字符串函数: substr()截取 数字函数: ceil()向上取整 日期函数: 其他函数: 流程控制函数: 分组查询一、语法 ,连接查询分类:内连接,外连接,自连接 内连接 : inner join 非等值连接 自连接 内连接语句模板: 外连接: 右外 right join 全外 full join 交叉连接 cross join 外连接语句模板: (left,right,cross)join 表2 别名 on 连接条件 where 筛选条件 group by 列名 having 组筛选条件 order by 列名 子查询一、含义 行子查询:结果集为多行多列 分页查询一、应用场景 联合查询一、含义 三、意义 |
DML插入:一、方式一
二、方式二 修改:一、修改单表的记录★ 删除:方式一:使用delete
方式二:使用truncate 三、区别: 1. truncate删除后,如果再插入,标识列从1开始 |
DDL库的管理(1)创建库
表的管理:(1)创建: 1.create table [if not exists]表名 ( (2)修改: 1.添加列
(3)删除drop table 表名;
(4)复制表1、复制表的结构
数据类型一。整型 整数型 浮点型 tinyint : 1、smallint : 2、mediunint : 3、 int/integer : 4、 bigint :8 通过unsigne d设置无符号 插入临界值 o填充,但需要搭配zerofill,并且默认变为无符 号整型
二。字符型 char和varchar的不同是,varchar的 长度是可变的,但是char的长度是不 可变的,char(10): 表示这个字段分配了10个字符的字段 ,插入不到十个字符也会占用是个字符 的长度。 较长的文本的用text和blob
①M代表整数部位+小数部位的个 数,D代表小数部位 range异常,并且插入临界值 点数,嘿认为10, D默认为0 虑使用定点数
三。日期型 year年 、版本的影响,更能反映当前时区的真实时间 不可重复读××√√常见约束:(1)约束的分类: not null:非空,用于保证该字段的值不 能为空,比如姓名,学号 default:默认,用于保证该字段的默 认值 ,如性别 primary key:主键,用于保证该字段具 有唯一性,非空,如学号 unique:唯一,用于该字段具有唯一性, 可以为空 check:检查约束(mysql不支持) foreign key:外键约束,用于限制两个表的关系,用于保证 (2)添加约束的时机 1.创建表时添加约束 create table stuinfo( check(gender='男' or gender='女'), key(major_id) references major(id) 2.修改表时添加约束 alter table 表名 modify 列名 类型 约束类型 (3)约束添加的分类 1.列级约束 六大约束都支持,但是外键约束无效果 2.表级约束 除了非空和默认,其他都支持
主键和唯一
外键:
#二、修改表时添加约束 标识列又称为自增长列 SET auto_ increment_ increment=3;设置步长 列级约束 create table stuinfo(
major_id int(2) foreign key references major(id) #外键约束(不支持) 表级约束:create table stuinfo( constraint fk_stinfo_major foreign key(major_id) references major(id)#外键 );
对于有外键的表: 插入时我们先插入主表数据在差从表的数据 删除时先删从表的数据在删主表的数据 若有业务需求:我们需要直接删除主表的数据时,我们可以这样实现 1. 级联删除:(使用关键字on delete cascade) alter table 从表名 add constraint 外键名 froeign key(添加外键的字段) refenences 主表名(字段名) on delete cascade; 2.级联置空(使用关键字on delete set null): alter table 从表名 add constraint 外键名 froeign key(添加外键的字段) refenences 主表名(字段名) on delete set null; 定义和使用的位置会话中的任何位置只能在BEGIN END 中,且只能是是第一句 |
TCL |
其他 |
||||||
事务的原则:* 原子性:一个事务要么全部
提交完成,要么全部回滚失败,不能执行其中的一部分操作,这就是事务的原子性(针对一个事务,要么一个 事务都完成,要么不开始,不能是执行一半的状态)。 * 一致性:事务的执行不能破坏数据的完整性和一致性,一个是事务在执行之前和执行之后,数据库都必须保持 一致的状态。(事务执行前后数据保持一致,不会增加也不会减少。)如果数据库系统在运行过程中发生故障, 有些事物尚未完成就被迫中断,这些未完成的事物对数据库所做的修改有一部分已经写入到物理数据库中,这是数据 库就处于一种不正确的状态,也就是不一致的状态。 * 持久性:一单事务提交,那么他对数据库中数据的状态的变更就会永远的保存到数据库中,--即使发生系 统崩溃会机器宕机等故障,只要数据库能够重新启动,那么一定能恢复到十五成功结束的状态。(对于事物只 有提交前和提交后,若果是事务还未提交,系统发生故障,那这个事务会恢复到未执行的状态,如果发生故障 之前,事务提交了,那这个事务就会提交到数据库成为已经执行的状态,且不可逆。事务 一旦提交就不可逆。) * 隔离性:事物的隔离性是指在并发环境中,并发的食物是相互隔离的,一个事务的执行不能背其他 的事物所干扰。不同的事务并发操作相同的数据时,每个事物都有各自完成的数据空间,即一个事务的 内部操作及使用的数据对其他并发事务是隔离的,并发执行的各个事 务之间不能相互干扰,(每个事物 之间都相互的隔离)。 |
|||||||
对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:
➢脏读:对于两个事务T1, T2,T1读取了已经被T2更新但还没有被提交的字段. * 隔离失败会产生一些问题: 1.读脏字(读取未提交):指的是一个事务读取了另一个事务 未提交的事务。 2.不可重复读:在一个事务内多次读取表中的某一行数据,多次读取的的数据不一样 (这不一定是错误,但是某些场 合下不对)。 3.虚读(幻读): 是指在一个事务内读取到了别 的事务插入的数据,导致前 后读取的不一样(一般是行数 影响,多了一行数据)
|
|||||||
隔离级别描述READ UNCOMMITTED READ COMMITED REPEATABLE READ SERIALIZABLE(串 行化)
Mysql支持4种事务隔离级别.Mysql默认的事务隔离级别
|
|||||||
其他:视图好处: 1.简化sql 2.提高了sql的重用性 3.保护基表的数据,提高了安全性
创建: create view 视图名 as 查询语句
修改: create or replace view 视图名 as 查询语句
删除: drop view 视图名
查看: show create view 视图名; desc 视图名;
视图的使用: 插入数据:insert into 视图名(字段名) value(字段值) 删除数据:delete from 视图名 更新数据:update 视图名 set 列名=值 where 筛选条件 查询数据:select * from 视图名 where 筛选条件 注意:视图是用来查询的,不是用来更新的, 查询语句中含有以下语句的不可进行更新: ①包含分组函数、group by、distinct、 having、 union、
视图和表的对比:
|
|||||||
变量:#一、系统变量 #1》全 局变量(globlal.*) 会话变量作用域(session.) variables系统变量,默认只能在本会话中起作用 |
|||||||
自定义变量: 说明:变量是用户自定义的,不是由系统的 声明并初始化: set 用户变量名=值; set 用户变量名:=值; select 用户变量名:=值; 赋值(更新变量): set 用户变量名=值; set 用户变量名:=值; select 用户变量名:=值; select 字段 into 变量名 from 表; |
|||||||
局部变量 作用域:仅仅在定义他的begin end中有效 应该在begin end 中的第一句话!! #①声明 |
|||||||
|
|||||||
#存储过程和函数
8 #一、创建语法
2、如果存储过程体仅仅只有一-句话,BEGIN END可以省略
|
select最全语法模板:
select [ all | distinct ] 字段名 别名 *********(8)
from 表名1 别名 *********(1)
(inner,left,right,cross) join 表名2 别名 *********(2)
on 连接条件 *********(3)
where 字段筛选条件 *********(4)
group by 以那个字段进行分组 *********(5)
having 分组筛选 *********(6)
order by 字段名 【asc/desc】 *********(7)
limit startindex,pagesize *********(9)
- 语法:
-
语法:select 查询类表 from 表名 where 筛选条件
分类:-
按条件表达式查询
简单条件运算符:>< = != >= <= <>
<>不等于 -
逻辑表达式筛选:
逻辑运算符:
&& || ! and or not -
模糊查询L
like
between and
in
is null
-
-
- 连接类型分类:
- 分类:内连接,外连接,自连接
-
内连接 : inner join
等值连接非等值连接
自连接
-
内连接语句模板:
select 查询列表
from 表1 别名
inner join 表2 别名
on 连接条件 -
外连接:
左外 left join右外 right join
全外 full join
交叉连接 cross join
-
外连接语句模板:
select 查询列别 别名
from 表 别名(left,right,cross)join 表2 别名
on 连接条件
where 筛选条件
group by 列名
having 组筛选条件
order by 列名
-
- 分类:内连接,外连接,自连接
- 常见函数:
-
字符串函数:
substr()截取
concat()连接
upper() lower()
replace()替换
length()获取字节长度
trim()去空格
lapd()左填充
rapd()右填充
instr():获取字串第一次出现的索引
-
数字函数:
ceil()向上取整
round()四舍五入
mod()取模
floor()向下取整
truncate()截断
rand()获取随机数,返回0-1之间的小数
-
日期函数:
now()当前日期+时间
year()当前的年
month()yuue
day()天
date_format()将日期转换为字符
curdate():返回当前日期
str_to_date()将字符转换为日期
curtime()返回当前时间
hour()小时
minute()分钟
second()秒
datediff()返回两个日期相差的天数
monthname()以英文形式返回月
-
其他函数:
version()放回当前版本
database 当前数据库
user当前用户
password(’字符‘):返回该字符的密码形式,自动加密
md5():返回MD5加密形式
-
流程控制函数:
if(条件表达式,表达式1,表达式2):如果表达式成立,则返回表示1 ,否则返回表达式2
case 表达式或变量
when 常量 then 表达式
else
end
case
when 条件 then 表达式
else 表达式
end
-
- 分页查询:
-
语法:
select查询列表
from表
[join type join表2
on
连接条件
where筛选条件
group by分组字段
having分组后的筛选_
order by排序的字段]
limit offset, size;
offset要显示条目的起始索引( 起始索引从0开始)
size 要显示的条目个数 -
特点:
limit 语句在查询的最后, -
公式:page size,index=(page-1)*size
-
- 数据类型
- 整型
-
- 浮点型
-
tinyint : 1、smallint : 2、mediunint : 3、 int/integer : 4、 bigint :8
特点:
①都可以设置无符号和有符号,默认有符号,通过unsigne d设置无符号
②如果超出了范围,会报out or range异常,插入临界值
③长度可以不指定,默认会有一-个长度
长度代表显示的最大宽度,如果不够则左边用o填充,但需要搭配zerofill,并且默认变为无符号整型
-
- 字符型
-
char和varchar的不同是,varchar的长度是可变的,但是char的长度是不可变的,char(10):表示这个字段分配了10个字符的字段,插入不到十个字符也会占用是个字符的长度。
- 较长的文本的用text和blob
-
定点数: decimal (M, D)
浮点数:
float(m, D
double (M, D) -
特点:
①M代表整数部位+小数部位的个数,D代表小数部位
②如果超出范围,则报out or range异常,并且插入临界值
③M和D都可以省略,但对于定点数,嘿认为10, D默认为0
④如果精度要求较高,则优先考虑使用定点数
-
- 日期型
-
year年
date日期
time时间
datetime日期+时间
timestamp日期+时间
4比较容易受时区下 语法模式、版本的影响,更能反映当前时区的真实时间
-
- 整型