mysql:默认4G内存,能存储800万T数据,5000万行记录。
数据库:处理业务
数据的存储
学校->院系->班级->班
关系型数据库:体现业务
表中的字段:管理各自职能范围内的业务。(数据)
一个关系数据库是一种软件:
1.能够实现具有表、列和索引的数据库
2.保证了各种表的行之间是引用完整性
3.自动更新索引,索引放在字段里。
4.解释sql查询和联合各表信息
数据库的几个定义
1.数据库:是表的集合,具有相关数据。
2.表:表是用数据矩阵表现的数据展现形式
在一个数据库中我们也可以把它看做是excel的展现
3.列:一列包含一个数据类型相同的数据集合。(会出现数据类型这个概念)
4.行:一组相关的数据,表示当前表所有列的一行集合。
5.冗余:存储数据两次,冗余能使系统更快。
6.主键:主键是唯一的,不能在一个表中出现两次。
使用主键可以快速的查找到某一行
7.外键:两个表之间的联接字段
8.复合键:是由多个列组成的,一个键无法满足唯一标识。
9.索引:索引是对数据库表中一列或多列的值进行排序的一种结构,
使用索引可快速访问数据库表中的特定信息。就像一本书里的目录
show create table t_idcard;//显示建表语句
desc t_idcard;//显示表结构
SQL语言
1、sql语句是用于访问和处理数据的标准计算机语言
2、能够对数据进行:select delete insert update
insert into table(字段) values(字段值)
delete from table where ..
update table set ... where ...
select .. from .. where .. -- 返回的是一个结果集
3、扩展功能:表、视图、存储过程、存储函数。
4、在数据库里有许多表,但是表的名字在当前数据库是唯一的,表里包含数据记录。
1》表的命名规则:t(显示当前表的实在意义)_tableName 、game(项目名)_user
加标签用于区分表,表名的表示意义比较多的时候可以加多个下滑线。
5、字符的引号和java中一样,都需要用英文的单引号,不同的是字符串也是单引号。
(mysql中只有单引号,没有双引号)。sql本身对大小写不敏感,但表中的数据对大小写
超级敏感(mysql默认对大小不区分,如果要区分,在字段前面加binary)。
6、mysql要求每条语句末尾都以分号结尾,这是一种标准写法。
7、alert(修改数据库表)
drop (drop表会把整表数据和表结构全部删除)
create index (创建索引) 、drop index(删除索引)
8、select:
查询表中的数据,用来展示。
把查询出来的结果存储到一个结果表里,称为结果集。
1》distinct 去掉重复的,返回唯一不同值。
2》where
where语句它只是select语句中的一个限定条件,起到过滤作用。
通常情况下添加where条件,sql就会取出满足条件的结果集。
where过滤运算符,过滤的越多放在越后面。
运算符描述
=等于
<>不等于mysql用!=
>
<
=>
<=
between num1 and num2 在某个范围内
like % 模糊匹配
in 指定针对某个列多个可能值
limit 分页处理,limit a,b(a起始条数从0开始,b控制显示条数),如limit 0,10显示前十条0-9
LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。
参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,
第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1):
为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。
mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15
//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.
//如果只给定一个参数,它表示返回最大的记录行数目:
mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行
//换句话说,LIMIT n 等价于 LIMIT 0,n。
where字句就像if一样,后面跟着的判断条件实际是if语句的boolean表达式。
where字句是拿数据库表里存的数据跟外部拿入的数据进行比较,如果比较的
结果为true则返回该表的对应行数据。
在where字句里做比较时候不区分大小写,如果要区分则要在判断条件(=)前的
字段前加binary关键字。如做like比较的时候,要区分大小写。
mysql数据类型:数字、时间日期、字符串类型
一、数字类型
1》int 正常大小的整数,可以带符号。允许范围-2147483648~2147483647
2》tinyint 一个非常小的整数,可以带符号,有符号范围是-128~127,
无符号范围是0~255,可以多达4位数的宽度。
3》smallint 一个小的整数,可以带符号-32768~32767,无符号是65535
4》mediumint 一个中等大小的整数,可以带符号,范围是-8388608~8388607。
无符号是0~16777215
5》bingint 一个大的整数,可以带符号。可以指定20位的宽度。
6》float(m,d) 不能使用无符号的数字。可以显示长度(m)和小数位(d),默认是10和2。
2表示小数的位数,10表示数字的总数。小数的精度可以到24个浮点
7》double(m,d) 不能使用符号的双精度浮点,可显示长度(m)和小数位(d)。
默认值(16,4)其中16表示整数位4表示小数位 ,小数精度可以达到53位。
8》decimal(m,d) 非压缩的浮点数,不能是符号数,没有默认值。
二、日期和时间类型
mysql时间日期类型包括:
1、date (mysql取当前系统时间用new()方法)
以YYYY-MM-DD格式的日期,在公元1000-01-01到9999-12-31之间。
例如2016年8月5号在mysql里存储2016-8-5。
2、datetime 日期和时间组合格式:YYYY-MM-DD HH:MM:SS格式。
在公元1000-01-01 00:00:00到9999-12-31 23:59:59。
例如2016年8月5号上午9点3分57秒将会存储成2016-8-5 09:03:57
3、timestamp 1970年1月1号午夜之间的时间戳,到2037年的某个时间。
不需要连接符(-,:)。如(yyyymmddhhmmss)19731230153001
4、time 存储的时间格式:hh:mm:ss
5、year(m)以2位和4位数字格式来存储年份,长度如果指定2则定义方式为year(2)。
1970到2069(70-69)。如果长度指定为4位则定义的方式为year(4)1901-2155,
如果不给长度则默认长度为4。
三、字符串类型
虽然数字和日期类型存储的样式比较丰富,但是存储的大多数数据都可以是字符串树。
1、char(M) 固定长度的字符串,是以长度为1到255个字符长度(char(5))。
存储右空格填充到指定长度,可以不指定长度,有默认是1。
2、varchar 可变长度的字符串,长度为1-255(高版本的超过了255)
创建varchar类型的字段必须定义长度(varchar(10))没有默认长度。
3、blod或者text字段最长65535个字符,blod是“二进制大对象”,用来存储大的
二进制数据,如图像或者其他类型的文件。定义text文本字段持有大量的数据。
blod和text的区别主要是在排序和比较上,blod大小写比较敏感而text不区分
大小写。blod和text在定义时不需要指定长度。犀牛服务器
4、bold和text blod或者text字段用255的最大长度,不指定长度。
5、mediumblod或mediumtext 长度16777215定义的时候不需要指定长度。
6、longblod或者longtext 长度4294967295(4G-2)不指定长度
7、enum
排序 order by
select col1,col2,col3 from table
[where condition1 and|or condition2]
order by coll [,col2...] [asc] [desc]
asc:正序 ,默认的。
desc:倒序,要显示的写。
如果是varchar类型排序要通过cast signed强转成原数据类型再排序,
varchar是一位一位的比较(逐位比较)。
join 联接:a表和b表通过join联接起来,联接条件为on后面的判断,
只取出两表匹配上的数据,其他的不要。
例如:
select a.col1,a.col2,b.col3
from table a
join table2 b
on a.id=b.out_id [condition];//联接条件
left join (左联接)
select
from table1 a
left join
table2 b
on a.id=b.outid ;[condition]
把左联接看成是关键字left join的左右匹配,把左表作为主动表,把右表作为从动表。
从动表去匹配主动表,从动表匹配上了的数据取出,没有匹配上的不要。而主动表中
没有匹配上的数据也要取出来。
right join(右连接)
join右边的表为主动表,左侧的表为从动表其他类似左联接。
inner join(等值连接) 只返回两个表中联结字段相等的行
null:
1、is null 如果列的值为null(不是""空字符串)返回true
2、is not null 如果列的值不为null,返回true。
3、<=> 运算符的比较,(不同于 =)即使两个空值都返回true。
一般情况下涉及null的条件都比较特殊,不能使用 列=null或者!=null来匹配列的空值
null = null也是不行的。查找列的值是否为null只能使用is null或者is not null
正则表达式(regexp)
模糊匹配:like..%..
mysql支持另一种类型的模式匹配基于正则表达式和正则表达式运算符
正则运算符:
模式什么样的模式匹配
∧开始的一个字符串('∧小')
$结束的一个字符串('ggk$')
.任意单个字符
[]方括号中列出的任何字符
[∧...]任何字符方括号之间不会被列出
p1|p2|p3交替匹配的任何模式p1,p2,p3
*前一个元素的零个或者多个实例
+前面元素的一个或者多个实例
{n}前一个元素的n个实例
{m,n}前一个元素的m到n个实例
事务
事务是数据库处理操作,执行起来就好像是一个有序的工作单元。
换而言之,事务将永远不会是完全的、除非在组内的每个单独的操作是成功的,
如果有一个环节失败,那么整个事务就失败。
事务的性质又称ACID特性:
1、原子性:确保了工作单位中的所有操作都成功,否则事务终止,
在失败时会回滚到事务操作以前的状态。
2、一致性:可确保数据库正确的更改状态,在一个成功事务的提交前提下。
3、隔离性:使事务相互独立的进行操作。
4、持久性:确保了提交事务的结果或系统故障的情况下任然存在作用。
提交和回滚
commit rollback
当一个成功的事务完成后,commit命令发出的变化对所有涉及的表有效。
如果发生故障,rollback命令发出后,事务中引用的每个表都会回滚到
事务开始之前的状态。
begin
declare sqlException param varchar(1) default
begin transaction;
insert into .... not null
if
param =1 then rollback ;
else
commit;
end
索引(index)
数据的索引也是一种数据结构,它的目的是提高表的操作速度。
可以使用一个或者多个列提高快速随机查找和访问记录的高效排序来创建索引。
实际上索引也是表,它保存主键和索引字段的指针并且指向每个记录到实际的表的类型。
作用就是为了保证查询速度,提高效率。
insert和update语句需要创建索引的时间比单纯的select语句耗费的多。
在执行insert或update的时候需要耗费时间去更新索引值。
根据数据库的功能,可以在数据库设计器中创建三种索引:唯一索引、主键索引和聚集索引。
简单和唯一索引
可以在表中创建唯一值索引,意味着两行不能有相同的索引值。
create unique index index_name on table_name(col1,col2...);
唯一索引 UNIQUE
唯一索引是不允许其中任何两行具有相同索引值的索引。
当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。
数据库还可能防止添加将在表中创建重复键值的新数据。例如,如果在employee表中职员的
姓(lname)上创建了唯一索引,则任何两个员工都不能同姓。
主键索引 PRIMARY
数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。
在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。
该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。
聚集索引
在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。
如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,
聚集索引通常提供更快的数据访问速度。
使用alter命令来添加和删除索引
1、添加主键,这意味着索引值必须是唯一的,并且不能为空。
2、创建一个索引量的值必须唯一
3、增加普通索引,任何值的出现是多次的。
4、创建一个用于文本搜索目的的特殊索引filetext索引
alert table table_name add index(c);
alert table table_name drop index(c);
显示索引信息
show index from table_name;
重复处理:unique
select distinct age from t_student;
存储过程 2016.8.11
1、创建存储过程
语法:
create procedure sp_name([proc_params])
[characteristics...]
routine_body
解释:
proc_params:指定存储过程的参数列表
[IN|OUT|INOUT]param_name_type
in:输入参数;out:输出参数;inout:输入输出都可以
characteristics:
language sql
|[not]deterministic
|{ contains sql|no sql|reads sql data|modifies sql data}
|sql security{definer|invoker}
|comment 'string'
routine_body:变量的作用域
valid sql procedure statement
解释:
language sql:说明routine_body部分是由sql组成的,当前系统支持的语言为sql
[not]deterministic :指明存储过程的执行结果的正确性,deterministic表示如果结果是正确的,
每次执行存储过程时,有相同的输出。not表示结果为不正确,相同的输入有可能输出结果不同。
默认是deterministic
{ contains sql|no sql|reads sql data|modifies sql data}:指明程序使用sql的语句限制
contains sql:表明子程序包含sql语句,但是不包含读写数据的语句。
no sql:表明子程序中不包含sql语句
reads sql data:包含读数据的语句
modifies sql data:包含写数据的语句,默认情况,系统会指定contains sql
sql security{definer|invoker}
definer表示只有定义者才能执行,表明谁有执行的权限.
invoker表示有权限的调用者都可以执行,默认情况为definer
comment 'string' 注释信息。
routine_body是sql代码的内容,begin ... end 表示sql代码的开始和结束。
drop procedure if exists proc_test//删除相同的存储过程
delimiter $$
create procedure proc_test(IN v_id INT)
begin
select * from t_position_salary where id=v_id;
end
call proc_test(2);
变量的使用
作用域:begin...end
声明、使用
1、变量定义
declare:声明变量的关键字,需要记忆
变量的名字:var_name[var_name1,var_name2...]
data_type: [default value];变量的类型(int char varchar(10)没有默认值)
default value 给我们当前变量一个默认值
eg:默认值之前声明了a,b类型int,a+b
2、给变量赋值
定义变量之后,为变量赋值可以改变变量的默认值。
mysql中使用关键字set给变量赋值
set var_name=exp[var_name=exp]....
eg:
declare var1,var2.... int;
set var1=10,var2=20;
set var3=var1+var2;
//单行操作语句
select ... into 为一个或者多个变量赋值
存储函数
创建一个存储函数需要使用create function 语句。
基本语法:
create function func_name([func_paramer])
returns type(返回值类型)
[charactristics....]
rountine_body
create function 创建存储过程的关键字
func_name 函数的名字
func_paramer 函数的参数,有三种类型(in|out|inout)
参数类型:parm type
returns type 表示函数返回的数据类型
charactristics类似存储过程
存储过程和函数的区别
1)一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。
存储过程,功能强大,可以执行包括修改表等一系列数据库操作;
用户定义函数不能用于执行一组修改全局数据库状态的操作。
2)对于存储过程来说可以返回参数,如记录集,而函数只能返回值或者表对象。
函数只能返回一个变量;而存储过程可以返回多个。存储过程的参数可以有IN,OUT,INOUT三种类型,
而函数只能有IN类,存储过程声明时不需要返回类型,而函数声明时需要描述返回类型,
且函数体中必须包含一个有效的RETURN语句。
3)存储过程,可以使用非确定函数,不允许在用户定义函数主体中内置非确定函数。
4)存储过程一般是作为一个独立的部分来执行( EXECUTE 语句执行),
而函数可以作为查询语句的一个部分来调用(SELECT调用),由于函数可以返回一个表对象,
因此它可以在查询语句中位于FROM关键字的后面。SQL语句中不可用存储过程,而可以使用函数。
定义条件和处理过程:8.12
特定条件特定处理,这些条件可以联系到错误,以及子程序中的一般流程控制。
1、定义条件:是事先定义程序执行过程中遇到的问题。
2、处理程序:定义了在遇到问题的时候应该采取什么处理方式,
并且保证存储过程或者函数在遇到警告或错误的时候能继续执行。
可以增强存储过程的处理问题能力,避免程序异常停止运行。
语法:
1、定义条件(condition)
declare condition_name condition for[condition_type]
[condition_type]:
sqlstate[value]: sqlstate_value |mysql_error_code
condition_name 条件名称
condition_type 条件类型
sqlstate_value 和mysql_error_code都是mysql自己的错误
state_value是长度5的字符串错误代码
mysql_error_code数值类型的错误码,长度是4位。
errror1142(42000),sqlstate_value:42000,mysql_error1142
定义条件指定需要特殊处理条件,它将一个名字和指定的错误条件关联起来,
供处理程序使用。
eg:
对sqlstate类型的错误定义条件
declare condi_test condition for sqlstate '42000';
对mysql_error_code类型的错误定义条件
declare condi_test_error condition for sqlstate'1142';
2、处理程序(handler)
declare handler_type handler for condition_value[,...] sp_statement
handler_type:continue|exit|undo
condition_value:
sqlstate[value] sqlstate_value|condition_name|sqlwarning|
not found|sqlException|mysql_error_code
其中,handler_type 指明错误的处理方式,三种方式:
continue遇到错误不进行任何抵抗,继续向下执行;
exit遇到错误马上退出;
undo遇到错误撤回之前的所有操作,但是mysql不支持。
注意:通常情况下,执行过程中遇到错误应该立刻停止执行下面的程序,并撤回前面所有操作。
由于mysql不支持撤回之前所有操作,那么遇到错误的时候exit 。
如果能够精准的预判错误类型,并且可以处理相关的错误,那么可以执行continue。
condition_value指明错误类型
sqlstate_value和mysql_error_code
condition_name declare定义的条件名称
sqlwarning 表示以01开头的sqlstate_value值
not found 表示以02开头的sqlstate_value值
sqlException 表示没有被sqlwarning和not found捕获的sqlstate_value值。
sp_statement一些存储过程或函数的执行语句
eg:
捕获一下sqlstate_value
declare continue handler for sqlstate '42000' set @info='1';
捕获sqlstate_value值,如果遇到sqlstate_value值为42000,执行语句continue,
并且同时做了一个操作给info赋值,这个变量的赋值是为了后面做存储过程的处理准备。(回滚)
捕获mysql_error_code
declare continue handler for sqlstate '1148' set @info='1';
捕获mysql_error_code值,如果遇到的mysql_error_code值为1148时,
执行continue语句,并给变量赋值。
先定义条件,然后处理
declare condi_handler condition for 1142;
declare condition handler fro condi_handler set @info=2;
定义条件,然后再调用条件,定义一个confi_handler 遇到1142错误时,
执行continue语句,并给变量赋值。
捕获sqlwarning
declare exit handler for sqlwarning set set @info=3;
sqlwarning捕获到以01开头的sqlstate_value值,执行exit操作,并且给变量赋值
捕获not found
declare exit handler for not found set @info=4;
使用not found,当not found捕获到以02开头的sqlstate_alue值时,
程序执行exit操作,并且给not found的变量赋值,赋值本身的意义在于后面存储过程中
执行游标循环取值做not found准备。(游标是一个结果集,以行为单位)
捕获sqlExcepion
declare exit handler for sqlException set @info=5;
当sqlException 捕获到没有被sqlwarning和not found捕获到的sqlstate_value值,
执行exit操作,并且给变量赋值。
eg:
delimiter $$
create procedure condiHandler1()
begin
declare continue(exit) handler for sqlstate '23000' set @x=6;
set @x=1;
insert into t_class_copy(id) values(10);
set @x=2;
insert into t_class_copy(id) values(10);
set @x=3;
end
call condiHandler1();-- continue (exit)
select @x;
光标(oracle和sqlserver叫游标)是一个结果集。
查询语句可以查询出多条记录,在存储过程和函数中使用光标来逐条读取查询结果集中的记录。
光标的使用包括:声明光标,打开光标,使用光标和关闭光标。
光标必须声明在处理程序(handler)之前,并且声明在变量和条件(condition)之后
1、声明光标
mysql中是通过使用declare关键字来声明一个光标,具体语法:
declare cursor_name cursor for select_statement;
cursor_name 光标的名称
sursor 光标的关键字
select_statement select语句的内容,返回的是一个创建光标的结果集。
eg:
declare cur_position cursor for
select * from t_position_salary;
把t_position_salary表的所有字段所有数据放到光标里作为数据集合。
declare cur_position cursor for
select posName,salary from t_position_salary;
把t_position_salary表中的posName、salary这两个字段的数据拿出来放到光标里
2、打开光标
mysql中使用关键字open来打开光标,语法格式:
open cursor_name;
cursor_name 是之前定义好的光标名字
eg:
open cur_position;
3、使用光标
mysql中使用关键字fetch来使用关键字,一条一条的迭代,基本格式:
fetch cursor_name into v_name[,v_name....];
cursor_name 光标名称
v_name 将光标中select查询出来的信息放入的对象。v_name声明在光标之前。
eg:
fetch cur_position into v_posname,v_salary;
光标取出来的数据需要和变量实际意义一一对应。
4、关闭光标
mysql使用close关键字关闭光标,语句结构 :
close cursor_name;
eg:
close cur_position;
注意:一旦光标关闭就不能再被使用了。mysql的光标只能在存储过程和函数中使用。
流程控制的使用
存储过程和函数可以使用流程控制来控制语句的执行。
mysql中使用if、case、loop、leave、iterate、repeat、while进行流程控制。
每个流程中可能包含一个单独的语句,或者是使用begin...end来构造复合语句,
构造可以被嵌套。
1、if语句
if语句用来进行条件判断,根据是否满足条件来执行不同的语句,语法格式:
if search_codition then statement_list
[else if search_condition then statement_list]...
[else statement_list]
end if;
search_condition 判断语句;
statement_list不同条件的执行语句。
注意mysql自有的函数if();
eg:
if age>20 then set @count1=@count1+1;
else if age=20 then set @count2=@count2+1;
else set set @count3=@count3+1;
end if;
delimiter $$
create procedure proc_selDept(v_positionId int(10))
begin
declare v_deptId varchar(10);
declare cur_fetchDeptId cursor for
select deptId from t_position_salary
where id=v_positionId ;
end
delimiter $$
create procedure proc_selDept(v_positionId int(10))
begin
-- 声明变量
declare v_deptId varchar(10);-- 声明一个部门变量
declare v_notFound varchar(1) default '1';-- 声明处理程序变量
-- 声明定义条件
-- 声明一个光标
declare cur_fetchDeptId cursor for
select deptId from t_position_salary
where id=v_positionId ;-- statement是为了给光标赋值
-- 声明处理程序
declare continue handler for not found
set v_notFound='0' ;-- 用来监听光标取值为null时
open cur_fetchDeptId;-- 打开光标
fetch cur_fetchDeptId into v_deptId;-- 使用光标,一次取一行数据
if -- 流程控制,作用是从处理程序里取not found的阀值
v_notFound='0' then close cur_fetchDeptId;-- 处理程序
else
select * from t_position_salary where deptId=v_deptId;
close cur_fetchDeptId;-- 关闭光标
end if; -- 流程控制结束
end
call proc_selDept(4);
2、case 语句
case语句也是用来进行条件判断,它实现了比if语句更为复杂的条件判断。
case语句一:
case case_value
when when_value then statement_list
[when when_value then statement_list]...
[else statement_list]
end case;
case_value判断条件的变量,key(Map)
when_value 表示变量的取值,value
statement_list 表示不同的when_value值对应的执行语句
eg:
case v_salary -- 可以把存储过程或函数声明的变量拿来使用
when '50000' then '项目经理'
end case;
case语句二:
case
when search_condition then statement_list
[when search_condition then statement_list]...
[else statement_list]
end case;
search_condition :判断语句
statement_list :不同的条件语句执行的语句
注意:存储过程或函数里的case不能有else null字句和用end case 代替end;
3、loop语句
loop语句可以使某些特定的语句(fetch)重复执行,实现简单的循环。
loop本身是没有停止循环语句的,只能遇到leave、iterate语句才能停止循环。
eg:
[begin_lable]loop
statement_list
end loop [end_lable];
begin_lable:循环开始标签
end_lable:循环结束标签
注意:begin_lable和end_lable必须同名,并且都可以省略。
statement_list 循环控制语句中的执行语句。
4、leave语句
主要用于跳出循环控制,语法格式:
leave lable;
lable表示循环的标签
eg:
delimiter $$
create procedure proc_add()
begin
set @count=0;
add_num:loop
set @count= @count +1;
if @count=10 then
leave add_num;
end if;
end loop add_num;
end
5、iterate 语句
iterate语句也是用来跳出循环,iterate语句是用来跳出本次循环,然后进入下一次循环。
iterate语句可以在loop、repeat、while语句中使用,语法格式:
iterate lable;
注意:iterate(跳出本次循环)和leave(跳出循环体)的区别。
6、repeat语句(先执行再判断)
repeat语句是有条件控制的循环语句,当满足特定条件的时候就会跳出循环语句
语法格式:
[begin_lable]repeat
statement_list
until search_condition
end repeat [end_lable]
begin_lable:循环开始标签(和loop一样)
end_lable:循环结束标签
statement_list循环执行语句
search_statement 表示结束循环的条件,满足该条件的循环结束。
eg:
set @count=0;
add_num:repeat
set @count=@count+1;
until @count=10
end repeat add_num;
7、while语句(先判断再执行)
while语句也是有条件控制的循环语句,但是while语句和repeat是语句不一样的
while语句是当条件满足是执行循环语句。
语句格式:
[begin_lable]while search_condition do
statement_list
end while[end_lable];
search_condition循环执行的条件,满足条件之后才能执行
statement_list循环执行语句
eg:
set @count=0;
while @count<10
do set @count+@count+1;
end while
事务 8.15
mysql事务主要是用来处理操作量大,复杂度高的数据。
如:insert、update、delete等
1、在mysql中只有使用了innodb数据库引擎的数据库和表才支持事务。
2、事务处理可以用来维护数据库的完整性,保证成批的sql语句
要么全部执行要不就全都不执行(回滚)。
3、事务是用来管理insert、update、delete语句。
事务必须满足4个条件:原子性,稳定性,隔离性,可靠性。
1、原子性:一组事务,要么成功要么撤回。
2、稳定性:有非法数据(外键约束),事务撤回。
3、隔离性:事务独立运行。一个事务处理后的结果如果影响了其他事务,
那么其他事务撤回。事务100%隔离,需要降低速度。
4、可靠性:软、硬件崩溃后innodb数据表驱动会利用日志文件(binlog)
重构修改可靠性和高速不可兼得,innodb_flush_log_at_trx_commit选项
决定什么时候把事务保存到日志里。
在mysql里控制台采用事务来操作
1、开启一个事务:start transaction(begin)
2、保存点(可选):
save point proint_name (折回点)
rollback to savepoint proint_name,回滚到proint_name,
意味着在当前保存点以前的操作全部commit。
3、操作(对数据处理的一个过程):
4、可回滚可提交,没问题就提交(commit)有问题就回滚(rollback);
事务的提交:自动提交、手动提交。(mysql默认自动提交)
set autocommit=0;禁止自动提交 set autocommit=1;开启自动提交。
事务的锁定模式
系统默认:不需要等待某事务结束,可直接查询到结果,但是不能再进行修改、删除。
优点:不需要等待某事务结束,可直接查询结果。
缺点:查询到的结果有可能过期。
锁的类型有三种:
1、共享(S)锁:多个事务可封锁一个共享页;任何事务都不能修改该页(只读操作,如select);
通常是该页被读取完毕,S锁立即被释放。
2、排它(X)锁:仅允许一个事务封锁此页;其他任何事务必须等到X锁被释放才能对该页进行访问;
X锁一直到事务结束才能被释放。
3、更新(U)锁:用来预定要对此页施加X锁,它允许其他事务读,但不允许再施加U锁或X锁;
当被读取的页将要被更新时,则升级为X锁;U锁一直到事务结束时才能被释放。
MySQL有三种锁的级别:页级、表级、行级。
MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);
BDB存储引擎采用的是页面锁(page-levellocking),但也支持表级锁;
InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。
MySQL这3种锁的特性可大致归纳如下:
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
仅从锁的角度来说:
表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用
行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,
如一些在线事务处理系统。
由于MySQL认为写请求一般比读请求要重要,所以如果有读写请求同时进行的话,
MYSQL将会优先执行写操作。这样MyISAM表在进行大量的更新操作时
(特别是更新的字段中存在索引的情况下),会造成查询操作很难获得读锁,从而导致查询阻塞。