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

相关推荐
❀͜͡傀儡师7 分钟前
MySQL REST Service 认证鉴权体系与 MySQL 26.10.0 内置化演进
数据库·mysql·adb
数据库小学妹36 分钟前
MySQL binlog格式怎么选?ROW、STATEMENT、MIXED的区别与坑
数据库·mysql·binlog·主从复制·数据一致性
花间相见1 小时前
【计算基础|MySQL18】Buffer Pool 与内存管理
后端·sql·mysql
杨云龙UP2 小时前
生产实战:Keepalived + Nginx + MySQL 双向复制高可用架构部署与原理详解
运维·数据库·mysql·nginx·架构·keepalived·高可用架构
为思念酝酿的痛2 小时前
MySQL的基本查询
数据库·mysql
m0_639906944 小时前
MySQL 实现分布式锁:悲观锁、乐观锁、唯一索引锁
数据库·分布式·mysql
Random Glow5 小时前
聚簇索引:为什么主键顺序决定插入性能
数据库·mysql·性能优化·innodb·索引
软件技术NINI5 小时前
基于PHP和MySQL的快递代收点管理系统的设计与实现
开发语言·javascript·数据库·mysql·毕业设计·php·毕设
SelectDB技术团队5 小时前
ClickHouse SQL 好学吗?从 MySQL 迁移 Doris 的完整兼容验证
人工智能·sql·mysql·clickhouse·开源·apache doris·增量计算
吹什么轩5 小时前
MySQL 增删改查(CRUD)完全指南:从 INSERT 到 GROUP BY
数据库·mysql