学习目的:了解MySQL数据库中多表查询的含义,掌握多表查询的基本写法,掌握特殊的多表查询的写法,掌握内连接和外连接的区别。
重点:
- 掌握多表查询的基本写法
- 掌握内连接和外连接的区别
难点:
- 外连接的用法和写法
- 特殊的多表查询的写法:自连接、非等值连接等
什么是连接
- 连接是在多个表之间通过一定的连接条件,使表之间发生关联,进而能从多个表之间获取数据。
- 语法为:
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;
- 在 WHERE子句中书写连接条件。
- 如果在多个表中出现相同的列名,则需要使用表名作为来自该表的列名的前缀。
- N个表相连时,至少需要N-1个连接条件
多表连接类型
- 按连接条件分:
-
- 等值连接
- 非等值连接
- 按其他连接方法分
-
- 外连接
- 内连接3.1.4 多表连接写法
- 多表连接包含多种写法,我们主要介绍:
-
- 基本写法:绝大多数符合SQL标准,其它关系型数据也适用。
- ANNSI 99写法:ANSI标准提供的写法,所有关系型数据库必须支持。
/*3.笛卡尔积:
●第一个表中的所有行和第二个表中的所有行都发生连接:产生数据总数为两表数据总数相乘
●笛卡尔积在下列情况产生:
○ 连接条件被省略
○ 连接条件是无效的
●为了避免笛卡尔积的产生,通常需要在WHERE子句中包含一个有效的连接条件
*/
SELECT emp.empno,emp.ename,emp.deptno,dept.deptno,dept.loc
FROM emp,dept;
-- 3.等值连接
SELECT emp.empno, emp.ename, emp.deptno, dept.deptno, dept.loc
FROM emp, dept
WHERE emp.deptno=dept.deptno AND sal>2000;
-- 3.1使用表的别名限制有歧义的列名
SELECT emp.empno, emp.deptno,dept.deptno, dept.loc
FROM emp, dept
WHERE emp.deptno=dept.deptno;
-- 4.非等值连接
SELECT e.ename, e.sal, s.grade
FROM emp e,salgrade s
WHERE e.sal
BETWEEN s.losal AND s.hisal;
-- 5.多于两个表的连接:通常N个表,至少有N-1个关联关系
SELECT c.name,o.itemid
FROM customer c, order o,item i
WHERE c.custid = o.custid and o.ordid = i.ordid;
-- 6.自连接:一个表通过某种条件和本身进行连接的一种方式,同多表连接
SELECT m.empno,m.ename,w.empno,w.ename
FROM emp w,emp m
WHERE w.mgr=m.empno;
/*ANSI SQL:1999标准的连接语法
除了上述自己的连接语法外,同时支持美国国家标准协会(ANSI)的SQL:1999标准的连接语法。
SELECT table1.column, table2.column
FROM table1
[JOIN table2
ON(table1.column_name = table2.column_name)]|
[LEFT | RIGHT OUTER JOIN table2
ON (table1.column_name = table2.column_name)];*/
-- 7.外部连接:左外(join左边的表为基表)、右外(join右边的表为基表),基表的内容全部显示
-- 7.1 左外连接
SELECT e.ename,e.deptno,d.loc
FROM emp e
LEFT OUTER JOIN dept d -- OUTER可写可不写
ON e.deptno=d.deptno;
-- 7.1 右外连接
SELECT e.ename,e.deptno,d.loc
FROM emp e
RIGHT JOIN dept d -- OUTER可写可不写
ON e.deptno=d.deptno;
/*8.本章小结
● 等值连接
● 不等值连接
● 自身连接
● 外连接*/
9.课后作业
- 显示员工SMITH的姓名,部门名称,直接上级名称
- 显示员工姓名,部门名称,工资,工资级别,要求工资级别大于4级。
- 显示员工KING和FORD管理的员工姓名及其经理姓名。
- 显示员工姓名,参加工作时间,经理名,参加工作时间,要求参加时间比经理早。