SQL表连接

原创 2018年04月16日 10:38:11

表连接(以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表的子查询就是一个内联视图。内联视图是一种一次性视图,用过之后不保存。

SQL数据库表连接图文详解

sql数据库表连接,主要分为:内连接、外连接(左连接、右连接 、全连接)、交叉连接,今天统一整合一下,看看他们的区别。   首先建表填充值。 学生表:student(id,姓名,年龄,性别 ) ...
  • MAOZEXIJR
  • MAOZEXIJR
  • 2017-06-25 14:35:26
  • 1944

sql 表连接基本语法

SQL连接可以分为内连接、外连接、交叉连接。1.内连接:内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。1.1 select * from Table1 as a...
  • kongbaidepao
  • kongbaidepao
  • 2015-07-30 17:37:24
  • 1197

查看sql执行计划时的表连接方式

查看sql执行计划时的表连接方式 在查看sql执行计划时,我们会发现表的连接方式有多种,本文对表的连接方式进行介绍以便更好看懂执行计划和理解sql执行原理。 一、连接方式:     嵌套循环(Ne...
  • li19236
  • li19236
  • 2014-11-25 18:11:00
  • 322

SQL 三表连接

http://www.111cn.net/database/mysql/62555.htm select * from a left join b on a.id=b.id left join c ...
  • lotusws
  • lotusws
  • 2018-01-09 14:29:41
  • 2855

几种表的连接方式(SQL)

SQL几种常用连接方式(旧式写法) 一、NATURAL JOIN(自然连接)     两张表通过NATURAL JOIN连接的时候,相当于有个隐含的WHERE子句,对两张表中同名的对应列相比较看是...
  • yuan22003
  • yuan22003
  • 2011-08-23 21:07:52
  • 8851

SQL查询简单代码

  • 2014年06月24日 15:28
  • 24KB
  • 下载

SQL优化:表的连接顺序

drop table tab_big; drop table tab_small; create table tab_big  as select * from dba_objects where...
  • qq_33879355
  • qq_33879355
  • 2017-10-20 19:20:12
  • 146

Oracle SQL中表连接顺序探究

SQL语句优化中大多会写上这样一句,把记录数最小的记录写到From子句的最后以提高查询的效率,我开始也深信不疑,但是自己写语句验证的时候却得到相反的结果。 下面是我验证的结果:   SQL>...
  • myzhanglt
  • myzhanglt
  • 2012-04-03 10:47:29
  • 1222

数据库三表连接查询怎么做

有三个表 a b c c.aid对应a.aid c.bid对应b.bid 现在要查出a.aname,b.bname,c.value怎么写sql语句? select a.aname,b.bna...
  • songsallyjin
  • songsallyjin
  • 2015-07-30 15:46:20
  • 2823

Sql三张表的连接查询

在做开发的时候,有时候会遇到多张表的连接查询,写两张表的连接查询,都会觉得很简单,但是超过这个数量的时候,可能会觉得难,其实,只要你分清楚表和字段,多表查询也能简单解决: //这是三张表的左连...
  • Megamind_HL
  • Megamind_HL
  • 2018-02-06 11:08:41
  • 319
收藏助手
不良信息举报
您举报文章:SQL表连接
举报原因:
原因补充:

(最多只允许输入30个字)