• 多表数据查询


    Mysql Join语法以及性能优化

    连表方式

    内链接:只取两张表的共同部分

    SELECT *
    FROM employee
    INNER JOIN department
    ON employee.dep_id = department.id
    View Code

    左连接:在内连接的基础之上,保留左表记录,即便右表没有与之对应数据,无对于字段用NULL填充

    SELECT *
    FROM employee
    LEFT JOIN department
    ON employee.dep_id = department.id
    View Code

    右连接:内连接的基础之上,保留右表记录,即便左表没有数据与之对应,无对于字段用NULL填充

    SELECT *
    FROM employee
    RIGHT JOIN department
    ON employee.dep_id = department.id
    View Code

    全外连接:在内链接基础之上,没有对于关系的记录也将保留

    实现原理,将左链接和右链接综合起来去重即可,UNION关键字

    SELECT *
    FROM employee
    LEFT JOIN department
    ON employee.dep_id = department.id
    UNION
    SELECT *
    FROM employee
    RIGHT JOIN department
    ON employee.dep_id = department.id;
    View Code

    对虚拟表进行分组过滤操作

    SELECT department.name ,avg(age)
    FROM employee
    INNER JOIN department
    ON employee.dep_id = department.id
    GROUP BY department.name
    HAVING avg(age)>30
    View Code

     SELECT语句完整语法

    SELECT DISTINCT <select_list>
    FROM <left_table>
    <join_type> JOIN <right_table>
    ON <join_condition>
    WHERE <where_condition>
    GROUP BY <group_by_list>
    HAVING <having_condition>
    ORDER BY <order_by_condition>
    LIMIT <limit_number>
    View Code

    SELECT执行顺序

    FROM
    ON
    JOIN
    WHERE
    GROUP BY
    HAVING
    SELECT
    DISTINCT
    ORDER BY
    LIMIT
    View Code

    子查询

    • 是将一个查询语句嵌套在另一个查询语句中
    • 内层查询语句的查询结果,可以为外层语句提供查询条件
    • 子查询可以包含:IN、NOT IN、ANY、ALL、EXISTS、NOT EXISTS等关键字
    • 可以使用比较运算符:=、!=、>、<等

    IN,查询平均年龄在25岁以上的部门名

    SELECT name
    FROM department
    WHERE id 
    IN(
        SELECT dep_id
        FROM employee
        GROUP BY dep_id
        HAVING avg(age)>25);
    View Code

    =,查看技术部员工姓名

    SELECT name 
    FROM  employee
    WHERE dep_id=(
                    SELECT id
                    FROM department
                    WHERE name="技术部");
    View Code

    NOT IN,查看不足1人的部门名

    SELECT name
    FROM department
    WHERE dep_id
    NOT IN(            
        SELECT 
        DISTINCT dep_id
        FROM department);
    View Code

    >,查询大于所有人平均年龄的员工姓名与年龄

    SELECT name,age
    FROM employee
    WHERE age
    > (
        SELECT
        AVG(age)
        FROM employee);
    View Code

    EXISTS,判断查询是否有结果

    SELECT *
    FROM employee
    WHERE    
    EXISTS(
        SELECT id
        FROM department
        WHERE name="技术");
    View Code

     把SELECT语句括起来加AS起别名后,下次可以继续对此做查询;

    SELECT *
    FROM 
        (SELECT id,name,sex
        FROM employee) AS t1;
    View Code

    每个部门最新入职的员工

    SELECT * 
    FROM employee
    AS t1
    INNER IN
    (
        --:分组拿到单个组最大时间,起别名为t1
        SELECT post,max(hire_date)
        AS max_hire_date
        FROM employee
        GROUP BY post)
    AS t2
    ON t1.post=t2.post
    WHERE t1.hire_date=t2.max_hire_date;
    View Code

    多表查询练习



  • 相关阅读:
    招标问什么
    其他房产
    长沙
    flume kafka
    http://www.zhihu.com/question/24301047
    38.NOW() 函数
    35.MID() 函数
    36.LEN() 函数
    34.UCASE() LCASE() 函数
    33.HAVING 子句
  • 原文地址:https://www.cnblogs.com/yaya625202/p/9064982.html
Copyright © 2020-2023  润新知