使用连接在多个表中查询数据:
在 WHERE 子句中写入连接条件。
在表中有相同列时,在列名之前加上表名前缀。
使用表名前缀在多个表中区分相同的列。
在不同表中具有相同列名的列可以用表的别名加以区分。
使用别名可以简化查询。
使用表名前缀可以提高执行效率。
内连接和外连接:
内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行。
外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。
没有匹配的行时, 结果表中相应的列为空(NULL)。
外连接的 WHERE 子句条件类似于内部连接, 但连接条件中没有匹配行的表的列后面要加外连接运算符, 即用圆括号括起来的加号(+)。
一、内连接:
1、等值连接:
例如:
方式1:
SELECT
A .employee_id,
b.department_id,
b.department_name
FROM
employees A,
departments b
WHERE
A .department_id = b.department_id;
方式2(join+ 连接的表名+on+匹配条件):
SELECT
a.last_name ,
a.department_id ,
b.department_name
FROM
employees a
JOIN departments b ON a.department_id=b.department_id;
三张表查询:
方式1:
SELECT
A .employee_id,
b.department_id,
b.department_name,
c.city
FROM
employees A,
departments b,
locations c
WHERE
A .department_id = b.department_id
AND b.location_id = c.location_id;
方式2:
SELECT
a .last_name,
a .department_id,
b.department_name,
c.city
FROM
employees a
JOIN departments b ON a .department_id = b.department_id
JOIN locations c ON b.location_id = c.location_id;
总结:连接 n个表,至少需要 n-1个连接条件。
2、非等值连接:
例如:
SELECT
employee_id,
last_name,
grade_level
FROM
employees A,
job_grades b
WHERE
A .salary BETWEEN b.lowest_sal
AND b.highest_sal;
二、外连接:
左外连接:
方式1:
SELECT
a .last_name,
a .department_id,
b.department_name
FROM
employees a,
departments b
WHERE
a.department_id = b.department_id(+);
方式2:
SELECT
A .last_name,
A .department_id,
b.department_name
FROM
employees A
LEFT OUTER JOIN departments b ON A .department_id = b.department_id;
右外连接:
方式1:
SELECT
a .last_name,
a .department_id,
b.department_name
FROM
employees a,
departments b
WHERE
a.department_id(+) = b.department_id;
方式2:
SELECT
A .last_name,
A .department_id,
b.department_name
FROM
employees A
RIGHT OUTER JOIN departments b ON A .department_id = b.department_id;
满外连接:
SELECT
A .last_name,
A .department_id,
b.department_name
FROM
employees A
FULL OUTER JOIN departments b ON A .department_id = b.department_id;
自连接:
查询公司中员工'chen'的manager的信息:
SELECT
empl.last_name,
manager.employee_id,
manager.last_name,
manager.manager_id,
manager.salary,
manager.email
FROM
employees empl,
employees manager
WHERE
empl.manager_id = manager.employee_id
AND LOWER (empl.last_name) = 'chen';
参考来自尚硅谷视频