MySQL 多表查询的分类及UNION的使用

一.多表查询的分类

  • 角度1:

等值连接 与 非等值连接

  • 角度2:

自连接 与 非自连接

  • 角度3:

内连接 与 外连接

1.等值连接与非等值连接

上述示例连接条件为'=',即为等值连接,而连接连接条件也为等值的.不为等值的统称为得等值连接.如!= ,<,>等

#: 非等值连接的栗子:

查询员工在job_grade中的salary等级

SELECT e.last_name,e.salary,j.grade_level
FROM employees e,job_grade j
WHERE e.`salary` BETWEEN j.`wowest_sal` AND j.`highest_sal`;

2.自连接与非自连接

我们在多表查询的实现中的实例即为非自连接,多个不同的表之间连接;如果实现自己与自己的连接,即称为自连接

#: 自连接栗子:

查询员工id,员工姓名及其管理者的id和姓名

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`;

3.内连接与外连接

  • 内连接:

    合并具有同一列的两个遇上表的行,结果集中不包含一个表与另一个表的不匹配的行.即只返回满足条件的字段

    SELECT employee_id,department_name
    FROM employees,departments
    WHERE employees.`department_id` = departments.department_id;
  • 外连接:

    两个表在连接过程中,除了返回满足条件的行外,还返回左(或右)表中不满足条件的行,这种连接称为左(或右)连接.没有匹配的行时,结果表中相应的列为空(NULL).

    • 如果是左外连接,则连接条件中左边的表称为主表,连接条件右边的表称为从表

    • 如果是右外连接,则连接条件中左边的表称为从表,连接条件右边的表称为主表

    • 满外连接:

      两个表在连接过程中,除了返回满足条件的行外,还返回左表和右表中不满足条件的行,这种连接称为满外连接

      • MySQL中不支持SQL99语法中FULL JOIN ON 的语法,Oracle支持

  • SQL99语法中使用 JOIN ...ON 的方式实现多表的查询,这种方式能解决内连接的问题,也能实现外连接

    • 使用SQL99语法实现内连接:

      SELECT last_name,department_name
      FROM employees e JOIN departments d
      ON e.`department_id` = d.`department_id`; 
      • 这里每加入一个表就需要写一个JOIN ON语句,INNER 和 OUTER 可以省略

    • 使用SQL99语法实现外连接:

      • 左外连接:

      SELECT last_name,department_name
      FROM employees e LEFT OUTER JOIN departments d
      ON e.`department_id` = d.`department_id`; 
      • 右外连接:

      SELECT last_name,department_name
      FROM employees e RIGHT OUTER JOIN departments d
      ON e.`department_id` = d.`department_id`; 

      二.UNION的使用

    • 利用UNION关键字,可给出多条SELECT语句,并将它们的结果组成单个结果集.合并时,两个表对应的列数和数据类型必须相同,并且相互对应.各个SELECT语句之间使用UNION或UNION ALL 关键字分隔

    • 语法格式:

    • 执行 UNION ALL 语句时所需的资源比UNION语句少.如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复数据时,尽量使用UNION ALL 语句,以用来提高数据查询的效率

      SELECT column...FROM table1
      UNION(ALL)
      SELECT column...FROM table2

      1.UNION操作符

      返回两个查询结果并集,去除重复记录

      2.UNION ALL 操作符

      返回两个查询结果集的并集,对于两个结果的重读部分,不去重

      注意:
           执行 UNION ALL 语句时所需的资源比UNION语句少.如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复数据时,尽量使用UNION ALL 语句,以用来提高数据查询的效率

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
多表查询是指从多张表检索数据的查询操作。在实际开发,很多情况下需要从多个表获取数据,通过关联关系连接这些表,以便查询所需的数据。关联关系可以是一对一或一对多的关系。比如,可以通过一个学生表和一个成绩表,通过学生编号关联这两个表,从而查询到某个学生的成绩。 在多表查询,常见的现象之一是笛卡尔积。当没有指定关联条件或者关联条件不正确时,会产生笛卡尔积现象,即返回的结果集包含了所有表的组合。为了避免笛卡尔积,需要正确设置关联条件。 多表查询可以根据不同的需求进行分类。包括等值连接和非等值连接、自连接和非自连接、内连接和外连接以及满外连接等。其,等值连接是通过相等的条件将两个表连接起来,而非等值连接则是使用其他逻辑条件进行连接。自连接是指连接同一个表,而非自连接则是连接不同的表。内连接只返回满足连接条件的记录,而外连接则返回满足连接条件以及不满足连接条件的记录。满外连接会返回所有的记录,不论是否满足连接条件。 在MySQL,可以使用UNION[ALL]操作符来合并多个查询结果集。UNION操作符会返回所有的记录,并去除重复的记录。而UNION ALL操作符则会返回所有的记录,包括重复的记录。 此外,MySQL还提供了7种SQL JOINS用于实现多表查询。这些JOIN操作包括内连接(INNER JOIN),左连接(LEFT JOIN),右连接(RIGHT JOIN),全连接(FULL JOIN),左外连接(LEFT OUTER JOIN),右外连接(RIGHT OUTER JOIN)和交叉连接(CROSS JOIN)。每种JOIN操作都有自己的特点和适用场景。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MySQL多表查询](https://blog.csdn.net/qq_46307070/article/details/126571024)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不会写代码的菜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值