雇员表
部门表
多表连接查询
1.交叉连接
交叉连接是不带谓词的连接,即两个表的笛卡尔积是量表中元组的交叉乘积。这种连接会产生一些没有意义的元组,因此在实际应用中较少使用。
例: SQL>SELECT * FROM emp, dept;
2.内连接
内连接是根据指定的连接条件进行连接查询,只有满足连接条件的数据才会出现在结果集中。内连接实际上就是结果集中只包含从交叉连接的全集中筛选出来的满足连接条件的记录,可分为相等内连接、非等内连接和自连接。
1)相等内连接
使用等号(=)指定连接条件的连接查询,用于比较的不同表中列的类型必须是匹配的,如果连接的表中有相同的列,则需要在列名前加表名。
①使用WHERE关键字的连接查询
由于交叉连接得到的查询结果集中包含大量的冗余信息,为此,可以通过WHERE子句过滤掉无意义的信息。
例:显示工资大于3000的雇员的名称、工资和所在的部门名称。
SELECT ename,sal,dname FROM emp,deptWHERE emp.deptno=dept.deptno AND sal>3000;
②使用JOIN关键字的连接查询
一般使用INNER JOIN关键字来指导内连接,INNER可以省略。使用JOIN关键字的内连接与使用WHERE子句的连接查询等价,即查询结果中只包含两个表中相匹配的行。在ON后面给出的连接条件使用等号(=)运算符比较被连接的两张表的公共字段,其查询结果中只包含两表的公共字段值相等的行,列可以是两表中任意列。
例:显示雇员的名称和所在的部门的编号和名称。
SELECT ename,emp.deptno,dname FROM emp JOIN dept ON emp.deptno=dept.deptno;
2)非等内连接
非等内连接是在连接条件中使用除“=”运算符以外的其它运算符比较被连接的公共字段。
例:显示雇员名称,工资和所属工资等级
SELECT e.ename,e.sal,s.grade FROM emp e,salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal;
3)自连接
自连接就是一个表,同本身进行连接。对于自连接可以想象存在两个相同的表(表和表的副本),可以通过不同的别名区别两个相同的表。
例:显示雇员名称和雇员的经理名称。
SELECT worker.ename||’的经理是’||manager.ename AS 雇员经理FROM emp worker,emp manager WHERE worker.mgr=manager.empno;