首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

面试官:在 SQL 中遇到 NULL 值该如何处理?我:没想那么多!

在日常使用数据库时,你在意过NULL值么?...有人会回答说:“我不知道川建国的小名是什么”。对于这种情况,可以在数据库中使用Nickname列来表示川建国的小名,而这一列的值为 NULL。 也有人会回答说:“川建国没有小名。...但如果我写成这样: SELECT * FROM SOME_TABLE WHERE 1 = NULL 这个时候,数据库不知道这两个值(1 和 NULL)是否相等,因此会认定为“NULL”或“未知”,所以它也不会返回任何数据...三元逻辑 SQL 查询语句中的 WHERE 一般会有三种结果: 它可以是 true(这个时候会返回数据); 它可以是 false(这个时候不会返回数据); 它也可以是 NULL 或未知(这个时候也不会返回数据...接下来,我来告诉你在哪些情况下会有问题:我们来看看 NOT( ) 方法。

1K20

如何写出更快的 SQL (db2)

下面我就自己的工作经验,分享一下如何写出更快的 SQL 一、查看执行计划来选择更快的 SQL 在写 SQL 的初期,你可能不知道到底是使用 UNION ALL 好还是 FULL JOIN 好,是使用 EXISTS...image.png 可以看到总成本为 6147.56 因此追求快速响应的的可以使用 方法三。 那么如何使用 db2 的执行计划呢?...windows 用户,可以在程序中找到 控制中心,图标如下图所示: ? image.png 点击打开后,查找相应的数据库,右键选择说明查询,如下图所示: ?...NOT 我们要避免在索引列上使用 NOT , NOT 会产生在和在索引列上使用函数相同的影响,会导致使用索引转而执行全表扫描。...总是使用索引的第一个列 如果索引是建立在多个列上, 只有在它的第一个列(leading column)被 where 子句引用时,优化器才会选择使用该索引。

2.2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    用 MySQL DISTINCT 轻松消灭所有重复数据的秘诀

    DISTINCT 关键字 DISTINCT 是 MySQL 中用于从查询结果中去除重复记录的关键字。当需要获取唯一值或组合时,可以在 SELECT 语句中使用DISTINCT。...它可以应用于单列或多列,并可与聚合函数(如 COUNT)结合使用,以统计唯一值的数量。 基本用法 SELECT DISTINCT column1, column2, ......例如,COUNT(DISTINCT column_name)会返回指定列中不同值的数量。 排序和分组: 在使用DISTINCT时,你可能还需要对结果进行排序或分组。...在某些情况下,你可能需要决定是使用DISTINCT还是GROUP BY,或者是否可以将它们结合使用。 NULL值处理: 在MySQL中,DISTINCT将NULL视为一个值。...因此,在编写查询时,请确保了解列的数据类型以及它们如何影响DISTINCT的行为。

    32410

    NULL 值与索引(一)

    正是基于这样一个特性,对于NULL值列上的B 树索引导致了is null/is not null不走索引的情形,下面描述了NULL值与索引以及索引NULL列上的执行计划,如何使得NULL值走索引的情形。...-->基于多列的复合索引,尽管全为null值的行可以多次插入,但不全为null的重复行则不能被插入(注,非唯一复合索引不存在此限制,此处不演示)。...-->此时Oracle 选择了单列唯一索引I_T1_ID -->看到此,不知道大家是否已明白,即哪个列为is not null,则会使用该列上的索引,原因还是那句话,索引不存储null值。...,对于可以为null的列或复合null值,Oracle不会为其存储索引值。     ...故在基于单列创建B树唯一索引或多列创建B树复合唯一索引的情形下,     当列上允许为null值时         where子句使用了基于is null的情形,其执行计划走全表扫描。

    1.6K20

    使用索引的注意事项

    为经常需要搜索的列加索引,可以加快索引的速度 主键列上可以确保列的唯一性 在表与表的连接条件上加索引,可以加快连接查询的速度 在经常需要排序、分组、distinct的列上加索引,可以加快排序查询速度 在使用包含... >= BETWEEN IN 等查询条件的联合索引时条件判断一定要放在最后 使用like查询时使用“str%” 索引键不要包含NULL 如果你的一个字段是Char(32)或者int(32),在创建索引的时候指定前缀长度...比如前10个字符 (前提是多数值是唯一的..)那么短索引可以提高查询速度,并且可以减少磁盘的空间,也可以减少I/0操作 不要在索引列上进行函数操作或运算 选择越小的数据类型越好,因为通常越小的数据类型通常在磁盘...,内存,cpu,缓存中 占用的空间很少,处理起来更快 查询中很少使用到的列 不应该创建索引 重复数据多的列不应该建立索引,比如性别、状态等字段 定义为text和image和bit数据类型的列不应该增加索引

    65730

    Oracle查询性能优化

    同样在联结多个表时使用索引也可以提高效率. 2) 另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证.。那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列....索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改....使用索引需要注意的地方: 1、避免在索引列上使用NOT , 我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的影响....除了使用索引,我们还有其他能减少资源消耗的方法: 1、用EXISTS替换DISTINCT: 当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT....DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序. 通常, 带有UNION, MINUS , INTERSECT的SQL语句都可以用其他方式重写.

    2.3K20

    oracle数据库sql语句优化(循环语句有几种语句)

    大家好,又见面了,我是你们的朋友全栈君。...table)将被最先处理,在FROM子句中包含多个表的情况下, 必须选择记录条数最少的表作为基础表。...COMMIT: 只要有可能,在程序中尽量多使用COMMIT,这样程序的性能得到提高,需求也会因为COMMIT 所释放的资源而减少。...注:TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML。 18、使用DECODE函数来减少处理时间: 使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。...同样在联结多个表时使用索引也可以提高效率。 另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证。那些LONG或LONG RAW 数据类型, 你可以索引几乎所有的列。

    2.9K10

    面试必备,MySQL索引优化实战总结,涵盖了几乎所

    索引从物理上可以分为:聚集索引,非聚集索引 从逻辑上可以分为:普通索引,唯一索引,主键索引,联合索引,全文索引 索引优化策略 不要在索引列上进行运算或使用函数 在列上进行运算或使用函数会使索引失效,从而进行全表扫描...如下面例子在publish\_time,id列上分别加上索引,publish\_time为datetime类型,id为int类型 -- 全表扫描 select * from article where...这时候索引的作用只是用于优化WHERE条件的查找 如果在a b列上建立联合索引,该如何建立,才能使查询效率最高 select count(distinct a) / count(*), count(distinct...一般区分度在80%以上的时候就可以建立索引,区分度可以使用 count(distinct(列名))/count(*) 来计算 明确知道只会返回一条记录,可以加limit1 当查询确定只有一条记录时,...因此我们选择足够长的前缀保证较高的区分度,同时又不能太长(以便节约空间) 可以进行如下实验 select count(distinct left(email, 5)) / count(*) as col5

    41410

    MySQL索引优化实战

    索引从物理上可以分为:聚集索引,非聚集索引 从逻辑上可以分为:普通索引,唯一索引,主键索引,联合索引,全文索引 索引优化策略 不要在索引列上进行运算或使用函数 在列上进行运算或使用函数会使索引失效,从而进行全表扫描...如下面例子在publish_time,id列上分别加上索引,publish_time为datetime类型,id为int类型 -- 全表扫描 select * from article where year...这时候索引的作用只是用于优化WHERE条件的查找 如果在a b列上建立联合索引,该如何建立,才能使查询效率最高 select count(distinct a) / count(*), count(distinct...一般区分度在80%以上的时候就可以建立索引,区分度可以使用 count(distinct(列名))/count(*) 来计算 明确知道只会返回一条记录,可以加limit1 当查询确定只有一条记录时,可以加...因此我们选择足够长的前缀保证较高的区分度,同时又不能太长(以便节约空间) 可以进行如下实验 select count(distinct left(email, 5)) / count(*) as col5

    1.1K30

    索引策略,性能爆炸!!!

    相信大家在面试时候也会遇到如何进行查询优化的问题,其中索引相关的策略就是重点考察项,比如怎么设置索引列等。 下面就详细聊一下有哪些索引策略,内容来自于《高性能MySQL》一书。...「如何计算完整列的选择性?」...计算合适的前缀长度的即是计算完整列的选择性,并使前缀列的选择性接近于完整列的选择性。 「如何确定n?」...当发起一个覆盖索引查询时,在EXPLAIN的Extra列可以看到“Using index”的信息。 比如我上面创建了一个age和name的联合索引,那么我只查询这两列的数据。...有一种情况下可以不满足最左前缀的要求,就是前导列为常量的时候。如果Where或Join子句中对这些列指定了常量,就可以弥补索引的不足。

    1K20

    懒癌必备-dplyr和data.table让你的数据分析事半功倍

    接下来,我就为大家分享几个我在工作当中最常用来做数据分析用到的包,dplyr和data.table,我保证你get到这两个包后,就再也不想用R里面自带的基础包函数进行数据分析了!!...V3以外的所有列 distinct( ) 去重 distinct(df,V1,V2) 根据V1和V2两个条件来进行去重 在基础包里面也有一个去重函数unique() ※注意distinct()可以针对某些列进行去重...①第一个参数都是数据集df ②查询条件都是关于如何操作数据集的,在列上面进行操作 ③返回的都是新的数据集,不会改变原始数据集 在介绍下一个包之前,我们先来引入一个dplyr包的综合运用: grouped...,用by进行分组,然后在列上面进行计算。..."B")] 使用j DT[,v1] #选择v1列 那如果我要选择多列呢,大家注意一下这里不是用c()来选取了, 而是通过.()来选取,注意前面有一个”.”号,所以我说data.table的语法有点奇怪呢

    2.5K70

    SQL 性能调优

    (21) 避免在索引列上使用NOT 通常 (22) 避免在索引列上使用计算 (23) 用>=替代> (24) 用UNION替换OR (适用于索引列) (25) 用IN来替换OR  (26) 避免在索引列上使用...(译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML) 回到顶部 (10)尽量多使用COMMIT 只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为...同样在联结多个表时使用索引也可以提高效率. 另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证.。那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列....)的查询时,避免在SELECT子句中使用DISTINCT....回到顶部 (21) 避免在索引列上使用NOT 通常 我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的影响.

    3.2K10

    Citus 分布式 PostgreSQL 集群 - SQL Reference(查询分布式表 SQL)

    这意味着您可以在 Citus 协调器上使用标准 PostgreSQL SELECT 查询进行查询。 Citus 将并行化涉及复杂选择、分组和排序以及 JOIN 的 SELECT 查询,以加快查询性能。...如果 count(distinct) 聚合在分布列上,Citus 可以直接将查询下推给 worker。...在这一步之后,count(distinct) 聚合会自动切换到使用 HLL,而无需对您的查询进行任何更改。您应该能够在表的任何列上运行近似 count distinct 查询。...连接(Join) Citus 支持任意数量的表之间的 equi-JOIN,无论它们的大小和分布方法如何。查询计划器根据表的分布方式选择最佳连接方法和 join 顺序。...共置连接 当两个表共置时,它们可以在它们的公共分布列上有效地 join。co-located join(共置连接) 是 join 两个大型分布式表的最有效方式。

    3.3K20

    SQL 性能优化 总结

    driving table)将被最先处理,在FROM子句中包含多个表的 情况下,你必须选择记录条数最少的表作为基础表。...(6)使用DECODE函数来减少处理时间: 使用DECODE 函数可以避免重复扫描相同记录或重复连接相同的表。...(10)尽量多使用COMMIT: 只要有可能,在程序中尽量多使用 COMMIT, 这样程序的性能得到提高,需求也会因为 COMMIT所释放的资源而减少: COMMIT所释放的资源:...那些 LONG 或 LONG RAW数据类型, 你可以索引几乎所有的列. 通常,在大型表中使用索引特别有效. 当然,你也会发现,在扫描小表时,使用索引同样能提高效率....(21)避免在索引列上使用NOT通常, 我们要避免在索引列上使用 NOT, NOT会产生在和在索引列上使用函数相同的影响.当 ORACLE”遇到”NOT,就会停止使用索引转而执行全表扫描. (22)避免在索引列上使用计算

    1.9K20

    Oracle优化07-分析及动态采样-直方图

    列的分析:包括列值的重复数,列上的空值,数据在列上的分布情况。 索引的分析: 包括索引叶块的数量,索引的深度,索引的聚合因子等。...我们现在说的直方图,单指第二项的最后一种 列分析中 数据在列上的分布情况。...当 Oracle 做直方图分析时,会将要分析的列上的数据分成很多数量相同的部分,每一部分称为一个 bucket,这样 CBO 就可以非常容易地知道这个列上的数的分布情况,这种数据的分布将作为一个非常重要的因素纳入到执行计划成本的计算当中...我们可以看到ID字段的信息已经被删除掉了。 查看表和索引的信息 ? 我们可知索引和表的信息依然存在,并且索引中甚至可以找到distinct_keys=2。...CBO在id =1 时,估算返回的结果是353行,比较全部表的记录35257(这个信息可以从表的分析数据中得到user_tables.NUM_ROWS字段), CBO认为选择索引是合适的,但是我们知道实际上

    30620

    第六章· MySQL索引管理及执行计划

    1)BTREE:B+树索引 2)HASH:HASH索引 3)FULLTEXT:全文索引 4)RTREE:R树索引  图1·B+tree索引  图2·B*tree索引3.索引管理 索引建立在表的列上...,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。...1、选择唯一性索引 唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。 例如: 学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。...3.1 经常查询   3.2 列值的重复值少 注:如果经常作为条件的列,重复值特别多,可以建立联合索引 4.尽量使用前缀来索引 如果索引字段的值很长,最好使用值的前缀来索引。...重建索引就可以解决 4.查询条件使用函数在索引列上或者对索引列进行运算,运算包括(+,-,*等) #例子 错误的例子:select * from test where id-1=9; 正确的例子:

    33940

    Java SQL语句优化经验

    (译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML) (10) 尽量多使用COMMIT: 只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为...为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS....同样在联结多个表时使用索引也可以提高效率. 另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证.。那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列.....: ALTER INDEX REBUILD (18) 用EXISTS替换DISTINCT: 当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT....(21) 避免在索引列上使用NOT 通常, 我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的影响.

    2.6K100

    MySQL专题- 数据库索引使用场景&注意事项

    ,那么可能用到索引范围查找,如果索引范围查找的成本太高, 数据库可能会选择全表扫描的方式 。...5.mysql 优化器 ---- mysql 优化器会做一些特殊优化,比如对于索引查找max(索引列)可以直接进行定位。 遇到max,min 是可以在列上做索引。...4.使用更短的索引 可以考虑前缀索引,但应确保选择的前缀的长度可以保证大部分值是唯一的。 如:alter table test add key(col(6)) 衡量不同前缀索引唯一值比例。...select count(distinct left(col_name,5))/count(*) As sele5, select count(distinct left(col_name,6))/...例如某个复合索引idx_a_b_c 建立在表tb1 的 a、b、c 列上, 那么对于如下的sql 语句 select a,b from tb1 where a = ? and b = ?

    81320
    领券