• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > SQL Join的一些总结(实例)

SQL Join的一些总结(实例)

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-05

匿名通过本文主要向大家介绍了SQL,Join等相关知识,希望本文的分享对您有所帮助

Join是关系型数据库系统的重要操作之一,SQL Server中包含的常用Join:内联接、外联接和交叉联接等

1.1.1 摘要
Join是关系型数据库系统的重要操作之一,SQL Server中包含的常用Join:内联接、外联接和交叉联接等。如果我们想在两个或以上的表获取其中从一个表中的行与另一个表中的行匹配的数据,这时我们应该考虑使用Join,因为Join具体联接表或函数进行查询的特性

本文将通过具体例子介绍SQL中的各种常用Join的特性和使用场合:

1.1.2 正文
首先我们在tempdb中分别定义三个表College、Student和Apply,具体SQL代码如下:
代码如下:

USE tempdb 

---- If database exists the same name datatable deletes it. 
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'College') 
DROP TABLE College; 
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Student') 
DROP TABLE Student; 
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Apply') 
DROP TABLE Apply; 

---- Create Database. 
create table College(cName nvarchar(50), state text, enrollment int); 
create table Student(sID int, sName nvarchar(50), GPA real, sizeHS int); 
create table Apply(sID int, cName nvarchar(50), major nvarchar(50), decision text);


Inner join

内联接(Inner join)是最常用的联接类型之一,它查询满足联接谓词的数据。

假设我们要查询申请表Apply中申请学校的相关信息,由于Apply表中包含学校名字我们并不能预知,所以我们可以根据cName来内联接(Inner join)表College和Apply,从而找到Apply表中包含学校的信息。

具体SQL代码如下:
代码如下:

---- Gets college information from college table 
---- bases on college name. 
SELECT DISTINCT College.cName, College.enrollment 
FROM College INNER JOIN 
Apply ON College.cName = Apply.cName

1318.png

图1查询结果
表1 College表中的数据

cNamestateenrollment
StanfordCA15000
BerkeleyCA36000
MITMA10000
CornellNY21000
HarvardMA29000


如上图1所示,我们把Apply表包含的学校信息查询出来了,由于Harvard并没有被查询出来,所以我们知道暂时还没有学生申请Harvard。

内联接(Inner join)满足交换律:“A inner join B” 和 “B inner join A” 是相等的。

Outer join
假设我们想看到所有学校信息;即使是那些没有申请的学校(如:Harvard),这时我们可以使用外部联接(Outer join)进行查询。由于外部联接保存一个或两个输入表的所有行,即使无法找到匹配联接谓词的行。

具体SQL代码如下:
代码如下:

---- Gets all college information 
SELECT College.cName, College.state, College.enrollment, 
Apply.cName, Apply.major, Apply.decision 
FROM College LEFT OUTER JOIN

1319.png

图3左联接查询结果

如上图3所示:由于在Apply表中并没有学生申请Harvard,但是我们通过左联接(left outer join)把所有学校信息查询出来了。

由于左联接(left outer join)产生表College的完全集,而Apply表中匹配的则有值,而不匹配的则以NULL值取代,所以我们知道Apply表中没有学生申请Harvard。

通过左联接查询我们可以获取College的完全集,假设现在我们既要获取College的完全集又要获取Apply的完全集,那么我们可以考虑使用完整外部联接(full outer join)。使用完整外部联接,我们可以查询所有的学校,不管它们是否匹配联接谓词:
代码如下:

--- Gets all information from college and apply table. 
SELECT College.cName, College.state, College.enrollment, 
Apply.cName, Apply.major, Apply.decision 
FROM College FULL OUTER JOIN 
Apply ON College.cName = Apply.cName

1320.png

图3 完整外部联接查询结果

现在我们获取了College和Apply的完全数据集,对于表中匹配的则有值,即使没有找到匹配cName的则以NULL值取代。

下表显示每种外部联接(outer join)匹配时保留数据行的情况:

联接类型保留数据行
A left outer join Ball A rows
A right outer join Ball B rows
A full outer join Ball A and B rows


表2 外部联接保留数据行

完整外部联接(full outer join)满足交换律:“A full outer join B” 和 “B full outer join A” 是相等的。

Cross join
交叉联接(cross join)执行两个表的笛卡尔积(就是把表A和表B的数据进行一个N*M的组合)。也就是说,它匹配一个表与另一个表中的每一行;我们不能通过使用ON子句在交叉联接指定谓词,虽然我们可以使用WHERE子句来实现相同的结果,这是交叉联接基本上是作为一个内部联接了。

交叉联接相对于内部联接使用率较低,而且两个大表不应该进行交叉联接,因为这将导致一个非常昂贵的操作和一个非常大的结果集。

具体SQL代码如下:
代码如下:

---- College Cross join Apply. 
SELECT College.cName, College.state, College.enrollment, 
Apply.cName, Apply.major, Apply.decision 
FROM College 
CROSS JOIN Apply

1321.png

图4 College表和Apply表的行数

1322.png

图5 交叉联接

现在我们对College和Apply表进行交叉联接,而且生成数据行为College和Apply表行数的笛卡尔积即5 * 20 = 100。

Cross apply
在SQL Server 2005中提供了Cross apply使表可以和表值函数(table-valued functions TVF‘s)结果进行join查询。例如,现在我们想通过函数的结果值和表Student进行查询,这时我们可以使用Cross apply进行查询:
代码如下:

---- Creates a function to get data from Apply base on sID. 
CREATE FUNCTION dbo.fn_Apply(@sID int) 
RETURNS @Apply TABLE (cName nvarchar(50), major nvarchar(50)) 
AS 
BEGIN 
INSERT @Apply SELECT cName, major FROM Apply where [sID] = @sID 
RETURN 
END 
---- Student cross apply function fn_Apply. 
SELECT Student.sName, Student.GPA, Student.sizeHS, 
  


 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 分享下mysql各个主要版本之间的差异
  • MySQL essential版本和普通版本有什么区别?
  • redhat 5.4下安装MYSQL全过程
  • 如何用SQL命令查看Mysql数据库大小
  • 解析mysql中如何获得数据库的大小
  • 解析mysql修改为utf8后仍然有乱码的问题
  • 5个常用的MySQL数据库管理工具详细介绍
  • 解析在MySQL里创建外键时ERROR 1005的解决办法
  • 解析远程连接管理其他机器上的MYSQL数据库
  • mysql 精简过程(删除一些文件)

相关文章

  • 2018-12-05在程序中压缩sql server2000的数据库备份文件的代码
  • 2018-12-05SQLServer2008的实用小道具 merger使用介绍
  • 2018-12-05有关数据库表的管理实例汇总
  • 2017-05-11mysql 一个较特殊的问题:You can't specify target table 'wms_cabinet_form'
  • 2017-08-07MySql按周,按月,按日分组统计数据
  • 2017-05-11MySQL存储引擎MyISAM与InnoDB的9点区别
  • 2018-12-05详解MySQL备份、还原、innoDB开启
  • 2018-12-05使用SQLSERVER 2005/2008 递归CTE查询树型结构的方法
  • 2017-05-11MySQL自增列插入0值的解决方案
  • 2018-12-05SQL语句导入导出大全

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • SQL 合并多行记录的相同字段值
    • Win7、WinXP下MySql安装出错完全卸载的方法步骤
    • 一列保存多个ID(将多个用逗号隔开的ID转换成用逗号隔开的名称)
    • 详解MySQL中DROP,TRUNCATE 和DELETE的区别实现mysql从零开始
    • MySQL 性能、监控与灾难恢复
    • MySql存储过程学习知识小结_MySQL
    • MYSQL不能从远程连接的一个解决方法(s not allowed to connect t
    • 详解远程连接Mysql数据库的问题(ERROR 2003 (HY000))
    • tomcat-dbcp数据库连接池配置以及使用时候的一些坑
    • Mysql的Root密码遗忘的解决办法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有