目录
一、内连接查询
二、外连接查询
三、复合条件连接查询
总结
内连接仅仅返回两个表中满足连接条件的记录,是最常用的连接方式,为默认连接方式。
语法:
SELECT ... FROM table1 INNER JOIN table2 ON table1.column = table2.column;
从表1中取出每一条记录,去表2中与所有的记录进行匹配,匹配必须是某个条件在表1中与表2中相同,最终才会保留结果,否则不保留。inner 关键字可省略不写;on 表示连接条件:条件字段就是代表相同的业务含义(如下面两张表中的 students.id 和 scores.student_id),大多数情况下为两张表中的主外键关系。
关联查询思路分为三步:
1.确定所连接的表,
2.确定所要查询的字段,
3.确定连接条件与连接方式。
例如:假设有students表(id, name)和scores表(student_id, score):
SELECT students.name, scores.score
FROM students
INNER JOIN scores ON students.id = scores.student_id;
结果:仅返回同时存在于students和scores表中的记录。
以某张表为主,取出里面的所有记录,然后每条与另外一张表进行连接,不管能不能匹配上条件,最终都会保留。能匹配,正确保留;不能匹配,其它表的字段都置空(null),称为外连接。
外连接查询分为左外连接和右外连接
1.左外连接查询:在内连接的基础上,保留左表所有记录,右表未匹配部分补NULL。
2.右外连接查询:在内连接的基础上,保留右表所有记录,左表未匹配部分补NULL。
表1 left/right [outer] join 表2 on 表1.字段=表2.字段
例如:
1.左连接:
SELECT students.name, scores.score
FROM students
LEFT JOIN scores ON students.id = scores.student_id;
结果:返回所有学生,无论是否有成绩(无成绩时score为NULL)。
2.右连接:
SELECT students.name, scores.score
FROM students
RIGHT JOIN scores ON students.id = scores.student_id;
结果:返回所有成绩记录,无论学生是否存在(学生不存在时name为NULL)。
在连接条件中使用多个条件(通过AND、OR组合)。
可结合过滤条件(如WHERE子句)进一步筛选结果。
例如:
1.在连接条件中使用多个条件(通过AND、OR组合)。
假设有employees表(id, name, department_id)和departments表(id, name, location):
SELECT employees.name, departments.name AS department, departments.location
FROM employees
INNER JOIN departments
ON employees.department_id = departments.id
AND departments.location = 'Beijing';
结果:返回部门位于北京的所有员工信息。
2.可结合过滤条件(如WHERE子句)进一步筛选结果。
SELECT employees.name, departments.name AS department
FROM employees
INNER JOIN departments
ON employees.department_id = departments.id
WHERE employees.salary > 5000 AND departments.location = 'Shanghai';
结果:返回上海部门中工资超过 5000 的员工。
1.总结对比
连接类型 |
匹配逻辑 |
保留未匹配记录? |
内连接 |
仅匹配条件成立的记录 |
否 |
左连接 |
保留左表全部记录 |
左表保留,右表补NULL |
右连接 |
保留右表全部记录 |
右表保留,左表补NULL |
复合条件连接 |
在基本连接上增加额外条件 |
取决于基础连接类型 |
2.选择原则:
仅需匹配数据:内连接。
需保留一侧数据:左 / 右连接。
需复杂条件筛选:复合条件连接。