多表查询
内连接(INNER JOIN)
获取两个或多个表中满足连接条件的交集数据 。语法:
SELECT 目标字段
FROM 表1 [别名1]
INNER JOIN 表2 [别名2] ON 连接条件
[WHERE 筛选条件]
[GROUP BY 分组依据]
[ORDER BY 排序依据];
比如有students(学生表,含字段id、name )和scores(成绩表,含字段student_id、score )表,查询学生姓名和对应成绩:
SELECT s.name, sc.score
FROM students s
INNER JOIN scores sc ON s.id = sc.student_id;
左外连接(LEFT JOIN)
返回左表所有数据,以及右表满足连接条件的数据,右表无匹配则用NULL填充 。语法:
SELECT 目标字段
FROM 表1 [别名1]
LEFT JOIN 表2 [别名2] ON 连接条件
[WHERE 筛选条件]
[GROUP BY 分组依据]
[ORDER BY 排序依据];
如查询所有学生及其成绩(若没成绩也列出学生):
SELECT s.name, sc.score
FROM students s
LEFT JOIN scores sc ON s.id = sc.student_id;
右外连接(RIGHT JOIN)
与左外连接相反,返回右表所有数据,左表满足连接条件的数据,左表无匹配用NULL填充 。语法:
SELECT 目标字段
FROM 表1 [别名1]
RIGHT JOIN 表2 [别名2] ON 连接条件
[WHERE 筛选条件]
[GROUP BY 分组依据]
[ORDER BY 排序依据];
全外连接(FULL OUTER JOIN ,MySQL 不支持,可用 UNION 模拟 )
返回左表和右表所有数据,无匹配部分用NULL填充 。模拟语法:
(SELECT 目标字段
FROM 表1 [别名1]
LEFT JOIN 表2 [别名2] ON 连接条件)
UNION
(SELECT 目标字段
FROM 表1 [别名1]
RIGHT JOIN 表2 [别名2] ON 连接条件);
交叉连接(CROSS JOIN ,笛卡尔积 )
返回被连接表所有数据行的笛卡尔积,即结果行数是两表符合条件行数乘积 。语法:
SELECT 目标字段
FROM 表1 [别名1]
CROSS JOIN 表2 [别名2]
[WHERE 筛选条件]
[GROUP BY 分组依据]
[ORDER BY 排序依据];
或
SELECT 目标字段
FROM 表1 [别名1], 表2 [别名2]
[WHERE 筛选条件]
[GROUP BY 分组依据]
[ORDER BY 排序依据];
子查询
在一个查询语句中嵌套另一个查询 。如在students和scores表中,查询成绩高于平均成绩的学生姓名:
SELECT name
FROM students
WHERE id IN (
SELECT student_id
FROM scores
WHERE score > (SELECT AVG(score) FROM scores)
);

浙公网安备 33010602011771号