02sql必知必会王者荣耀带你入门sqlWhere使用

作者: singworld 分类: Sql 发布时间: 2019-07-12 20:32

学会使用 WHERE 子句,如何使用比较运算符对字段的数值进比较
如何使用逻辑运算符,进行多条件的过滤;
学会使用通配符对数据条件进行复杂过滤。

– 查询生命值大于600的英雄

SELECT t.`name` FROM heros t WHERE t.hp_max >600;

– 想要查询所有最大生命值在 5399 到 6811 之间的英雄

SELECT t.`name` FROM heros t WHERE t.hp_max BETWEEN 5399 AND 6811;

– 假设想要筛选最大生命值大于 6000,最大法力大于 1700 的英雄,然后按照最大生命值和最大法力值之和从高到低进行排序。

SELECT t.`name` FROM heros t WHERE t.hp_max >6000 AND t.mp_max >1700 ORDER BY (hp_max+mp_max) DESC;

– 如果 AND 和 OR 同时存在 WHERE 子句中会是怎样的呢?假设我们想要查询最大生命值加最大法力值大于 8000 的英雄,或者最大生命值大于 6000 并且最大法力值大于 1700 的英雄。

SELECT t.`name` FROM heros t WHERE (t.hp_max+t.mp_max) >8000 OR t.hp_max>6000 AND t.mp_max>1700;

– 当 WHERE 子句中同时存在 OR 和 AND 的时候,AND 执行的优先级会更高,也就是说 SQL 会优先处理 AND 操作符,然后再处理 OR 操作符。

SELECT t.`name` FROM heros t WHERE ((t.hp_max+t.mp_max) >8000 OR t.hp_max>6000) AND t.mp_max>1700;

– 如果我想要查询主要定位或者次要定位是法师或是射手的英雄,同时英雄的上线时间不在 2016-01-01 到 2017-01-01 之间。

SELECT t.`name`,t.role_main,t.role_assist,t.birthdate FROM heros t WHERE (role_main IN ('法师', '射手') OR role_assist IN ('法师', '射手'))  AND DATE(t.birthdate) NOT BETWEEN '2016-01-01' AND '2017-01-01';
SELECT t.`name`,t.role_main,t.role_assist,t.birthdate FROM heros t WHERE (role_main IN ('法师', '射手') OR role_assist IN ('法师', '射手'))  AND (DATE(t.birthdate) < '2016-01-01'
OR DATE(t.birthdate) >'2017-01-01');

– 如果我们想要匹配任意字符串出现的任意次数,需要使用(%)通配符。比如我们想要查找英雄名中包含“太”字的英雄都有哪些:

 SELECT t.`name`,t.role_main,t.role_assist,t.birthdate FROM heros t WHERE t.`name` LIKE '%太%';

– 如果我们想要匹配任意字符串出现的任意次数,需要使用(%)通配符。比如我们想要查找英雄名中包含“太”字的英雄都有哪些:

 SELECT t.`name`,t.role_main,t.role_assist,t.birthdate FROM heros t WHERE t.`name` LIKE '_%太%';
 ```
– 你能看出来通配符还是很有用的,尤其是在进行字符串匹配的时候。不过在实际操作过程中,我还是建议你尽量少用通配符,因为它需要消耗数据库更长的时间来进行匹配。即使你对 LIKE 检索的字段进行了索引,索引的价值也可能会失效。如果要让索引生效,那么 LIKE 后面就不能以(%)开头
– 你可能认为学习 SQL 并不难,掌握这些语法就可以对数据进行筛选查询。但实际工作中不同人写的 SQL 语句的查询效率差别很大,保持高效率的一个很重要的原因,就是要避免全表扫描,所以我们会考虑在 WHERE 及 ORDER BY 涉及到的列上增加索引。

– 你能说一下 WHERE 子句中比较运算符、逻辑运算符和通配符这三者各自的作用吗?以 heros 数据表为例,请你编写 SQL 语句,对英雄名称、主要定位、次要定位、最大生命和最大法力进行查询,筛选条件为:主要定位是坦克或者战士,并且次要定位不为空,同时满足最大生命值大于 8000 或者最大法力小于 1500 的英雄,并且按照最大生命和最大法力之和从高到底的顺序进行排序。

SELECT t.name,t.role_main,t.role_assist,t.hp_max,t.mp_max FROM heros t WHERE t.role_main IN(‘坦克’,’战士’)
AND t.role_assist IS NOT NULL
AND (t.hp_max>8000 OR t.mp_max<1500)
ORDER BY (t.hp_max+t.mp_max) DESC;
“`

Leave a Reply

Your email address will not be published. Required fields are marked *