SQL145题系列 程序员在编程过程中,经常会在代码中使用到where 1=1,这是为什么呢? SQL注入 初次看到这种写法的同学肯定很纳闷,加不加where 1=1,查询不都一样吗?...当然这种事我们可千万不能干,也不能让别人有机可乘,这里只是为了表述where 1=1的作用之一。 语法规范 我们在写代码的过程中,为了保证语法规范的时候,也会使用到where 1=1。...拷贝表 在我们进行数据备份时,也经常使用到where 1=1,当然其实这两可以不写,写上之后如果想过滤一些数据再备份会比较方便,直接在后面添加and条件即可。...,这个在拷贝表的时候,加上where 11,意思就是没有任何一条记录符合条件,这样我们就可以只拷贝表结构,不拷贝数据了。...create table table_name as select * from Source_table where 1 1; 1=1的性能问题 在MySQL早期的版本中where
break; } 会报如下的错, initialization of 'newVal' is skipped by 'case' label 为什么会这样?
select * from exec_activity_effect_day oe where oe.ACTIVITY_ID in (select DISTINCT(e.ACTIVITY_ID...) from exec_activity_effect_day e limit 0 ,3) [SQL] select * from exec_activity_effect_day oe where...Err] 1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' 低版本中mysql不支持在limit...语句中有子查询 所以只要在有limit的语句里再向外包一层 ( select t.ACTIVITY_ID from (select DISTINCT(e.ACTIVITY_ID) from exec_activity_effect_day...e limit 0 ,3) as t) 把上面的结果作为一个新的t表 再查t表就ok ,整个语句如下 SELECT * FROM exec_activity_effect_day oe WHERE
对出现在where子句中的字段加索引 避免在索引列上使用函数或计算,在where子句中,如果索引是函数的一部分,优化器将不再使用索引而使用全表扫描 在insert和update维表时都加上一个条件来过滤维表中已经存在的记录...因此在本文提到Where 1=1 and引起的性能问题就需要按照查询分析器的规则去考虑为什么,这也是Think like query optimizer。 ...Where 1=1 and写法为什么不会变慢? 因为查询分析器在代数树优化阶段就把1=1 直接给过滤掉了。这个功能就是查询优化器中所谓的“Constant Folding”。 ...我们这里假设查询分析器在代数树优化阶段没有把where 1=1这种情况直接过滤掉。 ...这里我们举例,假如表中有100万行数据,where a=1的数据有1万条,where b=1的数据有1万条,则A和B的选择性都是1/100=0.01,在Where中A And B联合的估计行数则变为0.01
首先我在 onCreate 方法里调用 setText() 方法 override fun onCreate(savedInstanceState: Bundle?)...为什么正常呢,不应该报错吗?...TextView.java:4204) at android.widget.TextView.setText(TextView.java:4179) 这应该就是大家熟悉的报错了吧,不允许在非...UI线程中更新UI线程 既然报这个错了,那就跟进去,看看 ViewRootImpl.java 为什么报这个错,之前分享过看源码的方式。...mThread 是在ViewRootImpl 的构造方法里这样初始化的。
忽略批量插入失败中的错误 批量插入比单条数据挨个插入,普遍会提高性能以及减少总的网络开销。但是,假如批量插入的数据中心存在一个臭虫,在默认的情况下,这就会导致批量插入失败(没有一条数据插入成功)。...其中最糟糕的一类是WHERE子句中包含IN的子查询语句(详情可见《高性能MySQL》一书的6.5章节,标题名字起得就很nice,为MySQL查询优化器的局限性)。...概括下就是在部分情况下,在部分情况下MySQL可能会在挨个执行外部记录时执行子查询,如果外部记录数量较大,那么性能就会堪忧。...为什么同样是使用LEFT JOIN,查询结果就不同了呢?...在执行INNER JOIN时,以上问题还可以忽略,但是如果使用的是LEFT JOIN或者RIGHT JOIN,则需要加倍小心查询条件了。
from (select id,name from tt order by id desc) as t group by name // 输出结果如下: id,name 1,name1 3,name2 这是为什么呢...因为mysql 5.6之后版本对排序的sql解析做了优化,子查询中的排序是会被忽略的,所以上面的order by id desc未起到作用。...如果子语句中排序不做优化那不就可以了么,查阅资料发现可以在子语句中加上limit来避免这种优化(加上limit相当于临时表限定了取值范围不会进行优化,如果是全表的话就被优化掉了)。...// 通过分组获取关键key,然后再获取对应记录 select id,name from tt where id in (select max(id) from tt group by name) /...where id = (select max(id) from tt where name = a.name) order by name // 输出结果如下 id,name 2,name1 4,name2
还可以通过在条件前面加上%noindex关键字来忽略特定条件表达式的特定索引。 %INORDER 此可选关键字指定查询优化器按照表在FROM子句中列出的顺序执行联接。这最大限度地减少了编译时间。...不能同时使用%INORDER和%PARALLEL优化;如果同时指定了这两个优化,则忽略%PARALLEL。 %NOFLATTEN 此可选关键字在量化的子查询(返回布尔值的子查询)的FROM子句中指定。...此优化选项禁用“扁平化”(默认),它通过将子查询有效地集成子查询到查询中来优化包含量化的子查询的查询:将子查询的表添加到查询的FROM子句中,并将子查询中的条件转换为查询的WHERE子句中的联接或限制。...%NOMERGE 此可选关键字在子查询的FROM子句中指定。它指定编译器优化器应该禁止子查询到视图的转换。...%NOREDUCE 此可选关键字在流式子查询的FROM子句中指定-返回行的结果集的子查询,即封闭查询的FROM子句中的子查询。它指定编译器优化器应该禁止将子查询(或视图)合并到包含查询中。
BY 2, 1 表示先根据第二个列分组,再根据第一个列分组 过滤分组 在WHERE子句中指定过滤的是行而不是分组;实际上WHERE种并没有分组的概念。...在SQL使用HAVING来实现过滤分组; 笔记:WHERE过滤行,HAVING过滤分组 SELECT cust_id ,COUNT(*) AS orders FROM Orders GROUP...行级过滤 否 GROUP BY 分组说明 仅在按照组计算聚集时使用 HAVING 组级过滤 否 ORDER BY 输出排序顺序 否 使用子查询 任何SELECT语句都是查询,SQL还允许在查询中嵌套查询...WHERE prod_id = 'RGAN01')); 作为计算字段使用子查询 使用子查询的另一个方法是创建计算字段 SELECT...prod_id = 'RGAN01' 创建高级联结 使用表别名 在SQL语句中可以给表取别名: SELECT cust_name, cust_contact FROM Customers AS C
原因分析 对t_poetry表的子查询结果集很小,且两者在t_poetry表都能使用索引,对t_poetry子查询的消耗基本一致。两者区别在于,使用 in 时,t_author表能使用索引: ?...MySQL查询语句中的IN 和Exists 对比分析 在子查询结果集较小时,查询耗时主要表现在对t_author表的遍历上。...这种情况下子查询结果集很大,我们看看mysql的查询计划: 使用in时,由于子查询结果集很大,对t_author和t_poetry表都接近于全表扫描,此时对t_author表的遍历耗时差异对整体效率影响可以忽略...MySQL查询语句中的IN 和Exists 对比分析 使用exists时,数据量的变化没有带来执行计划的改变,但由于子查询结果集很大,5.5以后的MySQL版本在exists匹配查询结果时使用的是Block...---- 原文在MySQL查询语句中的IN 和Exists 对比分析
5.在同一查询的WHERE子句中使用Windows函数生成的列&使用CASE WHEN子句 注意,不要在同一查询的WHERE子句中使用通过Windows函数生成的列名以及CASE WHEN子句。...,并且在同一查询的WHERE子句中使用了该列,这个查询结果会出现异常。...解决方法:这一问题可以通过使用临时表或者子查询解决。...7.在GROUP BY语句后使用WHERE子句 在编写GROUP BY语句时,请注意WHERE子句的位置。...这是为什么呢? WHERE子句用于过滤查询结果,这一步要在将查询结果分组之前实现,而不是先分组再过滤。
vend_id = 1003; 这条SQL语句包含了where子语句,仅过滤出vend_id为1003的产品,avg_price中返回该供应商的产品的平均值; PS:avg()只能用来确定特定数值列的平均值...列的值之和,where子句保证只统计某个指定列的数值; PS:利用标准的算数操作符,所有聚集函数都可用来执行多个列上的计算(sum()函数忽略列值为null的行) 6、distinct与聚集函数 MySQL5.0.3...二、分组数据 1、group by创建分组 在MySQL中,分组是在select语句中的group by子句中建立的,比如: select vend-id,count(*) as num_prods from...)的那些分组; having和where的区别: where在数据分组前进行过滤,having在数据分组后进行过滤;where排除的行不包括在分组中(这可能会改变计算值,从而影响having子句中基于这些值过滤掉的分组...by vend_id having count(*)>= 2; 这条SQL语句中,where子句过滤掉所有prod_price至少为10的行,然后按照vend_id分组数据;having子句过滤技术为
1 受检异常 VS 非受检异常 简单的说,受检异常必须在方法中被显示的捕捉,或者在方法的throws语句中被抛出。...Paste_Image.png 2 异常管理的最佳实践 如果一个异常能够被正确的处理,那么他就该捕获,反之,则该被抛出 3 为什么在try语句中定义的变量不能在catch和finally语句中使用?...The code does not pass compilation 下面这段代码,string s定义在try语句块中,然后却在catch语句中使用了s,这段程序是无法通过编译的 try {...这就是为什么try语句中定义的变量不能在catch和finally语句中使用。...10 为什么开发者么总是默默的“消灭”异常?
、或DELETE语句中内部的查询 二、子查询的分类 单行子查询 返回零行或一行 多行子查询 返回一行或多行 多列子查询 返回多列 相关子查询 引用外部SQL语句中的一列或多列 嵌套子查询...FROM table); /* 子查询(内部查询)在执行主查询之前执行一次 然后主查询(外部查询)会使用该子查询的结果 四、子查询的规则 将子查询括在括号中 将子查询放置在比较条件的右侧...= , 在WHERE 子句中使用子查询 */ SQL> select ename,job from emp 2 where empno = ( 3 select empno...--在FROM 子句中使用子查询 SQL> select empno,ename 2 from 3 (select empno,ename 4 from emp 5 where...Num_emp > 3; DEPTNO NUM_EMP ---------- ---------- 30 6 20 5 /* 注意:子查询对空值的处理 除了count(*)外,都会忽略掉空值
3.2 多关系查询 我们可以在where子句中指定匹配条件,然后进行多关系查询。...在聚集函数中,除count(*)外的所有函数都会忽略输入集合中的空值。...在包含了子查询的查询中,在相关名称上可以应用作用域规则,根据此规则,在一个子查询中只能使用此子查询本身定义的,或者包含此子查询的任何查询中定义的相关名称,如果一个相关名称既在子查询中局部定义,有在包含该子查询的查询中全局定义...8.5 from子句中的子查询 前面的子查询都是在where子句中使用的,下面介绍在from子句中使用子查询。...从SQL:2003开始的SQL标准允许from子句中的子查询使用关键字lateral作为前缀,以便访问同一个from子句中在它前面的表或者子查询的属性。
4.匹配元组 元组可以可以作为case的条件的,元组在case中的用法还是比较灵活的。在case条件中,我们可以使用下划线来忽略元组中的某一项。...并且我们还可以在元组中的一些项中使用区间运算符。在元组匹配中如果你想忽略掉元组中的一项,可以使用下划线进行忽略即可。下方就是一个元组匹配的实例,如下所示。 ? ...上面的例子是在匹配元组时忽略不需要匹配的元组匹配项,接下来我们还可以把不匹配的值通过参数的形式传到case后方的子语句块中。这也就是Switch中的数值绑定,具体实例如下所示: ?...二、Where子句 在SQL中Where子句的出镜率是比较高的,但是出现Switch-Case分支语句中实不多见。...Switch-Case语句中引入Where子句可谓是完全可以替代if - else 语句的分支。Where子句使得Switch-Case语句中的条件更为灵活多变,使其更为强大。
中的子查询(不在 from 子句中) derived:在 from 子句中子查询,MySQL 会将结果存放在一个临时表中,也称为派生表(derived 的英文含义) 举个例子,你就知道它们的的区别了:...explain select (select 1 from actor where id = 1) from (select * from film where id = 1) alias; ?...3.3 table 列 表示 explain 的一行访问的表是哪一个 当 from 子句中有子查询时,table 列是 格式,表示当前查询依赖 id=N 的查询,于是先执行 id=...如果想强制使用或者忽略索引可以在查询语句加 force index(想要强制使用的索引名)或者 ignore index(想要忽略的索引名) PS:如果 possible_keys 有列,而 key...Using where:在存储引擎检索行后再进行过滤,就是先读取整行数据,再按 where 条件进行取舍。
distinct] expr) 求最大值 MIN([distinct] expr) 求最小值 SUM([distinct] expr) 求累加和 ①每个组函数接收一个参数 ②默认情况下,组函数忽略列值为...,必须出现在GROUP BY子句中作为分组列 ②分组列可以不出现在SELECT子句中 ③分组列可出现在SELECT子句中的一个复合表达式中 ④如果GROUP BY后面是一个复合表达式,那么在...但是目前一种分组情况只有一条记录,一个数据格是无法放入多个数值的,所以这个时候就需要通过一定的处理将这些多值的列转化成单值,然后将其放在对应的数据格中,那么完成这个步骤的就是前面讲到的聚合函数,这也就是为什么这些函数叫聚合函数了...子句对分组后的结果进行过滤 不能在WHERE子句中使用组函数,仅用于过滤行 mysql> select playerno -> from PENALTIES -> where count...having子语句与where子语句区别: where子句在分组前对记录进行过滤; having子句在分组后对记录进行过滤 mysql> select salary,count(*) from
视图的限制 定义视图时不能使用ORDER BY子句 为什么不能使用ORDER BY子句? 因为视图和表一样,数据行都是没有顺序的。...在WHERE子句中使用标量子查询 如何查询出销售单价高于平均销售单价的商品?...我们可能会想到以下错误的SQL语句: -- 在WHERE子句中不能使用聚合函数 SELECT product_id, product_name, sale_price FROM...Product WHERE sale_price > AVG(sale_price); 虽然这样的SELECT语句看上去能够满足我们的要求,但是由于在WHERE子句中不能使用聚合函数,因此这样的SELECT...这里起关键作用的就是在子查询中添加WHERE子句的条件,该条件的意思就是,在同一商品种类中对各商品的销售单价和平均单价进行比较。
领取专属 10元无门槛券
手把手带您无忧上云