• 多表设计和多表查询


    多表查询
    1. 添加外键约束
        1.1 在创建表的过程中申明外键
        外键是指引用另一个表的一列或多列,被引用的列应该具有主键约束或唯一性约束。外键用于建立和加强两个表数据之间的链接
        
        create table dept(
            id int primary key auto_increment,
            name varchar(40)
        );
    
        insert into dept values (null,'财务部'),(null,'人事部'),(null,'行政部'),(null,'科技部');
    
        create table emp(
            id int primary key auto_increment,
            name varchar(40),
            dept_id int,
            foreign key (id) references dept(id)
        );
    
        insert into emp values(null,'奥巴马',1),(null,'萨达姆',2),(null,'哈利波特',3),(null,'火车王',4);
    
    
        1.2 在表已经存在的情况下声明外键
        ALTER TABLE 表名 add constraint 外键约束名 foreign key (外键字段) REFERENCES 外表表名(主键字段名);
    
        create table dept(
            id int primary key auto_increment,
            name varchar(40)
        );
    
        create table emp(
            id int primary key auto_increment,
            name varchar(40),
            dept_id int
        );
    
        ALTER TABLE emp ADD CONSTRAINT FK_ID foreign key (dept_id) REFERENCES dept(id);
    
    2. 删除外键约束
        alter table 表名 drop foreign key 外键名;
        alter table emp drop foreign key emp_ibfk_1;
        
    3. 多表设计,设计和操作关联表
       3.1 一对多;
        我们可以在多的一方设计外键保存少的一方的主键
       3.2 一对一:
        可以在任意一方设计外键保存另一方的主键
       3.3 多对多
        需要设计第三张表,保存两张表的主键作为外键,存储两张表主键的对应关系
       添加数据:只有主表数据存在的情况下,附表的数据才能插入
       
    4. 多表查询
        create table dept(
            id int primary key auto_increment,
            name varchar(40)
        );
    
        create table emp(
            id int primary key auto_increment,
            name varchar(40),
            dept_id int
        );
    
        insert into dept values (null,'财务部'),(null,'人事部'),(null,'行政部'),(null,'科技部'),(null,'销售部');    
        insert into emp values(null,'奥巴马',1),(null,'萨达姆',2),(null,'哈利波特',4),(null,'火车王',4),(null,'火车王',6);
    
        笛卡儿积查询;是两张表相乘的结果,如果左边有m条记录,右边有n条记录,则查询出m*n条记录,这样的结果往往包含大量的错误的数据,所以这种方式我们通常不使用
        select * from dept,emp;
    
        内链接查询:查询出左边表有且右边表也有的记录
            select * from dept,emp where dept.id = emp.dept_id;
            select * from dept inner join emp on dept_id = emp.dept_id;
        外链接查询
            左外链接查询:在内链接的基础上增加了左边表有而右边表没有的记录
            select * from dept left join emp on dept_id = emp.dept_id;
            右外链接查询:在内链接的基础上增加了右边表有而左边表么有的记录
            select * from dept right join emp on dept_id = emp.dept_id;
            全链接查询:在内链接的基础上增加了左边表有而右边表没有的 和 右边表有而左边表么有的记录
            select * from dept full join emp on dept dept_id = emp.dept_id; #mysql不支持全外链接
    
            select * from dept left join emp on dept.id = emp.dept_id
            union
            select * from dept right join emp on dept.id = emp.dept_id;   #mysql中可以用union操作左外+右外,就模拟一个全外链接查询
        
        ~ 查询4号部门的名称和其中的员工的名称
            select dept.name 部门名称,emp.name 学生名称 from dept inner join emp on dept.id = emp.dept_id where dept.id=4;
        
        
        
        
        
        
        
        
  • 相关阅读:
    C# 把带有父子关系的数据转化为------树形结构的数据 ,以及 找出父子级关系的数据中里面的根数据Id
    基于角色的菜单按钮权限的设计及实现
    基于记忆性的中值滤波O(r)与O(1)复杂度的算法实现
    Canny算法检测边缘
    图像平滑去噪之高斯滤波器
    运动元素提取,基于帧间差分与背景差分
    基于RGB与HSI颜色模型的图像提取法
    基于阈值的灰度图像提取法
    C语言深入学习
    大津法实现图像二值化
  • 原文地址:https://www.cnblogs.com/zhuhaofeng/p/15734838.html
Copyright © 2020-2023  润新知