• 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
  • 相关阅读:
    Other.ini配置文件解读以及大众评委打分的最后得分两种模式选择及解析选项解释
    大作业练习:用Asp.net Mvc4做一个:学生考试成绩管理系统-简易版
    网络营销实施步骤及疑难问题汇编
    Web前端知识汇编收集B
    Web前端知识汇编收集A
    FlexItem 多行测试
    Last Work-随机出题加法游戏
    Android DisplayMetrics类获取屏幕大小
    Java简介
    Failed to resolve:junit:junit:4.12
  • 原文地址:https://www.cnblogs.com/lzmdbk/p/9804370.html
Copyright © 2020-2023  润新知