• 多表查询


    多表连接查询

    语法

    1SELECT 字段列表
    2 FROM1 INNER|LEFT|RIGHT JOIN2
    3 ON1.字段 = 表2.字段;

    示例表
    mysql> select * from department;

    id name
    200 技术
    201 人力资源
    202 销售
    203 运营

    mysql> select * from employee;

    id name sex age dep_id
    1 egon male 18 200
    2 alex female 48 201
    3 wupeiqi male 38 201
    4 yuanhao female 28 202
    5 liwenzhou male 18 200
    6 jingliyang female 18 204

    笛卡尔积

    交叉连接:不适用任何匹配条件。生成笛卡尔积
    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 liwenzhou male 18 200 200 技术
    5 liwenzhou male 18 200 201 人力资源
    5 liwenzhou male 18 200 202 销售
    5 liwenzhou male 18 200 203 运营
    6 jingliyang female 18 204 200 技术
    6 jingliyang female 18 204 201 人力资源
    6 jingliyang female 18 204 202 销售
    6 jingliyang female 18 204 203 运营

    内连接:只连接匹配的行

    找两张表共有的部分
    相当于利用条件从笛卡尔积结果中筛选出了正确的结果 department没有204这个部门,因而employee表中关于204这条员工信息没有匹配出来

    语法示例

    1mysql> select
    2employee.id,employee.name,employee.age,employee.sex,
    3department.name from employee inner join department
    4on 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 liwenzhou 18 male 技术
    1#上述sql等同于
    2mysql> select employee.id,employee.name,employee.age,employee.sex,department.name from employee,department where employee.dep_id=department.id;

    外链接之左连接:优先显示左表全部记录

    以左表为准,即找出所有员工信息,当然包括没有部门的员工
    本质就是:在内连接的基础上增加左边有右边没有的结果

    语法示例

    1mysql> select 
    2employee.id,employee.name,department.name as depart_name from
    3employee left join department
    4on employee.dep_id=department.id;

    左连接之后的虚拟表

    id name depart_name
    1 egon 技术
    5 liwenzhou 技术
    2 alex 人力资源
    3 wupeiqi 人力资源
    4 yuanhao 销售
    6 jingliyang NULL

    外连接之右连接优:先显示右表全部记录

    以右表为准,即找出所有部门信息,包括没有员工的部门
    本质就是:在内连接的基础上增加右边有左边没有的结果

    语法示例

    1mysql> select 
    2employee.id,employee.name,department.name as depart_name
    3from employee right join department
    4on employee.dep_id=department.id;

    右连接之后的虚拟表

    id name depart_name
    1 egon 技术
    2 alex 人力资源
    3 wupeiqi 人力资源
    4 yuanhao 销售
    5 liwenzhou 技术
    NULL NULL 运营

    全连接:显示左右两个表全部记录

    全连接:在内连接的基础上增加左边有右边没有的和右边有左边没有的结果

    语法示例

    1#注意:mysql不支持全外连接 full JOIN
    2#强调:mysql可以使用此种方式间接实现全外连接
    3select * from employee left join department
    4on employee.dep_id = department.id
    5union
    6select * from employee right join department
    7on employee.dep_id = department.id
    8;
    9#注意 union与union all的区别:union会去掉相同的纪录

    全连接后的虚拟表

    id name sex age dep_id id name
    1 egon male 18 200 200 技术
    5 liwenzhou male 18 200 200 技术
    2 alex female 48 201 201 人力资源
    3 wupeiqi male 38 201 201 人力资源
    4 yuanhao female 28 202 202 销售
    6 jingliyang female 18 204 NULL NULL
    NULL NULL NULL NULL NULL 203 运营

    多表连接可以不断地与虚拟表连接

    1select t1.* from emp as t1
    2inner join
    3(select post,max(salary) as ms from emp group by post) as t2
    4on t1.post = t2.post
    5where t1.salary = t2.ms
    6;
  • 相关阅读:
    cpu降频问题
    配置 logrotate 指导
    Ubuntu 和 Ros 对应版本关系
    Git 文件管理
    Win10(UEFI启动) 安装Ubuntu16.04双系统
    Clion ROS开发环境设置
    clion 创建快捷方式和配置ros开发环境
    Ubuntu 16.04安装 CastXML
    eigen3 版本信息查看
    ubunutu eigen3包的查找
  • 原文地址:https://www.cnblogs.com/guodengjian/p/9020818.html
Copyright © 2020-2023  润新知