mysql:默认4G内存,能存储800万T数据,5000万行记录。
数据库:处理业务
数据的存储
学校->院系->班级->班
关系型数据库:体现业务
表中的字段:管理各自职能范围内的业务。(数据)java
一个关系数据库是一种软件:
1.可以实现具备表、列和索引的数据库
2.保证了各类表的行之间是引用完整性
3.自动更新索引,索引放在字段里。
4.解释sql查询和联合各表信息mysql
数据库的几个定义
1.数据库:是表的集合,具备相关数据。
2.表:表是用数据矩阵表现的数据展示形式
在一个数据库中咱们也能够把它看作是excel的展示正则表达式
3.列:一列包含一个数据类型相同的数据集合。(会出现数据类型这个概念)
4.行:一组相关的数据,表示当前表全部列的一行集合。
5.冗余:存储数据两次,冗余能使系统更快。
6.主键:主键是惟一的,不能在一个表中出现两次。
使用主键能够快速的查找到某一行sql
7.外键:两个表之间的联接字段
8.复合键:是由多个列组成的,一个键没法知足惟一标识。
9.索引:索引是对数据库表中一列或多列的值进行排序的一种结构,
使用索引可快速访问数据库表中的特定信息。就像一本书里的目录数据库
show create table t_idcard;//显示建表语句
desc t_idcard;//显示表结构服务器
SQL语言
一、sql语句是用于访问和处理数据的标准计算机语言
二、可以对数据进行:select delete insert update
insert into table(字段) values(字段值)
delete from table where ..
update table set ... where ...
select .. from .. where .. -- 返回的是一个结果集数据结构
三、扩展功能:表、视图、存储过程、存储函数。
四、在数据库里有许多表,可是表的名字在当前数据库是惟一的,表里包含数据记录。
1》表的命名规则:t(显示当前表的实在乎义)_tableName 、game(项目名)_user
加标签用于区分表,表名的表示意义比较多的时候能够加多个下滑线。并发
五、字符的引号和java中同样,都须要用英文的单引号,不一样的是字符串也是单引号。
(mysql中只有单引号,没有双引号)。sql自己对大小写不敏感,但表中的数据对大小写
超级敏感(mysql默认对大小不区分,若是要区分,在字段前面加binary)。oracle
六、mysql要求每条语句末尾都以分号结尾,这是一种标准写法。
七、alert(修改数据库表)
drop (drop表会把整表数据和表结构所有删除)
create index (建立索引) 、drop index(删除索引)数据库设计
八、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、数字类型
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) 非压缩的浮点数,不能是符号数,没有默认值。
2、日期和时间类型
mysql时间日期类型包括:
一、date (mysql取当前系统时间用new()方法)
以YYYY-MM-DD格式的日期,在公元1000-01-01到9999-12-31之间。
例如2016年8月5号在mysql里存储2016-8-5。
二、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
三、timestamp 1970年1月1号午夜之间的时间戳,到2037年的某个时间。
不须要链接符(-,:)。如(yyyymmddhhmmss)19731230153001
四、time 存储的时间格式:hh:mm:ss
五、year(m)以2位和4位数字格式来存储年份,长度若是指定2则定义方式为year(2)。
1970到2069(70-69)。若是长度指定为4位则定义的方式为year(4)1901-2155,
若是不给长度则默认长度为4。
3、字符串类型
虽然数字和日期类型存储的样式比较丰富,可是存储的大多数数据均可以是字符串树。
一、char(M) 固定长度的字符串,是以长度为1到255个字符长度(char(5))。
存储右空格填充到指定长度,能够不指定长度,有默认是1。
二、varchar 可变长度的字符串,长度为1-255(高版本的超过了255)
建立varchar类型的字段必须定义长度(varchar(10))没有默认长度。
三、blod或者text字段最长65535个字符,blod是“二进制大对象”,用来存储大的
二进制数据,如图像或者其余类型的文件。定义text文本字段持有大量的数据。
blod和text的区别主要是在排序和比较上,blod大小写比较敏感而text不区分
大小写。blod和text在定义时不须要指定长度。犀牛服务器
四、bold和text blod或者text字段用255的最大长度,不指定长度。
五、mediumblod或mediumtext 长度16777215定义的时候不须要指定长度。
六、longblod或者longtext 长度4294967295(4G-2)不指定长度
七、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:
一、is null 若是列的值为null(不是""空字符串)返回true
二、is not null 若是列的值不为null,返回true。
三、<=> 运算符的比较,(不一样于 =)即便两个空值都返回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特性:
一、原子性:确保了工做单位中的全部操做都成功,不然事务终止,
在失败时会回滚到事务操做之前的状态。
二、一致性:可确保数据库正确的更改状态,在一个成功事务的提交前提下。
三、隔离性:使事务相互独立的进行操做。
四、持久性:确保了提交事务的结果或系统故障的状况下任然存在做用。
提交和回滚
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命令来添加和删除索引
一、添加主键,这意味着索引值必须是惟一的,而且不能为空。
二、建立一个索引量的值必须惟一
三、增长普通索引,任何值的出现是屡次的。
四、建立一个用于文本搜索目的的特殊索引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
一、建立存储过程
语法:
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
声明、使用
一、变量定义
declare:声明变量的关键字,须要记忆
变量的名字:var_name[var_name1,var_name2...]
data_type: [default value];变量的类型(int char varchar(10)没有默认值)
default value 给咱们当前变量一个默认值
eg:默认值以前声明了a,b类型int,a+b
二、给变量赋值
定义变量以后,为变量赋值能够改变变量的默认值。
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
特定条件特定处理,这些条件能够联系到错误,以及子程序中的通常流程控制。
一、定义条件:是事先定义程序执行过程当中遇到的问题。
二、处理程序:定义了在遇到问题的时候应该采起什么处理方式,
而且保证存储过程或者函数在遇到警告或错误的时候能继续执行。
能够加强存储过程的处理问题能力,避免程序异常中止运行。
语法:
一、定义条件(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';
二、处理程序(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)以后
一、声明光标
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这两个字段的数据拿出来放到光标里
二、打开光标
mysql中使用关键字open来打开光标,语法格式:
open cursor_name;
cursor_name 是以前定义好的光标名字
eg:
open cur_position;
三、使用光标
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;
光标取出来的数据须要和变量实际意义一一对应。
四、关闭光标
mysql使用close关键字关闭光标,语句结构 :
close cursor_name;
eg:
close cur_position;
注意:一旦光标关闭就不能再被使用了。mysql的光标只能在存储过程和函数中使用。
流程控制的使用
存储过程和函数可使用流程控制来控制语句的执行。
mysql中使用if、case、loop、leave、iterate、repeat、while进行流程控制。
每一个流程中可能包含一个单独的语句,或者是使用begin...end来构造复合语句,
构造能够被嵌套。
一、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);
二、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;
三、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 循环控制语句中的执行语句。
四、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
五、iterate 语句
iterate语句也是用来跳出循环,iterate语句是用来跳出本次循环,而后进入下一次循环。
iterate语句能够在loop、repeat、while语句中使用,语法格式:
iterate lable;
注意:iterate(跳出本次循环)和leave(跳出循环体)的区别。
六、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;
七、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等
一、在mysql中只有使用了innodb数据库引擎的数据库和表才支持事务。
二、事务处理能够用来维护数据库的完整性,保证成批的sql语句
要么所有执行要不就全都不执行(回滚)。
三、事务是用来管理insert、update、delete语句。
事务必须知足4个条件:原子性,稳定性,隔离性,可靠性。
一、原子性:一组事务,要么成功要么撤回。
二、稳定性:有非法数据(外键约束),事务撤回。
三、隔离性:事务独立运行。一个事务处理后的结果若是影响了其余事务,
那么其余事务撤回。事务100%隔离,须要下降速度。
四、可靠性:软、硬件崩溃后innodb数据表驱动会利用日志文件(binlog)
重构修改可靠性和高速不可兼得,innodb_flush_log_at_trx_commit选项
决定何时把事务保存到日志里。
在mysql里控制台采用事务来操做
一、开启一个事务:start transaction(begin)
二、保存点(可选):
save point proint_name (折回点)
rollback to savepoint proint_name,回滚到proint_name,
意味着在当前保存点之前的操做所有commit。
三、操做(对数据处理的一个过程):
四、可回滚可提交,没问题就提交(commit)有问题就回滚(rollback);
事务的提交:自动提交、手动提交。(mysql默认自动提交)
set autocommit=0;禁止自动提交 set autocommit=1;开启自动提交。
事务的锁定模式
系统默认:不须要等待某事务结束,可直接查询到结果,可是不能再进行修改、删除。
优势:不须要等待某事务结束,可直接查询结果。
缺点:查询到的结果有可能过时。
锁的类型有三种:
一、共享(S)锁:多个事务可封锁一个共享页;任何事务都不能修改该页(只读操做,如select);
一般是该页被读取完毕,S锁当即被释放。
二、排它(X)锁:仅容许一个事务封锁此页;其余任何事务必须等到X锁被释放才能对该页进行访问;
X锁一直到事务结束才能被释放。
三、更新(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表在进行大量的更新操做时(特别是更新的字段中存在索引的状况下),会形成查询操做很难得到读锁,从而致使查询阻塞。