SQL表连接
表连接(以Oracle为例):表连接就是一种将所有数据先进行笛卡尔积,然后在进行过滤的一种查询方式。
先介绍一下什么是笛卡尔积:
笛卡尔积也叫交叉连接,其结果就是所有表的列数相加,行数相乘:
这里有两张表test和test1,其中test有4列5行,test2有4列8行;
所以这两张表做笛卡尔积进行交叉连接的结果就是:
一共8列40行。
表的连接方式一共有四种:等连接,非等连接,外连接和自连接。这四种连接方式得出的结果都和笛卡尔积有关。
等连接、非等连接、自连接都是在交叉连接的基础上将符合条件的记录筛选出来的过程。
等连接也可以称之为内连接,它的标准SQL语句:
Select * from test inner join test2 on(test.i=test2.i);
On后的语句是连接条件,当连接条件中的列名称相同时,可以使用using,但是在使用using语句时,在select语句中的列名前不能出现修饰符:
如果在列名前加上修饰符就会报错。
非等连接:相当于在交叉连接的基础上给查询出的值进行筛选;
Select * from emp inner join salgrade on emp.salbetween salgrade.losal and salgrade.hisal;
外连接:分为左外连接、右外连接和全外连接,外连接就是查询出交叉连接的结果后,再将不属于交叉连接范围内的数据也查询出来。
其实对于左外连接和右外连接来说,只要确定了主表是谁,就可以用任意一种方式进行连接。
select * from emp left outer join dept on (emp.deptno=dept.deptno);
select * from dept right outer join emp on(emp.deptno=dept.deptno);
因为我确定了主表为emp表,所以我可以用任何一种连接方式对其进行连接,只要将表的顺序进行调整就好。
得出的结果只有在列顺序上有区别,其他都是完全一致的。
全外连接:就是对两张表不仅进行左外连接,同时进行右外连接。
自连接:举例来说,就是两张emp表进行连接。
自连接的标准SQL:
Select e1.ename,e1.empno,e1.mgr from emp e1inner join emp e2 on e1.mgr=e2.empno;
在使用自连接是一定要注意,最好使用表的别名,如果不使用,很可能查不出任何数据。
对于表的连接来说,可连接的表是无上限的,可以一次对多张表进行连接,但是连接的表越多,其执行速度就越慢。
视图:是一个从一张或者多张表中产生的一个逻辑数据集,也就是说,他不占内存,只记录创建视图时的那句SQL语句。
视图可以简单的分为两张:
第一种就是简单视图,不对数据进行任何函数处理不进行表的连接。
第二种就是复杂视图,这种视图没有任何限制,只要是可以在查询语句中用到的处理数据的方法都可以用。
两种语句最大的区别就是:简单视图一般情况下都可以接受dml操作。
创建视图视图的语句:
Create [or replace] view view_name as 查询语句;(orreplace就是指如果视图名已存在,覆盖原视图,创建新视图,但是这种方法仅适用于视图之间,如果视图名称与表名相同,只能修改其中某一对象的名称)(给数据库对象取名时,名称一定要有意义,这样不仅重复率会下降,并且容易记忆)0
例如,我想创建一张emp表中工作在30号部门的员工信息,就可以直接:
Create or replace view emp_deptno_30
As
Select * from emp where deptno=30;
这样就可以用一个简单的查询语句将一个较复杂的语句查询出来,所以可以将一些比较常用的,复杂的SQL语句创建成视图,方便下次使用。
视图还有另外一种存在形式,叫做内联视图,其实就是在进行SQL语句的编写是,在SQL语句中写入一个子查询,将这个子查询查出的数据作为一张表来使用,这个子查询就叫做内联视图:
比如:我想查询emp表中每个部门除了工资最高那个人以外所有人的姓名,就可以使用一个内联视图:
select a.ename
from emp a inner join (selectdeptno,max(sal) maxsal from emp group by deptno ) b
on a.deptno = b.deptno where a.sal <b.maxsal;
其中,代表b表的子查询就是一个内联视图。内联视图是一种一次性视图,用过之后不保存。