zoukankan      html  css  js  c++  java
  • 数据库(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表的每一行组合,笛卡尔积是:

    总结

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

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

  • 相关阅读:
    C# DataTable的用法详解
    Matlab绘图方法汇总
    java中Comparator的用法
    Java获取随机数
    jQuery动画高级用法——详解animation中的.queue()函数
    Oracle序列号详解
    jQuery验证框架教程
    二十四、按后退键退出Android程序
    同步synchronized用法
    jQuery 复选框全选反选
  • 原文地址:https://www.cnblogs.com/ldy-miss/p/12699904.html
Copyright © 2011-2022 走看看