• SQL 中的JOIN两表或者多表连接问题


    SQL数据库中的表连接

    含义:连接即是把两个表或者两个以上的表信息放置在一个结果集中

    分类:

    1.内部连接
    2.外部连接
    3.完全连接
    4.交叉连接

    内部连接是连接类型中最普通的一种,与大多数连接一样,内部连接根据一个或几个相同的字段将记录匹配在一起,但是内部连接仅仅返回那些存在的字段匹配的记录。

    Use northwind
    select products.*,suppliers.supplierid from products inner 
    join suppliers on products.supplierid=suppliers.supplierid
    
    
    use pubs
    select a.au_lname+', '+a.au_fname as author,t.title from authors a
    join titleauthor ta on a.au_id=ta.au_id join titles t on t.title_id=ta.title_id

    外部连接时必需跟上左侧连接还是右侧连接。

    Use pubs
    select discounttype,discount,s.stor_name from discounts d 
    left outer join stores s on d.stor_id=s.stor_id
    
    select discounttype,discount,s.stor_name from discounts d 
    right join stores s on d.stor_id=s.stor_id

    完全连接是将join两侧的数据全部匹配,并返回所有记录。

    Use pubs
    
    select discounttype,discount,s.stor_name from discounts d 
    full join stores s on d.stor_id=s.stor_id

    交叉连接不使用on运算符,而将join左侧的所有记录与另一侧的所有记录连接,返回的是join两侧表记录的笛卡尔积。(总数据条数为左侧表内数据条数乘以右侧表数据条数之积)

    Use pubs
    
    select discounttype,discount,s.stor_name from discounts d 
    cross join stores s

    上边只是把定义和简单的例子列举,下边用一个通俗简单的例子说明join连接中两表或者两表以上的数据连接获取到的数据集的情况

    准备工作,先建立三张数据表,TABLEA,TABLEB,TABLEC,TABLEA表中有B,C表中的ID代码如下

    //TABLEA表有B,C表中的两个ID,BID,CID
    
    
    
    
    
    CREATE TABLE [dbo].[TableA]( [id] [
    int] IDENTITY(1,1) NOT NULL, [A] [varchar](50) NULL, [Bid] [varchar](50) NULL, [Cid] [int] NULL, CONSTRAINT [PK_TableA_1] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
    //TABLEB表
    
    
    
    
    CREATE TABLE [dbo].[TableB]( [id] [
    int] IDENTITY(1,1) NOT NULL, [name] [varchar](50) NULL, CONSTRAINT [PK_TableB] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
    //TABLEC表
    
    
    
    CREATE TABLE [dbo].[TableC]( [id] [
    int] IDENTITY(1,1) NOT NULL, [Cname] [varchar](50) NULL, CONSTRAINT [PK_TableC] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
    //TABLEA表数据添加后
    1    A    1    1
    2    A    6    2
    //TABLEB表数据添加后
    id    name
    1    B
    2    B
    3    B
    4    B
    5    B
    //TABLEC
    id    Cname
    1    C
    2    C
    3    C
    4    C
    5    C

    两表连接时

    一、Inner join on 连接
    代码:SELECT * FROM TABLEB B INNER JOIN TABLEA A ON B.ID=A.BID

    结果:id name id A Bid Cid
             1   B     1 A  1   1

    分析:匹配后的结果只显示符合ON后条件的结果集,不符合则不显示

    二、Outer join on (外连接)

    1、左连接

    代码:SELECT * FROM TABLEB B LEFT OUTER JOIN TABLEA A ON B.ID=A.BID

    结果:

    id    name    id    A    Bid    Cid
    1    B    1    A    1    1
    2    B    NULL    NULL    NULL    NULL
    3    B    NULL    NULL    NULL    NULL
    4    B    NULL    NULL    NULL    NULL
    5    B    NULL    NULL    NULL    NULL

    分析:外左连接时左侧为需要显示全部信息的表,右侧把没有匹配ON条件的地方全部补为NULL

    2、右连接

    代码:(待续)

  • 相关阅读:
    新买的电脑桌面只有回收站该做些什么
    不安装oracle客户端也可以使用pl/sql developer
    Win7上安装Oracle数据库
    忘记oracle的sys用户密码怎么修改
    UML中类之间的关系
    JAVAEE 是什么,如何获取各种规范jar包及各种规范的jar包源码
    PL/SQL Developer使用技巧、快捷键
    Windows 7上安装Microsoft Loopback Adapter(微软环回网卡)
    超棒的30款JS类库和工具
    HTTP协议
  • 原文地址:https://www.cnblogs.com/nyzhai/p/2831357.html
Copyright © 2020-2023  润新知