数据库 左连接 右连接 全连接用法小结_数据库其它

连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 

SQL-92标准所定义的FROM子句的连接语法格式为: 

FROM join_table join_type join_table 
[ON (join_condition)] 

其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一个表操作的连接又称做自连接。join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 

外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。 

交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 

连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。 

无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接连接。例如: 

SELECT p1.pub_id,p2.pub_id,p1.pr_info 
FROM pub_info AS p1 INNER JOIN pub_info AS p2 
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) 

(一)内连接 

内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分三种: 

1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。 

2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。 

3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。 

例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: 

SELECT * 
FROM authors AS a INNER JOIN publishers AS p 
ON a.city=p.city 

又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): 

SELECT a.*,p.pub_id,p.pub_name,p.country 
FROM authors AS a INNER JOIN publishers AS p 
ON a.city=p.city 

(二)外连接 

内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 

如下面使用左外连接将论坛内容和作者信息连接起来: 

SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b 
ON a.username=b.username 

下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: 

SELECT a.*,b.* 
FROM city as a FULL OUTER JOIN user as b 
ON a.username=b.username 

(三)交叉连接 

交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 

例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等于6*8=48行。 

SELECT type,pub_name 
FROM titles CROSS JOIN publishers 
ORDER BY type

介绍了表连接,更确切的说是inner joins內连接. 
內连接仅选出两张表中互相匹配的记录.因此,这会导致有时我们需要的记录没有包含进来。 
为更好的理解这个概念,我们介绍两个表作演示。苏格兰议会中的政党表(party)和议员表(msp)。 

party(Code,Name,Leader) 
Code: 政党代码 
Name: 政党名称 
Leader: 政党领袖 

msp(Name,Party,Constituency) 
Name: 议员名 
Party: 议员所在政党代码 
Constituency: 选区 

在介绍左连接、右连接和全连接前,有一个数据库中重要的概念要介绍一下,即空值(NULL)。 

有时表中,更确切的说是某些字段值,可能会出现空值, 这是因为这个数据不知道是什么值或根本就不存在。 
空值不等同于字符串中的空格,也不是数字类型的0。因此,判断某个字段值是否为空值时不能使用=,<>这些 
判断符。必需有专用的短语:IS NULL 来选出有空值字段的记录,同理,可用 IS NOT NULL 选出不包含空值的记录。 

例如:下面的语句选出了没有领导者的政党。(不要奇怪,苏格兰议会中确实存在这样的政党) 

SELECT code, name FROM party 
WHERE leader IS NULL 

又如:一个议员被开除出党,看看他是谁。(即该议员的政党为空值) 

SELECT name FROM msp 
WHERE party IS NULL 

好了,让我们言归正传,看看什么叫左连接、右连接和全连接。 

A left join(左连接)包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。 
同理,也存在着相同道理的 right join(右连接),即包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录。 
而full join(全连接)顾名思义,左右表中所有记录都会选出来。 

讲到这里,有人可能要问,到底什么叫:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。 
Ok,我们来看一个实例: 

SELECT msp.name, party.name 
FROM msp JOIN party ON party=code 

这个是我们上一节所学的Join(注意:也叫inner join),这个语句的本意是列出所有议员的名字和他所属政党。 
你可以在 http://sqlzoo.cn/4.htm 亲自执行一下该语句,看看结果是什么。 

很遗憾,我们发现该查询的结果少了两个议员:Canavan MSP, Dennis。为什么,因为这两个议员不属于任 
和政党,即他们的政党字段(Party)为空值。那么为什么不属于任何政党就查不出来了?这是因为空值在 
作怪。因为议员表中政党字段(Party)的空值在政党表中找不到对应的记录作匹配,即 
FROM msp JOIN party ON party=code 没有把该记录连接起来,而是过滤出去了。 
在该短语中,msp在Join的左边,所有称为左表。party在Join的右边,所有称为右表。 

Ok,现在再看看这句话,“包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录”, 
意思应该很明白了吧。执行下面这个语句,那两个没有政党的议员就漏不了了。 

SELECT msp.name, party.name 
FROM msp LEFT JOIN party ON party=code 

关于右连接,看看这个查询就明白了: 

SELECT msp.name, party.name 
FROM msp RIGHT JOIN party ON msp.party=party.code 

这个查询的结果列出所有的议员和政党,包含没有议员的政党,但不包含没有政党的议员。 

那么既要包含没有议员的政党,又要包含没有政党的议员该怎么办呢,对了,全连接(full join)。 

SELECT msp.name, party.name 
FROM msp FULL JOIN party ON msp.party=party.code
当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行查询。

时间: 2024-10-25 12:49:45

数据库 左连接 右连接 全连接用法小结_数据库其它的相关文章

解析:内联,左外联,右外联,全连接,交叉连接的区别

本篇文章是对内联,左外联,右外联,全连接,交叉连接的区别进行了详细的分析介绍,需要的朋友参考下   连接分为:内连接.外连接.交叉连接 一.内连接--最常用 定义:仅将两个表中满足连接条件的行组合起来作为结果集. 在内连接中,只有在两个表中匹配的行才能在结果集中出现 关键词:INNER JOIN 格式:SELECT 列名表 FROM 表名1 [INNER] JOIN 表名2 ON或WHERE 条件表达式 说明: (1)列名表中的列名可以出自后面的两个表,但如果两个表中有同名列,应在列名前标明出处

解析:内联,左外联,右外联,全连接,交叉连接的区别_Mysql

连接分为:内连接.外连接.交叉连接 一.内连接--最常用 定义:仅将两个表中满足连接条件的行组合起来作为结果集. 在内连接中,只有在两个表中匹配的行才能在结果集中出现 关键词:INNER JOIN 格式:SELECT 列名表 FROM 表名1 [INNER] JOIN 表名2 ON或WHERE 条件表达式 说明: (1)列名表中的列名可以出自后面的两个表,但如果两个表中有同名列,应在列名前标明出处,格式为:表名.列名 (2)若连接的两个表名字太长,可以为它们起个别名. 格式为:表名 AS 别名

数据库设计规范化的五个要求 推荐收藏_数据库其它

若符合这两个条件,则可以说明这个数据库的规范化水平还是比较高的.当然这是两个泛泛而谈的指标.为了达到数据库设计规范化的要求,一般来说,需要符合以下五个要求. 要求一:表中应该避免可为空的列. 虽然表中允许空列,但是,空字段是一种比较特殊的数据类型.数据库在处理的时候,需要进行特殊的处理.如此的话,就会增加数据库处理记录的复杂性.当表中有比较多的空字段时,在同等条件下,数据库处理的性能会降低许多. 所以,虽然在数据库表设计的时候,允许表中具有空字段,但是,我们应该尽量避免.若确实需要的话,我们可以

WordPress导入数据库出现”Unknown collation: ‘utf8mb4_unicode_ci”错误的解决办法_数据库其它

从WordPress4.2版本开始,如果我们在MYSQL5.1版本数据中导出的数据编码是带有utf8mb4格式的,如果我们搬迁网站复原数据的时候,MYSQL5.5等高版本数据库导入到MYSQL5.1低版本的时候会出现"Unknown collation: 'utf8mb4_unicode_ci"错误问题,以前是没有这个问题的,从WP4.2开始才有的. 要解决这个问题,如果我们使用的VPS/服务器,可以类似老左昨天的"Linux CentOS6环境下MySQL5.1升级至MyS

几种常用DB驱动和DB连接串小结_数据库其它

(一) MySQL: (1) JDBC驱动jar包:(http://www.mysql.com) mm.mysql-2.0.2-bin.jar (2) 驱动类classpath:Driver = org.gjt.mm.mysql.Driver (3) 数据库连接URL: url = jdbc:mysql://IP(hostName):3306/DatabaseName. url解释:关键字 jdbc mysql jdbc表示采用方式连接数据库 mysql 表示连接到mysql数据库 (二) Or

bgsound 背景音乐 的一些常用方法及特殊用法小结_基础知识

前几天,在QQ群里有个XD问到bgsound的一些资料,确切地说是它的特殊用法.奇怪群里的人竟然都没几个能说出新意的,包括我!或许是这个标签不常用.或者是用处不大,所以,大家也就没有特意去研究过背景音乐吧.(以前自学这个东西时,本人也是仅仅出于好奇,玩玩而已^_^) 废话少说,来点真格的-- (以下是原文,不仅仅是bgsound哦,还有其他东东,慢慢see) <BGSOUND> 是用以插入背景音乐,但只适用於 IE,其参数设定不多. <BGSOUND src="liberati

HttpWebRequest和HttpWebResponse用法小结_实用技巧

最近公司拓展市场异常迅猛,数周之类开出去几十套系统,虽然系统名字不一样,但各个内容相似.由于时间紧迫,很多开出去的系统 出现各种神奇的错误,当初虽然有记录错误日志,然而很多客户使用的是自己的服务器和数据库,出了问题我们并不能立即掌握信息, 因此决定做一个捕获所有系统的异常并保存到自家数据库中. 实现思路 在每个系统出写入报告错误代码(找个合理的理由,比如系统免费升级) -> 自家服务器接收并处理错误报告 -> 反馈用户(解决掉BUG就行,不要太声扬) 基础回顾 ---参考msdn 1.Http

数据库命名规范小结_数据库其它

数据库命名规范 1 目的 规范数据库各种对象的命名规则. 2 数据库命名原则 2.1 数据文件 如果数据库采用文件系统,而不是裸设备,约定下列命名规则: 1)数据文件以表空间名为开始,以.dbf为结尾,全部采用小写英文字母加数字命名.如该表空间有多个数据文件,则从第2个数据文件开始,在表空间名后加_. 例:对system表空间的数据文件:system.dbf,system_2.dbf 2)对oracle数据库的控制文件,用control.ctl来表示.如control01.ctl,control

ACCESS转化成SQL2000需要注意的几个问题小结_数据库其它

很多朋友想用SQL2000数据库的编程方法,但是却又苦于自己是学ACCESS的,对SQL只是一点点的了解而已,这里我给大家提供以下参考---将ACCESS转化成SQL2000的方法和注意事项  一,首先,我说的是在ACCESS2000,SQL2000之间转换,其他的我也还没有尝试过,希望大家多多试验,肯定是有办法的:  二,转换的方法  1,打开"控制面板"下"管理工具"中的"数据库源":  2,按"添加"添加一个新的数据源,