zoukankan      html  css  js  c++  java
  • MySQL子查询

    什么是子查询?

    当一个查询是另一个查询的条件时,这个查询称之为子查询(内层查询)

    什么时候用?

    当查询需求比较复杂,一次性查询无法得到结果,需要多次查询时,

    例如:给出一个部门名称,需要获得该部门所有的员工信息

    需要先确定部门的id,

    然后才能通过id确定员工

    解决问题的方式是把一个复杂的问题拆分为若干个简单的问题

     

    如何使用?

    首先明确子查询就是一个普通的查询,当一个查询需要作为子查询使用时,用括号包裹即可

    案列:

    准备数据:

    create table emp (id int,name char(10),sex char,age int,dept_id int,job char(10),salary double);

    insert into emp values

    (1,"刘备","男",26,1,"总监",5800),

    (2,"张飞","男",24,1,"员工",3000),

    (3,"关羽","男",30,1,"员工",4000),

    (4,"孙权","男",25,2,"总监",6000),

    (5,"周瑜","男",22,2,"员工",5000),

    (6,"小乔","女",31,2,"员工",4000),

    (7,"曹操","男",19,3,"总监",10000),

    (8,"司马懿","男",24,3,"员工",6000);

     

    create table dept(id int primary key,name char(10));

    insert into dept values(1,"市场"),(2,"行政"),(3,"财务");

     

    需求:财务部有哪些:

    数据在两张表中 可以使用链接查询

    select emp.name from emp inner join dept on dept.id = emp.dept_id where dept .name = "财务";

     

    子查询方式:

    数据在两张表中,先查询那张?

    emp? 不行 不知道部门名 查dept

    第一步 需要知道财务部的id

    select id from dept where name = "财务";

    第二步 用查询的到的id作为判断条件查询emp

    select name from emp where dept_id = 3;

    3不能写死 是上一个查询的结果 所以直接写在后面 加上括号就变成了子查询

    select name from emp where dept_id = (select id from dept where name = "财务");

     

    in 关键字子查询

    查询平均年龄大于25的部门名称

    子查询方式:

    平均年龄大于25的部门id有哪些?

    先要求出每个部门的平年龄! 筛选出平均年龄大于25的部门id

    拿着部门id 去查询部门表查询

    select name from dept where id in (select dept_id from emp group by dept_id having avg(age) > 25);

     

    多表查询方式:

    先把数据拼接到一起 在加以筛选

    select dept.name from emp inner join dept

    on emp.dept_id = dept.id

    group by dept.name

    having avg(age) >25;

     

    exists关键字子查询

    exists 后跟子查询 子查询有结果是为True 没有结果时为False

    为true时外层执行 为false外层不执行

    select *from emp where exists (select *from emp where salary > 1000);

    查看exists 的返回结果: 只有 0 和 1

    select (exists (select *from emp where salary > 10000));

     

    一个查询结果也是一个表 既然是表就能链接起来

    综合练习:

    查询每个部门工资最高的员工信息

    先查询每个部门的最高工资

    将查询结果与员工表联合起来

    在加条件判断部门id相同并且 最高工资相同 则显示

    select *from emp inner join

    (select dept_id,max(salary) m from emp group by dept_id) t2

    on emp.dept_id = t2.dept_id

    where

    emp.salary = t2.m;

     

    面试题:

    create table test(day_id date,result char(10));
    insert test values("2018-10-01","success");
    insert test values("2018-10-01","fail");
    insert test values("2018-10-01","fail");
    insert test values("2018-10-01","success");
    insert test values("2018-10-02","success");
    insert test values("2018-10-02","fail");
    insert test values("2018-10-02","fail");

    查询出以下结果:
    day_id     success     fail
    2018-10-01    2            2
    2018-10-02    1            2


    求出每天失败次数
    select day_id,count(*) as fail from test group by day_id,result having result = "fail"

    求出每天成功次数
    select day_id,count(*) as success from test group by day_id,result having result = "success"

    链接查询
    select t1.day_id,success,fail from
    (select day_id,count(*) as fail from test group by day_id,result having result = "fail") as t1
    join
    (select day_id,count(*) as success from test group by day_id,result having result = "success") as t2
    on t1.day_id = t2.day_id;

     

  • 相关阅读:
    Centos设置开机启动Apache和Mysql[总结]
    主机无法访问虚拟机的apache解决办法
    PHP使用DOM XML操作XML[总结]
    Linux下C结构体初始化[总结]
    libxml2的安装及使用[总结]
    Linux动态链接库的使用
    linux获取系统启动时间
    解析oui.txt文件,通过MAC前缀获取Organization
    linux命令学习——cat
    linux内核数据结构之kfifo
  • 原文地址:https://www.cnblogs.com/tangda/p/10560925.html
Copyright © 2011-2022 走看看