精华内容
下载资源
问答
  • 交叉连接图
    千次阅读
    2021-01-26 02:13:17

    1、内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符)。包括相等联接和自然联接。

    内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。

    2、外联接。外联接可以是左向外联接、右向外联接或完整外部联接。

    在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:

    1)LEFT  JOIN或LEFT OUTER JOIN

    左向外联接的结果集包括  LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

    2)RIGHT  JOIN 或 RIGHT  OUTER  JOIN

    右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

    3)FULL  JOIN 或 FULL OUTER JOIN

    完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

    3、交叉联接

    交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。

    FROM 子句中的表或视图可通过内联接或完整外部联接按任意顺序指定;但是,用左或右向外联接指定表或视图时,表或视图的顺序很重要。有关使用左或右向外联接排列表的更多信息,请参见使用外联接。

    例子:

    -------------------------------------------------

    a表 id name b表 id job parent_id

    1 张3 1 23 1

    2 李四 2 34 2

    3 王武 3 34 4

    a.id同parent_id 存在关系

    --------------------------------------------------

    1) 内连接

    select a.*,b.* from a inner join b on a.id=b.parent_id

    结果是

    1 张3 1 23 1

    2 李四 2 34 2

    2)左连接

    select a.*,b.* from a left join b on a.id=b.parent_id

    结果是

    1 张3 1 23 1

    2 李四 2 34 2

    3 王武 null

    3) 右连接

    select a.*,b.* from a right join b on a.id=b.parent_id

    结果是

    1 张3 1 23 1

    2 李四 2 34 2

    null 3 34 4

    4) 完全连接

    select a.*,b.* from a full join b on a.id=b.parent_id

    结果是

    1 张3 1 23 1

    2 李四 2 34 2

    null    3 34 4

    3 王武 null

    --------------------------------------------------------------------------------------------

    一、交叉连接(CROSS JOIN)

    交叉连接(CROSS JOIN):有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积(没有条件的inner join)。

    例如:下面的语句1和语句2的结果是相同的。

    语句1:隐式的交叉连接,没有CROSS JOIN。

    SELECT O.ID, O.ORDER_NUMBER, C.ID, C.NAME

    FROM ORDERS O , CUSTOMERS C

    WHERE O.ID=1;

    语句2:显式的交叉连接,使用CROSS JOIN。

    SELECT O.ID,O.ORDER_NUMBER,C.ID,

    C.NAME

    FROM ORDERS O CROSS JOIN CUSTOMERS C

    WHERE O.ID=1;

    语句1和语句2的结果是相同的,查询结果如下:

    二、内连接(INNER JOIN)

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

    例如:下面的语句3和语句4的结果是相同的。

    语句3:隐式的内连接,没有INNER JOIN,形成的中间表为两个表的笛卡尔积。

    SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAME

    FROM CUSTOMERS C,ORDERS O

    WHERE C.ID=O.CUSTOMER_ID;

    语句4:显示的内连接,一般称为内连接,有INNER JOIN,形成的中间表为两个表经过ON条件过滤后的笛卡尔积。

    SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAME

    FROM CUSTOMERS C INNER JOIN ORDERS O ON C.ID=O.CUSTOMER_ID;

    语句3和语句4的查询结果:

    三、外连接(OUTER JOIN):外连不但返回符合连接和查询条件的数据行,还返回不符合条件的一些行。外连接分三类:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。

    三者的共同点是都返回符合连接条件和查询条件(即:内连接)的数据行。不同点如下:

    左外连接还返回左表中不符合连接条件单符合查询条件的数据行。

    右外连接还返回右表中不符合连接条件单符合查询条件的数据行。

    全外连接还返回左表中不符合连接条件单符合查询条件的数据行,并且还返回右表中不符合连接条件单符合查询条件的数据行。全外连接实际是上左外连接和右外连接的数学合集(去掉重复),即“全外=左外 UNION 右外”。

    说明:左表就是在“(LEFT OUTER JOIN)”关键字左边的表。右表当然就是右边的了。在三种类型的外连接中,OUTER 关键字是可省略的。

    下面举例说明:

    语句5:左外连接(LEFT OUTER JOIN)

    SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME

    FROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;

    语句6:右外连接(RIGHT OUTER JOIN)

    SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME

    FROM ORDERS O RIGHT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;

    注意:WHERE条件放在ON后面查询的结果是不一样的。例如:

    语句7:WHERE条件独立。

    SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME

    FROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID

    WHERE O.ORDER_NUMBER<>'MIKE_ORDER001';

    语句8:将语句7中的WHERE条件放到ON后面。

    SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME

    FROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID AND O.ORDER_NUMBER<>'MIKE_ORDER001';

    从语句7和语句8查询的结果来看,显然是不相同的,语句8显示的结果是难以理解的。因此,推荐在写连接查询的时候,ON后面只跟连接条件,而对中间表限制的条件都写到WHERE子句中。

    语句9:全外连接(FULL OUTER JOIN)。

    SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME

    FROM ORDERS O FULL OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;

    注意:MySQL是不支持全外的连接的,这里给出的写法适合Oracle和DB2。但是可以通过左外和右外求合集来获取全外连接的查询结果。下图是上面SQL在Oracle下执行的结果:

    语句10:左外和右外的合集,实际上查询结果和语句9是相同的。

    SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME

    FROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID

    UNION

    SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME

    FROM ORDERS O RIGHT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;

    更多相关内容
  • 连接  1.left join  示例:SQL语句:select * from student left join course on student.ID=course.ID  左外连接包含left join左表所有行,如果左表中某行在右表没有匹配,则结果中对应行右表的部分全部为...
  • 连接分为:内连接、外连接、交叉连接 一、内连接——最常用 定义:仅将两个表中满足连接条件的行组合起来作为结果集。 在内连接中,只有在两个表中匹配的行才能在结果集中出现 关键词:INNER JOIN 格式:SELECT 列名...
  • MySQL连接查询(多表连接查询:内连接,外连接,交叉连接详解) 6:多表连接查询 笛卡尔乘积:如果连接条件省略或无效则会出现 解决办法:添加上连接条件 连接查询的分类: 1.按年代分类: 1)sql 92标准:仅仅...
  • 基本概念 关系模型(表) 关系模型由关系数据结构、关系操作集合和关系完整性约束三部分组成。...class=t_class 交叉连接(笛卡尔积)(CROSS JOIN) /* 交叉连接 */ SELECT * FROM student CROSS JOIN teacher

    基本概念

    关系模型(表)

    关系模型由关系数据结构、关系操作集合和关系完整性约束三部分组成。

    关系模型的数据结构非常简单:一张扁平的二维表。

    元组:二维表中的具有相同数据类型的某一行

    属性:二维表中的具有相同数据类型的某一列

    笛卡尔积(Cartesian product):又称直积,分别用集合A和集合B的一个元素作第一、第二元素构成有序对,所有这样的有序对的集合称为A和B的笛卡尔积,记作A×B。

    其符号化表示为:A×B = { | x∈A∧y∈B}。

    易证:若|A| = m,|B| = n,则|AB| = m*n。(|A|表示集合A的模,即 集合A中元素的个数为m个)

    例如:

    A={a, b}, B={0, 1, 2},则

    A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}

    B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}

    表:是实实在在地保存数据的实体,写入的数据都保存在表中

    视图:是一个虚拟表,其内容由查询定义。

    同真实的表一样,视图包含一系列带有名称的列和行数据;但是,视图并不在数据库中以存储的数据值集形式存在。

    行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

    候选码:若关系中的一个属性或属性组的值能够唯一地标识一个元组,且他的真子集不能唯一的标识一个元组,则称这个属性或属性组做候选码。

    主键:如果在一个关系中,有多个候选码可以选择,则选定其中的一个作为该关系的主键。

    它的值用于唯一地标识表中的某一条记录。主关键字是一种唯一关键字。

    码:是一个或多个属性的集合。

    超码:是一个或多个属性的集合,超码中的这些属性可以让我们在一个实体集中唯一地标识一个实体。

    注意:虽然超码可以唯一标识一个实体,但是可能大多数超码中含有多余的属性。所以我们需要候选码。

    候选码:是极小的超码集,也就是它的任意真子集都不是超码,而他本身是超码。

    主码:是被选中用来在一个关系中区分不同元组的候选码。

    我来举个例子吧:

    学生表(学号,身份证号,姓名,性别)

    超码:(学号,性别)→(姓名)。学号和性别能唯一标识姓名一点问题都没有,但是其实标识姓名,只用学号就能标识了,不需要性别。

    候选码:(学号)→(姓名),(身份证号)→(姓名)。学号或身份证号都能唯一标识姓名。

    主码:(学号)→(姓名)。这是人为选择的,其实身份证号也能做主码。

    连接

    所谓"连接",就是两张表根据关联字段(就是ON后面的关联条件),组合成一个数据集。

    内连接(inner join):(以左右表内匹配的记录为主)表示只包含匹配的记录。只返回两张表匹配的记录。

    外连接(outer join):表示还包含不匹配的记录。

    左连接(left join):(以左表所有的记录为主)又称左外连接,返回匹配的记录,以及表A多余的记录。

    右连接(right join):(以右表所有的记录为主)又称右外连接,返回匹配的记录,以及表B多余的记录。

    全连接(full join):(以两个表所有的记录为主)又称全外连接,返回匹配的记录,以及表A和表B各自的多余记录。

    交叉连接(cross join):即 做笛卡尔积运算。

    表A和表B不存在关联字段,这时表A(共有n条记录)与表B(共有m条记录)连接后,一对一组合配对,会产生一张包含n*m条记录的新表,返回新表。

    89e37d44b8eee00b20924b54c42617c9.png

    上图中,表A的记录是123,表B的记录是ABC,颜色表示匹配关系。返回结果中,如果另一张表没有匹配的记录,则用null填充。

    例子:

    学生表:

    3b2ed49f7219dfb70e3cbcff2e5374f9.png

    s_id:学生学号

    s_name:学生名称

    s_class:学生班级

    老师表:

    016a64a9edc84c3a3ca34889876d8294.png

    t_id:老师id

    t_class:老师管理的班级

    t_name:老师名称

    内连接(INNER JOIN)

    /* 内连接 */

    SELECT * FROM student INNER JOIN teacher ON s_class=t_class

    /* 我比较喜欢这种 */

    SELECT * FROM student,teacher WHERE s_class=t_class

    7cd69710a1579400921c0091ecaf29e0.png

    外连接(OUTER JOIN)

    左外连接(LEFT JOIN)

    /* 左连接 */

    SELECT * FROM student LEFT JOIN teacher ON s_class=t_class

    0beb318806b7921d5b4cfc6ce5e62e54.png

    右外连接(RIGHT JOIN)

    /* 右连接 */

    SELECT * FROM student RIGHT JOIN teacher ON s_class=t_class

    858cabbf9b46ef9159f9d7ad5e5eca9b.png

    全外连接(FULL JOIN)

    注意:Oracle数据库支持full join,mysql是不支持full join的,但仍然可以同过左外连接+union+右外连接实现。

    /* 全连接(不适用于MYSQL) */

    SELECT * FROM student FULL JOIN teacher ON s_class=t_class

    /* 全连接 */

    SELECT * FROM student LEFT JOIN teacher ON s_class=t_class

    UNION

    SELECT * FROM student RIGHT JOIN teacher ON s_class=t_class

    7ec05e58c68c5b1dd681fb2273828dec.png

    交叉连接(笛卡尔积)(CROSS JOIN)

    /* 交叉连接 */

    SELECT * FROM student CROSS JOIN teacher

    8e1f5d199ffb0e8ce07ac31b7899753b.png

    展开全文
  • 全外连接和交叉连接

    2022-05-08 19:01:34
    接下来分享的有全外连接和交叉连接,在学习全外连接的时候我们会接触到之前学过的左连接和右连接,那么接下来我们先从全外连接开始然后再到交叉连接顺便再复习一下左连接和右连接。 首先在学习全外连接之前我们先...

    接下来分享的有全外连接和交叉连接,在学习全外连接的时候我们会接触到之前学过的左连接和右连接,那么接下来我们先从全外连接开始然后再到交叉连接顺便再复习一下左连接和右连接。
    首先在学习全外连接之前我们先了解一下什么是全外连接,全外连接就是当左表和右表中存在匹配项时,将返回所有的值。
    在这里插入图片描述

    依旧是熟悉的整张图,可能会有些看不清但是没关系我们将它放大。
    在这里插入图片描述

    这样就好看多了,既然表已经新建成功了那么接下来我们就开始实现他的功能了。就如同我们上面说的那样全外连接是当左表和右表存在匹配项的时候返回所有的行。
    首先我们先将两张表全部查询出来,直接使用select * from som和select * from mem语句就好from后面接的是表的名称这点要注意了是名称不是别的。查出来是这样的
    在这里插入图片描述

    查询出来后我们再看其他的,将两张表连接起来使用FULL OUTER JOIN查询两张表中的数据。
    在这里插入图片描述

    以上是使用后查询出来的结果,有两个数据为空的数据行。
    接下来我们来了解交叉连接,通过交叉连接我们可以连接两个或多个不相关的表。是不是感觉很有用啊!使用cross join将每个表的每一行连接起来也就是返回两个表中行的笛卡尔积。但是和inner join 和
    Left join 不同,交叉连接不会在连接的表之间建立关系。
    在这里插入图片描述

    从这里可以看出cross join 从每一表中获取一行,然后为第二个表中的每一行创建一个新行,然后他就会对接下来的每一行执行相同的操作。这也就会为啥呢我们看到第二张表中的数据重复了两遍。
    换一个也是一样的情况。
    在这里插入图片描述

    展开全文
  • SELECT的查询对象由FROM子句指定,各个表用逗号分隔,这样就指定了交叉连接。 其格式为: FROM 表名1 [ [AS] 别名1 ] [ , 表名2[ [AS] 别名2]] … ; 【例】 members表和sell表进行交叉连???。 SELECT Book.*, Sell....
  • 连接-inner: 数学中的交集,使用比较运算符(= < >)根据每个表共有的列的值匹配两个表中的行 关键字:inner join on 语句: select *(column1,column2,colunmnN) from 表A inner join 表B on 表A.连接...

    目录


    以下为Postgresql实际操作测试数据,主要为了记录总结个人所得,可供大家参考,欢迎大家指出不当之处。

    示例表:

    表a,表b,表c,修改后的表c(表d)
    表a
    表b
    表c
    表d

    1.内连接-inner:

    数学中的交集,使用比较运算符(= < >)根据每个表共有的列的值匹配两个表中的行
    关键字:inner join on
    语句
    select *(column1,column2,colunmnN)
    from 表A
    inner join 表B
    on
    表A.连接字段=表B.连接字段;

    实例1:内连接表a和表b

    语句:select * from a inner join b on a.a_id = b.b_id;
    结果:
    在这里插入图片描述

    结论:

    1. 根据连接字段ID返回两个表中所有相同字段名、字段值

    实例2:内连接表a和表c

    语句:select * from a inner join c on a.a_id = c.c_id;
    结果:
    在这里插入图片描述

    实例3:内连接表a和表b,使用“>”号

    语句:select * from a inner join b on a.a_id > b.b_id;
    结果:
    在这里插入图片描述

    结论:

    1. 取出表a中一行中的id依次和表b中的每一行的id比较

    实例4:内连接表a和表b,使用“<”号

    语句:select * from a inner join b on a.a_id < b.b_id;
    结果:
    在这里插入图片描述

    实例5:内连接表a和表b,指定字段显示

    语句:select a_id,a_name,a_part,b_name,b_part from a inner join b on a.a_id = b.b_id;
    结果:
    在这里插入图片描述

    实例6:内连接表a和表b,指定字段并命名显示字段

    语句:select a_id as id,a_name,a_part,b_name,b_part from a inner join b on a.a_id = b.b_id;
    结果:
    在这里插入图片描述

    总结

    只显示根据条件匹配相同的字段值a_id,b_id的行数据
    说明:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。
    请添加图片描述

    2.左连接-left(左外连接)

    关键字:left join on / left outer join on
    语句
    select *(column1,column2,colunmnN)
    from 表A
    left join 表B
    on
    表A.连接字段=表B.连接字段;

    实例1:左连接表a和表b(左边表-表a,右边表-表b)

    语句: Select * from a left join b on a.a_id = b.b_id;
    结果:
    请添加图片描述

    实例2:左连接表a和修改后的表c(表d)

    语句: Select * from a left join c on a.a_id = c.c_id;
    结果:
    请添加图片描述

    结论:
    只要条件字段值id相同,就会显示所有的行数据,不管其他的字段值是否与之相同。简而言之,只要a_id和c_id值相同,就会显示对应的行数据!!!

    实例3:左连接表a和表b,使用“>”号

    语句: select * from a left join b on a.a_id > b.b_id;
    结果:
    请添加图片描述

    实例4:左连接表a和表b,使用“<”号

    语句: select * from a left join b on a.a_id < b.b_id;
    结果:
    请添加图片描述

    结论:
    结果与内连接表a和表b(使用“<”号)相同。好像一旦不使用“=”号,使用“<”、“>”的话,内连接和左连接达到的效果相同

    实例5:左连接表a和表b,指定字段显示

    语句: Select a_id,a_name,a_part,b_name,b_part from a left join b on a.a_id = b.b_id;
    结果:
    请添加图片描述

    总结:

    首先显示左边表(在实例中指表a)的所有数据,其次加上右边表(此处指表b)根据条件匹配相同的字段值a_id,b_id的行数据
    说明:
    left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。
    左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。

    3.右连接-right(右外连接)

    关键字: right join on / right outer join on
    语句:
    select *(column1,column2,colunmnN)
    from 表A
    right join 表B
    on
    表A.连接字段=表B.连接字段;

    实例1:右连接表a和表b

    Select * from a right join b on a.a_id = b.b_id
    结果:
    请添加图片描述

    实例2: 右连接表a和修改后的表c

    Select * from a right join c on a.a_id = c.c_id;
    结果:
    请添加图片描述

    实例3:右连接表a和表b,使用“<”号

    Select * from a right join b on a.a_id < b.b_id;
    结果:
    请添加图片描述

    结论:
    1.使用“<”,和内连接对比
    select * from a inner join b on a.a_id < b.b_id;
    结果:
    请添加图片描述

    总结:

    首先显示右边表(在实例中指表b)的所有数据,其次加上左边表(此处指表a)根据条件匹配相同的字段值a_id,b_id的行数据
    说明:
    right join是right outer join的简写,它的全称是右外连接,是外连接中的一种。
    与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。
    请添加图片描述

    4.交叉连接-cross

    关键字:cross join
    语句:
    select *(column1,column2,colunmnN)
    from 表A
    cross join 表B;

    实例1:交叉连接表a和表b

    **语句:**Select * from a cross join b;
    结果:
    请添加图片描述

    实例2:交叉连接表a和表b,指定字段显示

    语句: Select a_id,a_name,a_part from a cross join b;
    结果:
    请添加图片描述

    总结:

    1. 显示比所有数据更多数据,着重注意比较顺序:从左边(表a)开始,一对多比较

    5.外连接-full

    关键字: full join/full outer join on
    语句:
    select *(column1,column2,colunmnN)
    from 表A
    full join 表B
    on
    表A.连接字段=表B.连接字段;

    实例1:外连接表a和表b

    语句: select * from a full join b on a.a_id=b.b_id;
    结果:
    请添加图片描述

    实例2:外连接表b和表a

    语句: select * from b full join a on a.a_id=b.b_id;
    结果:
    请添加图片描述

    6.全连接-union

    关键字:union / union all
    语句:
    (select colum1,colum2…columN from tableA )
    union或者union all
    (select colum1,colum2…columN from tableB )

    实例1:不设置显示列名或两个表列名不同时

    语句: (select a_id,a_name,a_part from a) union all (select b_id,b_name,b_part from b);
    结果:
    请添加图片描述

    结论: 不设置显示列名或两个表列名不同时,以第一个sql 表列名为准

    实例2:两个表取出的列数或选择显示的列数不同时,报错

    语句:(select a_id,a_name from a) union (select b_id,b_name,b_part from b);
    结果:
    请添加图片描述

    表a取出两列:a_id,a_name,而表b取出三列:b_id,b_name,b_part————列数不同
    **结论:**通过union连接的SQL它们分别单独取出的列数必须相同

    实例3:设置显示字段名,如a_id as id,a_name as name,

    语句: (select a_id as id,a_name as name,a_part as part from a) union all (select b_id,b_name,b_part from b);
    结果:
    请添加图片描述

    实例4:union和union all的区别

    语句: (select a_id as id,a_name as name,a_part as part from a) union (select b_id,b_name,b_part from b);
    结果:
    请添加图片描述

    语句: (select a_id as id,a_name as name,a_part as part from a) union all (select b_id,b_name,b_part from b);
    结果:
    请添加图片描述

    结论:
    Union——显示不重复的数据(完全相等的行会被合并为一行)
    Union all——显示所有的数据(包括重复的行)
    由于union合并重复的行比较耗时,所以平时使用union all

    实例5:对结果排序(正序、倒序)

    语句:
    正序
    (select a_id as id,a_name as name,a_part as part from a) union all (select b_id,b_name,b_part from b) order by id;
    结果:
    请添加图片描述

    倒序
    (select a_id as id,a_name as name,a_part as part from a) union all (select b_id,b_name,b_part from b) order by id desc;
    结果:
    请添加图片描述

    总结:

    1. 不设置显示列名或两个表列名不同时,以第一个sql 表列名为准
    2. 与其他连接相比,需要取出某些列。通过union连接的SQL它们分别单独取出的列数必须相同
    3. Union——显示不重复的数据(完全相等的行会被合并为一行)
      Union all——显示所有的数据(包括重复的行)
      由于union合并重复的行比较耗时,所以平时使用union all
    4. 被union 连接的sql 子句,单个子句中不用写order by ,因为不会有排序的效果。但可以对最终的结果集进行排序;

    7.对比

    7.1 内连接、左连接和右连接使用“>”、“<”号的对比

    关联执行的策略

    Mysql:当前关联执行的策略很简单:对任何关联都执行嵌套循环关联操作,即先在一个表中循环取出单条数据,然后在嵌套循环到下一个表中寻找匹配的行,依次下去,直到找到所有表中匹配的行为止。然后根据各个表匹配的行,返回查询中需要的各个列。

    对比1:a_id > b.b_id;的三种情况

    请添加图片描述

    对比2:a_id < b.b_id;的三种情况

    请添加图片描述

    总结

    对比之后的结果要从比较顺序、保留数据两个方面来看:
    比较顺序:从左边(表a)开始,一对多比较、从右边(表b)开始,一对多比较(也就是前面所说的 关联执行的策略)
    保留数据:匹配(符合条件)数据、不匹配数据

    从左边(表a)开始,一对多比较

    因为它们都是从左边(表a)开始,第一轮取出左边的第一行数据,分别和右边的每一行数据对比。第二轮取出左边的第二行数据,分别和右边的每一行数据对比,,,,依次类推。
    请添加图片描述

    从右边(表b)开始,一对多比较

    从右边开始,第一轮取出右边的第一行数据,分别和左边的每一行数据对比。第二轮取出右边的第二行数据,分别和左边的每一行数据对比,,,,依次类推。
    请添加图片描述

    (1)比较顺序:
    内连接——从左边(表a)开始,一对多比较
    左连接——从左边(表a)开始,一对多比较
    右连接——从右边(表b)开始,一对多比较

    (2)保留数据:
    内连接——只保留匹配(按条件判断)的数据
    左连接——(在比较顺序的前提下)保留左边表的不匹配的数据+匹配数据
    右连接——(在比较顺序的前提下)保留右边表的不匹配的数据+匹配数据

    7.2 交叉连接和全连接的对比

    交叉连接效果图:

    请添加图片描述

    全连接效果图:

    Union(有去重的效果)
    请添加图片描述
    Union all(不排除重复的部分)
    请添加图片描述

    总结:

    1. 以上图只是大体效果图,具体行数据的排序不定

    7.3 postgresql与 Mysql的对比

    左连接对比

    Postgresql
    语句:select * from a left join b on a_id = b_id;
    请添加图片描述

    Mysql
    语句:select * from a left join b on a_id = b_id;
    请添加图片描述

    结论:
    结果一样,只是显示不一样

    交叉连接对比

    Postgresql
    语句:Select * from a cross join b;
    结果:
    请添加图片描述
    Mysql
    语句:Select * from a cross join b;
    请添加图片描述

    结论:
    Postgresql——比较顺序:从左边(表a)开始,一对多比较
    Mysql——比较顺序:从右边(表b)开始,一对多比较

    外连接对比

    Postgresql
    语句:select * from a full join b on a.a_id=b.b_id(或者a_id = b_id);
    结果:
    请添加图片描述

    Mysql
    语句:select * from a full join b on a_id = b_id;
    请添加图片描述

    结论:
    Postgresql——显示所有数据
    Mysql——只显示根据id相等的行数据

    总结:

    1.后面的条件约束(匹配字段)
    posgresql——可使用“a.a_id = b.b_id”形式,也可使用“a_id = b_id”形式
    mysql——只能使用使用“a_id = b_id”形式
    2. 在左连接中:
    结果一样,只是显示不一样
    3.在交叉连接中:
    Postgresql——比较顺序:从左边(表a)开始,一对多比较
    Mysql——比较顺序:从右边(表b)开始,一对多比较
    4.在外连接中:
    Postgresql——显示所有数据
    Mysql——只显示根据id相等的行数据

    引用:

    1. https://blog.csdn.net/plg17/article/details/78758593?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
    2. https://blog.csdn.net/zjt980452483/article/details/82945663
    3. https://www.runoob.com/postgresql/postgresql-join.html
    展开全文
  • SQL三种连接:内连接、外连接、交叉连接一、交叉连接(CROSS JOIN)二、内连接(INNER JOIN)三、外连接(LEFT JOIN、RIGHT JOIN、FULL JOIN)1.左外连接2.右外连接3.完整外连接 准备两张表并以PersonId相关联。 一...
  • 无论是光路交换还是光突发交换,都离不开有光开关矩阵组成的光交叉连接节点(OXC)。OXC节点是组建波分复用光网络的基本单元,OXC节点引入的串扰成为限制其投入实用的主要原因。理论分析了基于扩展Benes(DB)结构和改进...
  • 一、交叉连接、内连接、外连接的区别 交叉连接又叫’笛卡尔积’,它是指不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配。 内连接 则是只有条件的交叉连接,根据某个条件筛选出符合条件的...
  • MySQL交叉连接

    2021-01-19 08:15:26
    连接查询包括交叉连接查询、内连接查询、外连接查询交叉连接交叉连接返回的结果,是被连接的两个表中所有数据行的笛卡尔积,也就是返回第一个表中符合查询条件的数据行数,乘以第二个表中符合查询条件的数据行数比如...
  • 数据库中外连接,内连接,交叉连接的详细介绍
  • 一、 多表查询引入 实际开发中往往需要针对两张甚至更多张数据表进行操作,而这多张表之间需要使用主键和外键关联在...交叉连接(CROSS JOIN)是对两个或者多个表进行笛卡儿积操作,所谓笛卡儿积就是关系代数里的一个
  • 自然连接 (Natural Join) 是一种特殊的内连接,它要求相连接的两张表的连接依据列必须是相同的字段(字段名相同,字段属性相同)。 在自然连接中两张表的所有名称相同的列都将被比较,并且在结果集中把重复的列...
  • SQL的几种连接:内连接、左联接、右连接、全连接、交叉连接
  • SQL内连接、外连接、交叉连接内连接(inner join)外连接(outer join)左外连接右外连接全连接(full join)交叉连接(cross join)隐式交叉连接与显式交叉连接自连接自然连接(natural join) 内连接(inner join...
  • 核心:交叉连接 select A.column1,A.column2,B.column1,B.column2 from A cross join B; 交叉连接就是做笛卡尔积 计算 原理如下 具体原理百度 解读示例: A表有2行数据 , B表有3行数据 交叉连接后,产生一个新表 C...
  • 二:连接类型连接分为三种:内连接、外连接、交叉连接。1:内连接使用比较运算符(包括=、&gt;、&lt;、&lt;&gt;、&gt;=、&lt;=、!&gt;和!&lt;)进行表间的比较操作,查询与连接条件...
  • 交叉连接设备分类有哪些光交叉连接应用于哪里.docx
  • 右连接、左连接、全连接、内连接、交叉连接、自连接.pdf
  • 连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。 外连接连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行,外连接包括左外连接、右外连接和全外连接。 用一张题来...
  • 1、SQL Server自连接 定义:自联接用于将表连接到自身(同一个表)。 它对于查询分层数据或比较同一个表中的行很有用。 自联接使用内连接或左连接子句。 由于使用自联接的查询引用...2、SQL Server交叉连接(cross join)
  • sql表连接分成 外连接 、 内连接 和 交叉连接。. 外连接包括三种,分别是左外连接、右外连接、全外连接。. 对应的sql关键字:LEFT/RIGHT/FULL OUTER JOIN,通常我们都省略OUTER关键字,写成LEFT/RIGHT/FULL JOIN。. 在左...
  • mysql--交叉连接

    2020-08-08 15:41:27
    #交叉连接 SELECT b.*,bo.* FROM beauty b CROSS JOIN boys bo;
  • 交叉连接(笛卡尔积)

    千次阅读 2021-08-25 14:47:36
    什么是笛卡尔积(交叉连接交叉连接(Cross Join),又称“笛卡尔连接(Cartesian Join)”或“叉乘(Product)”,它是所有类型的内连接的基础。 如果把表视为行记录的集合,那么交叉连接即返回这两个集合的...
  • 笛卡尔积 笛卡尔积(Cartesian product)是指两个集合 X 和 Y 的乘积... 结论: 通过交叉连接的方式进行多表查询的方法并不常用,表的数量较多时,交叉连接会非常非常慢,所以我们应该尽量避免这种查询,需要加条件避免
  • 数据库连接分为:内连接 外连接 交叉连接 (即笛卡尔积)   内连接(INNER JOIN):分为三种:等值连接、自然连接、不等连接  外连接(OUTER JOIN):分为三种:左外连接(LEFT JOIN)、右外连接(RIGHT JOIN...
  • 交叉连接和全连接

    千次阅读 2015-03-27 19:24:01
    全外连接是在结果中除了显示满足连接的条件的行外,还显示了join两侧表中所有满足检索条件的行。 SQL> select e.empno,e.ename,e.sal,d.grade  2 from emp e full outer join salgrade d  3 on e.sal between d...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 168,331
精华内容 67,332
关键字:

交叉连接图