【MySQL】多表查询

1.多表查询分类讲解

1.1等值连接vs非等值连接

等值连接:

SELECT student.name, class.name AS className

FROM student, class

WHERE student.class_id = class.class_id;

非等值连接:

SELECT a.name, a.salary, b.grade

FROM teacher a, grades b

WHERE a.salary BETWEEN b.lowest_sal AND b. highest_sal;

1.2自连接 vs 非自连接

  • 当table1和table2本质上是同一张表,只是用取别名的方式虚拟成两张表以代表不同的意义。然后两个表再进行内连接,外连接等查询。
  • 通过concat函数返回固定格式

SELECT CONCAT(worker.name ,' works for '

, manager.name)

FROM teacher worker, teacher manager

WHERE worker.manager_id = manager.id ;

1.3:内连接 vs 外连接

  • 内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行
  • 外连接: 两个表在连接过程中除了返回满足连接条件的行以外**还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。**没有匹配的行时, 结果表中相应的列为空(NULL)。
  • 如果是左外连接,则连接条件中左边的表也称为主表,右边的表称为从表。
  • 如果是右外连接,则连接条件中右边的表也称为主表,左边的表称为从表。

#左外连接

SELECT last_name,department_name

FROM employees ,departments

WHERE employees.department_id = departments.department_id(+);

#右外连接

SELECT last_name,department_name

FROM employees ,departments

WHERE employees.department_id(+) = departments.department_id;

  1. SQL99语法实现多表查询

3.1 基本语法

  • 使用JOIN...ON子句创建连接的语法结构:

SELECT table1.column, table2.column,table3.column

FROM table1

JOIN table2 ON table1 和 table2 的连接条件

JOIN table3 ON table2 和 table3 的连接条件

3.2内连接(INNER JOIN)的实现

SELECT 字段列表

FROM A表 INNER JOIN B表

ON 关联条件

WHERE 等其他子句;

3.3 外连接

3.3.1左外连接(LEFT OUTER JOIN)

SELECT 字段列表

FROM A表 LEFT JOIN B表

ON 关联条件

WHERE 等其他子句;

3.3.2右外连接(RIGHT OUTER JOIN)

SELECT 字段列表

FROM A表 RIGHT JOIN B表

ON 关联条件

WHERE 等其他子句;

3.3.3 满外连接(FULL OUTER JOIN)

  • 满外连接的结果 = 左右表匹配的数据 + 左表没有匹配到的数据 + 右表没有匹配到的数据。
  • SQL99是支持满外连接的。使用FULL JOIN 或 FULL OUTER JOIN来实现。
  • 需要注意的是,MySQL不支持FULL JOIN,但是可以用 LEFT JOIN UNION RIGHT join代替。

4.UNION的使用

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

语法格式:

SELECT column,... FROM table1

UNION [ALL]

SELECT column,... FROM table2

5.自然连接

SELECT a.name, b.name AS className

FROM student a join class b

on a.class_id = b.class_id;

相关推荐
程序新视界5 分钟前
MySQL中什么是回表查询,如何避免和优化?
mysql
得物技术7 小时前
破解gh-ost变更导致MySQL表膨胀之谜|得物技术
数据库·后端·mysql
Java水解8 小时前
【MySQL】从零开始学习MySQL:基础与安装指南
后端·mysql
沢田纲吉12 小时前
🗄️ MySQL 表操作全面指南
数据库·后端·mysql
Java水解1 天前
Mysql查看执行计划、explain关键字详解(超详细)
后端·mysql
知其然亦知其所以然1 天前
MySQL 社招必考题:如何优化查询过程中的数据访问?
后端·mysql·面试
DemonAvenger2 天前
NoSQL与MySQL混合架构设计:从入门到实战的最佳实践
数据库·mysql·性能优化
程序新视界2 天前
如何在MySQL中创建聚集索引?
mysql
AAA修煤气灶刘哥2 天前
后端人速藏!数据库PD建模避坑指南
数据库·后端·mysql
程序新视界2 天前
学习MySQL绕不开的两个基础概念:聚集索引与非聚集索引
mysql