数据库中的外连接(Outer Join)用于连接两个表,并包括两个表中的匹配行以及左表(LEFT JOIN)或右表(RIGHT JOIN)中未匹配的行。外连接分为两种主要类型:
左外连接(LEFT OUTER JOIN):返回左表(FROM子句中第一个表)的所有行,即使在右表中没有匹配的行。如果右表中没有匹配的行,则结果集中右表的部分将包含NULL值。
右外连接(RIGHT OUTER JOIN):返回右表(JOIN子句中指定的表)的所有行,即使在左表中没有匹配的行。如果左表中没有匹配的行,则结果集中左表的部分将包含NULL值。
表的初始化
mysql> create table stu (id int ,name varchar(30));
Query OK, 0 rows affected (0.02 sec)
mysql> desc stu;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(30) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> insert into stu values(1,'Jack'),(2,'Tom'),(3,'Kity'),(4,'Nono');
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select*from stu;
+------+------+
| id | name |
+------+------+
| 1 | Jack |
| 2 | Tom |
| 3 | Kity |
| 4 | Nono |
+------+------+
4 rows in set (0.00 sec)
mysql> create table exam (id int ,grade int );
Query OK, 0 rows affected (0.02 sec)
mysql> desc exam;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| grade | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> insert into exam values(1,56),(2,76),(11,82);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select*from exam;
+------+-------+
| id | grade |
+------+-------+
| 1 | 56 |
| 2 | 76 |
| 11 | 82 |
+------+-------+
3 rows in set (0.00 sec)
mysql>
查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来
mysql> select *from stu;
+------+------+
| id | name |
+------+------+
| 1 | Jack |
| 2 | Tom |
| 3 | Kity |
| 4 | Nono |
+------+------+
4 rows in set (0.00 sec)
mysql> select *from exam;
+------+-------+
| id | grade |
+------+-------+
| 1 | 56 |
| 2 | 76 |
| 11 | 82 |
+------+-------+
3 rows in set (0.00 sec)
mysql> select *from stu left join exam on stu.id=exam.id;
+------+------+------+-------+
| id | name | id | grade |
+------+------+------+-------+
| 1 | Jack | 1 | 56 |
| 2 | Tom | 2 | 76 |
| 3 | Kity | NULL | NULL |
| 4 | Nono | NULL | NULL |
+------+------+------+-------+
4 rows in set (0.00 sec)
mysql> select *from stu inner join exam on stu.id=exam.id;
+------+------+------+-------+
| id | name | id | grade |
+------+------+------+-------+
| 1 | Jack | 1 | 56 |
| 2 | Tom | 2 | 76 |
+------+------+------+-------+
2 rows in set (0.00 sec)
mysql>
左外连接(LEFT JOIN)的查询结果显示了stu
表中所有的学生,包括那些在exam
表中没有成绩的学生。对于没有成绩的学生(如Kity和Nono),成绩列