06丨数据过滤:SQL数据过滤都有哪些方法?
该思维导图由 AI 生成,仅供参考
比较运算符
- 深入了解
- 翻译
- 解释
- 总结
SELECT 英雄名称, 主要定位, 次要定位, 最大生命, 最大法力 FROM heros WHERE (主要定位 = '坦克' OR 主要定位 = '战士') AND 次要定位 IS NOT NULL AND (最大生命 > 8000 OR 最大法力 < 1500) ORDER BY (最大生命 + 最大法力) DESC;
《SQL 必知必会》,新⼈⾸单¥68
全部留言(150)
- 最新
- 精选
- 奕就是要避免全表扫描,所以我们会考虑在 WHERE 及 ORDER BY 涉及到的列上增加索引 ----------------------------------------------- where 条件字段上加索引是可以明白的,但是为什么 order by 字段上还要加索引呢?这个时候已经通过 where条件过滤得到了数据,已经不需要在筛选过滤数据了,只需要在排序的时候根据字段排序就好了。不是很明白
作者回复: 这是一个很好的问题,关于ORDER BY字段是否增加索引: 在MySQL中,支持两种排序方式:FileSort和Index排序。Index排序的效率更高, Index排序:索引可以保证数据的有序性,因此不需要再进行排序。 FileSort排序:一般在内存中进行排序,占用CPU较多。如果待排结果较大,会产生临时文件I/O到磁盘进行排序,效率较低。 所以使用ORDER BY子句时,应该尽量使用Index排序,避免使用FileSort排序。 当然具体优化器是否采用索引进行排序,你可以使用explain来进行执行计划的查看。 优化建议: 1、SQL中,可以在WHERE子句和ORDER BY子句中使用索引,目的是在WHERE子句中避免全表扫描,ORDER BY子句避免使用FileSort排序。 当然,某些情况下全表扫描,或者FileSort排序不一定比索引慢。但总的来说,我们还是要避免,以提高查询效率。 一般情况下,优化器会帮我们进行更好的选择,当然我们也需要建立合理的索引。 2、尽量Using Index完成ORDER BY排序。 如果WHERE和ORDER BY相同列就使用单索引列;如果不同使用联合索引。 3、无法Using Index时,对FileSort方式进行调优。
2019-06-245104 - 极客星星你好 老师 不是很明白您说的对where语句建索引是什么意思 通过sql语句怎么实现 谢谢
作者回复: 多谢提问,这句话我说的比较省略。想表达的意思是,如果你使用了WHERE子句,对于某个字段进行了条件筛选,那么这个字段你可以通过建立索引的方式进行SQL优化。 因为我们在进行SQL优化的时候,应该尽量避免全表扫描。所以当我们使用WHERE子句对某个字段进行了条件筛选时,如果我们没有对这个字段建立索引,就会进入到全表扫描,因此可以考虑对这个字段建立索引。 当然你也需要注意 索引是否会失效。因此除了考虑建立字段索引以外,你还需要考虑: 1、不要在WHERE子句后面对字段做函数处理,同时也避免对索引字段进行数据类型转换 2、避免在索引字段上使用<>,!=,以及对字段进行NULL判断(包括 IS NULL, IS NOT NULL) 3、在索引字段后,慎用IN和NOT IN,如果是连续的数值,可以考虑用BETWEEN进行替换 因为在WHERE子句中,如果对索引字段进行了函数处理,或者使用了<>,!=或NULL判断等,都会造成索引失效。
2019-06-2556 - Abyssknight关于通配符匹配里的 % 相当于正则表达式里的 .* 表示匹配大于等于0个任意字符, 所以 % 太 % 匹配的是 [大于等于0个任意字符]太[大于等于0个任意字符],[东皇]太[一] 和 []太[乙真人]都符合; 而 _% 相当于正则表达式里的 .+ 表示匹配至少一个,即大于等于1个, 所以 '_% 太 % 匹配的是 [大于等于1个字符]太[大于等于0个字符],只有 [东皇]太[一] 符合。
作者回复: 对的 解释正确
2019-06-24634 - 陈扬鸿老师,你好,现在mysql8已经没有frm文件,一旦数据字典丢失,没有表结构就无法恢复单个ibd文件的数据,如何通过mysql8的 sdi文件生成创建表的ddl语句。
作者回复: 在MySQL8.0版本之前,当我们ALTER TABLE时系统崩溃了,则会遗留.frm,.ibd文件。而在8.0版本之后,MySQL默认的InnoDB存储引擎实现了原子DDL。原子 DDL 操作写入了内部隐藏的系统表,即mysql.innodb_ddl_log中,也就是说明在DDL执行过程中如果出现了失败,是可以回滚的。 需要说明的是:DDL如果正常运行结束后,ddl_log中的相应日志也会被删除。如果这中间崩溃了,重启时会根据事务是否提交了来判断是做redo,还是undo DLL操作。
2019-06-2533 - 怪兽宇老师好, 平日因业务考核需要,一条查询语句查询条件需要写 30 多个 like "%A%" ,语句跑起来特别慢,请问有什么优化方法吗?
作者回复: 可以考虑: 1、建立索引 2、使用函数来替代LIKE, 如果是MySQL的话:可以考虑locate, position, instr, find_in_set 如果是SQL Server,可以考虑charindex, patindex
2019-06-26730 - Goal老师关于通配符给的解释,不够清晰! 说明如下: SQL:SELECT name FROM heros WHERE name LIKE '_% 太 %' 因为太乙真人的太是第一个字符,而_%太%中的太不是在第一个字符,所以匹配不到“太乙真人”,只可以匹配上“东皇太一”。 说明: "_":匹配任意一个字符,包括可以匹配到“太乙真人”的太字。 但是,整体的通配符 '_% 太 %',需要后面继续匹配到一个"太"字符,显然,"太乙真人"不符合了,如果是,"太乙真人太太",就可以匹配到。
作者回复: 哈哈 太乙真人太太 这个解释的好。也就是在第一个字符之后能匹配上“太”字。
2019-06-24326 - stormsc有个问题想问老师: SELECT name,role_main,role_assist from heros where role_assist is not null LIMIT 5 这样限定的查询结果为5条数据,是随机选择的5条数据吗?
作者回复: 感谢提问,不是随机的5条。最简单的方式,你可以多重复几次,然后看下结果有没有变化。你会发现,每次运行的结果都是一样的,因此不是随机的。 如果想实现随机5条数据,可以采用下面的方式: SELECT name,role_main,role_assist, RAND() as r FROM heros WHERE role_assist IS NOT NULL ORDER BY r LIMIT 5
2019-06-2523 - 看,有只猪解答一下对使用DATE函数的疑问: birthdate字段可能会有时间包含在里面,如2019-01-01 00:00:00,如果直接和2019-01-01比较是会失败的,用DATE函数可以提取出原始数据的日期部分
作者回复: 解释的很好,关于为什么使用DATE函数的说明可以看下这个
2019-06-25320 - stormsc作业 mysql: select name 英雄名称, role_main 主要定位, role_assist 次要定位,hp_max 最大生命值,mp_max 最大法力值 from heros where (role_main in ('坦克','战士') AND role_assist is not null) AND (hp_max > 8000 or mp_max <1500) ORDER BY (hp_max+mp_max) DESC
作者回复: 正确,同时采用了列别名的方式。
2019-06-25411 - hlz-123where子句WHERE 子句中比较运算符、逻辑运算符和通配符这三者各自作用? 1、比较运算符,比较数值的大小,数值类型可以是整数,浮点数,字符串,布尔类型等等。 2、逻辑运算符,定义where子句中多个条件之间的关系。 3、通配符,对文本类型字段进行模糊查询。 Mysql查询语句: SELECT name,role_main,role_assist,hp_max,mp_max FROM heros WHERE (role_main in ('坦克','战士') AND role_assist is not null) AND (hp_max>8000 OR mp_max<1500) order by (hp_max+mp_max) DESC;
作者回复: 解释的很好,最后一个SQL查询也正确
2019-06-249