数据库笔记3

一、六大约束

1.primary key ;一个表中只能有一个主键约束,一个主键约束可由多个字段组成,且设为主键的字段的值不能为空。

2.unique;一个表中可有多个唯一键约束,not可以为空。

3.not null;可有多个非空约束,非空约束字段值不能为空。

4.default;表中可有多个默认值,当插入值不设置时,自动补充设置的默认值。

5.check;检查约束,插入的值只有通过check检查时才能插入。

6.foreign key;外键约束,外键约束的字段值必须是主表的键。

实例:

create table student(

id int primary key auto_increment,

name varchar(20) unique not null,

sex char check(sex='男' or sex='女'),

age int default 18,

majorid int ,

constraint fk_student_major foreign key (majorid) reference major(id)

); 

/*1.除外键其他约束基本用列级约束,外键用表级约束

2.创建表时可添加标识列auto_increment,标识列必须加在一个key上,一个遍只能添加一个标识列,且标识列必须加在数据类型为整型、小数等类型后。

3.标识列可设置步长 set auto_increment_incremet=常数

二、事务

特性(ACID)

1.原子性(atomicity):要么都执行,要么都回滚

 2.一致性(consistency):保证数据的状态操作前和操作后保持一致

3.隔离性(isolation):多个事务同时操作相同数据库的同一个数据时,一个事务的执行不受另外一个事务的干扰

4.持久性(surability):一个事务一旦提交,则数据将持久化到本地,除非其他事务对其进行修改

显示事务运行

set autocommit=0;

srart transaction;

insert/delete/update 语句

commit/rollback

事务并发问题

1.读脏:一个事务读取到了另外一个事务未提交的数据

2.不可重复读:同一个事务中,多次读取到的数据不一致

 3.幻读:一个事务读取数据时,另外一个事务进行更新,导致第一个事务读取到了没有更新的数据

避免措施

1.READ COMMITTED 可以避免脏读

2.REPEATABLE READ 可以避免脏读、不可重复读和一部分幻读

3.SERIALIZABLE:避免脏读、不可重复读和幻读,但是性能特别地

一般设定为:repeatable read

设置隔离级别语句:set session/global transaction level 级别名

查看级别: select @@tx_isolation

三、视图

创建视图

create view 视图名

as

select语句;

增删改视图

1.查询视图数据:select* from 视图名;

2.查看视图结构:desc 视图名 或 show create view 视图名;

3.插入视图数据:insert into 视图名(字段名) values (字段值);

4.修改视图数据:update 视图名 set

5.删除试图数据:delete from 视图名;

6.删除试图:drop view 视图1,视图2~;

以下情况不能更新试图

1.sql语句包含分组函数、distinct、group by、having、union或者union all

2.常量视图(create view v3 as select 'john' )

3.Select中包含子查询 join

4.from一个不能更新的视图

5.where子句的子查询引用了from子句中的表

四、变量

系统变量

全局变量      global               会话变量      session

1.查看所有变量 show global/session variables

2.查看满足条件变量:show global/session variables like '  '

3.查看指定系统变量的值:select @@global/session.变量名

4.为某个变量赋值:set global/session 变量名=值

                                set @@global/session.变量名=值

**所有的session都可以省略,例:select @@变量名;表示查询会话变量的指定变量值,只针对当前的连接有效。全局变量跨连接有效,但不可跨重启。

用户自定义变量

用户变量

作用于:针对于当前会话连接有效,作用域同于会话变量;

1.声明初始化:set @用户变量名=值

                      set @用户变量名:=值

                      select @用户变量名:=值

2.赋值(更新用户变量值):

              方式一:通过set select

              set @用户变量名=值

              set @用户变量名:=值

              select @用户变量名:=值

              方式二:通过select into

              select 字段 into  变量名  from 表;

              例:select count(*) into  @count  from employees

3.查看用户变量名:select @用户变量名

局部变量

作用于:仅在定义他的begin end中,且必须放在begin end 中的第一句。

1.声明:declare 变量名  类型 【default 值】;#default赋初值

2.赋值:方式一:通过set select

                   set 局部变量名=值

                   set 局部变量名:=值

                   select 局部变量名:=值

            方式二:通过select into

                   select 字段 into 变量名 from 表;

3.使用:select 变量名;(注意此处没有@)

五、存储过程

含义:一组经过预先编译的sql语句的集合,理解成批处理语句。

创建存储过程

create procedure 存储过程名(参数列表)

begin

           存储过程体(一组合法的sql体)

end

**注意1.参数列表包含三部分  

             参数模式  :IN:该参数需要调用方输入值;

                                 OUT:该参数可以作为返回值;

                                 INOUT:该参数及需要传入值,又可以返回值;

             参数名 

             参数类型

2.若参数过程体中只有一句话,则begin end可以省略

3.存储过程体中的sql语句必须加分号,存储过程体结尾用“delimiter 结束标记”

调用

call   存储过程名(实参列表);

实例

1.参数列表为空

delimiter $

CREATE procedure myp1()

BEGIN

 insert into admin(username,`password`)

values ('john1','0000'),('lily','0000'),('rose','0000'),('jack','0000'),('tom','0000');

 end $

调用:call myp1() $

2.创建带in模式参数的存储过程

传一个in参数的存储过程

CREATE PROCEDURE myp2(in beautyname varchar(20))

BEGIN

SELECT bo.* FROM boys bo RIGHT JOIN beauty b on b.boyfriend_id=bo.id WHERE b.name=beautyname;

END $

传两个in参数的存储过程

CREATE PROCEDURE myp4(in username varchar(20), in password varchar(20))

BEGIN

DECLARE result int default 0; #声明局部变量

SELECT count(*) into result from admin where admin.username=username and admin.password=password; #局部变量赋值

SELECT if(result>0,'成功','失败');

END $

3.创建带out参数的存储过程

创建带一个in一个out的存储过程(输入beautyname 输出boyname)

CREATE PROCEDURE myp8 (in beautyname VARCHAR(20),out boyname VARCHAR(20))

 begin

SELECT bo.boyname into boyname from boys bo INNER JOIN beauty b on b.boyfriend_id=bo.id where b.name=beautyname;

end

set @bname='  '    #此处将bname设定为用户变量

call myp8('唐艺昕',@bname)

SELECT @bname $

创建带两个out的存储过程

CREATE PROCEDURE myp11(in beautyname VARCHAR(20),out boyname varchar(20),out usercp int )

BEGIN

SELECT bo.boyname,bo.usercp into boyname,usercp from boys bo INNER JOIN beauty b on b.boyfriend_id=bo.id where b.name=beautyname;     #注意此处boyname/usercp是局部变量,此处为两个字段同时赋值

END

call myp11('唐艺昕',@bname,@bcp)

select @bname,@bcp

4.创建inout参数的存储过程

CREATE procedure mpy13(inout a int,inout b int)

BEGIN

      set a=a*2;

      set b=b*2;

end $

set @a=10

 set @b=20

call mpy13(@a,@b)

SELECT @a,@b

删除

drop procedure 存储过程名;

查看存储过程结构:show create prodecure 存储过程名

六、函数

函数定义类似于存储过程

创建函数

create fincation 函数名(【参数类型】) returns 数据类型

begin

变量声明

SQL语句

return 变量名

end

实例

1.无参有返回

 CREATE function my1() RETURNS INT

begin

        declare c int DEFAULT 0; #声明局部变量

        SELECT count(*) into c from employees;

         return c;

END

SELECT my1()

2.有参有返回

CREATE FUNCTION my3(empname VARCHAR(20)) RETURNS DOUBLE

begin

        set @sal=0;

        SELECT salary into @sal from employees e where e.last_name=empname;

        RETURN @sal;

END

SELECT my3('kochhar');

查看函数结构

show create function 函数名;

删除函数:

drop function 函数名;

七、流程控制结构

顺序结构:从上往下依次执行

分支结构:程序从两条或多条路径中选择一条

1.if函数:实现简单双分支

语法:

if(表达式1,表达式2,表达式3) 若表达式1成立,则返回表达式2,不成立返回表达式3。

2.case结构:一般用于实现等值判断(类似于switch),或区间判断(类似于if)

语法一:

case 变量/表达式/字段

when 要判断的值  then 返回值1或语句;

when 要判断的值  then 返回值2或语句;

......

else 要返回值n;

END case;

语法二:

case

when 要判断的条件  then 返回值1或语句;

when 要判断的条件  then 返回值2或语句;;

......

else 要返回值n

END case;

特点:作为独立语句执行时必须放在 begin end中

else 可以省略,若else省略且所有的when都不成立则返回null

3.if结构:只能应用在begin end

语法

if 条件1 then 语句1;

elseif  条件2 then 语句2;

......

【else 语句n】

end if


循环结构:程序在满足一定的条件基础上,重复执行一段代码

1.while

语法:

【标签】while 循环条件 do

                             循环体;

              end while 【标签】;

实例:

CREATE PROCEDURE test_while3(in insertcount int)

begin

      DECLARE i int DEFAULT 1;

      a:while i<intercount do

            set i=i+1;

            if i%2!=0 then iterate;

           end if;

           insert into  admin(username,`password`)VALUES(concat('杉菜',i),'6666');

           end while a;

end

2.loop:

语法:【标签】 loop

                                       循环体;

                          end loop 【标签】;

3.repeat

语法:【标签】 repeat

                                      循环体;

                          until 结束循环的条件

                          end repeat 【标签】;

4.循环控制 

                      iterate(类似于continue)结束本次循环进行下一次;

                      leave(类似于break)跳出,结束当前循环;










最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容