sql分为1992语法和1999语法。首先来看92语法的连接:
规则:select table1.colm,table2.colm from table1,table2 where table1.colum = table2.colum;
在where子句中写入连接条件。当表中有重名的列时,必须在列的名字前加上表名作为前缀。
连接的类型:
1.等值连接--equal join
2.非等值连接--non-equal join
3.外连接--outer join
4.自连接--self join
在进行连接的时候可以使用等值连接,也可以使用非等值连接。
--查询雇员名称以及自己的薪水等级(非等值连接)
select e.sal,e.ename,sg.grade from emp e,salgrade sg where e.sal between sg.losal and sg.hisal;
--等值连接:两个表中包含相同的列明
--非等值连接:两个表中没有相同列名,但是某一个列在另一张表的列范围内。
--外连接:利用等值连接只会把关联到的数据显示,没有关联到的数据不会显示,此时需要外连接。
--分类:左外连接(左表全部数据显示)和右外连接(右边数据全部显示)
select * from emp e,dept d where e.deptno = d.deptno;//等值连接
select * from emp e,dept d where e.deptno = d.deptno(+);//谓词,左外连接
select * from emp e,dept d where e.deptno(+) = d.deptno;//右外连接
--自连接:将一张表当成不同的表来看待,自己关联自己。
如,将雇员和他经理的名称查出来。
select e,ename,m,ename from emp e,emp m where e.mgr = m.empno;
--笛卡尔积,当关联多张表,但是不指定连接条件的手,会进行笛卡尔积,关联后的总记录条数为m*n;m和n表示两张表的列数,一般不使用。
select * from emp e,dept d;
- 92语法有什么问题?
答:在92语法中,多张表的连接条件会放到where子句中,同时where需要对表进行条件过滤,因此相当于过滤条件和连接条件揉到一起,太乱了,所以出现了99语法。
- 99语法修正了整个缺点,把连接条件,过滤条件分开来,并引入了新的table join语法结构。
--cross join,交叉连接等同于92中的笛卡尔积。
select * from emp cross join dept;
--natural join,自然连接相当于92中的等值连接。
不需要写连接条件,会从两张表中找到相同列做连接。
当两张表中不具有相同的列名时,会进行笛卡尔积操作。
select * from emp e natural join dept d;等值连接
select * from emp e natural join salgrade sg;笛卡尔积
--on子句,添加连接条件(可以等值连接,也可以非等值连接)
select * from emp e join dept d on e.deptno = d.deptno;//等值连接
select * from emp e join salgrade sg on e.sal between sg.losal and sg.hisal;//非等值连接
--left (outer)join,左外连接,outer可省略
select * from emp e left outer join dept d on e.deptno = d.deptno;
select * from emp e ,dept d where e.deptno = d.deptno(+);
--right(outer)join,右外连接,outer可省略
--full outer join 全连接,相当于左外连接和右外连接的合集。
select * from emp full outer join dept d on e.deptno = d.deptno;
--inner join 内连接,两张表的连接查询,只会查询出右匹配记录的数据。
select * from emp e inner join dept d on e.deptno = d.deptno;
select * from emp e join dept d on e.deptno = d.deptno;
--using 除了使用on表示连接条件外,也可以使用using作为连接条件,此时连接条件的列不再归属于任何表。(与On的区别就是这个)
select d.deptno(错)应改为deptno from emp e join dept d using (deptno);
select d.deptno from emp e join dept d on e.deptno = d.deptno;
using子句引用的列在sql任何地方都不能使用表名或别名做前缀,natural子句同样适合。
--检索雇员名字,所在单位,薪水等级。
select e.ename,d.loc,sg.grade from emp e join dept d on e.deptno = d.deptno join salgrade sg on e.sal between sg.losal and sg.hisal;