• 联合查询


    三  多表查询
         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  不能省
    
  • 相关阅读:
    选择排序
    【洛谷8341】[AHOI2022] 回忆(贪心)
    swagger在高版本springboot中的使用
    springboot中关于连接池的几种方式
    MySQL 的 delete、truncate、drop 有什么区别?
    Docker容器命令
    IDEA 神级插件!效率提升 20 倍!
    Bean Searcher——多条件查询神器
    8 种最坑SQL语法,工作中踩过吗?
    消息中间件:rocketmq单机安装部署
  • 原文地址:https://www.cnblogs.com/tcpblog/p/10003432.html
Copyright © 2020-2023  润新知