当前位置: 首页 > article >正文

MySQL(4)多表查询

引言:为什么需要多表的查询?

A:提高效率,多线进行。

高内聚、低耦合。

一、多表查询的条件

1、错误的多表查询:

SELECT employee_id,department_name

FROM employees,departments;

SELECT employee_id,department_name

FROM employees CROSS JION departments;

每个员工与每个部门都进行一次匹配,出现笛卡尔积的错误。

错误原因:缺少了多表的连接条件。

解决方案:用WHERE关键字加入连接条件

2、若查询语句中出现多个表中都存在的字段,必须指明此字段所在的表。

3、可以给表起别名,在SELECT和WHERE中使用。

SELECT department_name,employee_id,departments.deps_id

FROM departments deps,employees emps

WHERE emps.department_id = deps.department_id;

但是,如果为表起了别名,则不能再使用原名。否则报错。

4、如果有n个表实现多表的查询,则至少有n-1个连接条件

二、多表查询的分类

(1)等值连接与非等值连接

等值连接即为:连接条件为相等运算的语句。

非等值连接:连接条件中不使用等号。

可以使用BETWEEN…AND、>=、<=等。

例如:

SELECT e.salary,e.last_name

FROM employees e,job_grades j

WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal;

(2)自连接与非自连接

自连接:

使用同一张表,通过取别名的方式进行SELECT的区分,使用WHERE写明查找的条件。

SELECT emp.employee_id,emp.last_name,mag.employee_id,mag.last_name

FROM employees emp,employees mag

WHERE emp.manager_id = mag.employee_id;

(3)内连接与外连接

内连接:合并具有同一列的两个以上的表的行,结果集中不包含员工表与另一个表不匹配的行

理解为;合并两个以上的表中满足WHERE条件的行

外连接:合并具有同一列的两个以上的表的行,结果集中除了包含一个表语另一个表匹配的行之外,还查询了左表或右表中不匹配的行。

可以理解为:除了内连接的表内容,还查询了两张表中内连接内容以外的内容。

外连接的分类;左外连接、右外连接、满外连接。

注意,查询所有的、不同的表中的数据,使用外连接。

 

MySQL不支持SQL92的外连接写法。

SQL99中使用JOIN … ON 实现外连接的写法。如果加入多张表,则依次使用JOIN ON进行连接。

SQL99中使用JION..ON的方式实现多表的查询

SQL99实现内连接:

SELECT employee_id,department_name,city

FROM employees e JOIN departments d

ON e.department_id = d.department_id

JOIN locations l

ON d.location_id = l.location_id;

 

SQL99实现外连接:

左外连接:

SELECT last_name,department_name

FROM employees e LEFT OUTER JOIN departments d

ON e.employee_id = d.department_id;

右外连接:

SELECT last_name,department_name

FROM employees e RIGHT JOIN departments d

ON e.department_id = d.department_id;

满外连接:

SELECT last_name,department_name

FROM employees e FULL JOIN departments d

ON e.department_id = d.department_id;

关于满外连接,MySQL不支持,Oracle支持。

OUTER可以省略。

UION关键字的使用:合并查询结果

SELECT……FROM……

UNION

SELECT……FROM……

UNION ALL操作符:在满外连接的情况下,加上两表的交集,对两表重复的部分不去重

三、SQL99的七种JOIN操作

1、左外连接

2、满足左外连接的条件并且右表为空

举例理解:

SELECT  employee_id,department_name

FROM employees e LEFT JOIN departments d

ON e.department_id = d.department_id

WHERE d.department_id IS NULL;

3、内连接

4、右外连接

5、满足右外连接的条件并且左表为空

SELECT employee_id,department_name

FROM employees e RIGHT JOIN departments d

ON e.department_id = d.department_id

WHERE e.employee_id IS NULL;

6、不去重的UNION ALL

取一个左外连接和去掉交集的右表。

或者取一个右外连接和去掉交集的左表。

SELECT  employee_id,department_name

FROM employees e LEFT JOIN departments d

ON e.department_id = d.department_id

WHERE d.department_id IS NULL;

UNION ALL

SELECT employee_id,department_name

FROM employees e RIGHT JOIN departments d

ON e.department_id = d.department_id;

7、去重的UNION

可视作2、5相连接

SELECT  employee_id,department_name

FROM employees e LEFT JOIN departments d

ON e.department_id = d.department_id

WHERE d.department_id IS NULL;

UNION ALL

SELECT employee_id,department_name

FROM employees e RIGHT JOIN departments d

ON e.department_id = d.department_id

WHERE e.employee_id IS NULL;

NATURAL JOIN与USING

SQL99语法的新特性1:自然连接

NATURAL JOIN:自动查询两张连接表中所有相同的字段,然后进行等值连接

但不够灵活。

新特性2:USING

USING可以替换等值条件。

当两张表中左等值的字段同名时可以采用。

SELECT employee_id,department_name

FROM employees e RIGHT JOIN departments d

USIING (department_id);


http://www.kler.cn/a/514330.html

相关文章:

  • 202009 青少年软件编程等级考试C/C++ 二级真题答案及解析(电子学会)
  • AI Agent:数字文明的暗物质,如何悄然改变我们的世界?
  • 解决后端接口返回Long类型参数导致的精度丢失问题
  • 深入解析人工智能中的协同过滤算法及其在推荐系统中的应用与优化
  • Linux内核编程(二十一)USB驱动开发-键盘驱动
  • 2024年度总结-CSDN
  • 使用 F12 查看 Network 及数据格式
  • 为什么你的 Qt 应用程序会出现 xcb 插件错误
  • 54.DataGrid数据框图 C#例子 WPF例子
  • HTML中相对路径和绝对路径详解
  • react中hooks之useId用法总结以及与useRef用法区别
  • LeetCode hot 力扣100 LRU 缓存
  • 升级到MySQL 8.4,MySQL启动报错:io_setup() failed with EAGAIN
  • KubeKey安装K8s和kubesphere
  • ConvBERT:通过基于跨度的动态卷积改进BERT
  • 【Linux入门】2w字详解yum、vim、gcc/g++、gdb、makefile以及进度条小程序
  • 电脑办公技巧之如何在 Word 文档中添加文字或图片水印
  • 使用Sum计算Loss和解决梯度累积(Gradient Accumulation)的Bug
  • C# LINQ(Language Integrated Query)详解
  • docker部署的gitlab迁移
  • 图像点处理
  • 使用 vllm 部署 MiniCPM-o 2.6
  • Logo语言的操作系统
  • PostIn安装教程
  • Windows电脑安装USB Redirector并实现内外网跨网USB共享通信访问
  • Python爬虫学习第一弹 —— 爬虫的基础知识 及 requests基础