MySql-第三部分(外键, 多表连接, 事务,视图 )

外键

何为外键?
    外键是指引用另一个表中的一列或者多列,被引用的列要么是主键约束要么是唯一约束.
    外键用于建立和加强两张表数据之间的连接.
为表添加外键约束:
    alter tableadd constraint 外键名 foreign key(本表外键id字段) references 外表(主键id字段);
    # 示例:alter table student add constraint wid foreign key(bid) reference A(aid); #
    
为表删除外键约束:
    alter tabledrop foreign key 外键名称;
    # 示例: alter table student foreign key sid_gid; #

多表连接

交叉连接(cross join):
    返回的结果是被连接的表中的所有数据行的笛卡尔积,即行数的乘积.
    yf: select * from 表1 cross join 表2;  #一般不用,会显示所有数据
内连接(inner join):
    yf: select 所查字段 from 表1 inner join 表2 on 表1.关系字段=表2.关系字段.
外连接(left|right join):
    yf: select 所查字段 from 表1 left|right [outer] join 表2 on 表1.关系字段=表2.关系字段.
    左连接:左连接的结果包括left join子句中指定的左表的所有记录,和所有满足条件的记录.如果左表的某条记录在右表中不存在,则在右表中显示为空.
    右连接:右连接与左连接正好相反,返回右表中所有指定的记录和所有满足连接条件的记录.如果右表的某条记录在左表中没有匹配,则左表将返回空值.
    #左右连接相当于全部显示已该连接边的数据为主的数据,另一半没有该边匹配的数据时就填充NULL值显示#
自连接:自己连接自己;
    select a.*,b.* from 表 a jion 表 b on a.id=b.id;
子查询:
    释义:子查询是指一个查询语句嵌套在另一个查询语句内部的查询.在执行查询语句时,首先会执行子查询中的语句,然后将返回的结果作为外层查询的过滤条件.
    一个select语句中包含另一个完整的select语句.
    子查询出现的位置:
        1.where后,作为条为被查询的一条件的一部分.
        2.from后,作表.
    当子查询出现在where后作为条件时,还可以说使用如下关键字:any,all
    带in:包含其中的查询结果
    带exists:后面接子查询,返回行,exists为True,外层查询继续,子查询返回Flase,exists为False,外层查询停止.
    带any:满足其中一个条件,就返回结果
    带all:要满足其中的所有比较条件
    带运算符:<,>,>=,<=,!=,<>等等.

事务

何为事务?
    所谓的事务就是针对数据库的一组操作,它可以由一条或多条SQL语句组成,同一个事务的操作具备同步的特点,即事务中的语句要么都执行,要么都不执行.
事务的使用流程1.开启事务        start transaction
    2.执行Sql语句    sql语句
    3.提交事务        commit;
    4.取选事务        rollback;  #回滚#
事务的定义特性:
    持久性:事务一旦提交,其所做的修改就会永久保存到数据库中,即使数据库发生故障也不应该对其有任何影响.事务的持久性不能做到100%的持久,只能从事务本身的角度来保证永久性,而一些外部原因导致数据库发生故障;如硬盘损坏,那么所有提交的数据可能
都会丢失.
    原子性:原子性是指一个事务必须被视为一个不可分割的最小工作单元,只有事务中所有的数据库操作都执行成功,才算整个事务执行成功
    一致性:一致性是指事务将数据库从一种状态转变为下一种一致的状态.
    隔离性:隔离性还可以称为并发控制、可串行化、锁等,当多个用户并发访问数据库时,数据库为每-一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离.

视图

何为视图?
    视图是一个虚拟表(非真实存在),其本质是根据SQL语句获取动态的数据集并为其命名,用户使用时只需使用名称即可获取结果集,并可以将其当作表来使用.
视图的优点:
    简化查询语句:在日常开发中我们可以将经常使用的查询定义为视图,从而使用户避免大量重复的操作.
    安全性:通过视图用户只能查询和修改他们所能见到的数据,数据库中的其他数据看不到也取不到.
    逻辑数据独立性:视图可以帮助用户屏蔽真实表结构变化带来的影响.
    
    yf:create [or replace] [algorithm = {undefined | merge |temptable}] view view_name [(column_list)] as select_statement [with [cascaded | local] check option]
    /**
        create: 创建视图的关键字;
        or replace: 表示该语句能够替换已有的视图;
        algorithm: 可选,表示视图选择的算法;
        undefined: 表示mysql将自动选择所要使用的算法;
        temptable: 表示将视图的结果存入临时表,然后使用临时表执行语句;
        view_name: 视图名称;
        column_list: 可选,表示属性清单;
        select_statement: 表示从某个表或视图中查找到满足条件的记录,并导入视图中;
        with check option: 可选,表示创建视图时要保证在该视图的权限范围之内;
        cascaded: 需要满足跟该视图有关的所有相关视图和表的文件,该参数为默认值;
        local: 可选,在创建视图时,只要满足视图本身定义的条件即可.
    **/

简单的视图创建与查看
  create view view_表 as select 字段1,2,3... from 表;
  select * from view_表;
  create view view_表(str1,str2) as select strA,strB from#strA,strB在视图中更改为str1,str2;

  /*
      desc 视图名;
      show table status like '视图名'; #查看基本信息.
      show create view 视图名;
      视图为虚拟表,无法对真实表进行操作,仅能作查询用.
    */
    
视图的修改:
    yf1: create [or replace][algorithm ={undefined | merge | temptable}] view view_name [(column_list)] as select_statement [with [cascaded | local] check option]    
    #使用create or replace view语句修改,例:create or replace view view_name as select * from table;
    
    yf2: alter [algorithm = (undefined | merge |temptable)] view view_name [(column_list)] as select_statement [with [cascaded | local] check option]
    #使用alter语句修改,例:alter view view_name as select * from table;

视图的更新:
    尽管更新视图有多种方式,但是并非所有情况下都能执行视图的更新操作。
    当视图中包含有如下内容时,视图的更新操作将不能被执行:
        1.视图中不包含基本表中被定义为非空的列。.
        2.在定义视图的SELECT语句后的字段列表中使用了数学表达式。
        3.在定义视图的SEL ECT语句后的字段列表中使用聚合函数。
        4.在定义视图的SELECT语句中使用了DISTINCT, UNIONTOPGROUP BY或HAVING子句。
    update:例:update view view_name set 视图字段=[where];
    delete:例:delete from view_name where 视图字段=值;
    insert:真实表添加了数据,视图也会相应更新;
    
视图的删除:
    yf: drop view [if exists] view_name [,view_name2] [restrict | cascaded]
   例: drop view if exists view_name;

猜你喜欢

转载自www.cnblogs.com/luowei93/p/12556045.html