**
小白终是踏上了这条不归路----小文的mysql学习笔记(1)
小白终是踏上了这条不归路----小文的mysql学习笔记(2)----条件查询
小白终是踏上了这条不归路----小文的mysql学习笔记(3)----排序询查
小白终是踏上了这条不归路----小文的mysql学习笔记(4)----常见的基本函数
小白终是踏上了这条不归路----小文的mysql学习笔记(5)----分组查询
…
…
小白终是踏上了这条不归路----小文的mysql学习笔记(目录)
**
在学习之后,感觉还不是很熟悉,于是跟着老师复习了一遍,跟着打了一遍总结。下面是mysql基础部分的所有知识点的总结,希望对自己以及看到这篇文章的人有所帮助。
**
**
当然总结只有主体部分,有些没明白的可以去目录看该节内容
1、可以持久化数据到本地
2、结构化查询
1、DB:数据库,存储数据的容器
2、DBMS:数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理DB
3、SQL: 结构化查询语言,用于和数据库通信的语言,不是某个数据库软件特有的,而是几乎所有的主流数据库软件通用的语言
1、数据存放到表中,然后表再放到库中
2、-个库中可以有多张表,每张表具有唯一的表名用来标识自己
3、表中有一-个或多个列,列又称为“字段”,相当于java中“属性”
4、表中的每一行数据,相当于java中“对象”
mysgl、 oracle、 db2、 sqlserver
前身属于瑞典的一家公司, MySQL AB
08年被sun公司收购
09年sun被oracle收购
1、开源、免费、成本低
2、性能高、移植性也好
3、体积小,便于安装
方式一: 通过命令行
net start 服务名
net stop服务名
方式二:计算机一一右击一-管理一一服务。
登录: mysq1 【-h 主机名-P端口号】 -u 用户名 -p密码|
Ps:我们目前学习的时候 用的是root 就可以直接mysql -u root -p密码就好了。
退出: exit或ctr1+C
select 查询列表
from 表名;
1、查询列表可以是字段、常量、表达式、函数,也可以是多个.
2、查询结果是一个虚拟表
1、查询单个字段
select 字段名 from 表名;
2、查询多个字段
select 字段名,字段名 from 表名;
3、查询所有字段
select * from 表名
4、查询常量
select 常量值;
注意:字符型和日期型的常量值必须用单引号引起来,数值型不需要
5、查询函数
select 函数名(参数列表);
6、查询表达式
select a*b;
ps:支持我们正常的加减乘除以及取模等
7、起别名
①as
②空格
8、去重
select distinct 字段名 from 表名;
ps:distinct用于去重,一般后面只跟单个字段,如果后面跟的是多个字段,只有这多个字段都重复的一行才会被去重,其他只有部分重复的行是不会被去除的。
9、加号(+)
作用:做加法运算。
select数值+数值;直接运算,将二者相加。
select字符+数值;会先试图将字符转换成数值,如果转换成功,则继续运算;否则将字符转换成0,再与之继续做运算。
select nul1+值; 结果为null,null和任何值相加都等于null。
10、【补充 】concat拼接函数
select concat(字符1,字符2,字符3…);
功能:拼接字符
ps:可以将几个字符拼接在一起
11、【补充】 ifnull 函数
ifnull(exper1,exper2)
功能:判断exper1是否为null,如果为null返回exper2,否则返回exper1本身。
12、【补充】 isnull 函数
isnull(xxx);
功能:判断某字段或表达式是否为null,如果是,则返回1,否则返回0。
select 查询列表
from 表名
where 筛选条件
1、简单条件运算符
大于 | > |
---|---|
小于 | < |
等于 | = |
不等于 | <> 或!= |
大于等于 | >= |
小于等于 | <= |
安全等于 | <=> |
ps:<>安全等与,既可以用来判断普通数值,又可以用来判断null值。
但是 =和<>不能用来判断null值
2、逻辑运算符
与 | && 、 and |
---|---|
或 | ll 、or |
非 | !、not |
3、模糊查询
like
ps:like一般和通配符搭配使用,
通配符: %表示任意多个字符;
_ 表示任意单个字符。
between and
in
is null / is not null ;用于判断null值。
4、is null 和 安全等与 <=>的区别
二者都可以用于判断null值,但是is null不能判断普通类型的数值,而安全等与(<=>)可以判断普通类型的数值, but 安全等于的可读性比is null差。
select 查询列表
from 表
where 筛选条件
order by 【asc/desc】
1、asc代表的是升序,desc代表的是降序,如果不写,默认是升序;
2、order by子句中可以支持单个字段、多个字段、表达式、函数、别名。
3、order by 子句一般是放在查询语句的最后面,limit子句除外。
概念: 类似于java的方法,,将一组逻辑语句封装在方法体中,对外暴露方法名。
好处: (1) 隐藏了实现细节;
(2) 提高了代码的重要性.
语法: select 函数名(实参列表)【from 表】
1、length(str); 获取参数值的字节个数
2、concat(str1,str2,…); 用于拼接字符串
3、upper(srt);将字符大写显示
4、lower(str);将字符小写显示
5、substr();用于截取指定的字符串。
ps:substr一共有两种语法:第一种是 substr(xxx,x);截取从指定索引处至后面的所有字符
第二种是substr(xxx,x,x);截取从指定索引处到指定长度的字符。
6、instr(xxx,xxx);返回子串第一次出现的索引
7、trim(“xx” from “xxaaaaaxx”);用于去掉前后指定的字符及空格。
8、lpad(“xxxx”,长度,str);用指定的字符实现左填充指定的长度
9、rpad(“xxx0,长度,str”);用指定的字符实现右填充指定长度
ps : 有一点注意,lpad 左填充和rpad右填充 ,如果字数多了则会将本身截取到相等的长度,从右边开始截取。
10、replace();用于替换
replace(“aabbcc”,“aa”,“cc”);表示将aa换成cc
1、mod();取模
2、round();:四舍五入
3、ceil();向上取整
4、floor();向下取整
5、truncate();截断
6、rand();获取随机数,返回0-1之间的小数,但是不包括端点值
1、now();返回当前系统日期+时间
2、curdate();返回当前系统日期,不包含时间
3、curtime();返回当前系统时间,不包含日期
4、year();返回年
5、month();返回月
6、day();返回日
7、hour();返回小时
8、minute();返回分钟
9、cecond();返回秒
10、str_to_date();将字符格式的日期转换为指定格式的日期
11、date_format();将其他形式的日期转换成字符形式的日期
补充:
格式符 | 功能 |
---|---|
%Y | 四位的年份 |
%y | 2位的年份 |
%m | 月份( 01,02…11,12 ) |
%c | 月份( 1,2…11,12 ) |
%d | 日( 01,02,… ) |
%H | 小时( 24小时制) |
%h | 小时( 12小时制) |
%i | 分钟( 00,01…59 ) |
%s | 秒( 00,01…59 ) |
Select version(); 查询版本号;
Select database();查看当前的库;
select user(); 查看当前用户;
IF(expr1,expr2,expr3)
若expr1正确,则输出expr2;若expr1错误,则输出expr3.
case 函数的使用一: switch case 的效果
语法: case 要判断的字段或表达式
When 常量1 then 要显示的值1或语句
When 常量2 then 要显示的值2或语句
………
else 要显示的值n或语句
end
ps:一般用作等值判断
case函数的使用二:类似于多重if
语法:case
When 条件1 then 要显示的值1或语句1
When 条件2 then 要显示的值2或语句2
……
else 要显示的值n或语句n
end
ps:一般用于实现区间判断
1分类
sum | 求和 |
avg | 平均值 |
max | 最大值 |
min | 最小值 |
count | 计算个数 |
①语法
select 函数名 (字段) from 表名;
②支持的类型
sum和avg一般用于处理数值型
max、min、 count可以处理任何数据类型
③以上分组函数都忽略null
④都可以搭配distinct使用,实现去重的统计
select 函数名(distinct 字段) from 表;
⑤count函数
count (字段) :统计该字段非空值的个数
count (*) :统计结果集的行数
count (1) :统计结果集的行数
效率上:
MyISAM存储引擎,count ()最高
InnoDB存储引擎,count ()和count (1)效率>count (字段)
select 分组函数,列(要求出现在group by的后面)
from 表
【where 筛选条件】
Group by 分组的列表
【order by 子句】
特点1: 分组前的筛选条件,数据源是原始表,位置是放在group by前面用where+筛选条件;
分组后的筛选条件,数据源是分组后的结果集,位置是放在group by后面用having+筛选条件。
注:能用分组前筛选条件的,就优先考虑使用分组前筛选的条件。
特点2: group by子句支持单个字段分组、多个字段分组(多个字段之间用逗号隔开没有顺序要求)、表达式或函数(使用较少)
特点3: 也可以添加order by排序(排序放在整个分组查询的最后)
又称多表查询,当查询的字段来自于多个表时,就会用到链接查询。
select
字段1,字段2
from表1,表2,…:
笛卡尔乘积: 当查询多个表时,没有添加有效的连接条件,导致多个表所有行实现完全连接
如何解决: 添加有效的连接条件
按年代分类:sq192标准:仅仅支持内连接;
sq199标准【推荐】:支持内链接+外连接(左外和右外)+交叉链接;
按功能分类:
内连接:等值连接;
非等值连接;
自链接;
外连接:左外链接;
右外连接;
全外连接;
交叉连接;
1、等值连接
语法: select查询列表
from表1别名,表2别名
where表1. key=表2. key
【and筛选条件】
【group by 分组字段】
【having分组后的筛选】
【order by 排序字段】
特点:
①一般为表起别名
②多表的顺序可以调换
③n表连接至少需要n-1个连接条件
④等值连接的结果是多表的交集部分
2、非等值连接
语法: select查询列表
from表1别名,表2别名
where 非等值的链接条件
【and筛选条件】
【group by 分组字段】
【having分组后的筛选】
【order by 排序字段】
个人理解:若链接条件不是=,则为非等值连接
3、自链接
语法: select查询列表
from表 别名1,表 别名2
where 等值的连接条件
【and筛选条件】
【group by 分组字段】
【having分组后的筛选】
【order by 排序字段】
MySQL自连接就是在同一张表上自己连接自己,参与连接的表是同一张表,通过设置表别名虚拟出两张表。当我们想将表中行与同一表中的其他行组合或运算时,可以使用自连接。要执行自连接操作必须使用表别名来帮助MySQL在查询中区分连接后的虚拟结果集中的字段。
1、内连接
语法: select 查询列表
From 表1 别名
【 inner】 join 表2 别名
on 链接条件;
特点:
①表的顺序可以调换
②内连接的结果=多表的交集
③n表连接至少需要n 1个连接条件
④inner可以省略
分类:(1)等值连接;(2)非等值连接;(3)自链接
2、外连接
语法: select 查询列表
表1 别名1
【连接类型】join 表2 别名
on 连接条件
【where筛选条件】
【group by分组】
【having筛选条件】
【order by排序列表】
特点: 1、外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示null
外连接查询结果=内连接结果+主表中有而从表没有的记录。
2、左外连接,left join左边的是主表
右外连接,right join右边的是主表
3、左外和右外交换两个表的顺序,可以实现同样的效果
4、全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的,即两张表取并集。
①查询的结果主表中所有的行,如果从表和它匹配的将显示匹配行,如果从表没有匹配的则显示nul1
②1eft join 左边的就是主表,right join 右边的就是主表
ful1 join 两边都是主表
③一般用于查询除了交集部分的剩余的不匹配的行
3、交叉连接
语法: select 查询列表
from 表1 别名.
cross join 表2 别名;
ps:相当于用sq199的标准来实现的笛卡尔乘积
概念:出现在其他语句内部的select语句,称为子查询或内查询;
内部嵌套其他select语句的查询即外部的查询语句,称为外查询或主.查询。
分类:
按子查询出现的位置:
select后面: 仅仅支持标量子查询
from后面: 支持表子查询
where或having后面:★ 标量子查询(单行查询) ★
列子查询(多行多行查询) ★
行子查询
exists后面(相关子查询) 标量子查询
列子查询
行子查询
表子查询
按结果集的行列数不同:
标量子查询 (结果集只有一行一列)
列子查询 (结果集只有一列多行)
行子查询 (结果集有一行多列也可是多行多列)
表子查询 (结果集一般为多行多列)
注:不论是一行一列还是一列多行,只要是查询都可以叫做表子查询,但我们通常所说的表子查询一般指多行多列。
where 和having后面
标量子查询
案例:查询最低工资的的员工姓名和工资
SELECT last_name,salary
FROM employees
WHERE salary=(
SELECT MIN(salary)
FROM employees
);
列子查询
案例:查询所有是领导的员工姓名
SELECT last_name
FROM employees
WHERE employee_id IN (
SELECT DISTINCT manager_id
FROM employees
);
当你查询的数据很多的时候,一页显示不全,则需要提交sql分页显示,这便用到了我们今天所学的分页查询了
limit 【offset,】 size;
select查询列表
from表1
【 join type join表2
on连接条件
where
筛选条件
group by分组字段
having分组后的筛选
order by排序的字段】
limit 【offset,】size;
解释:
offset:要显示条目的起始索引(起始索引从0开始)
size:要显示的条目个数
当你像服务器提交查询的时候一般,这个起始不会是一个固定的值,这不方便我们查询会是一个变量,这就需要用到下面的一个公式:select 查询列表
from 表
limit (page-1) *size , size;
page要显示的页数,size每页的条目数
Union 联合合并:可以将多条查询语句的查询结果合并成一-个结果。
语法: 查询语句1
union 【all】
查询语句2
union 【all】
。。。。。
查询语句n
1、将一条比较复杂的查询语句拆分成多条语句
2、当要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致时便可以用到联合查询。
1、要求多条查询语句的查询列数必须是一致的!
2、(虽然当几个查询语句查询的列的类型不一样的时候不会报错,查询结果的列名默认以你第一个查询语句的查询字段命名。)但是我们要求多条查询语句中查询的每一列的类型和顺序最好一致。
3、union关键字默认去重,如果使用union all 可以包含重复项。
语法:
insert into 表名(字段名…) values (值…);
特点:
1、 要求值的类型和字段的类型要一致或兼容
2、 字段的个数和顺序不一-定 与原始表中的字段个数和顺序-致
但必须保证值和字段一 一对应
3、 假如表中有可以为null的字段,注意可以通过以下两种方式插入null值
①字段和值都省略
②字段写上,插入的值写null
4、 字段和值的个数必须一致
5、 字段名可以省略,默认所有列
语法:
insert into表名
set列名=值,列名=值, …
注意: 1、方式一支持插入多行,方式二不支持
2、方式一可以支持子查询批量插入数据,而方式二不支持
语法: update 表名
set列=新值,列=新值, …
【where 筛选条件】;
sql99语法: .update 表1 别名
inner / left /right join 表2 别名.
on 连接条件
set 列=值… τ
where 筛选条件;
1、单表记录的删除【★】
delete from 表名 where 筛选条件 【limit 条目数】;
2、(级联删除)多表记录的删除【补充】
sq199语法: delete 表1的别名,表2的别名
from 表1 别名
inner/left/right join 表2 别名 on 连接条件
【where 筛选条件;
【limit 条目数】
语法:
trruncate table 表名;
注意: 该方式直接删除表的整张数据,不能添加where筛选条件
create database 【if not exists】 库名 【 character set 字符集名】
alter database 库名 【character set 字符集名】;
drop database 【if exists】 库名;
语法: create table 【if not exists】表名(
列名 列的类型【(长度)约束】 ,
列名 列的类型【 (长度)约束】,
列名 列的类型【(长度)约束】,
。。。。。
列名 列的类型【(长度)约束】
);
1.添加列
alter table 表名add column 列名 类型【first / after字段名】 ;
2.修改列的类型或约束
alter table 表名modify column 列名 新类型 / 新约束 ;
3.修改列名
alter table 表名 change column 旧列名 新列名 类型;
4.删除列
alter table 表名drop column 列名;
5.修改表名
alter table 表名 rename to 新表名;
语法: drop table 【if existis】表名
1、复制表的结构
create table 表名 like 旧表;
2、复制表的结构+数据
create table 表名
select 查询列表 from 旧表 【where 筛选】 ;
1、整型
字节 | 整型 | 范围 |
---|---|---|
1 | Tinyint | 有符号:-128~127;无符号: 0~255 |
2 | Smallint | 有符号:-32768~32767;无符号: 0~65535 |
3 | Mediumint | 有符号: -8388608~8388607;无符号: 0~1677215 |
4 | Int / interger | 有符号: - 2147483648 2147483647 ; &无符号: 0~4294967295 |
5 | Bigint | 有符号:-92233720368547 75808~92233720368547 75807; 无符号: 0~9223372036854775807*2+1 |
注意事项
①如果不设置无符号还是有符号,默认是有符号,如果想设置无符号,需要添加unsigned关键字
②如果插入的数值超出了整型的范围,会报警告(8.0版本sqlyog),无法插入数据
③如果不设置长度,会有默认的长度
一共有两类一类是浮点型,一类是定点型
浮点数类型 | 范围 | 字节 |
---|---|---|
float | 士1.75494351E 38~士3.402823466E+38 | 4 |
double | 士2.2250738585072014E-308~士1.7976931348623157E+308 | 8 |
定点数类型 | 范围 | 字节 |
DEC(M,D)/DECIMAL(M,D) | 最大取值范围与double相同,给定decimal的有效职值范围由M和D决定 | M+2 |
释一下M和D的意思:
D代表小数的位数,如果多了便会四舍五入保留D位小数,如果少了不够D位那么会自动用0来填充
M代表整数和小数一共加起来的位数,不能超过M(小文的是8.0当你超过M位数时是不会插入临界值,当然也不会插入数据)
注意: (M,D) 可以省略,如果是float和double则会根据插入的数值的位数来确定位数;
如果是 DECIMAL M默认是10,D默认是0。
定点型的精确度较高,如果要求插入数值的精度较高如货币运算等就考虑使用.
char、varchar、 binary、 varbinary、 enum、 set、text、blob 等。
较短的文本:char 和 varchar
类型 | 范围 | 最多字符数 |
---|---|---|
char(M) | M为0~ 255之间的整数 | M |
varchar(M) | M为0~65535之间的整数 | M |
二者的区别:
char(M) 是固定长度的字符,M可以省略默认为一,虽然比较占空间,但是效率较高;
varchar(M) 是可变长度的字符,M不可以省略,相比于char 更节省空间,但是效率相对较低。
解释:
这里char的固定长度字符的意思就是:加入你设置了char(6);然后你插入的数据只要两个字符“aa”但是她是固定长度字符,所以系统还是会给你开六个的字符位置 ; 而varchar(M)是可变长度字符,M是它的最大字符数,只要在M内,你插入几个字符,那系统就给你开几个字符的位置,
补充:
1、binary和varbinary类型(用于保存较短的二进制)
说明: 类似于char和varchar,不同的是它们包含二进制字符串而不包含非二进制字符串。
2、Enum类型,
说明:又称为枚举类型,要求插入的值必须属于列表中指定的值之一。(不区分大小写)
日期和日期类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
date | 4 | 1000-01-01 | 9999-1231 |
datetime | 8 | 1000-01-01 00:00:00 | 9999-12 -31 23: 59:59 |
timestamp | 4 | 1 9700101 080001 | 2038年的某个时刻 |
time | 3 | -838 :59:59 | 838: 59:59 |
year | 1 | 1901 | 2155 |
date 只保存日期
time 只保存时间
year 只保存年
datetime 保存日期+时间(不受时区影响)
timestamp 保存日期+时间(受时区影响)
Timestamp和datetime区别:
1、Timestamp支 持的时间范围较小,取值范围19700101080001- – 2038年的某个时间
Datetime的取值范围: 1000-1-1 --9999- 12-31
2、timestamp和实际时区有关,更能反映实际的日期
而datetime则只能反映出插入时的当地时区
3、timestamp的 属性受Mysq|版本和SQLMode的影响很大
一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性。
(1)NOT NULL:非空,用于保证该字段的值不能为空
比如姓名、学号等
(2)DEFAULT: 默认,用于保证该字段有默认值
比如性别
(3)PRIMARY KEY:主键,用于保证该字段的值具有唯一-性,并且非空
比如学号、员工编号等
(4)UNIQUE:唯一键,用于保证该字段的值具有唯一-性,可以为空
比如座位号
(5)CHECK:检查约束【mysql 中不支持】(意思就是在mysql中你输入check它不会报错,但是也不会执行!)
(6)FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值.
主键和唯一
1、区别:
①、一个表至多有一个主键,但可以有多个唯一键
②、主键不允许为空,唯一键可以为空
2、相同点
都具有唯一性
都支持组合键,但不推荐
外键:
1、用于限制两个表的关系,从表的字段值引用了主表的某字段值
2、外键列和主表的被引用列要求类型- -致,意义-样,名称无要求
3、主表的被引用列要求是- -个key (- -般就是主键)
4、插入数据,先插入主表
删除数据,先删除从表。
我们有一下两种删除主表和从表记录的方式,在添加外键的时候加上条件
方式一:级联删除
ALTER TABLE stuinfo(解释:表名) ADD CONSTRAINT fk(外键名) FOREIGN KEY (majorid) REFERENCES major (id) ON DELETE CASCADE ;
注释: 就是在添加外键的时候在最后添加 ON DELETE CASCADE,
产生的效果就是:当我们删除从表的数据时,主表与从表相对应的数据也会一起删除(是直接那一行数据都会被删除)
方式二:级联置空
ALTER TABLE stuinfo(解释:表名) ADD CONSTRAINT fk_ stu major F0REIGN KEY (majorid) REFERENCES major(id) ON DELETE SET NULL;
注释:就是在添加外键的时候在最后添加ON DEKETE SET NULL
产生的效果就是:当我们删除从表的数据时,主表中与之相对应的字段会被设置为null
语法:
create table 表名(
字段名 字段类型 not null, #非空
字段名 字段类型 primary key, #主键
字段名 字段类型 unique, #唯一
字段名 字段类型 default 值,默认
constraint 约束名 foreign key(字段名) references 主表(被引用列)
)
注意:
列级约束不可以起约束名,并且除了外键,其他的都可以添加列级约束;
表级约束可以取约束名,但对主键无效,并且不支持非空和默认
语法:
添加列级约束:
alter table 表名 modify column 字段名 字段类型 约束条件;
添加表级约束:
alter table 表名 add 【cons’t’raint 约束名】 约束类型(字段名) 【外键的引用】
添加语法:
添加列级约束:
alter table 表名 modify column 字段名 字段类型 约束条件;
添加表级约束:
alter table 表名 add 【cons’t’raint 约束名】 约束类型(字段名) 【外键的引用】
删除语法: alter table 表名 drop 约束条件 列名(也可能是你取了别名的约束名);
alter table 表名 modify column 列名 数据类型 null;
alter table 表名 modify column 列名 数据类型 ;
即自增长列
1、不用手动插入值,可以自动提供序列值,默认从1开始,步长为1
auto_increment_increment 代表步长值,就是代表自增的个数,可以用set来更改步长值
auto_increment_offset 代表起始值,当然我们也可以用set来更改起始值。
2、一个表至多有一个自增长列
3、自增长列只能支持数值型
4、自增长列必须为一个key
create table 表(
字段名 字段类型 约束 auto_ increment .
)
alter table 表 modify column 字段名 字段类型 约束 auto_ increment
alter table 表 modify column 字段名 字段类型 约束
. 是由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事物开始以前的状态;如果单元中的所有SQL语句均执行成功,则事物被顺利执行。即这个执行单元要么全部执行,要么全部不执行。
A 原子性 :一个事务是不可再分割的整体,要么都执行要么都不执行
C 一致性:一个事务可以使数据从- -个- -致状态切换到另外-一个- 致的状态
I 隔离性:一个事务不受其他事务的干扰,多个事务互相隔离的
D持久性:一个事务- -旦提交了,则永久的持久化到本地
首先说一下,事务一共有两种:
一种是隐式事务,该事务没有明显的开启和结束的标记,比如:insert、update、delete语句都是;
一种是显示事务,该事务具有明显的开启和结束的标记,但有个前提:必须先将系统的自动提交功能关闭(即 set autocommit=0 将其关闭)
注:这里关闭自动提交功能并不是永久关闭,只对当前会话有效,下次开启时需要重新
使用显式事务:
第一步:开启事务
set autocommit=0;
start tr ansaction; #可以省略
第二步:编写一组逻辑sql语句
注意: sq1语句支持的是insert、update、 delete
设置回滚点:
savepoint回滚点
第三步:结束事务
提交: comunit;
回滚: rollback;
回滚到指定的地方:rollback to 回滚点名;
1、事务的并发问题产生的原因
对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:
2、并发问题有哪些:
脏读: 对于两个事务T1, T2, T1读取了已经被T2更新但还没有被提交的字段.
.之后,若T2回滚,T1读取的内容就是临时且无效的.
不可重复读: 对于两个事务T1, T2,T1读取了一个字段,然后T2更新了该字段.
之后,T1再次读取同一个字段,值就不同了.
幻读: 对于两个事务T1, T2,T1从一个表中读取了一个字段,然后T2在该表中插
入了一-些新的行.之后,如果T1再次读取同一个表,就会多出几行.
3、如何解决事务的并发问题
可以通过设置隔离级别来解决并发问题
4、4种隔离级别
隔离级别 | 描述 |
---|---|
READ UNCOMMITTED(读未提交数据) | 允许事务读取未被其他事物提交的变更.脏读,不可重复读和幻读的问题都会出现 |
READ COMMITED(读已提交数据) | 只允许事务读取已经被其它事务提交的变更.可以避免脏读.但不可重复和幻读问题仍然可能出现 |
REPEATABLE READ(可重复读) | 确保事务可以多次从一个字段中读取相同的值.在这个事务持续期问,禁止其他事物对这个字段进行更新.可以避免脏读和不可重复读.但幻读的问题仍然存在 |
SERIALIZABLE(串行化) | 确保事务可以从一个表中读取相同的行. 在这个事务持续期间,禁止其他事务对该表执行插入,更新和删除操作所有并发问题都可以避免,但性能十分低下. |
Oracle支持的2种事务隔离级别: READ COMMITED、SERIALIZABLE。
Oracle 默认的事务隔离级别为: READ COMMITED
Mysql支持4种事务隔离级别.Mysql默认的事务隔离级别为: REPEATABLE READ
每启动一个mysql程序,就会获得一个单独的数据库连接.每.个数据库连接都有一个全局变量 @@transaction_isolation ,表示当前的事务隔离级别.
查看当前的隔离级别: SELECT @@transaction_isolation;
设置当前mySQL连接的隔离级别:
set transaction isolation level read committed;
设置数据库系统的全局的隔离级别:.
set global transaction isolation level read committed;
mysql5.1版本出现的新特性,本身是一个虚拟表,它的数据来自于表,通过执行时动态生成。
好处:
1、简化sql 语句
2、提高了sql 的重用性
3、保护基表的数据,提高了安全性
语法: create view 视图名称
AS
sql查询语句 ;
方式一
语法: create or replace view 视图名
AS
sql查询语句
方式二
语法: alter view 视图名
AS
sql查询语句
语法: drop view 视图名,视图名,…
注意:你必须要有删除权限才能够执行删除,当然该删除语句既可以只删除一个视图,也可以同时删除多个视图
方式一:
desc 视图名;
方式二:
SHOW CREATE VIEW 视图名;
1、插入 insert
2、修改 update
3、删除 delete
4、查看 select
但是
并不是所有的视图都是可更新的,视图是否可更新和视图查询的定义有关系,以下类型的视图都是不可更新的:
1、包含以下关键字的SQL语句:
聚合函数(SUM、 MIN、MAX、COUNT等)、 DISTINCT、 GROUP BY、HAVING、UNION或UNION ALL
2、常量视图
3、select中包含子查询
4、JOIN(即连接查询)
5、 FROM一个不能更新的视图
6、WHERE子句的子查询引用了FROM子句中的表
7、使用了临时表
说明: 变量由系统提供的,不用自定义
语法:
①查看系统变量
show 【global / session 】variables like “ ”;如果没有显式声明 global 还是 session,则默认是session会话变量。
②查看指定的系统变量的值
select @@【global / session .】 变量名;如果没有显式声明 global 还是 session,则默认是session会话变量
③为系统变量赋值
方式一:
set 【global / session 】变量名=值 ;如果没有显式声明global还是session,则默认是session
方式二:
set @@global. 变量名=值;
set @@变量名=值;
1、全局变量
服务器层面上的,必须拥有super权限才能为系统变量赋值,作用域为整个服务器,也就是针对于所有连接(会话)有效。
2、会话变量
服务器为每一个连接 的客户端都提供了系统变量,作用域为当前的连接(会话)
1、用户变量
作用域: 针对于当前连接(会话)生效
位置: begin end里面,也可以放在外面
使用步骤:
声明
赋值
使用(查看、比较、运算)
第一步: 声明并初始化(三种方式)
方式一:
SET @用户变量名=值;
方式二:
SET @用户变量名:=值;
方式三:
SELECT @用户变量名:=值;
注意: 如果用set 则两种写法都可以;但是如果用selet 则等号前面必须加上冒号
第二步: 赋值(更新用户变量的值)两种方式
方式一:通过set或select
SET @用户变量名=值;
SET @用户变量名:=值;
SELECT @用户变量名:=值;
方式二:通过 SELECT INTO
SELECT 字段 INTO 变量名
FROM 表;
第三步: 使用(查看用户变量的值)
语法: SELECT @用户变量名;
2、局部变量
作用域: 仅仅在定义它的begin end中有效
位置: 只能放在begin end中,而且只能放在第一句
使用: 三步走
第一步: 声明
语法: DECLARE 变量名 类型;
DECLARE 变量名 类型 DEFAULT 值;(如果要初始化就这么写)
注意: 当然这里初始化的值要和前面设置的类型一致
第二步: 赋值
语法:
方式一:通过set或select
SET 局部变量名=值;
SET 局部变量名:=值;
SELECT @局部变量名:=值;
方式二:通过 SELECT INTO
SELECT 字段 INTO 局部变量名
FROM 表;
第三步: 使用
语法: SELECT 局部变量名;
说明: 都类似于java中的方法,将-组完成特定功能的逻辑语句包装起来, 对外暴露名字
好处:
1、提高重用性
2、sql 语句简单
3、减少了和数据库服务器连接的次数,提高了效率;
创建语法:
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
存储过程体(一组合法有效的sql语句)
END
参数列表一共包括三个部分:参数模式、参数名、参数类型
IN 该参数可以作为输入,也就是该参数需要调用方传入值
OUT 该参数可以作为输出值,也就是该参数可以作为返回值
INOUT 该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值。
注意: 如果存储过程体仅仅只有一句话,那么 BEGIN END 可以省略,并且
存储过程体中的每条 SQL 语句的结尾要求必须加分号。
而这时我们存储过程的结尾就需要自己来设置
语法: call 存储过程名(实参列表);
举例:
调用in模式的参数: call 存储过程名(‘值’) ;
调用out模式的参数: set @name;
call 存储过程名 (@name) ;
select @name;
调用inout模式的参数: set @name=值;
call 存储过程名 (@name);
call select @name;
这里的@name 为你自己写的任意变量,你可以写成其他的,并且我们可以省略前面的set步骤,直接call调用,并select打印
语法:show create procedure 存储过程名
语法:drop procedure 存储过程名
语法: create function 函数名(参数列表) returns 返回类型
begin
函数体
end
解释:
参数列表: 一共包含参数名和参数列表两部分。
函数体: 是我们封装的所有sql语句,在写完函数体后,一定要写上 return 语句 ,不然会报错。
我们一般是在前面写函数体,写完之后在后面写上return值
语法: select 函数名(参数列表)
语法: show create function 已创建的函数名称;
语法: drop function 已创建的函数名。
流程控制结构主要一共有三种:
顺序结构: 程序从上往下依次执行
分支结构: 程序从两条或多条路径中选择一条去执行
循环结构: 程序在满足一定条件的基础上,重复执行一段代码
功能: 可以实现简单的双分支。
语法: IF(表达式1,表达式2,表达式3);
ps:一般和其他的语句如 select、等一起使用
解释: 如果表达式1成立,则IF函数返回表达式2的值,否则返回表达式3的值
功能: 实现多分支
(1)case 函数的使用一: switch case 的效果类似于java中的switch语句,一般用于实现等值判断。
语法: case 要判断的字段或表达式
When 常量1 then 要显示的值1或语句;
When 常量2 then 要显示的值2或语句;
………
else 要显示的值n或语句;
end case;
(2)、case函数的使用二: 类似于多重if。一般用于实现区间判断
语法:case
When 条件1 then 要显示的值1或语句1;
When 条件2 then 要显示的值2或语句2;
……
else 要显示的值n或语句n;
end case;
位置:
可以放在任何位置,
如果放在begin end外面,作为表达式结合着其他语句使用
如果放在begin end里面,-般作为独立的语句使用
功能: 可以实现多分支
语法: if 条件1 then 语句1;
elseif 条件2 then 语句2;
… …
【else 语句n】;
end if ;
位置: 只能放在begin end 中。
位置: 只能放在begin end 中。
特点: 都能实现循环结构
对比: .
①这三种循环都可以省略名称,但如果循环中添加了循环控制语句( leave 或 iterate )则必须添加名称
②
loop :一般用于实现简单的死循环。
while:先判断后执行。
repeat:先执行后判断,无条件至少执行一-次。
语法:
【别名:】 while 循环条件 do
循环体;
end while 【别名】;
语法:
【别名:】loop
循环体;
end loop 【别名】;
语法:
【别名:】 repeat
循环体;
until 结束循环的条件
end repeat 【别名】;
iterate 类似于continue, 继续,结束本次循环,继续下一次。
leave 类似于 break,跳出,结束当前所在的循环。
**
不错哦这么长的总结你都能看到结尾,嘿嘿嘿,整个赞再走咋样【滑稽】
**
当然如果有不清楚的地方,直接来 小文的mysql学习笔记目录
**
Time will tell you the love for the simple things lasts long and the people loving you are the warmest.
---------------时光会告诉我们,简单的喜欢最长远,懂你的人最温暖