联合查询

三  多表查询
     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  不能省
原文地址:https://www.cnblogs.com/tcpblog/p/10003432.html