mysql 外连接 内连接 自连接 ,自然连接,交叉连接

2022年11月13日13:28:53
  • 自连接(最特殊)
  • 将同一张表
  • 查询 xx的名字,和上级的名
  • 而同一行的记录中没有上级的名字只有上级的编号

例子: 查询改员工的员工名字 以及直接上级的名字

结果:

  • -- 小结: 1 一张表当做两张表来使用
  • -- 2.需要取别名(表分别取别名)再加筛选条件 where 员工.mgr指向上级的编号
  • -- 3列名不明确,可以给列取别名

内连接

例题:   找出学生表与成绩表中都存在的学生信息

内连接,如果用学生id 来连接,就是找出时存在与两张表中的i学生d,然后就可以选择性地展示这些学生id后面的数据

1. 行数据: 通过  where 语句来筛选要展示

2,列数据: 通过select 来选择展示字段

感觉跟 select  *  from   biao 1 biao2  where   biao1.xx=biao2.xx   查不多只是性能上有不同

仅供参考:额   (where先合并再过滤条件,on是先过滤条件再合并!?)

  -- 感觉也是把两张表连起来(普通多表查询与内连接区别)

      -- 区别  :  on是先筛选后关联,优先级高,所以先做hash筛选匹配,再两张表合并
             --  where 是先关联合并表后   筛选匹配(量大),
           --  on指匹配到一条需要的记录后就结束,其他的不匹配,然后合并表,
           -- 而where的会一直匹配直到结束,再合并表

         --  on 匹配到相同的数据 ->   join (合并)  ->  select查询
        --  合并biao1,biao2 ,    -->where 对合并的所以信息筛选 -->select 查询
         -- on 效率高    先hash,后合并,效率  0 logN
         -- where 效率低:  多个from笛卡尔集 合并 再筛选  0(n^2)

例题:      查询程维的订单数量

    普通笛卡尔积多表查询:

  SELECT  SUM(数量)FROM  销售表,员工信息 WHERE  销售表.员工工号  = 员工信息.工号 
  AND 员工信息.姓名="程维"

   内连接join

 SELECT SUM(数量) FROM  员工信息 JOIN 销售表  ON  员工信息.工号=销售表.员工工号
    
    WHERE 姓名="程维"
  • 外连接

  • 左外连接(如果左侧的表完全显示【左侧的表即使某些字段的记录没有与另外一个表字段关联也会显示】)
  • 右外连接同理

 全外连接 :结果表中除了满足连接条件的行外,还包括两个表的所有行(单行所有记录重复的去重)

 例子:

准备两张简单的表   -- m2表  学生的id   学生的分数    -- m1表   学生的id   学生num绩点

左连接 测试:     没有分数的学生的id也显示出来了

  SELECT  *  FROM  m1 LEFT JOIN m2 ON m1.id=m2.id

右测试:   没有绩点的的学生的id也显示出来

全外连接: 目前mysql  有这种说发   x biao  full  join  y biao   但是现在不支持这种写法了,可以用union 联合查询

 SELECT  *  FROM  m1 LEFT JOIN m2 ON m1.id=m2.id  -- m2 没有分数的学生id也显示出来
     UNION  
    SELECT  *  FROM  m1 RIGHT JOIN m2 ON m1.id=m2.id -- m1 没有绩点的的学生的id也显示出来

  ps :这里可以再测试一下  union  all 的区别

可以发现union all 会在全外连接的基础删,对表中记录完全相同的记录也会重复显示

交叉连接

交叉连接(又名笛卡尔积)
首先,先简单解释一下笛卡尔积。

有两个集合A和B,A = {0,1} B = {2,3,4}

集合 A×B 和 B×A的结果集就可以分别表示为以下这种形式:

A×B = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)};
B×A = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)};
以上A×B和B×A的结果就可以叫做两个集合相乘的‘笛卡尔积’。

从以上的数据分析我们可以得出以下两点结论:

两个集合相乘,不满足交换率,既 A×B ≠ B×A; A集合和B集合相乘,包含了集合A中元素和集合B中元素相结合的所有的可能性,即两个集合相乘得到的新集合的元素个数是 A集合的元素个数 × B集合的元素个数。

交叉连接:

SELECT * from 表1 JOIN 表2;
交叉连接实际上是将两个表进行笛卡尔积运算,结果表是由第一个表的每一行与第二个表的每一行拼接后形成的表,称为‘笛卡尔积表’,结果表的行数等于两个表的行数之积。

如果两张表的数据量都比较大的话,那样就会占用很大的内存空间这显然是不合理的。所以,我们在进行表连接查询的时候一般都会使用JOIN xxx ON xxx的语法,ON语句的执行是在JOIN语句之前的,也就是说两张表数据行之间进行匹配的时候,会先判断数据行是否符合ON语句后面的条件,再决定是否JOIN。

因此,有一个显而易见的SQL优化的方案是,当两张表的数据量比较大,又需要连接查询时,应该使用 FROM table1 JOIN table2 ON xxx的语法,避免使用 FROM table1,table2 WHERE xxx 的语法,因为后者会在内存中先生成一张数据量比较大的笛卡尔积表,增加了内存的开销。

自然连接

 --  自然 内、外 连接(自然连接)

      -- 自然内连接(就是我们平时用的最多的两张表合并,做笛卡尔积)
      --  (只不过它已经自动帮我们匹配等连接条件)

      SELECT  *  FROM  USER NATURAL JOIN score

      -- ps:  与内连接     (inner) join   只是换了一个单词
      --  自然连接的特别之处就是自动帮我们匹配了等连接

      --  自然外连接同理

作为学习笔记只是参数昂

  • 作者:IT_WXD.
  • 原文链接:https://blog.csdn.net/qq_54250695/article/details/124172435
    更新时间:2022年11月13日13:28:53 ,共 2330 字。