zoukankan      html  css  js  c++  java
  • 联合查询

    三  多表查询
         a 语法: select field from table1  inner/left/right/ join table2
                              on table1.fieldx = table1.fieldy;
             不使用 inner /left/ right 连接:
                (两张表的数据其中一张表的每条记录对应对方的每一条)  >>>生成笛卡尔积
    
                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 | 运营         |
    
         b  inner内连接: 匹配出字段能匹配的结果, 没有对应的结果不显示
                         #找两张表共有的部分,相当于利用条件从笛卡尔积结果中筛选出了匹配的结果
                        #department没有204这个部门,因而employee表中关于204这条员工信息没有匹配出来
                        mysql> select employee.id,employee.name,employee.age,employee.sex,department.name from employee inner join department on employee.dep_id=department.id;
                        +----+---------+------+--------+--------------+
                        | id | name    | age  | sex    | name         |
                        +----+---------+------+--------+--------------+
                        |  1 | egon    |   18 | male   | 技术         |
                        |  2 | alex    |   48 | female | 人力资源     |
                        |  3 | wupeiqi |   38 | male   | 人力资源     |
                        |  4 | yuanhao |   28 | female | 销售         |
                        |  5 | nvshen  |   18 | male   | 技术         |
                        +----+---------+------+--------+--------------+
                        rows in set (0.00 sec)
    
                        #上述sql等同于
                        mysql> select employee.id,employee.name,employee.age,employee.sex,department.name from employee,department where employee.dep_id=department.id;
    
    
    
    
    
    
            left 左连接:  匹配左表的每一条数据, 另一张表无对应则 zerofill
                            #以左表为准,即找出所有员工信息,当然包括没有部门的员工
                            #本质就是:在内连接的基础上增加左边有,右边没有的结果
                            mysql> select employee.id,employee.name,department.name as depart_name from employee left join department on employee.dep_id=department.id;
                            +----+----------+--------------+
                            | id | name     | depart_name  |
                            +----+----------+--------------+
                            |  1 | egon     | 技术         |
                            |  5 | nvshen   | 技术         |
                            |  2 | alex     | 人力资源     |
                            |  3 | wupeiqi  | 人力资源     |
                            |  4 | yuanhao  | 销售         |
                            |  6 | xiaomage | NULL         |
                            +----+----------+--------------+
                            rows in set (0.00 sec)
    
    
    
    
    
    
            right 右连接:  匹配右表的每一条数据, 另一张表无对应则 zerofill
                            #以右表为准,即找出所有部门信息,包括没有员工的部门
                            #本质就是:在内连接的基础上增加右边有,左边没有的结果
                            mysql> select employee.id,employee.name,department.name as depart_name from employee right join department on employee.dep_id=department.id;
                            +------+---------+--------------+
                            | id   | name    | depart_name  |
                            +------+---------+--------------+
                            |    1 | egon    | 技术         |
                            |    2 | alex    | 人力资源     |
                            |    3 | wupeiqi | 人力资源     |
                            |    4 | yuanhao | 销售         |
                            |    5 | nvshen  | 技术         |
                            | NULL | NULL    | 运营         |
                            +------+---------+--------------+
                            rows in set (0.00 sec)
    
    
    
    
    
    
            全外连接: 高版本支持 full join,
            #外连接:在内连接的基础上增加左边有右边没有的和右边有左边没有的结果
                    #注意:mysql不支持全外连接 full JOIN
                    #强调:mysql可以使用此种方式间接实现全外连接
                    语法:select * from employee left join department on employee.dep_id = department.id
                           union all
                          select * from employee right join department on employee.dep_id = department.id;
    
                     mysql> 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
                               ;
                    +------+----------+--------+------+--------+------+--------------+
                    | 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 | 运营         |
                    +------+----------+--------+------+--------+------+--------------+
                    rows in set (0.01 sec)
    
                    #注意 union与union all的区别:union会去掉相同的纪录
    
         C  子查询:  1. 将一个查询语句嵌套在另一个查询语句中, ()括起来
                     2, 内层查询语句的查询结果 , 可以为外层查询语句提供查询条件
                     3, 子查询中可以包含 in, not in,  any, all, exists, no exists 等关键字
                     4, 可以包含比较运算符: = > < != ...
    
    
    
     tip  : 查询条件不为空,  is not null 不能用 !=null
             select @@global.sql_mode; 查询全局模式
              select @@sql_mode;  查询当前库
               select post, group_concat(name) from employee group by post; //concat拼接所以字段,否则无法查询所以的信息
                mysql> select post, avg(salary) from employee group by post having avg(salary)>10000 and avg(salary)<20000;  //必须写and  不能省
    
  • 相关阅读:
    UVALive 6909 Kevin's Problem 数学排列组合
    UVALive 6908 Electric Bike dp
    UVALive 6907 Body Building tarjan
    UVALive 6906 Cluster Analysis 并查集
    八月微博
    hdu 5784 How Many Triangles 计算几何,平面有多少个锐角三角形
    hdu 5792 World is Exploding 树状数组
    hdu 5791 Two dp
    hdu 5787 K-wolf Number 数位dp
    hdu 5783 Divide the Sequence 贪心
  • 原文地址:https://www.cnblogs.com/tcpblog/p/10003432.html
Copyright © 2011-2022 走看看