如果要查询多个表中的数据,就需要使用多表查询。多表查询有多种方法,隐式查询、链接查询(包括外连接查询和内连接查询)、交叉查询。
目录
例如:
在如上两张表中,如果要查询 result 表中 studentResult 字段值大于80的学生姓名 studentName ,此时就要使用多表查询。
SELECT student.studentName,result.studentResult
FROM student,result
WHERE student.studentNo = result.studentNo
AND result.studentResult > 80
隐式查询
格式
SELECT 列名1,列名2,...
FROM 表1,表2
WHERE 表1.主键列 = 表2.主键列
AND 限制条件
在隐式查询中,需要注意:在 WHERE 语句中必须写出 表1.主键列 = 表2.主键列 ;在所有的链接查询中,如果两个表有相同的列,则列之前必须加上表名,若无相同列则可以省略。
内链接查询
格式
SELECT 列名1,列名2
FROM 表名1
INNER JOIN 表名2
ON 主键表主键列 = 外键表的外键列
例如, 查询 result 表中 studentResult 字段值大于80的学生姓名 studentName
SELECT studentName,studentResult
FROM student
INNER JOIN result
ON student.studentNo = result.studentNo
外链接查询
格式
SELECT 列名1,列名2,...
FROM 表1
LEFT(RIGHT) JOIN 表2
ON 表1.主键 = 表2.主键
JOIN 前的LEFT 和 RIGHT ,若为LEFT , 则表示以左表为主表,查询右表;若为RIGHT , 则表示以右表为主表,查询左表。
例如, 左外链接查询 result 表中 studentResult 字段值大于80的学生姓名 studentName
SELECT student.studentName,result.studentResult
FROM result
LEFT JOIN student
ON student.studentNo = result.studentNo
WHERE result.studentResult > 80
例如, 右外链接查询 result 表中 studentResult 字段值大于80的学生姓名 studentName
SELECT student.studentName,result.studentResult
FROM student
RIGHT JOIN result
ON student.studentNo = result.studentNo
WHERE result.studentResult > 80
交叉查询
交叉查询会产生笛卡尔积,在实际的应用中应该避免这种情况。
SELECT 列名1,列名2,...
FROM 表名1
CROSS JOIN 表名2
全链接查询
格式
SELECT 表名1.列名1,表名1.列名2,...
FROM 表名1
UNION
SELECT 表名2.列名1,表名2.列名2,...
FROM 表名2;
在全链接查询中,UNION的作用是去除重复数据,UNION ALL 的作用是不去除重复数据。