• 2019.3.26 SQL语句(进阶3)


    表的联查

    员工表与部门表

    员工表:id,姓名,年龄,部门id
    部门表:部门id,部门名,部门成立时间,部门领导,部门职责....

    表和表之间的关系

    • 一对一
    • 一对多
    • 多对多

    创建联查

    创建表

    先创建被依赖表(dept):
    create table dept (did integer primary key auto_increment comment '部门id',
    dname varchar(10) comment '部门名',
    des varchar(30) comment '部门描述');

    再创建关联表(emp):
    create table emp (emp_id integer primary key auto_increment comment '员工id',
    emp_name varchar(20) comment '员工名',
    emp_salary integer comment '员工薪资',
    emp_age integer comment '员工年龄',
    d_id integer comment '部门id',
    foreign key (d_id) references dept(did) on UPDATE cascade
    on delete cascade );

    添加外键的方法:
    foreign key (自己表的列名) references 被关联表(被关键表的列)
    on UPDATE cascade:可以被修改(修改被关联表中内容,关联表中的内容也会被修改,delete下同)
    on delete cascade:可以被删除

    添加数据

    在给有外键的表添加数据时候,要添加的数据必须在被关联表(dept)中出现
    insert into dept values (null,'研发部' ,'******'),
    (null,'市场部' ,'aaa'),
    (null,'人事部' ,'bbb'),
    (null,'营销部' ,'ccc'),
    (null,'行政部' ,'ddd');

    insert into emp values (null ,'张三','6000',25,1),
    (null ,'李四','8000',22,3),
    (null ,'王五','5000',24,2),
    (null ,'赵六','7000',26,4),
    (null ,'钱七','9000',23,3);

    关于外键:

    • 外键只和update 和 delete 有关系
    • 在insert的时候,只有在被关联表(dept)有相应的值时,才能在关联表(emp)中添加
    • 如果在创建表的时候给外键添加 on update cascade ,那么关联表(emp)的外键只可以随时被关联表(dept)的改变自动修改
    • 如果添加了 on delete cascade,那么删除被关联表(dept)的数据之后,
      被关联表的相关数据一并删除
    • 删除表的时候,先drop关联表(emp),再drop被关联表(dept)

    多对多联查:学生表和课程表

    学生表:id,name
    课程表:id,name
    需要的中间表:id,s_id,c_id
    如果两个表是多对多的关系,那么必然会有中间表来关联两者

    创建表

    学生表:
    create table if not exists stu(sid integer auto_increment primary key ,
    sname varchar(10) ) comment '学生表';
    课程表:
    create table if not exists course(cid integer auto_increment primary key ,
    cname varchar(10)) comment '课程表';
    中间表:
    create table if not exists sc(id integer primary key auto_increment,
    s_id integer,
    c_id integer,
    foreign key (s_id) references stu(sid)
    on UPDATE cascade ,
    foreign key (c_id) references course(cid)
    on UPDATE cascade ) comment '中间表';

    多表查询

    select emp.emp_name,emp.d_id,
    dept.dname,dept.did
    from emp,dept where emp.d_id=dept.did;

    笛卡尔积axb

    多表查询就是把不符合条件的笛卡尔积全部去掉

    join...on(inner join...on)

    左外连接 left join
    join左侧的表的所有行一定会在结果中出现
    右外连接 right join
    join右侧的表的所有行一定会在结果中出现
    全连接 full join
    笛卡尔积 cross join
    自然连接 natural join
    自连接: 取代子查询的手段

    join:两表形成的笛卡尔积的形式合并为一个表
    on:过滤笛卡尔积的条件

    判断语句执行的顺序:on > where > having

    练习

    1.查询员工及所在部门所有信息

    select *
    from emp join dept
    on emp.d_id = dept.did;

    2.查询所有员工姓名,薪资和所在部门

    select emp_name ,emp_salary ,dept.dname
    from emp join dept
    on emp.d_id = dept.did;

    3.查询员工姓名及所在部门的全部信息

    select emp_name,dept.*
    from emp join dept
    on emp.d_id = dept.did;

    4.查询“市场部”的员工的姓名和薪资

    select dept.dname,emp.emp_name ,emp_salary
    from emp join dept
    on emp.d_id = dept.did
    where dept.dname='市场部';

    5.查询“市场部”年龄大于22岁的员工姓名和薪资

    select emp_name, emp_salary
    from emp join dept
    on emp.d_id = dept.did
    where dept.dname='市场部' and emp_age>22;

    6.查询每个部门的平均薪资

    select dept.dname,AVG(emp_salary)
    from emp join dept
    on emp.d_id = dept.did
    group by dept.dname;

    7.查询每个部门的人数

    select dept.dname,count(*)
    from emp join dept
    on emp.d_id = dept.did
    group by dept.dname;

    8查询每个部门年龄大于21岁的员工的人数(要求全部输出)

    select dept.dname,count(emp_name)
    from emp right join dept
    on emp.d_id = dept.did and emp_age>21
    group by dept.dname;

    9.查询每个部门的薪资>5000的员工的平均年龄和每个部门的平均薪资

    select dept.dname,AVG(emp.emp_salary),AVG(emp.emp_age)
    from emp join dept
    on emp.d_id = dept.did
    group by dept.dname
    having AVG(emp.emp_salary)>5000;

  • 相关阅读:
    MongoDB理解
    jQuery+Ajax+PHP实现异步分页数据显示
    PHP设计模式四:适配器模式
    PHP设计模式三:原型设计模式
    Event Managers
    NetAdvantage
    英语
    CA1060
    DateTime和DateTime2
    宿主进程 vshost.exe
  • 原文地址:https://www.cnblogs.com/lzb1234/p/10631994.html
Copyright © 2020-2023  润新知