Mysql多表连接查询

连接查询概述
  • 又称为多表查询,当查询的字段来自于多个表时,就会用到连接查询。
  • 笛卡尔乘积现象:表1有m行数据,表2有n行数据,结果有m*n行。
    • 原因:没有有效连接条件
    • 方法:添加有效的连接条件
分类
  • 年代分类
    • sql192标准:仅支持内连接
    • sql199标准:所有内连接,外连接(不支持全外连接),交叉连接
  • 功能
    • 内连接
      • 等值连接
      • 非等值连接
      • 自连接
    • 外连接
      • 左外连接
      • 右外连接
      • 全外连接
    • 交叉连接

sql192标准

等值连接
  • 特点:

    • 多表等值连接的结果为多表的交集部分
    • n表连接,至少需要n-1个连接条件
    • 多表的顺序没有要求
    • 一般需要为表起别名
    • 可以搭配前面介绍的所有子句使用,如排序、分组、筛选
  • 示例:

    • SELECT last_name, department_name
      FROM employees,departments
      WHERE employees.department_id = departments.department_id;
      
  • 为表起别名

    • 提高语句的简洁度

    • 区分多个重名的字段

    • 注:如果为表起了别名,查询时的字段就不能使用原来的表名去限定

    • SELECT e.last_name, e.job_id, j.job_title
      FROM employees e, jobs j
      WHERE e.job_id=j.job_id;
      
  • 在连接查询中使用筛选条件

    • SELECT last_name, department_name, commission_pct
      FROM employees e, departments d
      WHERE e.department_id = d.department_id
      AND commission_pct IS NOT NULL;
      
  • 在连接查询中使用筛选条件

    • SELECT count(*) 个数, city
      FROM departments d, locations l
      WHERE d.location_id=l.location_id
      GROUP BY city;
      
  • 在连接查询中使用排序

    • SELECT job_title, count(*) 员工个数
      FROM employees e, jobs j
      WHERE e.job_id = j.job_id
      GROUP BY job_title
      ORDER BY 员工个数 ASC;
      
  • 三表连接

    • SELECT last_name, department_name,city
      FROM employees e, departments d, locations l
      WHERE e.department_id=d.department_id
      AND d.location_id=l.location_id;
      
非等值连接
  • 示例:

    • SELECT salary, grade_level
      FROM employees e, job_grades jg
      WHERE salary BETWEEN jg.lowest_sal AND jg.highest_sal;
      
自连接
  • 示例

    • SELECT e.employee_id, e.last_name, m.employee_id, m.last_name
      FROM employees e, employees m
      WHERE e.manager_id=m.employee_id;
      

sql99语法

  • 语法

    • SELECT 查询列表
      FROM 表1 别名 连接类型
      JOIN 表2 别名
      ON 连接条件
      ......
      
  • 分类

    • 内连接:innner
      • 可添加排序、分组、筛选
      • innner可以省略
      • 筛选条件放在where后,连接条件放在on后,便于阅读。
      • innner join连接和sql192语法中的等值连接效果是一样的,都是查询多表的交集
    • 外连接:
      • 左外:left
      • 右外:right
      • 全外:full
      • 特点
        • 外连接的查询结果为主表中的所有记录,如果从表中有和他匹配的,则显示匹配的值,如果没有匹配的则显示null,外连接查询结果=内连接结果+主表中有二从表没有的记录。
        • 左外连接,left join左边的是主表
        • 右外连接,right join右边的是主表
        • 左外和右外交换两个表的顺序,可以实现同样的效果
        • 全外连接=内连接的结果+表1中有但表2没有的+表1中没有但表2中有的
    • 交叉连接:cross join
      • 笛卡尔乘积
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌尘吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值