zoukankan      html  css  js  c++  java
  • 数据库部分(MySql)_3

    表设计之关联关系

      一对一:有两张表A和B,A表中有一条数据对应B表中的一条数据称为一对一;

      应用场景:用户表和用户扩展表,商品表和商品信息扩展表;

      如何建立关系:在从表中添加一个外键字段指向主表的主键。

      SELECT * FROM user u JOIN userinfo us ON u.id=us.uid WHERE u.name='Tom';

     

      一对多:AB两张表,A表中一条数据对应B表中的多条数据,同时B表中的一条数据对应A表中的一条数据;

      应用场景:员工表和部门表,分类表和商品表;

      如何建立关系:一对多张表,在多的表里添加外键指向另外一个表主键;

      

      多对多:AB两张表,A表中一条数据对应B表中的多条数据,同时B表中的一条数据对应A表中的多条数据;

      如何健立关系:需要创建单独的关系表,表中两个字段分别指向两个表的主键;

      SELECT t.name,s.name FROM student s JOIN t_s z ON s.id=z.sid JOIN teacher t ON t.id=z.tid;

     

      自关联:在表中有一个外键字段指向当前表的主键值;

      应用场景:需要保存层级关系,但又不确定有多少层的时候使用自关联;如:员工的上级领导、部门的上级部门、分类的上级分类;

     

      连接方式:关联查询的查询方式包括等值连接、内连接、外连接;

      关联关系:指设计表的时候两个表之间存在的逻辑关系,包括一对一、一对多、多对多;(当查询存在关联关系的表时,使用某一种连接方式进行查询);

    视图VIEW

      数据库中存在多种对象,表和视图都是数据库中的对象,可以理解成是一张虚拟的表,视图没有自己独立的数据,数据会随着原表的改变而改变;因为有些数据的查询需要书写大量的SQL语句,每次书写比较麻烦,使用视图可以起到SQL重用的作用,可以隐藏敏感信息。

      格式: CREATE VIEW 视图名 AS (子查询);

      简单视图:创建视图的子查询中不包含去重、函数、分类、分组、关联查询的视图;可对视图中的数据进行增删改查操作;

        CREATE VIEW v_emp_nosalary AS (SELECT name,manager,deptno FROM emp);

      复杂视图(对原表进行查询操作):和简单视图相反,只能对复杂视图的数据进行查询操作。

        CREATE VIEW v_emp_salary AS (SELECT deptno,sum(salary),avg(salary),max(salary),min(salary) FROM emp GROUP BY deptno);

    对简单视图中的数据进行增删改查操作

     

    1 案例:create view v_emp_A as (select * from emp where deptno='A');
    2     //1、在不改变视图创建条件的前提下添加数据
    3     insert into v_emp_A (empno,ename,deptno,salary) values (9527,'小白','A',50);
    4     //数据在原表中可见,在v_view_A中可见
    5 
    6     //2、在改变视图创建条件下添加数据
    7     insert into v_emp_A (empno,ename,deptno,salary) values (9527,'小白','B',50);
    8     // 数据在v_view_A中不可见,但在原表中可见

    数据污染

      往视图中插入一条视图中不可见,但是在原表中存在的数据;如果需要避免污染的出现,可以使用with check option 关键字。

      CREATE VIEW v_emp_a AS (SELECT * FROM emp WHERE deptno='a') with check option;

    在视图中修改和删除数据

      修改和删除不会出现类似数据污染问题,修改和删除只能操作视图中存在的数据;

      修改

        UPDATE v_emp_A set salary=salary+5;//仕途中存在可以修改并同步到原表;

        UPDATE v_emp_A sat salary=salary+5 WHERE deptno='B'; //修改失败;

      删除

        DELETE FROM v_emp_A WHERE empno=1;//成功

        DELETE FROM v_emp_A WHERE empno=2;//失败;

    修改视图(替换)

      CREATE OR REPLACE VIEW 视图名 AS 子查询;

    删除视图

      DROP VIEW 视图名;

    视图别名

      如果创建视图的子查询中使用了别名,则对视图进行的各种操作都必须使用别名;

      CREATE VIEW 视图名 as (SELECT 字段名 别名,字段名 FROM emp);

      测试:

        UPDATE 视图名 SET salary=10 WHERE 别名='A';//成功

        UPDATE 视图名 SET salary=10 WHERE 字段名='A';//失败

     

  • 相关阅读:
    Collection<E>接口
    Iterable<T>接口
    Iterator<E>接口
    js图片压缩
    js计算最大公约数和最小公倍数
    canvas原生js写的贪吃蛇
    左右两栏div布局,高度自适应
    vue的图片路径,和背景图片路径打包后错误解决
    职责链模式
    js多个异步请求,按顺序执行next
  • 原文地址:https://www.cnblogs.com/DebugTheWorld/p/9822467.html
Copyright © 2011-2022 走看看