数据库(join) 内连接、外连接、笛卡尔积

今天,重刷了刷leetcode数据库的题目,对数据库连接查询做一个记录。

数据库(join) 内连接、外连接、笛卡尔积

内连接(自身连接)

内连接有隐式内连接和显示内连接两种:

  • 隐式(无join),from后跟多个表名,生成的中间临时表是全部笛卡尔积。最后用where条件筛选

    • 例如:

      select A.Name
      from Employee as A, Employee as B
      where A.ManagerId=B.Id and A.Salary>B.Salary
      
  • 显示(有join),中间临时表是经过ON子句过滤后的笛卡尔积。最后用where条件筛选
    • 例如:a [INNER] JOIN b ON a.id=b.id
    • select A.name as Employee
      from Employee As A inner join Employee as B on A.ManagerId=B.Id
      where A.Salary>B.Salary
      

差异:隐式生成的是全部笛卡尔积,连接时生成的中间临时表更大。on条件是生成中间临时表的过滤条件;where条件是在临时表生成好后,再对临时表进行过滤的条件。

外连接

外连接有左连接、右连接、全连接三种:

  • 左连接 a LEFT JOIN b ON a.id=b.id

    • 左边为主表,保留所有行(即使在右表没有匹配的行),右表输出满足 on 条件的行,不满足的输出null

      select A.FirstName, A.LastName, B.City, B.State
      from Person as A left join Address as B on A.PersonId=B.PersonId
      
  • 右连接 a RIGHT JOIN b ON a.id=b.id
    • 右边为主表,保留所有行(即使在左表没有匹配的行),左表输出满足 on 条件的行,不满足的输出null

      select A.FirstName, A.LastName, B.City, B.State
      from Person as A right join Address as B on A.PersonId=B.PersonId
      
  • 全连接 a FULL JOIN b ON a.id=b.id
    • MySQL不支持全连接。一定要使用的话可以用左连接+右连接+去重=全连接。

笛卡尔积(交叉连接)

定义:是指在数学中,两个集合 X 和 Y 的乘积 X * Y。

它不带WHERE子句,返回被连接的两个表所有数据行的乘积。a CROSS JOIN b , cross join可以省略。

select * from Person as A cross join Address as B
select * from Person as A, Address as B

例如,两个表如图:

A表的每一行会和B表的每一行组合,笛卡尔积是:

总结

子查询执行时系统要先把子查询转化成连接查询来实现,因此连接查询执行时效率更高。

子查询是把问题细分成子问题,然后解决,更符合人们的解决问题习惯。但是因为效率的原因,遇到一个问题尽量用连接查询实现,如果连接查询实现时很复杂或者实现不了,则可以考虑使用子查询实现。

原文地址:https://www.cnblogs.com/ldy-miss/p/12699904.html

时间: 2024-08-29 20:42:04

数据库(join) 内连接、外连接、笛卡尔积的相关文章

oracle 内连接(inner join)、外连接(outer join)、全连接(full join)

转自:https://premier9527.iteye.com/blog/1659689 建表语句: create table EMPLOYEE(EID NUMBER,DEPTID NUMBER,ENAME VARCHAR2(200)) create table DEPT(DEPTID NUMBER,DEPTNAME VARCHAR2(200)) oracle中的连接可分为,内连接(inner join).外连接(outer join).全连接(full join),不光是Oracle,其他很

内连接 外连接 交叉连接

数据库表连接大致分为三种:交叉连接.内连接.外连接 交叉连接(CROSS JOIN):其实就是内连接的一种特例,不带查询条件 内连接(INNER JOIN):相等连接.不等连接.自然连接 外连接(OUTER JOIN):左外联接.右外链接.全外连接(全外连接只有部分RDBMS系统可以做到,例如Oracle.做不到的有MySQL.SQL Server.Access) 交叉连接: 最简单,返回多张表每一行相乘的结果,也就是笛卡尔积.关键字是 CROSS JOIN 写法有三种:CROSS JOIN ,

内连接 外连接 自连接 交叉连接

======================================================== My SQL如下: ======================================================== 1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和courses表中学生标识号相同的所有行. 2.外联接.外联接

SQL中的内连接外连接和交叉连接是什么意思?

内连接又分为等值连接.自然连接和不等连接三种. 外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN).右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种.与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时).右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行. 交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,

SQL内连接-外连接join,left join,right join,full join

1.创建测试表test1及test2 SQL> CREATE TABLE TEST1(ID NUMBER,NAME VARCHAR2(20)); 表已创建. SQL> create table test2(id number, country varchar2(10)); 表已创建. INSERT INTO TEST1 VALUES(1,'name1'); INSERT INTO TEST1 VALUES(2,'name2'); INSERT INTO TEST1 VALUES(3,'name

数据库操作-内连接外连接

内连接: 只连接匹配的行 左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行 右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行 全外连接: 包含左.右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行. /**************************************************************************************/ 表A id   n

左连接,右连接,内连接,外连接, join, left join, right join ,mysql ,oracle

2016-6-12 22:35:51 工作用了一年多的oracle,最近在学mysql, 仔细想想 各种连接,感觉这些概念还是蛮烦人的! 最近整理了一下,分享一下自己的理解,有些东西是借鉴网上并自己吸收了的. 1.不管是什么连接,oracle和mysql的原理是一模一样的,只是有些写法不一样而已.说到写法,这里提一下, select * from A, B where a.filed1=b.filed2; --这是第1种写法, 内连接,这样写,很方便, oracle和mysql通用 select

sql 内连接 外连接 左连接 右连接

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

【cl】多表查询(内、外连接)

交叉连接(cross join):该连接产生的结果集笛卡尔积 a有7行,b有8行    a的第一行与b的每一行进行连接,就有8条a得第一行 7*8=56条 select a.real_name,s.unix_host,s.os_username from account a cross  join service s:(56条) select a.real_name,s.unix_host,s.os_username from account a cross  join service s wh