在前几章中,大致了解了如何在一张表中读取数据,但是在真正的应用中,经常需要从数据库的两个或多个数据表中匹配读取数据。
注:以下SQL语句示例全部基于下面「user表」、「department表」「job表」:
user表
uid | uname | depid | jid |
---|---|---|---|
1 | 张三 | 2 | 1 |
2 | 李四 | 2 | 2 |
3 | 王铿 | 3 | 4 |
4 | 彭昶 | 3 | 4 |
5 | 王小二 | 4 | 3 |
department表
depid | depname | master |
---|---|---|
1 | 总裁办 | 李大宝 |
2 | 研发部 | 张三 |
3 | 测试部 | 王铿 |
4 | 开发小组A | 王潇潇 |
5 | 开发小组B | 尼古拉叶 |
6 | 财务部 | 佳琪佳 |
job表
jid | jname |
---|---|
1 | 高级开发工程师 |
2 | Java工程师 |
3 | 前端开发 |
4 | 测试工程师 |
5 | 产品经理 |
6 | 财会 |
- INNER JOIN(内连接,或等值连接): 获取两个表中字段匹配关系的记录,即查询两表交集部分的数据。
- LEFT JOIN(左连接): 获取左表所有记录,即使右表没有对应匹配的记录。
- RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
两表联合查询
sql
--内连接:INNER JOIN
SELECT * FROM user
INNER JOIN department on user.depid = department.depid ;
或
SELECT * FROM user,department WHERE user.depid = department.depid;
--查询「user表」「department表」中共有的数据。
结果如下:
uid | uname | depid | jid | depid | depname | master |
---|---|---|---|---|---|---|
1 | 张三 | 2 | 1 | 2 | 研发部 | 张三 |
2 | 李四 | 2 | 2 | 2 | 研发部 | 张三 |
3 | 王铿 | 3 | 4 | 3 | 测试部 | 王铿 |
4 | 彭昶 | 3 | 4 | 3 | 测试部 | 王铿 |
5 | 王小二 | 4 | 3 | 4 | 开发小组A | 王潇潇 |
sql
--左连接:LEFT JOIN
SELECT * FROM user u
LEFT JOIN department d ON u.uname = d.master;
--查询「user表」中所有的数据,和匹配上「department表」中的数据。
结果如下:
uid | uname | depid | jid | depid | depname | master |
---|---|---|---|---|---|---|
1 | 张三 | 2 | 1 | 2 | 研发部 | 张三 |
2 | 李四 | 2 | 2 | Null | Null | Null |
3 | 王锵 | 3 | 4 | 3 | 测试部 | 王锵 |
4 | 彭昶 | 3 | 4 | Null | Null | Null |
5 | 王小二 | 4 | 3 | Null | Null | Null |
sql
--右连接:RIGHT JOIN
SELECT * FROM user u
RIGHT JOIN department d ON u.uname = d.master;
--查询「department表」中所有的数据,和匹配上「user表」中的数据。
结果如下:
depid | depname | master | uid | uname | depid | jid |
---|---|---|---|---|---|---|
1 | 总裁办 | 李大宝 | Null | Null | Null | Null |
2 | 研发部 | 张三 | 1 | 张三 | 2 | 1 |
3 | 测试部 | 王铿 | 3 | 王铿 | 3 | 4 |
4 | 开发小组A | 王潇潇 | Null | Null | Null | Null |
5 | 开发小组B | 尼古拉叶 | Null | Null | Null | Null |
6 | 财务部 | 佳琪佳 | Null | Null | Null | Null |