一、SQL92 实现 =
多表查询 ?查询每个球员的主场所在地(等值连接---非等值连接)
SELECT player, location
FROM players, teams
WHERE players.teamID = teams.teamID;
?自连接 (查询表中员工号对应领导号,自己连接自己)
-- (TABLE employee) id ?name ?managerID
SELECT t1.`name`, t2.`name`,
FROM employee t1, employee t2
WHERE t1.managerID = t2.id
?二、SQL99 实现 多表查询 JOIN...ON...
1、内连接:合并具有同一列的两个以上的表,结果集不包含两个表不匹配的行
?查询每个球员的主场所在地(等值连接---非等值连接)
SELECT p.player, t.location
FROM players p INNER JOIN teams t
ON p.teamID = t.teamID;
2、外连接:合并具有同一列的两个以上的表,结果集中除了两个表匹配的行,还包含左表或右表中不匹配的行(表中有null也显示)
-- 外连接分类:左外连接,右外连接,满外连接
-- 左外连接:结果集中除了满足连接条件的行,还包含左表中不满足条件的行
SELECT p.player, t.location
FROM players p LEFT JOIN teams t
ON p.teamID = t.teamID;
?-- 左外连接中去除两表重复部分(去除内连接部分)
SELECT p.player, t.location
FROM players p LEFT JOIN teams t
ON p.teamID = t.teamID
WHERE p.teamID IS NULL;
-- 右外连接:结果集中除了满足连接条件的行,还包含右表中不满足条件的行
SELECT p.player, t.location
FROM players p RIGHT JOIN teams t
ON p.teamID = t.teamID;
-- 右外连接中去除两表重复部分(去除内连接部分)
SELECT p.player, t.location
FROM players p RIGHT JOIN teams t
ON p.teamID = t.teamID
WHERE t.teamID IS NULL;
-- 满外连接:结果集中除了满足连接条件的行,还包含左表和右表中不满足条件的行
-- UNION 和 UNION ALL 中,尽量使用UNION ALL,效率高(但是并集不去重复部分)!
-- 实现方式1:左外连接 UNION ALL 右外连接中去除两表重复部分(去除内连接部分)
SELECT p.player, t.location
FROM players p LEFT JOIN teams t
ON p.teamID = t.teamID
UNION ALL
SELECT p.player, t.location
FROM players p RIGHT JOIN teams t
ON p.teamID = t.teamID
WHERE t.teamID IS NULL;
-- 实现方式2:右外连接 UNION ALL 左外连接中去除两表重复部分(去除内连接部分)
SELECT p.player, t.location
FROM players p RIGHT JOIN teams t
ON p.teamID = t.teamID
UNION ALL
SELECT p.player, t.location
FROM players p LEFT JOIN teams t
ON p.teamID = t.teamID
WHERE p.teamID IS NULL;