连接_连接数据库 - CSDN
精华内容
参与话题
  • Sql连接操作

    千次阅读 2018-11-02 22:59:25
    自然连接(natural join) 自然连接(Natural join)是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。 如果关系R与S具有相同的属性组B,且该属性组的值...

    前言

    在介绍一下的内容之前,先介绍两个表:R和S,内容如下:

    表R

    A B C
    a1 b1 1
    a2 b2 2
    a3 b2 3
    a4 b3 4

    img

    表S

    B D
    b1 5
    b2 6
    b4 7

    img

    笛卡尔积

    两个表的笛卡尔积定义为:
    R×S={<t,g>tRANDgS} R \times S = \{<t,g> \mid t \in R \quad AND \quad g \in S\}
    即把两个表联系起来,列数为两表之和,行数为两表之积。
    如上面的两个表做笛卡尔积得到下面的表

    A B C B D
    a1 b1 1 b1 5
    a1 b1 1 b2 6
    a1 b1 1 b4 7
    a2 b2 2 b1 5
    a2 b2 2 b2 6
    a2 b2 2 b4 7
    a3 b2 3 b1 5
    a3 b2 3 b2 6
    a3 b2 3 b4 7
    a4 b3 4 b1 5
    a4 b3 4 b2 6
    a4 b3 4 b4 7

    笛卡尔积的sql语句如下:

    select * from R as r, S as s;
    

    img

    连接

    连接操作定义如下:

    R<>S=σ<>(R×S) R\bowtie_{<连接条件>}S = \sigma_{<连接条件>}(R\times S)

    连接即先做笛卡尔积,再在笛卡尔积生成的表上根据连接条件进行过滤。
    笛卡尔积包含两个表之间的所有组合,连接只包含满足连接条件的组合。
    没有连接条件的连接就是笛卡尔积。

    连接条件为两关系中对应属性的比较,对应的属性不一定同名,但是类型要一样。
    连接条件的普遍形式为:条件A and 条件2 and 条件3 … 条件k

    其中每个条件的普遍形式为: AiθBjθ{=,,<,,>,}A_{i} \theta B_{j}\quad \theta \in \{ =, \neq, <, \le, >, \ge\}

    各种连接的概念

    内连接

    向上面用 =,,<,,>,=, \neq, <, \le, >, \ge这种比较运算符判断条件的叫内连接。

    即内连接包括等值连接,不等值连接,自然连接(可以看做特殊的等值连接)。

    等值连接

    如果所有的条件的θ\theta都为==,则这种连接称为等值连接。

    如连接R和S中B列相等的值。

    select * from S join R on S.B = R.B;
    

    img

    注意:

    select * from S join R;
    
    select * from S, R;
    

    上面两句是等价的。两者都可以看成是两表之间的笛卡尔积。

    自然连接

    在等值连接的结果中,对应属性的值是相同的,没有必要重复列出,只在两个属性之间取一
    个,这种消除冗余属性的等值连接称为自然连接。

    如R和S的自然连接会去除重复的B这一列,并且比较B相等的值。
    R和S自然连接的结果:

    B D A C
    b1 5 a1 1
    b2 6 a2 2
    b2 6 a3 3

    sql语句如下:

    select * from S natural join R;
    

    img

    不等值连接

    使用除了等号的其他运算符:<,,>,,<, \leq, >, \ge, \ne 叫不等值连接

    外连接

    外连接是除了内连接的结果,还包括其中一个表或两个表的所有结果。具体理解看下面
    每一类的说明。

    外连接分为三类:左(外)连接,右(外)连接,全(外)连接。

    左(外)连接(left join or left outer join)

    左连接会从左表返回所有的行,即使与右表没有匹配。

    如连接条件为R.B=S.B时的等值连接会返回三行,当为左连接时,
    如R left join S,R的B=b3这一行一会返回,即使S中没有B=b3这一行。
    由于S中没有B=b3这一行,S中的值就被赋值为NULL(数据库不同,值可能不同)。

    select * from R left join S on R.B = S.B;
    

    img

    从上图可以看到,右表中不匹配的值为NULL

    右(外)连接(right join or right outer join)

    右连接与左连接相反,右连接会从右表中返回所有行,即使与左表不匹配。

    直接看实例

    select * from R right join S on R.B = S.B;
    

    img

    左连接和右连接的联系

    相对的操作。直接看下面的代码

    select * from R left join S on R.B = S.B;
    select * from S right join R on R.B = S.B;
    

    上面两句结果相同,交换两表的位置,把左连接变为右连接。

    可以看到 S.B = b4在R中没有,但是还是返回结果,R中的值设为NULL。

    全外连接(full join or full outer join)

    全连接即两表的左连接与右连接的并集。

    像mariadb没有全连接full join方法,就是用左连接并上右连接:left join union right join

    select * from R left join S on R.B = S.B 
    union 
    select * from R right join S on R.B = S.B;
    

    img

    其他

    交叉连接:网上有一些叫法,其实就是笛卡尔积,也是无条件连接。

    展开全文
  • SQL的连接分为三种:内连接、外连接、交叉连接

    万次阅读 多人点赞 2018-03-31 20:18:04
    先给出两张表:一、内连接: 内连接(INNER JOIN):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。1、等值连接 概念:在连接条件中...

    先给出两张表:


    一、内连接:

        内连接(INNER JOIN):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。

    1、等值连接

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

    例子:

    select  * 

    from T_student s,T_class c 

    where s.classId = c.classId

    等价于

    select  * 

     from T_student s inner join T_class c on s.classId = c.classId

    2、不等连接

       概念:在连接条件中使用除等于号之外运算符(>、<、<>、>=、<=、!>和!<)

    select * from T_student s inner join T_class c on s.classId <> c.classId

    二、外连接

        外连接分为左连接(LEFT JOIN)或左外连接(LEFT OUTER JOIN)、右连接(RIGHT JOIN)或右外连接(RIGHT OUTER JOIN)、全连接(FULL JOIN)或全外连接(FULL OUTER JOIN)。我们就简单的叫:左连接、右连接和全连接。

    1、左连接:

        概念:返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。

    例如:

    select  *

    from T_student s left join T_class c on s.classId = c.classId

    检索结果:

      总结:左连接显示左表全部行,和右表与左表相同行。

    2、右连接:

       概念:恰与左连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。

    例如:

         select * from  T_student s right join T_class c on s.classId = c.classId

    检索结果:

     总结:右连接恰与左连接相反,显示右表全部行,和左表与右表相同行。

    3、全连接:

      概念:返回左表和右表中的所有行。当某行在另一表中没有匹配行,则另一表中的列返回空值。

         select * from  T_student s full join T_class c on s.classId = c.classId

       总结:返回左表和右表中的所有行。

    三、交叉连接(CROSS JOIN):也称迪卡尔积

    概念:不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积(例如:T_student和T_class,返回4*4=16条记录),如果带where,返回或显示的是匹配的行数。

    1、不带where:

    1.    select *from T_student cross join T_class    //cross join 可以省略不写
    2.   等于
    3.    select *from T_student, T_class
    总结:相当与笛卡尔积,左表和右表组合。

    2、有where子句,往往会先生成两个表行数乘积的数据表,然后才根据where条件从中选择。

    1. select * from T_student s cross join T_class c where s.classId = c.classId   
    2.    (注:cross join后加条件只能用where,不能用on)  
          查询结果跟等值连接的查询结果是一样。


    展开全文
  • 用两个表(a_table、b_table),关联字段a_table.a_id和b_table.b_id来演示一下MySQL的内连接、外连接( 左(外)连接、右(外)连接、全(外)连接)。 MySQL版本:Server version: 5.6.31 MySQL Community Server ...

    用两个表(a_table、b_table),关联字段a_table.a_id和b_table.b_id来演示一下MySQL的内连接、外连接( 左(外)连接、右(外)连接、全(外)连接)。

    MySQL版本:Server version: 5.6.31 MySQL Community Server (GPL)

    数据库表:a_table、b_table

    主题:内连接、左连接(左外连接)、右连接(右外连接)、全连接(全外连接)

    前提

    建表语句:

    CREATE TABLE `a_table` (
      `a_id` int(11) DEFAULT NULL,
      `a_name` varchar(10) DEFAULT NULL,
      `a_part` varchar(10) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    CREATE TABLE `b_table` (
      `b_id` int(11) DEFAULT NULL,
      `b_name` varchar(10) DEFAULT NULL,
      `b_part` varchar(10) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8

    表测试数据:



    一、内连接

    关键字:inner join on
    语句:select * from a_table a inner join b_table bon a.a_id = b.b_id;
    执行结果:


    说明:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。

    二、左连接(左外连接)

    关键字:left join on / left outer join on
    语句:select * from a_table a left join b_table bon a.a_id = b.b_id;
    执行结果:


    说明:
    left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。
    左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。

    三、右连接(右外连接)

    关键字:right join on / right outer join on
    语句:select * from a_table a right outer join b_table b on a.a_id = b.b_id;
    执行结果:


    说明:
    right join是right outer join的简写,它的全称是右外连接,是外连接中的一种。
    与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。


    四、全连接(全外连接)

    MySQL目前不支持此种方式,可以用其他方式替代解决。

    五、补充,MySQL如何执行关联查询

    MySQL认为任何一个查询都是一次“关联”,并不仅仅是一个查询需要到两个表匹配才叫关联,所以在MySQL中,每一个查询,每一个片段(包括子查询,甚至基于单表查询)都可以是一次关联。
    当前MySQL关联执行的策略很简单:MySQL对任何关联都执行嵌套循环关联操作,即MySQL先在一个表中循环取出单条数据,然后在嵌套循环到下一个表中寻找匹配的行,依次下去,直到找到所有表中匹配的行为止。然后根据各个表匹配的行,返回查询中需要的各个列。请看下面的例子中的简单的查询:

    查询语句:select tbl1.col1, tbl2.col2 from tbl1 inner join tbl2 using(col3) where tbl1.col1 in (5, 6);
    假设MySQL按照查询中的表顺序进行关联操作,我们则可以用下面的伪代码表示MySQL将如何完成这个查询:
    outer_iter = iterator over tbl1 where col1 in (5, 6)
    outer_row = outer_iter.next
    while outer_row
        inner_iter = iterator over tbl2 where col3 = outer_row.col3
        inner_row = inner_iter.next
        while inner_row
            output [ outer_row.col1, inner_row.col2]
            inner_row = inner_iter.next
        end
        outer_row = outer_iter.next
    end
    上面的执行计划对于单表查询和多表关联查询都适用,如果是一个单表查询,那么只需要上面外层的基本操作。对于外连接,上面的执行过程仍然适用。例如,我们将上面的查询语句修改如下:
    select tbl1.col1, tbl2.col2 from tbl1 left outer join tbl2 using(col3) where tbl1.col1 in (5, 6);
    那么,对应的伪代码如下:
    outer_iter = iterator over tbl1 where col1 in (5, 6)
    outer_row = outer_iter.next
    while outer_row
        inner_iter = iterator over tbl2 where col3 = outer_row.col3
        inner_row = inner_iter.next
        if inner_row
            while inner_row
                output [ outer_row.col1, inner_row.col2]
                inner_row = inner_iter.next
            end
        else
            output [ outer_row.col1, null]
        end
            outer_row = outer_iter.next
    end
    说明:第五部分摘自《高性能MySQL 第三版》








    展开全文
  • 连接、左右连接和全连接的区别

    万次阅读 多人点赞 2019-05-24 15:15:41
    举例说明 假设您有两个表,每个表只有一个列,表数据如下 A B - - 1 3 2 4 3 5 4 6 ... 内连接是A表的所有行交上B表的所有行得出的结果集 select * from a INNER JOIN b on a.a = b.b; se...

    举例说明

    • 假设您有两个表,每个表只有一个列,表数据如下
      A    B
      -    -
      1    3
      2    4
      3    5
      4    6
      

      注意,(1,2)是A表唯一的,(3,4)是公共的,并且(5,6)是B表独有的

      内连接

      内连接是A表的所有行交上B表的所有行得出的结果集

      select * from a INNER JOIN b on a.a = b.b;
      select a.*, b.*  from a,b where a.a = b.b;
      
      a | b
      --+--
      3 | 3
      4 | 4
      

      左外连接

      左外连接是A表的所有行匹配上B表得出的结果集

    select * from a LEFT OUTER JOIN b on a.a = b.b;
    select a.*, b.*  from a,b where a.a = b.b(+);
    
    a |  b
    --+-----
    1 | null
    2 | null
    3 |    3
    4 |    4
    

    右外连接

    右外连接是B表的所有行匹配上A表得出的结果集

    select * from a RIGHT OUTER JOIN b on a.a = b.b;
    select a.*, b.*  from a,b where a.a(+) = b.b;
    
    a    |  b
    -----+----
    3    |  3
    4    |  4
    null |  5
    null |  6
    

    全连接

    全连接是A表的所有行并上B表的所有行得出的结果集

    select * from a FULL OUTER JOIN b on a.a = b.b;
    
     a   |  b
    -----+-----
       1 | null
       2 | null
       3 |    3
       4 |    4
    null |    6
    null |    5
    

     

    展开全文
  • HTTP协议——HTTP连接管理

    千次阅读 2018-07-02 11:21:47
    客户端应用程序可以打开一条TCP/IP连接连接到可能运行在世界任何地方的服务器应用程序。一旦连接建立起来了,在客户端和服务器的计算机之间交换的报文就永远不会丢失、受损或失序。1.1、TCP的可靠数据管控 HTTP...
  • 数据库左连接、右连接、内连接、全连接笔记

    万次阅读 多人点赞 2018-04-02 16:23:58
    原英文文章链接:...准备 表A: -- auto-generated definition CREATE TABLE table_a ( PK INT(10) NOT NULL PRIMARY KEY, Va...
  • 作者:lianghc 连接:...pandas提供了一个类似于关系数据库的连接(join)操作的方法merage,可以根据一个或多个键将不同DataFrame中的行连接起来 语法如下: merge(left, right, how='inner', on=No...
  • 关系代数运算之连接

    万次阅读 热门讨论 2017-08-18 20:09:52
    1.关于连接的理解:分别在关系R和S中取一列数据,比较所取两列的数据,如果两列数据有相同的,就将数据相同的那一行数据保留,其余行舍弃。如下例: 表a表示
  • 连接  连接的数据表相对应的匹配字段完全相等的连接连接关键字是 inner join 外连接 分为左外连接与右外连接、全连接。 左连接的结果集包括指定的左表全部数据与匹配的右表数据,右表中没匹配的全为空值....
  • 连接 ,右连接,内连接和全外连接的4者区别

    万次阅读 多人点赞 2020-06-13 11:54:41
     left join (左连接):返回包括左表中的所有记录和右表中连接字段相等的记录。  right join (右连接):返回包括右表中的所有记录和左表中连接字段相等的记录。  inner join (等值连接或者叫内连接):只...
  • Mysql—— 内连接、左连接、右连接以及全连接查询

    万次阅读 多人点赞 2019-08-14 10:44:52
    一、内连接查询 inner join 关键字:inner join on 语句:select * from a_table a inner join b_table b on a.a_id = b.b_id; 说明:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集...
  • Teamviewer显示“未就绪,请检查您的连接”解决办法

    万次阅读 热门讨论 2020-06-06 16:57:44
    Teamviewer显示“未就绪,请检查您的连接”,如图:解决办法:1.先将IP地址的DNS改为114.114.114.114,确定,尝试重启teamviewer。2.如果仍然不行,再将DNS改为自动获取,即可。3.如果上述两个方法都不行,请参考...
  • 用FileZilla连接服务器时,显示错误:错误:20秒后无活动,连接超时 错误:无法连接到服务器 解决方法: 检查基本的内容 主机是否写错 端口是否自定义,默认21 检查用户名和密码是否错误 如果连接的是外部服务器 ...
  • 对全连接层(fully connected layer)的通俗理解

    万次阅读 多人点赞 2020-01-01 19:48:09
    我的机器学习教程「美团」算法工程师带你入门机器学习 已经开始更新了,欢迎大家订阅~ 任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑...
  • 常用连接linux工具

    万次阅读 2020-08-13 15:35:12
    常用连接linux工具 一般我们装linux,基本上都是用来做服务器的,而且基本上服务器也只有一个主机,没有键盘和显示器,在无法接触到物理机的情况下,我们如何对服务器进行管理呢?本篇文章,将会介绍在工作中接触的...
  • 计算机如何建立远程桌面连接有的时候身在远方,想查看或者调用自己狗窝(宿舍或者家)里的机器的文件,怎么办呢?可以通过远程桌面登录自己个的电脑,利用剪切板的功能便可以实现文件之间的传送。当然,假如家里的...
  • 完美解决win10家庭版本系统无法远程连接问题

    万次阅读 多人点赞 2019-10-28 10:10:52
    近期需要对实验室的ftp服务器密码进行重新设置,然后就很理所当然的接入同一局域网,发现在连接的时候,报错 出现身份验证错误 要求的函数不受支持,CredSSP 加密 Oracle 修正 一个小伙伴自己重装过系统他就可以无...
  • 电脑显示已连接网络但是无internet访问

    万次阅读 多人点赞 2018-03-13 14:44:22
    电脑显示已连接网络但是无internet访问 自己电脑不知道出什么问题了,连接到无限网络但是无法访问,一开始以为是自己双系统的问题,然后自己在ubuntu那边是可以正常上网的。 下面是自己的解决方法 方法一: ...
  • win10无法连接windows服务器,无法连接SENS服务

    万次阅读 多人点赞 2019-07-19 09:57:41
    今天打开电脑,整个电脑的屏幕就只有一个鼠标图标,如图: 然后,逼得我只有强制性关机了,重新启动之后,就悲剧了 首先,进入windows界面的时候,前期加载速度变得极其慢,进入主界面之后,就是这样了 ...
  • VMware 虚拟机无法连接网络解决办法

    万次阅读 多人点赞 2020-03-06 13:10:07
    如果你发现在VMware下运行的虚拟机无法连接网络,那下面的方法也许可以帮 到你。(前提是你的物理网络是通的) 第一步:在VMware界面下 单击“编辑“→”虚拟网络编辑器” 第二步:单击”更改设置” 获取权限,...
1 2 3 4 5 ... 20
收藏数 5,328,343
精华内容 2,131,337
关键字:

连接