多表设计和多表查询

多表查询
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;
    
    
    
    
    
    
    
    
原文地址:https://www.cnblogs.com/zhuhaofeng/p/15734838.html