zoukankan      html  css  js  c++  java
  • SQL 基础

    DELETE、Drop和Truncate的区别

    1、delete 删除表数据不删除表的结构,可进行数据回滚
    truncate 删除表数据并释放空间,不可进行数据回滚
    drop 删除表/数据库(包括数据和表结构)并释放空间,不可进行数据回滚
    2、执行效率:DROP > TRUNCATE > DELETE
    DELETE执行过程是 每次从表中删除一行,并将该操作作为事务记录保存在日志,便于回滚操作。
    3、如果想删除部分数据用delete,注意带上where子句,回滚段要足够大;
    如果想删除表,当然用drop;
    如果想保留表而将所有数据删除,如果和事务无关,用truncate即可;
    如果和事务有关,或者想触发trigger,还是用delete;
    如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。

    WHERE 与HAVING 的异同点

    1、where针对表中的列发挥作用,查询数据;having对查询结果中的列(筛选分组聚合后的结果集)发挥作用,筛选数据。
    2、where不能使用聚合函数,having中可以使用聚合函数(count、sum、avg、max、min等聚合函数)。
    3、where和having的执行顺序
    where 早于 group by 早于 having
    where子句在聚合前先筛选记录,也就是说作用在group by 子句和having子句前,而 having子句在聚合后对组记录进行筛选

    注意 NULL

    聚合函数普遍会将 NULL 排除在外( COUNT 函数例外),具体如下:
    1、COUNT 函数的结果根据参数的不同而不同。COUNT(*)会得到包含 NULL 的数据行数,而 COUINT(<列名>) 会得到不包含 NULL的数据行数。
    SELECT COUNT(DISTINCT <列名>) 可以得到不包含 NULL 且 不重复的数据行数。
    2、SUM 函数将 NULL 忽略,也可理解成视为 0。
    3、AVG 函数将 NULL 忽略,即不参与分母也不参与分子。

    EXISTS和IN的区别

    in 是把外表和内表作hash join,而exists是对外表作loop,每次loop再对内表进行查询。
    in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。exists查询时指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。
    如:
    A:select * from t1 a where exists (select * from t2 b where b.id = a.id)
    B:select * from t1 a where a.id in (select b.id from t2 b)
    对于A,用到了t2上的id索引,exists执行次数为t1.length,不缓存exists的结果集。
    对于B,用到了t1上的id索引,首先执行in语句,然后将结果缓存起来,之后遍历t1表,将满足结果的加入结果集,所以执行次数为t1.length*t2.length次。
    因此对t1表大t2表小的情况使用in,t2表小t1表大的情况使用exists。
    not in 和not exists
    如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。其他详见sql中exists和in的区别SQL语句中exists和in的区别

    SQL基础教程《SQL基础教程》+《SQL进阶教程》学习笔记

    在线SQL

  • 相关阅读:
    MariaDB日志文件、备份与恢复
    实例讲解ip地址、子网掩码、可用地址范围的计算
    Nginx配置文件、优化详解
    Centos系统的升级
    编译安装nginx
    虚拟化云计算的相关概念汇总
    ELK日志管理
    Kubernetes 监控
    用 ConfigMap 管理配置
    K8s管理机密信息
  • 原文地址:https://www.cnblogs.com/fanfeng/p/14927481.html
Copyright © 2011-2022 走看看