Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3041733
  • 博文数量: 167
  • 博客积分: 613
  • 博客等级: 中士
  • 技术积分: 5473
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-13 21:35
个人简介

人, 既无虎狼之爪牙,亦无狮象之力量,却能擒狼缚虎,驯狮猎象,无他,唯智慧耳。

文章分类
文章存档

2015年(19)

2014年(70)

2013年(54)

2012年(14)

2011年(10)

分类: Mysql/postgreSQL

2014-01-03 15:53:17

       为什么SQL语言会定义“联结”呢?其实这源于关系型数据库本身的特点。数据存储的对象具有繁杂的信息条目,如果将所有的信息都存储在一张表中,应用时非常不便,主要体现在:1. 大量信息冗余,浪费磁盘存储空间;2. 部分信息发生变动时修改量十分巨大;3. 同一供应商的产品会出现大量雷同信息,极易导致不一致性。因此,现代数据的理念是将每个记录属性(列)分成不同的类别,每个类别一张表,表与表间通过特定的键值相互关系,从而表现为关系型数据库。这样的数据库具有极好的可扩展性,但是不足在于如果需要查询的信息位于多张表中,就需要特定的机制来实现各个表的“联结”,因此也就有了我们接下来要讨论的内联结(等值联结)、自然联结和外联结。

一、INNER JOIN:内联结(等值联结)
     首先我们来看看最基本、最简单的内联结,又叫做等值联结,之所以这样,还得先来说说联结的语法要义:谁和谁联结以及怎么联结。这里的等值联结就是说明的“如何联结”,即利用联结对象表中相等的键值作为联结条件,准确的说,应该是过滤条件。因为,如果没有限定联结条件的内联结,其实结果就是简单的笛卡尔积,即:
     SELECT Col-1, Col-2, Col-3 FROM Table-1 INNER JOIN Table-2 [ ON Table-1.Col-1 = Table-2.Col-3];  如果不输入ON部分的过滤条件,那么得出的结果就是两张表中的所有行记录的组合:

     这样大的信息量绝对不是我们想要的,因此我们一般都要求在最后加上ON作为过滤条件:

     
二、外联结
     所谓的自然联结就是指记录中不会出现重复的项,因为我们一般接触到的都是自然联结,因此不再着重叙述。我们来看看外联结。为什么会需要外联结呢?因为有些时候我们需要显示一张表中所有的记录行,而内联结只能显示ON过滤匹配后的记录行,具体过程是DBMS利用ON条件对于表格的笛卡尔积进行过滤,然后显示过滤后组合的结果,记得这里所有的过程都是DBMS完成的,本身的数据库没有丝毫的改变。外联结就是为了有些时候我们要显示没有匹配被过滤的表行而设置的方法。外联结一般分为LEFT/RIGHT联结,其实就是选择保留联结式子的左边/右边表的全部记录行,这里以左联结为例,需要使用LEFT OUTER JOIN关键词:

     上面利用内外联结对于同样的表进行了操作作为对比,可以看到外联结可以显示记录NULL的行,而内联结只能显示匹配到ON条件的行。
三、组合查询
     这里是自己一直没有掌握迷糊的地方,SQL盲注的时候也遇到了很多UNION信息,但是自己都没有看懂什么意思。其实UNION的作用就在于联结多个SELECT查询,然后将各自查询到的结果组合在一起好像一个SELECT结果一样显示出来,使用形式直接用UNION联结SELECT查询语句即可:

     注意到这里使用UNION联结了两个SELECT查询语句,其中最后添加了一个ORDER BY语句为UNION组合查询后的结果进行排序,如果要对SELECT结果排序,必须在末尾添加ORDER BY语句。
阅读(3494) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

forgaoqiang2014-01-06 22:37:48

比较喜欢使用子查询 在非相关子查询的时候比表连接效率高很多~