SQL表连接

表连接(以Oracle为例):表连接就是一种将所有数据先进行笛卡尔积,然后在进行过滤的一种查询方式。

先介绍一下什么是笛卡尔积:

笛卡尔积也叫交叉连接,其结果就是所有表的列数相加,行数相乘:

这里有两张表test和test1,其中test有4列5行,test2有4列8行;

SQL表连接

所以这两张表做笛卡尔积进行交叉连接的结果就是:

SQL表连接

一共8列40行。

表的连接方式一共有四种:等连接,非等连接,外连接和自连接。这四种连接方式得出的结果都和笛卡尔积有关。

等连接、非等连接、自连接都是在交叉连接的基础上将符合条件的记录筛选出来的过程。

等连接也可以称之为内连接,它的标准SQL语句:

Select * from test inner join test2 on(test.i=test2.i);

SQL表连接

On后的语句是连接条件,当连接条件中的列名称相同时,可以使用using,但是在使用using语句时,在select语句中的列名前不能出现修饰符:

SQL表连接

如果在列名前加上修饰符就会报错。

非等连接:相当于在交叉连接的基础上给查询出的值进行筛选;

Select * from emp inner join salgrade on emp.salbetween salgrade.losal and salgrade.hisal;

SQL表连接

外连接:分为左外连接、右外连接和全外连接,外连接就是查询出交叉连接的结果后,再将不属于交叉连接范围内的数据也查询出来。

其实对于左外连接和右外连接来说,只要确定了主表是谁,就可以用任意一种方式进行连接。

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表,所以我可以用任何一种连接方式对其进行连接,只要将表的顺序进行调整就好。

SQL表连接

SQL表连接

得出的结果只有在列顺序上有区别,其他都是完全一致的。

全外连接:就是对两张表不仅进行左外连接,同时进行右外连接。

SQL表连接

自连接:举例来说,就是两张emp表进行连接。

自连接的标准SQL:

Select e1.ename,e1.empno,e1.mgr from emp e1inner join emp e2 on e1.mgr=e2.empno;

SQL表连接

在使用自连接是一定要注意,最好使用表的别名,如果不使用,很可能查不出任何数据。

SQL表连接

对于表的连接来说,可连接的表是无上限的,可以一次对多张表进行连接,但是连接的表越多,其执行速度就越慢。

视图:是一个从一张或者多张表中产生的一个逻辑数据集,也就是说,他不占内存,只记录创建视图时的那句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语句的编写是,在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;

SQL表连接

其中,代表b表的子查询就是一个内联视图。内联视图是一种一次性视图,用过之后不保存。