• 表的连接分析(内,自,外连接)


    表的连接分析(内,自,外连接)

      下面我会说下数据库的表的连接,建立A,B表数据如下

    A表

    这里写图片描述

    B表

    这里写图片描述

    内连接(inner join)

      使用比较运算符(包括=、>、<、<>、>=、<=、!>和!<)进行表间的比较操作,查询与连接条件相匹配的数据。根据比较运算符不同,内连接分为等值连接和不等连接两种。

    语法

    内连接

    select * 
    from A inner join B  
    on A.NO = B.NO 
    

    结果为:

    这里写图片描述

    1.等值连接

      概念:在连接条件中使用等于号(=)运算符,其查询结果中列出被连接表中的所有列,包括其中的重复列。

    select * from tableA A 
    innerjoin tableB B  
    on A.NO = B.NO 
    

    2、不等连接

      概念:在连接条件中使用除等于号之外运算符(>、<、<>、>=、<=、!>和!<)

    select * from tableA A 
    innerjoin tableB B  
    on A.NO <> B.NO
    

    外连接

      
      外连接分为左连接(LEFT JOIN)或左外连接(LEFT OUTER JOIN)、右连接(RIGHT JOIN)或右外连接(RIGHT OUTER JOIN)、全连接(FULL JOIN)或全外连接(FULL OUTER JOIN)。我们就简单的叫:左连接、右连接和全连接。

    左连接(LEFT JOIN或LEFT OUTER JOIN)

      概念:返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。

    select * 
    from A LEFT JOIN B   
    ON A.NO = B.NO;
    

    这里写图片描述

      总结:左连接显示左表全部行,右表不足用null补。

    右连接(RIGHT JOIN 或 RIGHT OUTER JOIN)

      概念:恰与左连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。

    select * 
    from A RIGHT JOIN B   
    ON A.NO = B.NO;
    

    这里写图片描述

      同理:右连接恰与左连接相反,显示右表全部行,左表与右表相同行。左表不足用null补足。

    全连接(FULL JOIN 或 FULL OUTER JOIN)

      返回左表和右表中的所有行。当某行在另一表中没有匹配行,则另一表中的列返回空值

    select * from A  
    FULL JOIN B   
    ON A.NO = B.NO;
    

    这里写图片描述

      总结:返回左表和右表中的所有行。

    交叉连接(CROSS JOIN):也称迪卡尔积

      概念:不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积,如果带where,返回或显示的是匹配的行数。

    不带where:

    select * 
    from A  CROSS join B   
    

    等价于下面的

    select * 
    from  A,B 
    

    这里写图片描述

    有where子句

      有where子句,往往会先生成两个表行数乘积的数据表,然后才根据where条件从中选择。查询结果跟等值连接的查询结果是一样。

    自连接

      自连接是对同一个表进行的连接。要自行一个自连接,必须使用不同的表别名来标识在查询中每次对表的引用。

      自连接查询因为其语法结构简单,而逻辑结构复杂,语义往往不是那么容易被人理解。自连接之前要对数据进行过滤。

    sql的简单优化

    对Select语句的法则

    • 在应用程序、包和过程中限制使用select * from table这种方式。

    对Where 语句的优化

    • 避免在WHERE子句中使用in,not in,or 或者having。

    可以使用 exist 和not exist代替 in和not in。
    可以使用表链接代替 exist。Having可以用where代替,如果无法代替可以分两步处理。

    • 不要以字符格式声明数字,要以数字格式声明字符值。(日期同样)否则会使索引无效,产生全表扫描。

    • 在WHERE 语句中,尽量避免对索引字段进行计算操作

    编写写简单而损害了性能,建议不要为了编写简单而损害性能。

    排序

    避免使用耗费资源的操作,带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎 执行,耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序

  • 相关阅读:
    面试题-JAVA算法题
    分布式
    linux中文件描述符fd和struct file结构体的释放
    Linux字符设备驱动
    Linux内存地址管理概述
    mnist卷积网络实现
    【TensorFlow官方文档】MNIST机器学习入门
    FCN笔记
    datetime.timedelta
    tensorflow中的函数获取Tensor维度的两种方法:
  • 原文地址:https://www.cnblogs.com/yangliguo/p/7670418.html
Copyright © 2020-2023  润新知