美文网首页
数据库笔记3

数据库笔记3

作者: 我爱芒果干 | 来源:发表于2018-08-07 21:51 被阅读9次

    一、六大约束

    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)跳出,结束当前循环;


    相关文章

      网友评论

          本文标题:数据库笔记3

          本文链接:https://www.haomeiwen.com/subject/hkjavftx.html