
5.2 内连接
内连接是最早的一种连接方式,它是指从结果表中删除与其他被连接表中没有匹配行的所有行,因此当匹配条件不满足时内连接可能会丢失信息。内连接的完整格式有以下两种:
SELECT 列名列表FROM 表名l [INNER] JOIN 表名2 ON 表名1.列名=表名2.列名 SELECT 列名列表 FROM 表名l,表名2 WHERE 表名1.列名=表名2.列名
第一种格式使用JOIN关键字与ON关键字结合将两个表的字段联系在一起,实现多表数据的连接查询;第二种格式之前使用过,是基本的两个表的连接。
5.2.1 等值连接
所谓的等值连接就是在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列值,包括其中的重复列。简单来说,基表之间的连接是通过相等的列值连接起来的查询就是等值连接查询。
实现等值连接时有两种格式,这里只使用JOIN关键字与ON关键字结合的方式进行介绍。
【范例5】
基于emp表和dept表创建查询,限定查询条件为两个表中的deptno(部门编号)列相等,并要求返回emp表中的员工编号、姓名和职位,dept表中员工所处的部门名称。语句如下。
SELECT e.empno, e.ename, e.job, d.dname FROM emp e INNER JOIN dept d ON e.deptno=d.deptno;
执行上述语句时返回13行结果,部分内容如下。
EMPNO ENAME JOB DNAME --------- --------- -------------- -------------- 7369 SMITH CLERK RESEARCH 7499 ALLEN SALESMAN SALES 7521 WARD SALESMAN SALES 7566 JONES MANAGER RESEARCH 7654 MARTIN SALESMAN SALES
在上述语句中,INNER关键字可以省略,它们的实现效果是一样的。语句如下。
SELECT e.empno, e.ename, e.job, d.dname FROM emp e JOIN dept d ON e.deptno=d.deptno;
注意
连接条件中各连接列的类型必须是可比较的,但没有必要是相同的。例如,可以都是字符型,或都是日期型;也可以一个是整型,另一个是实型,整型和实型都是数值型,因此是可比较的。但若一个是字符型,另一个是整数型就不允许了,因为它们是不可比较的类型。
5.2.2 不等值连接
在等值连接查询的连接条件中不使用等号,而使用其他比较运算符就构成了非等值连接查询。也就是说,非等值连接查询的是在连接条件中使用除了等于运算符以外的其他比较运算符比较被连接列的值。在非等值连接查询中,可以使用的比较运算符有>、>=、<、<=、! =以及BETWEEN AND等。
【范例6】
连接emp表和dept表进行查询,查询条件是两个表的部门编号(deptno)列相等,并且要求部门编号列的值小于30,符合查询条件时返回emp表中的员工编号和员工名称,dept表中的部门编号和部门名称。
SELECT e.empno, e.ename, d.deptno, d.dname FROM emp e INNER JOIN dept d ON e.deptno = d.deptno AND d.deptno<30;
执行上述语句,输出结果如下。
EMPNO ENAME DEPTNO DNAME ------ ---------- ------------ ----------------- 7369 SMITH 20 RESEARCH 7566 JONES 20 RESEARCH 7782 CLARK 10 ACCOUNTING 7839 KING 10 ACCOUNTING 7902 FORD 20 RESEARCH 7934 MILLER 10 ACCOUNTING 7876 ADAMS 20 RESEARCH