mysql多表查询 内外连接
时间: 2024-05-03 18:15:16 浏览: 158
MySQL多表查询是指在一个查询语句中同时操作多个表,通过连接操作将这些表关联起来,以获取所需的数据。常见的连接方式包括内连接和外连接。
1. 内连接(INNER JOIN):内连接是通过匹配两个或多个表中的共有值来获取数据。只有在连接条件满足的情况下,才会返回匹配的行。内连接可以使用关键字INNER JOIN或简写为JOIN来表示。
示例:
```
SELECT *
FROM 表1
INNER JOIN 表2
ON 表1.列 = 表2.列;
```
2. 外连接(OUTER JOIN):外连接用于获取两个表中所有的数据,即使其中一个表没有匹配的行。外连接分为左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)和全外连接(FULL JOIN)。
- 左外连接(LEFT JOIN):返回左表中的所有行,以及右表中满足连接条件的行。如果右表中没有匹配的行,则返回NULL值。
示例:
```
SELECT *
FROM 表1
LEFT JOIN 表2
ON 表1.列 = 表2.列;
```
- 右外连接(RIGHT JOIN):返回右表中的所有行,以及左表中满足连接条件的行。如果左表中没有匹配的行,则返回NULL值。
示例:
```
SELECT *
FROM 表1
RIGHT JOIN 表2
ON 表1.列 = 表2.列;
```
- 全外连接(FULL JOIN):返回左表和右表中的所有行,如果某个表中没有匹配的行,则返回NULL值。
示例:
```
SELECT *
FROM 表1
FULL JOIN 表2
ON 表1.列 = 表2.列;
```
相关问题
mysql 的内外连接查询
MySQL的内外连接查询是用于将两个或多个表中的数据进行关联查询的一种方法。其中,内连接只显示匹配的数据,而外连接则显示匹配的数据以及不匹配的数据。具体来说,内连接使用的是JOIN或INNER JOIN关键字,而外连接则使用LEFT JOIN、RIGHT JOIN或FULL OUTER JOIN关键字。其中,LEFT JOIN显示匹配的数据和左边表的不匹配的数据,RIGHT JOIN则显示匹配的数据和右边表的不匹配的数据,FULL OUTER JOIN则显示匹配的数据以及左、右边表的不匹配的数据。需要注意的是,MySQL不支持全外连接,因此只能采取关键字UNION来联合左、右连接的方法。
MySQL 内外连接
### MySQL 中 Inner Join 和 Outer Join 的概念及用法
#### 内连接 (Inner Join)
内连接返回两个表中满足连接条件的记录。只有当左表和右表中的某个匹配时,才会显示结果。
```sql
SELECT columns
FROM table1
INNER JOIN table2 ON table1.common_column = table2.common_column;
```
此语句会从 `table1` 和 `table2` 中选取那些在两表中共有相同 `common_column` 值的行[^1]。
#### 外连接 (Outer Join)
外连接可以分为三种类型:左外连接(Left Outer Join),右外连接(Right Outer Join)以及全外连接(Full Outer Join)。需要注意的是,在某些数据库系统中,如MySQL,所有的右外连接会被重写成左外连接来执行。
##### 左外连接 (Left Outer Join)
左外连接返回左表中的所有记录,即使右表中没有匹配项。如果不存在匹配,则结果集中的右侧列将包含NULL值。
```sql
SELECT columns
FROM table1
LEFT OUTER JOIN table2 ON table1.common_column = table2.common_column;
```
这段SQL代码将会展示来自 `table1` 所有的行,并且对于每一个能在 `table2` 中找到对应关系的数据也会一并呈现出来;而对于无法配对的情况则会在右边填充 NULL。
##### 右外连接 (Right Outer Join)
理论上讲,右外连接应该返回右表中的全部数据加上左边能够关联上的部分。然而实际上由于MySQL内部机制的原因,这类操作最终都会被转换为等价形式的左外连接处理方式。
##### 全外连接 (Full Outer Join)
全外连接并不是直接支持于MySQL语法之内的特性之一,但是可以通过组合使用UNION运算符与左/右外连接实现相似效果——即获取两张表格间尽可能多的信息集合体,无论它们之间是否存在交集都予以保留下来。
---
为了更好地理解这些概念,下面给出具体的例子:
假设有一个学生表 (`students`) 和一个分数表 (`scores`) ,其中包含了学生的ID(`sid`)和其他相关信息。现在想要找出所有参加了考试的学生及其对应的得分情况。
通过 **inner join** 来查找既存在于 `students` 表又存在于 `scores` 表里的条目:
```sql
SELECT students.name, scores.grade
FROM students
INNER JOIN scores ON students.id = scores.student_id;
```
而如果我们希望即使是未参加任何测试的学生也能出现在列表里(他们的成绩字段为空),那么就可以采用 **left outer join** :
```sql
SELECT students.name, IFNULL(scores.grade,'No Score') AS grade
FROM students
LEFT OUTER JOIN scores ON students.id = scores.student_id;
```
这里使用了IFNULL函数用来替代可能出现的null值以提高可读性[^3]。
阅读全文