• mysql 多表查询


    一:多表连接查询

      - 外连接语法:

        - select 字段列表

          from 表1 inner|left|right  join 表2

          on 表1.字段 = 表2.字段;

      (1)直接交叉连接:生成笛卡儿积,不适用于任何匹配条件

    mysql> select * from employee,department;
    +----+----------+--------+------+--------+------+--------------+
    | id | name     | sex    | age  | dep_id | id   | name         |
    +----+----------+--------+------+--------+------+--------------+
    |  1 | egon     | male   |   18 |    200 |  200 | 技术         |
    |  1 | egon     | male   |   18 |    200 |  201 | 人力资源     |
    |  1 | egon     | male   |   18 |    200 |  202 | 销售         |
    |  1 | egon     | male   |   18 |    200 |  203 | 运营         |
    |  2 | alex     | female |   48 |    201 |  200 | 技术         |
    |  2 | alex     | female |   48 |    201 |  201 | 人力资源     |
    |  2 | alex     | female |   48 |    201 |  202 | 销售         |
    |  2 | alex     | female |   48 |    201 |  203 | 运营         |
    |  3 | wupeiqi  | male   |   38 |    201 |  200 | 技术         |
    |  3 | wupeiqi  | male   |   38 |    201 |  201 | 人力资源     |
    |  3 | wupeiqi  | male   |   38 |    201 |  202 | 销售         |
    |  3 | wupeiqi  | male   |   38 |    201 |  203 | 运营         |
    |  4 | yuanhao  | female |   28 |    202 |  200 | 技术         |
    |  4 | yuanhao  | female |   28 |    202 |  201 | 人力资源     |
    |  4 | yuanhao  | female |   28 |    202 |  202 | 销售         |
    |  4 | yuanhao  | female |   28 |    202 |  203 | 运营         |
    |  5 | nvshen   | male   |   18 |    200 |  200 | 技术         |
    |  5 | nvshen   | male   |   18 |    200 |  201 | 人力资源     |
    |  5 | nvshen   | male   |   18 |    200 |  202 | 销售         |
    |  5 | nvshen   | male   |   18 |    200 |  203 | 运营         |
    |  6 | xiaomage | female |   18 |    204 |  200 | 技术         |
    |  6 | xiaomage | female |   18 |    204 |  201 | 人力资源     |
    |  6 | xiaomage | female |   18 |    204 |  202 | 销售         |
    |  6 | xiaomage | female |   18 |    204 |  203 | 运营         |
    View Code

        (2) 内连接:只连接匹配的行

    mysql> select * from employee as A inner join department as B on A.dep_id = B.id;
    +----+---------+--------+------+--------+------+--------------+
    | id | name    | sex    | age  | dep_id | id   | name         |
    +----+---------+--------+------+--------+------+--------------+
    |  1 | egon    | male   |   18 |    200 |  200 | 技术         |
    |  2 | alex    | female |   48 |    201 |  201 | 人力资源     |
    |  3 | wupeiqi | male   |   38 |    201 |  201 | 人力资源     |
    |  4 | yuanhao | female |   28 |    202 |  202 | 销售         |
    |  5 | nvshen  | male   |   18 |    200 |  200 | 技术         |
    +----+---------+--------+------+--------+------+--------------+
    5 rows in set (0.09 sec)
    View Code

           (3) 左连接:优先显示左表全部记录

    mysql> select * from employee as A left join department as B on A.dep_id = B.id;
    +----+----------+--------+------+--------+------+--------------+
    | id | name     | sex    | age  | dep_id | id   | name         |
    +----+----------+--------+------+--------+------+--------------+
    |  1 | egon     | male   |   18 |    200 |  200 | 技术         |
    |  5 | nvshen   | male   |   18 |    200 |  200 | 技术         |
    |  2 | alex     | female |   48 |    201 |  201 | 人力资源     |
    |  3 | wupeiqi  | male   |   38 |    201 |  201 | 人力资源     |
    |  4 | yuanhao  | female |   28 |    202 |  202 | 销售         |
    |  6 | xiaomage | female |   18 |    204 | NULL | NULL         |
    +----+----------+--------+------+--------+------+--------------+
    6 rows in set (0.57 sec)
    View Code

           (4)右连接:优先显示右表全部记录

    mysql> select * from employee as A right join department as B on A.dep_id = B.id;
    +------+---------+--------+------+--------+------+--------------+
    | id   | name    | sex    | age  | dep_id | id   | name         |
    +------+---------+--------+------+--------+------+--------------+
    |    1 | egon    | male   |   18 |    200 |  200 | 技术         |
    |    2 | alex    | female |   48 |    201 |  201 | 人力资源     |
    |    3 | wupeiqi | male   |   38 |    201 |  201 | 人力资源     |
    |    4 | yuanhao | female |   28 |    202 |  202 | 销售         |
    |    5 | nvshen  | male   |   18 |    200 |  200 | 技术         |
    | NULL | NULL    | NULL   | NULL |   NULL |  203 | 运营         |
    +------+---------+--------+------+--------+------+--------------+
    6 rows in set (0.00 sec)
    View Code

       (5)全外连接:显示左右两个表全部记录  

    mysql> select * from employee as A left join department as B on A.dep_id = B.id
        -> union select * from employee as A right join department as B on A.dep_id = B.id;
    +------+----------+--------+------+--------+------+--------------+
    | id   | name     | sex    | age  | dep_id | id   | name         |
    +------+----------+--------+------+--------+------+--------------+
    |    1 | egon     | male   |   18 |    200 |  200 | 技术         |
    |    5 | nvshen   | male   |   18 |    200 |  200 | 技术         |
    |    2 | alex     | female |   48 |    201 |  201 | 人力资源     |
    |    3 | wupeiqi  | male   |   38 |    201 |  201 | 人力资源     |
    |    4 | yuanhao  | female |   28 |    202 |  202 | 销售         |
    |    6 | xiaomage | female |   18 |    204 | NULL | NULL         |
    | NULL | NULL     | NULL   | NULL |   NULL |  203 | 运营         |
    +------+----------+--------+------+--------+------+--------------+
    7 rows in set (0.01 sec)
    View Code

    二:符合条件连接查询

      - 以内连接的方式查询employee和department表,并且employee表中的age字段值必须大于25,即找出年龄大于25岁的员工以及员工所在的部门

    mysql> select employee.name,department.name from employee inner join department
        -> on employee.dep_id = department.id where age>25;
    +---------+--------------+
    | name    | name         |
    +---------+--------------+
    | alex    | 人力资源     |
    | wupeiqi | 人力资源     |
    | yuanhao | 销售         |
    +---------+--------------+
    3 rows in set (0.04 sec)
    View Code

    三:子查询

    1.子查询是将一个查询语句嵌套在另一个查询语句中

    2 内层查询语句的查询结果,可以为外层查询语句提供查询条件

    3.子查询中可以包含:in, not in,all,exists 和not exists 等关键字

    4.还可以包含比较运算符:= ,!=,> , < 等

    (1)in 关键字

    #查询平均年龄在25岁以上的部门名
    select id,name from department
        where id in 
            (select dep_id from employee group by dep_id having avg(age) > 25);

    (2)比较运算符

    #查询大于所有人平均年龄的员工名与年龄
    mysql> select name,age from employee where age > (select avg(age) from employee);
    #查询大于部门内平均年龄的员工名、年龄
    思路:
          (1)先对员工表(employee)中的人员分组(group by),查询出dep_id以及平均年龄。
           (2)将查出的结果作为临时表,再对根据临时表的dep_id和employee的dep_id作为筛选条件将employee表和临时表进行内连接。
           (3)最后再将employee员工的年龄是大于平均年龄的员工名字和年龄筛选。
    
    
    
    mysql> select t1.name,t1.age from employee as t1
                 inner join
                (select dep_id,avg(age) as avg_age from employee group by dep_id) as t2
                on t1.dep_id = t2.dep_id
                where t1.age > t2.avg_age;
    View Code
  • 相关阅读:
    jQuery的父,子,兄弟节点查找方法
    我们的产品最终入驻淘宝服务市场
    iframe显示滚动栏
    自己定义控件三部曲之动画篇(十三)——实现ListView Item进入动画
    [叁]Pomelo游戏server编程分享 之 server结构与配置分析
    数列求和
    字节与字符_字节流与字符流_ASCII与Unicode_GB2312_GBK_GB18030_BIG-5
    Codeforces Round #257(Div. 2) B. Jzzhu and Sequences(矩阵高速幂)
    呼叫保持流程
    PDF转EPUB格式电子书经验总结
  • 原文地址:https://www.cnblogs.com/lzmdbk/p/9804370.html
Copyright © 2020-2023  润新知