内联结查询

内连接是通过在查询中设置连接条件的方式,来移除查询结果集中某些数据行后的交叉连接。简单来说,就是利用条件表达式来消除交叉连接的某些数据行。

在MySQL FROM 子句中使用关键字 INNER JOIN 连接两张表,并使用 ON 子句来设置连接条件。如果没有任何条件,INNER JOIN 和 CROSS JOIN 在语法上是等同的,两者可以互换。

SELECT <列名1,列名2 …>
FROM <表名1> INNER JOIN <表名2> [ ON子句]
  • <列名1,列名2…>:需要检索的列名。
  • <表名1><表名2>:进行内连接的两张表的表名。

内连接是系统默认的表连接,所以在 FROM 子句后可以省略 INNER 关键字,只用关键字 JOIN。使用内连接后,FROM 子句中的 ON 子句可用来设置连接表的条件。

mysql> SELECT tb_students_info.id ,  name , age , dept_name
    -> FROM tb_students_info , tb_departments
    ->  WHERE tb_students_info.id = tb_departments.id;
+----+--------+------+-----------+
| id | name   | age  | dept_name |
+----+--------+------+-----------+
|  1 | Dany   | 25   | Computer  |
|  2 | Green  | 23   | Chinese   |
|  3 | Henry  | 23   | Math      |
|  4 | Jane   | 22   | Computer  |
|  5 | Jim    | 24   | Computer  |
|  6 | John   | 21   | Math      |
|  7 | Lily   | 22   | Computer  |
|  8 | Susan  | 23   | Economy   |
|  9 | Thomas | 22   | Chinese   |
| 10 | Tom    | 23   | Economy   |
+----+--------+------+-----------+
10 rows in set (0.00 sec)
mysql> SELECT tb_students_info.id ,  name, age, dept_name
    -> FROM tb_students_info INNER JOIN tb_departments
    ->  WHERE tb_students_info.id = tb_departments.id;
+----+--------+------+-----------+
| id | name   | age  | dept_name |
+----+--------+------+-----------+
|  1 | Dany   | 25   | Computer  |
|  2 | Green  | 23   | Chinese   |
|  3 | Henry  | 23   | Math      |
|  4 | Jane   | 22   | Computer  |
|  5 | Jim    | 24   | Computer  |
|  6 | John   | 21   | Math      |
|  7 | Lily   | 22   | Computer  |
|  8 | Susan  | 23   | Economy   |
|  9 | Thomas | 22   | Chinese   |
| 10 | Tom    | 23   | Economy   |
+----+--------+------+-----------+
10 rows in set (0.00 sec)

提示:使用 WHERE 子句定义连接条件比较简单明了,而 INNER JOIN 语法是 ANSI SQL 的标准规范,使用 INNER JOIN 连接语法能够确保不会忘记连接条件,而且 WHERE 子句在某些时候会影响查询的性能。

外联结

MySQL 中内连接是在交叉连接的结果集上返回满足条件的记录;而外连接先将连接的表分为基表和参考表,再以基表为依据返回满足和不满足条件的记录。

外连接更加注重两张表之间的关系。按照连接表的顺序,可以分为左外连接和右外连接。

左外连接又称为左连接,在 FROM 子句中使用关键字 LEFT OUTER JOIN 或者 LEFT JOIN,用于接收该关键字左表(基表)的所有行,并用这些行与该关键字右表(参考表)中的行进行匹配,即匹配左表中的每一行及右表中符合条件的行。

在左外连接的结果集中,除了匹配的行之外,还包括左表中有但在右表中不匹配的行,对于这样的行,从右表中选择的列的值被设置为 NULL,即左外连接的结果集中的 NULL 值表示右表中没有找到与左表相符的记录。

mysql> SELECT name , dept_name
    -> FROM tb_students_info s
    -> LEFT OUTER JOIN tb_departments d
    -> ON s.id = d.id;
+--------+-----------+
| name   | dept_name |
+--------+-----------+
| Dany   | Computer  |
| Green  | Chinese   |
| Henry  | Math      |
| Jane   | Computer  |
| Jim    | Computer  |
| John   | Math      |
| Lily   | Computer  |
| Susan  | Economy   |
| Thomas | Chinese   |
| Tom    | Economy   |
+--------+-----------+
10 rows in set (0.00 sec)