精华内容
下载资源
问答
  • SQL应用与开发:(五)多个数据表的连接

    千次阅读 热门讨论 2015-04-04 11:58:19
    连接查询的结果集或结果表称为表之间的连接。查询实际上是通过各个表之间共同列的关联性来查询数据的,它是关系型数据库查询最主要的特征。 实现连接的结果是在向数据库增添新类型的数据方面没有限制,具有很大的...

    数据库中的各个表中存储着不同的数据,用户往往需要用多个表中的数据来组合、提炼出所需要的信息。如果一个查询需要对多个表进行操作,就称为连接查询。连接查询的结果集或结果表称为表之间的连接。查询实际上是通过各个表之间共同列的关联性来查询数据的,它是关系型数据库查询最主要的特征。

    实现连接的结果是在向数据库增添新类型的数据方面没有限制,具有很大的灵活性。通常总是通过连接创建一个新表,以包含不同表中的数据。如果新表有合适的域,就可以将它连接到现有的表。


    1.简单连接操作

    最简单的连接方式是在SELECT语句的FROM子句中用逗号将不同的基表隔开,使用WHERE子句创建的同等连接是使第一个基表中一个或者多个列中的值与第二个基表中相应的一个或者多个列的值相等的连接。这样在查询结果中只显示两个基表中列的值相匹配的行。但是值得注意的是,无论不同表中的列是否具有相同的列名,都相应的通过增加表名来限制列名。

    例如,在数据库“销售关系系统”中,从“业务员信息”和“客户信息”连个表中,查询“业务员编号”大于1004,并且在SELECT列表中增加一个列“业务员编号”:

    SELECT 业务员信息.业务员编号,业务员信息.业务员编号,客户信息.客户姓名,客户信息.客户地址,客户信息.联系电话

    FROM 业务员信息,客户信息

    WHERE 业务员信息.业务员编号=客户信息.所属业务员编号 AND 业务员信息.业务员编号>1004

    执行后,便是我们条件的结果。

    在该查询中,我们也可以使用相关名称,“业务员信息”表用别名A代替,“客户信息”表用B代替,当引用这连个表时,除了FROM子句外,在SELECT语句的任何地方都可以使用A和B,那么我们上述的语句就变成了:

    SELECT A.业务员编号,A.业务员编号,B.客户姓名,B.客户地址,B.联系电话

    FROM 业务员信息 A ,客户信息 B

    WHERE A.业务员编号=B.所属业务员编号 AND A.业务员编号>1004

    其执行结果,和前面的完全相同。

    这也为后面的多个表的连接的 学习奠定了基础。例如,在数据库“珠宝销售系统”中,基于“珠宝信息”、“珠宝商信息”和“销售明细信息”三个表创建一个查询。要求返回“珠宝信息”表中的列“珠宝名称”,“珠宝商信息”表中的列“珠宝商姓名”和“销售明细信息”表中的列“利润”:

    SELECT A.珠宝名称,B.珠宝商姓名,C.利润

    FROM 珠宝商信息 AS A ,珠宝商信息 AS B,销售明细信息 AS C

    WHERE A.珠宝代号=C.珠宝代号 AND A.珠宝商编号=B.珠宝商编号

    执行后,便是所查询结果集。


    2.内连接

    内连接是最常用的连接查询,一般用INNER JION关键字来指定内连接。但是,INNER不是必需的。如果只用JOIN关键字,还必须定义一个ON子句。内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接的列值。


    2.1等值连接

    所谓等值连接解释在连接条件中使用等于号(=)运算符比较被连接列的值,其查询结果中列出被连接表中的所有列,包括其中的重复列。换句话说,基表之间的连接通过相等的列值连接起来的查询就是等值连接查询。

    等值连接查询可以用两种表示方式来指定连接条件。例如,在数据库“销售关联系统”中,基于“商品信息”和“供应商信息”两个表创建一个查询。限定查询条件为两个表中的“供应商编号”相等时返回,并要求返回的列为“商品信息”表中的“商品名称”和“供应商信息”表中的列“供应商名称”、“联系人姓名”。

    SELECT A.商品名称,B.供应商名称,B.联系人姓名,A.单价

    FROM 商品信息 A,供应商名称 B

    WHERE A.供应商编号=B.供应商编号

    在上述语句的WHERE子句中,用"="指定查询为等值连接查询。

    还可以在查询语句的FROM子句中使用INNER JOIN关键字连指定查询是等值连接查询。

    SELECT A.商品名称,B.供应商名称,B.联系人姓名,A.单价

    FROM 商品信息 A INNER JOIN 供应商信息 B

                               ON A.供应商编号=B.供应商编号 

    执行后,与上述语句所得结果相同。

    也可以对连接查询所得的结果利用ORDER BY子句进行排序。例如,将上述的的等值连接查询的查询按列“单价”的降序进行排列。

    SELECT A.商品名称,B.供应商名称,B.联系人姓名,A.单价

    FROM 商品信息 A INNER JOIN 供应商信息 B

                               ON A.供应商编号=B.供应商编号 

    ORDER BY A.单价 DESC

    运行后,唯一与上述结果不同的是,该查询的结果根据“单价”对查询的结果进行了降序排序。


    2.2非等值连接

    在等值连接查询的连接条件中不适用等号,而使用其他比较符就构成了非等值连接查询。也就是说,非等值连接查询是在连接条件中使用了等于运算符以外的其他比较运算符比较被连接列的列值。在非等值连接查询中,可以使用的比较傲运算符有:>、<、>=、<=、!=,还可以使用BETWEEN...AND之类的关键字。

    例如,从数据库“销售管理系统”中,基于“供应商信息”和“入库单信息”两个表创建一个查询。限定查询条件为两个表中的“供应商编号”不相等,并返回列“供应商名称”和“供应商所在城市”。

    SELECT 供应商名称,供应商所在城市

    FROM 供应商信息 A INNER JOIN 入库单信息 B

    ON A.供应商编号!=B.供应商编号

    执行上述语句后,其查询结果返回80行,单大部分都是重复的。我们利用下述语句来消除重复行。

    SELECT  DISTINCT 供应商名称,供应商所在城市

    FROM 供应商信息 A INNER JOIN 入库单信息 B

    ON A.供应商编号!=B.供应商编号

    该查询结果中信息与“供应商信息”表中列“供应商名称”和“供应商所在城市”中的信息完全相同,所以上述查询并没有实际应用价值,这就说明非等值连接查询往往需要同其他连接查询结合使用,尤其是与等值连接查询结合。

    2.3自然连接

    自然连接是在连接条件中使用等于号(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集中所包含的列,并删除连接表中的重复列。简单的说,在等值连接中去掉重复的属性列,即为自然连接。

    自然连接为具有相同名称的列自动进行记录匹配。自然连接不必指定任何同等连接条件。SQL实现方式判断出具有相同名称的列然后形成匹配。然而,自然连接虽然可以指定查询结果包括的列,但是不能指定被匹配的列。

    例如,在数据库“珠宝营销系统”中,基于“顾客信息”和“珠宝商信息”两个表创建了一个自然连接查询。这个连接查询的限定条件是两个表中“消费者所在城市”和“珠宝商所在城市”相同,并按照列“消费者姓名”、“消费者地址”、“珠宝商姓名”和“珠宝商地址”返回查询结果。

    SELECT 消费者姓名,消费者地址,消费者所在城市 AS 城市,珠宝商姓名。珠宝商地址

    FROM 顾客信息 A INNER JOIN B

    ON A.消费者所在城市=B.珠宝商所在城市

    执行上述语句后,对其结果进行分析。尽管利用自然查询能够消除查询结果中重复的行,但是从上述语句的查询结果中能够发现,该查询结果也是由笛卡尔积形成的。


    3.外连接

    当至少有一个同属于两个表的行符合连接条件时,内连接才返回行。而外连接返回所有的匹配航和一定的不匹配行,这主要取决于所建立的连接的类型。SQL支持的3种类型的外连接:

    左外连接:返回所有的匹配行并从关键字JOIN左边的表中返回所有不匹配的行。

    右外连接:返回所有的匹配行并从关键字JOIN右边的表中返回所有不匹配的行。

    完全连接:返回所有的匹配行和不匹配的行。


    3.1左外连接

    左外连接的查询结果集中包括指定左表中的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有找到相匹配的行,则结果集中的右表的相对应位置为NULL。

    在左外连接查询的SELECT语句中,用LEFT OUTER JOIN关键字对两个基表进行连接。

    例如,在数据库“珠宝营销系统”中,以在同一个城市的消费者和珠宝商为条件,对“消费者信息”和“珠宝商信息”表进行左外连接查询。

    SELECT  消费者姓名,消费者地址,消费者所在城市 AS 城市,珠宝商姓名,珠宝商地址

    FROM 顾客信息 A LEFT OUTER JOIN 珠宝商信息 B

    ON A.消费者所在城市=B.珠宝商所在城市

    执行后,查询其结果中包含了三行含有NULL值得数据,尽管这三行没有匹配列,但在查询结果中仍然被包括进去,原因就是这三行中列“消费者姓名”中的信息包含在左表中。这就是说,在进行左外连接查询时,无论左表中的行是否能够在右表中找到匹配的行,查询结果中都将被显示在该行,与其他行唯一不同的是,右表中与该行对应的位置用NULL值代替。


    3.2右外连接

    右外连接就是左外连接的反向连接,只不过在插叙结果集中包括的是指定右表的所有行。如果右表的某行在左表中没有找到相匹配的行,则结果集中的左表的相对应位置为NULL。

    在右外连接查询的SELECET语句中,用RIGHT OUTER JOIN关键字对两个基表进行连接。

    例如,在数据库“珠宝商营销系统”中,以在同一个城市的消费者和珠宝商为条件,对“消费者信息”和“珠宝商信息”表进行右外连接。

    SELECT  消费者姓名,消费者地址,消费者所在城市 AS 城市,珠宝商姓名,珠宝商地址

    FROM 顾客信息 A RIGHT OUTER JOIN 珠宝商信息 B

    ON A.消费者所在城市=B.珠宝商所在城市

    执行后,查询其结果中包含了两行含有NULL值得数据,尽管这两行没有匹配列,但在查询结果中仍然被包括进去,原因就是这两行中列“珠宝商姓名”中的信息包含在右表中。这就是说,在进行右外连接查询时,无论右表中的行是否能够在左表中找到匹配的行,查询结果中都将被显示在该行,与其他行唯一不同的是,左表中与该行对应的位置用NULL值代替。


    3.3完全连

    完全连接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表与之相对应列值为NULL。如果表之间右匹配行,则整个结果集包含基表的数据值。

    在完全连接查询的SELECT语句中,用FULL OUTER JOIN关键字对两个基表进行连接。

    例如,在数据库“珠宝商营销系统”中,以在同一个城市的消费者和珠宝商为条件,对“消费者信息”和“珠宝商信息”表进行完全连接。

    SELECT  消费者姓名,消费者地址,消费者所在城市 AS 城市,珠宝商姓名,珠宝商地址

    FROM 顾客信息 A FULL OUTER JOIN 珠宝商信息 B

    ON A.消费者所在城市=B.珠宝商所在城市

    执行后,查询其结果中包含了六行含有NULL值得数据,尽管这六行没有匹配列,但在查询结果中仍然被包括进去,原因就是这两行中列“珠宝商姓名”中的信息包含在右表中。这就是说,在进行完全连接查询时,无论左表中还是右表是否能够找到匹配的行,它都在查询结果中显示该行,而只是在找不到匹配的位置上用NULL值代替。


    4.联合查询

    如果有多个不同的查询结果,但又不希望将它们连接在一起,组成数据。在这种情况下,可以使用UNION子句。使用UNION子句的查询称为联合查询,它可以将两个或者更多查询的结果组合为一个单个结果集,该结果集包含联合查询中所有查询结果集中的全部行数据。联合查询不同于对两个表中的列进行连接查询,前者是组合两个表中的行,后者是匹配两个表中的列数据。联合查询的语法格式为:

    SELECT <select_list>

    FROM <table_reference>

    [WHERE <search_condition>]

    {UNION [ALL]

    SELECT <select_list>

    FROM <table_reference>

    [WHERE <search_condition>]}

    [ORDER BY <order_condition>]

    在进行联合查询时,UNION子句会自动删除重复的行,查询结果的列标题为第一个查询语句的列标题。因此,必须在第一个查询语句中定义列标题。

    例如,从数据库”珠宝营销系统“的"顾客信息"表中,查询”消费者所在城市“为”北京市“的消费者的姓名、家庭住址和联系电话,并为其增加类型列为”类别“,列的内容为”消费者“;从”珠宝商信息“表中,查询”珠宝商所在城市“同样是”北京市“的珠宝商的相关信息,并增加一个列,列的内容为“珠宝商”;最后,将两个查询的结果联合在一起。

    SELECT 消费者姓名 AS 姓名,消费者地址 AS 家庭住址,联系电话,'消费者' AS 类别

    FROM 顾客信息

    WHERE 消费者所在城市='北京市'

    UNION

    SELECT 珠宝商姓名,珠宝商地址,电话,'珠宝商'

    FROM 珠宝商信息

    WHERE 珠宝商所在城市='北京市'

    在使用UNION的SELECT语句中,如果要对联合查询结果进行排序,则必须使用第一个查询语句中的列名、列标题或者列序号。并且排序子句ORDER BY中最好用数字来指定排序次序,如果不用数字,则联合查询的子查询中的列名就需要相同,也可以使用别名来统一列名。

    另外,在对联合查询的结果进行排序的结果进行排序时,必须把ORDER BY子句放在SELECT子句的后面。

    例如,从数据库“销售管理系统”的“客户信息”表中,查询“客户编号”不大于1005的客户的姓名、家庭住址和联系电话,并为其增加类型列“职能”,列的内容为“客户”;从“业务员信息”表中,查询“业务员编号”不大于1005的业务员的姓名、家庭住址和联系电话,并增加一个列,列的内容为“业务员”;最后,将两个查询结果联合在一起,并按类型“职能”的升序排列。

    SELECT 客户姓名 AS 姓名,客户地址 AS 家庭住址,联系电话,'客户' AS 职能

    FROM 客户信息

    WHERE 客户编号<= 1005

    UNION

    SELECT 业务员姓名,家庭住址,电话,'业务员'

    FROM 业务员信息

    WHERE 业务员编号<=1005

    ORDER BY 职能

    UNION ALL是另外一种对表进行联合的方法。它与UNION唯一不同的区别是它不删除重复的行,也不对行进行自动排序。在对表进行联合查询时,如果以希望在查询结果中显示重复的行,就可以使用UNION ALL。在此,不再一一举例。


    5.交叉连接和自连接

    在连接查询中还有两个比较特殊的连接查询方式:交叉连接和自连接。在交叉连接的查询结果中,两个表中每两个可能成对的行占一行。自连接就是一个表与自身进行连接查询。


    5.1交叉连接

    两个表进行交叉连接将生成来自这两个表的各行的所有可能组合。交叉连接在不带WHERE子句时,返回的是被连接的两个表所有行的笛卡尔积,即返回到结果集中的行数等于第一个表中符合查询条件的行数乘以第二个表中符合查询条件的行数。当交叉连接带有WHERE子句时,返回的是连接两个表的所有行的笛卡尔积减去WHERE子句所现在而省略的所有行数。

    交叉连接与前面介绍的基本连接操作非常相似。唯一不同的是,在FROM子句中,多个表名之间不是用逗号,而是用CROSS JOIN关键字隔开;并且在进行交叉连接时,不能像内连接和外连接一样使用ON 关键字来限定连接条件,但是可以将连接条件限定在WHERE子句中。

    例如,在数据库“销售管理系统”中,对“商品信息”表和“供应商信息”表进行交叉连接。要求返回商品的产地和供应商所在城市都是“上海市”或者构思“南京市”的相关信息。

    SELECT 商品信息.商品名称,商品信息.产地,供应商信息.供应商名称

    FROM 商品信息 CROSS JOIN 供应商信息

    WHERE 商品信息.产地=供应商信息.供应商所在城市

    AND (商品信息.产地='上海市' OR 商品信息.产地='南京市')

    ORDER BY 商品信息.产地


    5.2自连接

    连接不仅可以再不同表之间进行,也可以使一个表同其自身进行连接,这种连接成为自连接,相应的查询称为子连接查询。子连接是与表本身进行的内连接或者外连接。

    子连接的连接操作可以利用别名的方法实现一个表自身的连接。实质上,这种子身连接方法与两个表的连接操作完全相似。只是在每次列出这个表时便为它命名一个别名。

    例如,对数据库“销售管理系统”中的“客户信息”表进行自连接,查询“客户地址”相同的客户信息,并在查询结果中只返回“客户地址”为“北京市海淀区”或者“北京市朝阳区”的相关信息。

    SELECT A.客户姓名,A.联系电话,A.客户地址,B.客户姓名,B.联系电话

    FROM 客户信息 A INNER JOIN 客户信息 B

    ON A.客户地址=B.客户地址

    WHERE A.客户地址='北京市海淀区'

    OR A.客户地址='北京市朝阳区'

    由于此查询涉及“客户信息”表与自身的连接,因此“客户信息”表以两种角色显示。要区分这连个角色,必须在FROM子句中为“客户信息”表中提供两个不同的别名(A 和B),这两个别名用来限定查询中的列名。如果希望消除客户与自身相匹配的行,则只需在上述语句中添加一个限定条件,即将上述语句改为:

    SELECT A.客户姓名,A.联系电话,A.客户地址,B.客户姓名,B.联系电话

    FROM 客户信息 A INNER JOIN 客户信息 B

    ON A.客户地址=B.客户地址

    WHERE (A.客户地址='北京市海淀区'

    OR A.客户地址='北京市朝阳区')

    AND A.客户姓名<>B.客户姓名

    该查询结果和上述查询结果相比较,发现在该查询结果中消除了客户与其自身相匹配的行。


    6.学习小结

    在学习本章节的内容时,很是感到头疼,这内容也的确是多了点儿。但是,其联系却是十分的紧密,学起来不是很费力,总算把学的知识总结起来了。

    在对于多个数据表的连接学习中,数据表的联系很是实际化,在不断练习中学到更多的知识。


    展开全文
  • 通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。 在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在...
  • 通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。 在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放...
    连接查询

    通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。

    在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的 不同实体的信息。连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行查询。

    连接可以在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
    两个主要的连接类型是内连 接和外连 接。到目前为止,所有示例中使用的都是内连 接。内连 接只保留交叉积中满足连接条件的那些行。如果某行在一个表中存在,但在另一个表中不存在,则结果表中不包括该信息。
    外连 接是内连 接和左表和/或右表中未包括内连 接中的那些行的并置。当对两个表执行外连 接时,可任意将一个表指定为左表而将另一个表指定为右表。外连 接有三种类型:

    外连 接包括内连 接和左表中未包括在内连 接中的那些行。

    外连 接包括内连 接和右表中未包括在内连 接中的那些行。

    外连 接包括内连 接以及左表和右表中未包括在内连 接中的行。
    内连 接一般是检索两个表里连接字段都存在的数据。
    左连接的意思是,查询左(语句前面)表里的所有内容,无论右边表里有没有。右边表里没有的内容用NULL代替。
    右连接和左连接相反。
    数据表的连接有:
    1、内连 接(自然连接): 只有两个表相匹配的行才能在结果集中出现
    2、外连 接: 包括
    (1)左外连 接(左边的表不加限制)
    (2)右外连 接(右边的表不加限制)
    (3)全外连 接(左右两表都不加限制)
    3、自连接(连接发生在一张基表内)
    展开全文
  • 一、概述 通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统一个标志。多表连接查询是使用Sql基本操作,但连接的方式却多种,熟练使用这些连接方式...

    一、概述  

      通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。多表连接查询是使用Sql的基本操作,但连接的方式却有多种,熟练使用这些连接方式能够简化Sql语句,提高数据库运行效率。

      在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,然后通过连接进行查询。 

      连接可以在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)使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同。

      1、内连接又分为等值连接自然连接不等连接三种。 

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

      3、交叉连接(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

       SELECT a.*,p.pub_id,p.pub_name,p.country 

    FROM authors AS a INNER JOIN publishers AS p

    ON a.city=p.city

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

    (二)外连接 

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


      1、left join或left outer join(左外连接)

      左外连接 :(也叫左外连接,给出两个表的配匹行,并且以左边的表为准,如果左边表有而右边表没有的行,则在右边表的相应行选择的列显示为NULL,允许左边的基准表对应右边表多条满足条件的记录)左连接就是返回左边的匹配行,不考虑右边的表是否有相应的行

    select field1,field2 from table1 left join table2

      
    on field1=field2(基准字段,可以多个)

      
    where table1.field3=table2.field3

      2、right join或right outer join(右外连接)

      右连接:(也叫右外连接,给出两个表的配匹行,并且以右边的表为准,如果右边表有而左边表没有的行,则在右边表的相应行选择的列显示为NULL,允许右边的基准表对应左边表多条满足条件的记录)

      语法与做链接差不多! 

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

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

      SELECT type,pub_name 

      
    FROM titles CROSS JOIN publishers

      
    ORDER BY type

    转载于:https://www.cnblogs.com/chixiaojin/archive/2011/08/31/2161253.html

    展开全文
  • Join 连接查询

    2015-10-09 17:34:20
    连接查询连接查询,主要使用join关键字,建立多个表之间的联系。 连接查询可以分为,内连接和外连接,同时外连接又分为左连接和右连接。下面列出了您可以使用的 JOIN 类型,以及它们之间的差异。 JOIN: 如果

    Join连接查询


    在大多数实际开发情况了,我们需要同时和多个表打交道,多表查询是数据库中使用频率最高效率攸关的操作了!

    多表查询主要有两种方案:

    • 连接查询
    • 嵌套查询

    这里主要介绍一下连接查询!

    连接查询

    连接查询,主要使用join关键字,建立多个表之间的联系。
    连接查询可以分为,内连接和外连接,同时外连接又分为左连接和右连接。

    下面列出了您可以使用的 JOIN 类型,以及它们之间的差异。

    • JOIN: 如果表中有至少一个匹配,则返回行
    • LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
    • RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
    • FULL JOIN: 只要其中一个表中存在匹配,就返回行

    实例表结构如下:

    这里写图片描述

    这里写图片描述

    内连接

    INNER JOIN 与 JOIN 是相同的。
    在表中存在至少一个匹配时,INNER JOIN 关键字返回行。

    SELECT
        persons.FirstName,
        persons.LastName,
        orders.OrderNo
    FROM
        persons
    INNER JOIN orders ON orders.id_P = persons.Id_P
    ORDER BY
        persons.FirstName

    这里写图片描述

    左连接

    LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。

    我们想知道所有人的信息,以及他们的订单号,如果有的话!

    SELECT
        persons.FirstName,
        persons.LastName,
        orders.OrderNo
    FROM
        persons
    LEFT JOIN orders ON orders.id_P = persons.Id_P
    ORDER BY
        persons.FirstName

    LEFT JOIN 关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行。

    这里写图片描述

    右连接

    RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。

    我们希望列出所有的定单,以及定购它们的人 - 如果有的话。

    SELECT
        persons.FirstName,
        persons.LastName,
        orders.OrderNo
    FROM
        persons
    RIGHT  JOIN orders ON orders.id_P = persons.Id_P
    ORDER BY
        persons.FirstName

    这里写图片描述

    全连接

    只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。在某些数据库中, FULL JOIN 称为 FULL OUTER JOIN。

    我们希望列出所有的人,以及他们的定单,以及所有的定单,以及定购它们的人。相当于左连接和右连接相加!

    SELECT
        persons.FirstName,
        persons.LastName,
        orders.OrderNo
    FROM
        persons
    FULL  JOIN orders ON orders.id_P = persons.Id_P
    ORDER BY
        persons.FirstName

    由于Mysql不支持全连接,这里就不写运行结果,可以通过Union关键字组合左右连接得到相同的效果!

    自然连接

    自然连接,是对数据表进行笛卡尔积操作。

    SELECT
        persons.FirstName,
        persons.LastName,
        orders.OrderNo
    FROM
        persons,orders 
    where orders.id_P = persons.Id_P
    ORDER BY
        persons.FirstName

    这里写图片描述

    嵌套查询

    关于嵌套查询和连接查询的效率问题,下节课讨论

    展开全文
  • SQL语言查询基础:连接查询 通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。 在关系数据库管理系统中,表建立时各数据之间的关系不必确定,...
  • oracle 连接查询

    2010-10-11 13:30:00
    连接查询 连接查询 通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。 在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个...
  • 不过明确是编写那样代码有多简单,购买它们会有多昂贵以及它们需要多么昂贵和强大硬件。如果你什么中立观点(比如说没有被SUN和Microsoft百万美金所影响),请顺便通知我。 据我所知,JSP基于Java,...
  • SQL Server数据库链接查询方式相关知识是本文我们主要要介绍内容,我们知道,通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统一个标志。多表连接...
  • 日期类型 date 7字节 用于存储日期和时间数据,取值范围是公元前4712年1月1日至公元9999年12月31日,7字节分别表示世纪、年、月、日、时、分和秒 二进制数据类型 row 1~2000字节 可变长二进制数据,在具体...
  •  Collection是集合类上级接口,继承与他接口主要有Set 和List. Collections是针对集合类帮助类,他提供一系列静态方法实现对各种集合搜索、排序、线程安全化等操作。 13、&和&&区别。 &是位运算符...
  • SQL Server数据库链接查询方式相关知识是本文我们主要要介绍内容,我们知道,通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统一个标志。多表连接...
  • 一些创意SQL语句

    2008-07-01 13:29:00
     通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。  在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息...
  • 结构元数据API也向用户开放,同时支持在使用过程中,灵活调整映射关系,因此用户可以用API动态创建结构模型,从而实现各种动态类型表的映射(例如POJO中包含一Map,用于映射各种动态扩展字段)企业...
  •  通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统一个标志。多表连接查询是使用Sql基本操作,但连接的方式却多种,熟练使用这些连接方式能够简化Sql...
  • 本系统中使用射频卡为Mifare1 S50,也简称为M1卡,该卡16扇区,每扇区4块,每块可存储16 B数据。MF RC522对M1卡进行读写控制,分别寻卡、防碰撞、选卡、认证、读块和写块等过程。 MF RC522驱动...
  • sqljoin语法解析

    2020-05-17 18:34:10
    sql join子句主要是用于将两个或多个表结合起来,基于这些表之间的共同字段。 最常见的 JOIN 类型:SQL INNER JOIN(简单的 JOIN)、SQL LEFT JOIN、SQL RIGHT JOIN、SQL FULL JOIN,其中前一种是内连接,后三种是...
  • 入门学习Linux常用必会60命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    不同Linux发行版命令数量不一样,但Linux发行版本最少命令也200多个。这里笔者把比较重要和使用频率最多命令,按照它们在系统中作用分成下面六个部分一一介绍。 ◆ 安装和登录命令:login、shutdown、...
  • 16. hibernate进行表查询每个表中各取几个字段,也就是说查询出来结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate二级缓存 123 18、Spring 依赖注入是什么意思? 给一个 Bean message ...
  • (2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足...
  • (2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足...
  • 信号与槽机制常用的连接方式为 connect(Object1, SIGNAL(signal), Object2, SLOT (slot) signal|为对象 Object1的信号,sot为对象 Object2的槽,Qt的窗口部件都包含若十预定 义的信号和若干预定乂的槽。当一类被...
  • 随着博客人数增加, Blog 作为一种新生活方式、新工作方式、新学习方式已经被越来越多的人所接受,并且在改变传统网络和社会结构:网络信息不再是虚假不可验证,交流和沟通更明确选择和方向性,单一...
  • 问题4-16:以太网的覆盖范围受限的一原因是:如果站点之间的距离太大,那么由于信号传输时会衰减得很因而无法对信号进行可靠的接收。试问:如果我们设法提高发送信号的功率,那么是否就可以提高以太网的通信距离...
  • hibernate简介

    2019-10-02 04:42:34
    现在用的数据库大多数都是关系数据库,而关系数据库重在于表与表之间的关系连接。术语就为:一个持久化类和一个表对应,类的每个实例对应表的一条记录。其他就不说了,回到hibernate。ORM框架类型有,hibernate...
  • 1.8.4 在同一查询中次引用同一个表 27 1.8.5 使用衍生表 28 1.8.6 使用UNION组合结果集 29 1.9 使用APPLY来为每行调用表值函数 30 1.9.1 使用CROSS APPLY 30 1.9.2 使用OUTER APPLY 32 1.10 数据源...
  • Hibernate学习笔记

    2017-06-19 22:55:00
    现在用的数据库大多数都是关系数据库,而关系数据库重在于表与表之间的关系连接。术语就为:一个持久化类和一个表对应,类的每个实例对应表的一条记录。其他就不说了,回到hibernate。ORM框架类型有,hiberna...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 227
精华内容 90
关键字:

多个表之间的连接类型主要有