在SQL中,操作多个表的数据称为连接。在oracle中有两种连接格式,ANSI SQL连接格式和Oralce特有的连接格式。一般where子句中的连接条件是数据表中指定用于连接的字段。在一个表中指定外键,在另一个表中指定与其相关联的主键。
一、内连接
语法:select table1.column,table2.column
From table1,table2
Where table.column1 = table2.column2;
1、如:scott方案中emp中包含了deptno这个字段,为显示部门名称。可以使用连接查询从emp表和dept表中获取字段值。
Select emp.empno, emp.ename, emp.job, emp.hiredate, emp.sal, dept.dname from emp,dept where emp.deptno = dept.deptno;
在dept表中,deptno是主键列,emp中是deptno的外键列。两者建立了主外键的关联。
2、如查询部门20的员工信息:
Select emp.empno, emp.ename, emp.job, emp.hiredate, emp.sal, dept.dname from emp,dept where emp.deptno = dept.deptno and emp.deptno = 20;
3、设置表别名,简化SQL代码:
Select x.empno, x.ename, x.job, x.hiredate, x.sal, y.dname from emp x,dept y where emp.deptno = dept.deptno and emp.deptno = 20;
4、使用内连接的ANSI SQL表示方式如下:
Select x.empno, x.ename, x.job, x.hiredate, x.sal, y.dname from emp x inner join dept y on emp.deptno = dept.deptno where emp.deptno = 20;
Inner join连接左右两个表,on字句指定两个标的连接条件,where字句来指定条件字句。
二、外连接
1、外连接分为两类,分别是保存左侧表内容的左外连接和保存右侧表内容的右外连接。
语法如下:
-------左外连接:当(+)出现在等号左边时,将返回table2表的所有数据
SELECT table1.column,table2.column
FROM table1,table2
WHERE table1.column(+)=tables2.column;
-------右外连接:当(+)出现在等号右边时,将返回table1表的所有数据
SELECT table1.column.table2.column
FROM table1,table2
WHERE table1.column=table2.column(+);
如:为返回emp表中的所有数据,将使用右外连接来实现
SELECT x.empno,x.ename,x.job,x.hiredate,x.sal,y.dname
FROM emp x,dept y
WHERE x.deptno = y.deptno(+);
2.使用ANSI SQL的连接、右连接及全连接语法
SELECT table1.column,table2.column
FROM table1 LEFT/RIGHT/FULL OUTER JOIN table2
ON table1.column_name = table2.column_name;
如:左连接
SELECT x.empno,x.ename,x.job,x.hiredate,x.sal,y.dname
FROM emp x LEFT OUTER JOIN dept y ON x.depno=y.deptno;
全连接中除了包含连接的数据外,还包含表中不符合连接条件的数据
三、交叉连接
交叉连接是A表中记录行和B表中的记录行数相乘得到的笛卡尔积,如果在进行连接查询时不指定任何连接条件,将产生交叉查询。
如:
SELECT x.empno,x.ename,x.job,x.hiredate,x.sal,y.dname
FROM emp x,dept y;
ANSI SQL标准用CROSS JOLN L来实现交叉查询
SELECT x.empno,x.ename,x.job,x.hiredate,x.sal,y.dname
FROM emp x CROSS JOIN dept y;
四、自然连接
如果两个表中有相同的名字和数据类型的列(必须同时满足),那么可以使用自然连接来自动匹配数据类型和列名。使用NATURAL JOIN满足
SELECT x.empno,x.ename,x.job,x.hiredate,x.sal,y.dname
FROM emp x NATURAL JOIN dept y;