每个数据库中可以存放多张表,真正的应用中经常需要从多个数据表中读取数据
笛卡尔乘积
多表进行连接查询时没有任何条件,最终的结果是多表结果数量乘积的现象被称为笛卡尔积
例如
SELECT e.employeename,d.departmentname FROM department AS d,employee AS e;
注:在多表联合查询时,要记得加上连接条件 ,通常会给表取别名,通过别名来判断字段属于哪个表,有较强的可读性。
SQL92语法 1992年制定的规则
SELECT e.employeename ,d.departmentname FROM department AS d,employee AS e
WHERE e.departmentnumber=d.departmentnumber;
SQL99 语法 建议使用 1999年制定的规则
SELECT e.employeename ,d.departmentname FROM department AS d,employee AS e
WHERE e.departmentnumber=d.departmentnumber;
join关键字可以连接多个表,
on关键字后面加上连接条件
join 按照功能大致分为如下三类:
内连接
inner join(内连接,或等值连接):获取两个表中字段匹配关系的记录。
内连接查询出的数据是两张表的交集,inner可省略
如:
-- 查询每个员工所在的部门名称,显示员工姓名和对应的部门名称
SELECT
e.employeename,
d.departmentname
FROM
department AS d
JOIN employee AS e
ON d.departmentnumber = e.departmentnumber;
-- 查询每个员工所在的部门名称,显示员工姓名,工作和对应的部门名称
SELECT
e.employeename,
e.job,
d.departmentname
FROM
department AS d
INNER JOIN employee e
ON d.departmentnumber = e.departmentnumber;
-- 查询每个员工所在的部门名称,显示用工姓名和对应的部门名称:
SELECT
e.employeename,d.departmentname
FROM
department AS d
JOIN employee AS e
ON d.departmentnumber=e.departmentnumber;
-- 找出员工所对应的工资等级,显示员工姓名、工资、工资等级:
SELECT
e.employeename,
e.salary,
s.grade
FROM
employee AS e
JOIN salarygrade s
ON e.salary BETWEEN s.lowsalary
AND s.highsalary;
左外连接
left outer join:获取左表所有记录,即使右表没有对应匹配的记录。
左外连接如上图中A部分+C部分的内容,即包含左边表的全部行(不管右边的表中是否存在与它匹配的行),和右边表中全部匹配的行 ,outer可省略
示例:
-- 找出每一个员工对应的部门名称,要求显示所有员工,要求显示所有的部门
SELECT
e.employeename,
d.departmentname
FROM
department d
LEFT OUTER JOIN employee e
ON e.departmentnumber = d.departmentnumber;
说明:部门表的内容有的跟员工表没联系,为了显示出部门表所有信息,需要使用左连接
右外连接
right outer join: 与 left join相反,用于获取右表所有记录,即使左表没有对应匹配的记录,
右外连接如上图中B部分+C部分的内容,即包含右边表的全部行(不管左边的表中是否存在与它匹配的行),和左边表中全部匹配的行。outer可省略
-- 找出每一个员工对应的部门名称,要求部门名称全部显示:
SELECT
e.employeename,
d.departmentname`
FROM
employee e
RIGHT JOIN department d
ON e.departmentnumber = d.departmentnumber;
注:右外连接都可改写成左外连接,左外连接都可改写成右外连接
自连接
两张一样的表连接查询叫自连接,自连接也可以左连接或者右连接
例如: 查询员工的名称和员工对应的领导名称
SELECT
e1.employeename,
e2.employeename AS leader
FROM
employee e1
JOIN employee e2
ON e1.manager = e2.employeenumber;
上面的自连接查询有问题,king的领导为null,上面的询句查不出来,需要用到下面的左连接查询
-- 找出每一个员工对应的领导名,要求显示所有员工
SELECT
e1.employeename ,e2.employeename ledaer
FROM
employee e1
LEFT JOIN employee e2
ON e1.manager=e2.employeenumber;
示例:
-- 找出每一个员工对应的部门名称,以及该员工对应的工资等级,要求显示员工姓名、部门名称、员工工资,工资等级
SELECT
e.employeename,
d.departmentname,
e.salary,
s.grade
FROM
employee e
JOIN department d
ON e.departmentnumber = d.departmentnumber
JOIN salarygrade s
ON e.salary BETWEEN s.lowsalary
AND s.highsalary;
说明:当多余两个表联合查询时,先将前两个表查出的内容当作新表,再和第三个表联合查询
参考:小猴子视频