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

相关推荐
唐青枫2 天前
MySQL JSON 实战详解:从存储、查询、更新到 JSON_TABLE 与索引
sql·mysql
小满8782 天前
5.Mysql事务隔离级别与锁机制
mysql
元Y亨H3 天前
技术笔记:MySQL 字符集排序规则与大小写敏感性问题解决方案
mysql
这个DBA有点耶4 天前
GROUP BY优化全解:如何写出既不丢数据又飞快的分组查询
数据库·mysql·架构
掉头发的王富贵4 天前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql
SamDeepThinking4 天前
一条UPDATE语句在MySQL 8.0中到底加了几把锁?
后端·mysql·程序员
李白客6 天前
KES新版MySQL兼容能力再升级意味着什么?
mysql·国产数据库
Jim6008 天前
【吃透 MySQL InnoDB连载】第 1 章・解密线上数据库高频故障
mysql
GreatSQL8 天前
gt-checksum v4.0.0 新功能解读系列文章(4):SSL 加密连接——数据校验传输安全再升级
mysql