连接查询
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行查询。
连接可以在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
[Post=0][/Post]
结合实例
联接可分为以下几类:
• 内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符)。包括相等联接和自然联接。
内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students 和 courses 表中学生标识号相同的所有行。
• 外联接。外联接可以是左向外联接、右向外联接或完整外部联接。
在 FROM 子句中指定外联接时,可以由下列几组关键字中的一组指定:
• LEFT JOIN 或 LEFT OUTER JOIN。
左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
• RIGHT JOIN 或 RIGHT OUTER JOIN。
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
• FULL JOIN 或 FULL OUTER JOIN。
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
• 交叉联接。
交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。
select * from test1
select * from test2
SELECT *
FROM test1 inner JOIN test2
ON test1.t2 = test2.t1
SELECT *
FROM test1 JOIN test2
ON test1.t2 = test2.t1
SELECT *
FROM test1 left JOIN test2
ON test1.t2 = test2.t1
SELECT *
FROM test1 right JOIN test2
ON test1.t2 = test2.t1
SELECT *
FROM test1 cross JOIN test2
1 a
2 b
3 c
b B
c C
d D
c CC
2 b b B
3 c c C
3 c c CC
2 b b B
3 c c C
3 c c CC
1 a NULL NULL
2 b b B
3 c c C
3 c c CC
2 b b B
3 c c C
NULL NULL d D
3 c c CC
1 a b B
1 a c C
1 a d D
1 a c CC
2 b b B
2 b c C
2 b d D
2 b c CC
3 c b B
3 c c C
3 c d D
3 c c CC
分享到:
相关推荐
1967年,哈佛大学的心理学教授Stanley Milgram(1933-1984)想要描绘一个连结人与社区的人际连系网。做过一次连锁信实验,结果发现了“六度分隔”现象。简单地说:“你和任何一个陌生人之间所间隔的人不会超过六个,也...
易飞安装常见问题,包括 系统控制员连接失败,报表数据库连接失败的常见问题排查,适用于第一次安装易飞8.0.6版本的初学者,以上内容亲测有效,希望对csdn的同行们有所帮助。
navicate数据库连接工具,支持各种常用数据库的连接和开发操作,包括mysql、postgresql、sqlite、oracle、sqlserver、mariaDB
转换迅雷,旋风,BT种子连接~ 转换迅雷,旋风,BT种子连接~
资源里面有个方法2,可以试试操作,这是两种解决方法
易飞ERP系统三大报错: 一、系统控制员连接失败 二、报表数据库连接失败 三、LeaderWorkCenter ADO连接失败 检查步骤与排查详解。
微软研究(Microsoft Research)部门最近就提出了虚拟WiFi(VirtualWiFi)的概念为我们提供方便,一个小软件可以让妳的本本将单WiFi网卡设定成多重设定的网卡(就像虚拟网卡一样),并可连结多方的网络。有多种这类的应用...
行业资料-电子功用-同轴电缆与连接器的接地连结构造
说明:Oracle中需要创建用户一定是要具有dba(数据库管理员)权限的用户才能创建,而且创建的新用户不具备任何权限,连登录都不可以。 用法:create user 新用户名 identified by 密码 例子: 2. 修改密码 说明:...
Prices连接! 回复:潜水文明VI Mod 公主连接! Re:Dive Civilization and Leaders Mod for Civilization VI 这是Steam Workshop Princess Connect Mod for Civilization 6的源代码存储库了解有关此mod的更多信息...
Delphi ADO连接Oracle数据库报数据类型不支持处理方式 连接上后查询报“数据类型不支持”....
可直接使用,里面有十几个DEMO,包括SSH,SCP,可直接作为SSH终端访问LINUX服务器;除非之外还可以使用已经封装好的类直接调用,操作封装在类SshExe。这些源码很简单,可直接用,很方便!!
网络服务:系统连结的新希望 网络服务:系统连结的新希望
多种网络连接方式
NULL 博文链接:https://jaybin.iteye.com/blog/1171212
C#编写的OleDb数据库连接通用类库.关于数据库连结的
公主连结Re:Dive&明日方舟Arknights奖池页面上方 项目环境 JDK-1.8 MySQL的5.7.25 SpringBoot 2.4.3 项目进度 完成评论接口分页,登录和注册接口 未来大版本预想 权限管理(安全框架) 用户个人界面
Spark SFTP连接器库 通过从SFTP下载文件并将数据帧写入SFTP服务器来构造数据帧的库 要求 该库需要Spark2.x。 对于Spark 1.x支持,请检查分支。 连结中 您可以通过以下方式在程序中链接到该库: Maven依赖 ...
JSP连结数据库大全,包括的大部分数据库连接
重要连结使用python scripts/upload_systems.py将数据上传到波斯菊(一旦解析)数据库(Cosmos DB) 连接信息位于configure.yaml ,如下所示。 它位于.gitignore因此您需要添加该文件。 # Web location of the cos...