多表查询:
A)内连接:join,inner join
B)外连接:left join,left outer join,right join,right outer join,union
C)交叉连接:cross join
JOIN 按照功能大致分为如下三类:
INNER JOIN(内连接,或等值连接):取得两个表中存在连接匹配关系的记录。
LEFT JOIN(左连接):取得左表(table1)完全记录,即是右表(table2)并无对应匹配记录。
RIGHT JOIN(右连接):与 LEFT JOIN 相反,取得右表(table2)完全记录,即是左表(table1)并无匹配对应记录。
内连接查询:
select * from emp inner join dep on emp.dep_id=dep.id;
左外连接查询:
select * from emp left join dep on emp.dep_id=dep.id;
mysql> select * fromemp;+----+------+--------+--------+
| id | name | salary | dep_id |
+----+------+--------+--------+
| 1 | 张三 | 8000 | 2 |
| 2 | 李四 | 12000 | 1 |
| 3 | 王五 | 5000 | 2 |
| 4 | 赵六 | 8000 | 3 |
| 5 | 猪七 | 9000 | 1 |
| 6 | 周八 | 7000 | 4 |
| 7 | 蔡九 | 7000 | 2 |
+----+------+--------+--------+
7 rows in setmysql> select * fromdep;+----+--------+
| id | name |
+----+--------+
| 1 | 教学部 |
| 2 | 销售部 |
| 3 | 人事部 |
+----+--------+
3 rows in set
内连接
查询两张表中都有的关联数据,相当于利用条件从笛卡尔积结果中筛选出了正确的结果。
mysql> select * from emp join dep on emp.dep_id=dep.id;+----+------+--------+--------+----+--------+
| id | name | salary | dep_id | id | name |
+----+------+--------+--------+----+--------+
| 1 | 张三 | 8000 | 2 | 2 | 销售部 |
| 2 | 李四 | 12000 | 1 | 1 | 教学部 |
| 3 | 王五 | 5000 | 2 | 2 | 销售部 |
| 4 | 赵六 | 8000 | 3 | 3 | 人事部 |
| 5 | 猪七 | 9000 | 1 | 1 | 教学部 |
| 7 | 蔡九 | 7000 | 2 | 2 | 销售部 |
+----+------+--------+--------+----+--------+
6 rows in set
这时,我们就可以利用两张表中所有的字段进行查询了
mysql> select * from emp; --这么一个表
+----+------+--------+--------+
| id | name | salary | dep_id |
+----+------+--------+--------+
| 1 | 张三 | 800