实操-mysql表连接笛卡尔积(join、left join)

1、为什么两张表连接会出现重复数据

2、表的连接过程是怎样的?

举例:

  表A:

    1

    0

  表B:

    1

    0

    0

    2

  执行语句:select * from A join B on A.id = B.id;

  顺序如下:

    join形成的表:

      1 1

      1 0

      1 0

      1 2

      0 1

      0 0

      0 0

      0 2

    on之后:

      1 1

      0 0

      0 0

  所以表连接后出现了重复数据

  

  两张表的关系存在一对多的关系,所以就会出现重复情况

什么是笛卡尔积呢?  就是两张表连接的时候,是通过笛卡尔积的方式连接。  笛卡尔(Descartes)乘积又叫直积。假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。可以扩展到多个集合的情况。类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。  所以两个表连接后(使用join、逗号连接)就是笛卡尔积。

  无论是join还是left join,都是先把表以笛卡尔积的方式连接,然后通过on来筛选数据,join只显示符合条件的数据,left join不仅会显示所有满足条件的数据,而且还会把主表没有匹配上的也显示出来  

  

  
  

  left join后面必须加上on

  


      

  

  

原文地址:https://www.cnblogs.com/smallpigger/p/8400589.html

时间: 2024-10-06 14:13:16

实操-mysql表连接笛卡尔积(join、left join)的相关文章

MySQL Study之--MySQL 表连接

MySQL Study之--MySQL 表连接 一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON condition table1:左表:table2:右表. JOIN 按照功能大致分为如下三类: INNER JOIN(内连接,或等值连接):取得两个表中存在连接匹配关系的记录. LEFT JOIN(左连接):取得左表(table1)完全记录,即是右表(table2)并无对应匹配记录

Mysql 表连接查询

1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和courses表中学生标识号相同的所有行.       2.外联接.外联接可以是左向外联接.右向外联接或完整外部联接.     在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:     1)LEFT  JOIN或LEFT OUTER JOIN     左向外联接的结果集包括  LEF

Mysql表连接查询

原文地址: https://www.cnblogs.com/qiuqiuqiu/p/6442791.html 1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和courses表中学生标识号相同的所有行. 2.外联接.外联接可以是左向外联接.右向外联接或完整外部联接. 在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定: 1)LEFT JOIN或L

Mysql表连接

当需要同时显示多个表中的字段时,就可以用表连接来实现这样的功能. 从大类上分,表连接分为内连接和外连接,它们之间的最主要区别是內连接仅选出两张表中互相匹配的记录,而外连接会选出其他不匹配的记录.我们最常用的是内连接. 例如:查询出所有雇员的名字和所在部门名称,因为雇员名称和部门分别存放在表emp 和dept 中,因此,需要使用表连接来进行查询: select ename,deptname from emp,dept where emp.deptno=dept.deptno; ename是表emp

mysql表连接,子查询以及if判断

创建表: CREATE TABLE emp ( ename varchar(10) DEFAULT NULL, hiredate date DEFAULT NULL, sal decimal(10,2) DEFAULT NULL, deptno int(2) DEFAULT NULL, age int(3) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 CREATE TABLE dept ( deptno int(2) DEFAULT NUL

MySQL 表连接

MySQL数据库表有4种连接方式: 左连接(左外连接) 右连接(右外连接) 等值连接(内连接) 全连接(全外连接) 以下,小编将依次简要介绍,希望能对初学的小伙伴们有所裨益. 首先先介绍下将要使用的两张数据库表 表a 表b 表b中的uid字段,与表a中id字段相对应. 表a中id为6的记录,在表b中没有体现,表b中id为9,uid为7的记录在表a中没有体现. 建表语句如下: 1 SET NAMES utf8mb4; 2 SET FOREIGN_KEY_CHECKS = 0; 3 4 -- ---

mysql表连接的时候注意事项

1. null值与null值是不可以连接的 2. 如果希望像null与null进行连接可以有如下方式 select * from ceview LEFT JOIN caview on IFNULL(ceview.ce, -1) = IFNULL(caview.ce,-1) and ceview.ca = caview.ca 3. 在postgresql中使用 select * from ceview LEFT JOIN caview on coalesce(ceview.ce, -1) = co

SQL 中不同类型的表连接

http://www.linuxidc.com/Linux/2012-08/68035.htm 1.简介 在关系型数据库中,join操作是将不同的表中的数据联合在一起时非常通用的一种做法.首先让我们看看join是如何操作的,然后我们探索一下当join和where语句同时存在的时候的执行顺序问题,最后来谈一谈不同类型的join的顺序问题. 2.建立初始的测试表结构(建表语句到这里下载) 表建立完之后,将会看到如下三个表. 我们将通过以上三个表来演示join操作.这三个表都是用来做演示的,所以我并没

表连接方式

--表连接方式1.Hash join:优化器使用两个表中较小的表(或数据源)利用连接键(HASH KEY)在内存中建立散列表(HASH表),然后扫描较大的表并探测散列表,找出与散列表匹配的行.如果hash表太大则无法在内存中完全放入,这时候优化器就分成不同区,把不能放入内存的分区放入到磁盘临时段,此时有较大的临时段来提高i/o性能.默认值指定方式:USE_HASH(table_name1 table_name2) 2.Nested loops:工作方式是从一张表(驱动表outer table,结