条件查询
In this section, you will learn below keywords of MySQL:
- WHERE
- IS NULL / IS NOT NULL
- AND
- OR
- IN / NOT IN
- LIKE
Example table: user_profile
id | device_id | gender | age | university | gpa |
---|---|---|---|---|---|
1 | 2138 | male | 21 | Peking University | 3.4 |
2 | 3214 | male | Fudan University | 4.0 | |
3 | 6543 | female | 20 | Peking University | 3.2 |
4 | 2315 | female | 23 | Zhejiang University | 3.6 |
5 | 5432 | male | 25 | Shandong University | 3.8 |
There is a large amount of data in database, but in most cases we only need to query the data meets certain conditions.
WHERE
We can use WHERE
clause to filter the data which usually follows FROM
, as shows below:
SELECT device_id
FROM user_profile
WHERE gender = 'male';
The above SQL uses WHERE
to filter the data whose gender is male. WHERE
needs to use with operators, and in this case, we use =
which basically means 'equals'. Select the proper operators can greatly improve the efficiency of the query, so let's look at some frequently used operators in the following.
Basic Operators
不等于号
不等于号在 SQL 中的写法为 <>
或 !=
,代表筛选出不满足某条件的数据。
大于号小于号
大于号 SQL 中的写法为 >
,小于号为 <
,代表筛选出大于或小于某个条件的数据。
范围值
范围值限制方法为 BETWEEN n1 AND n2
,n1
和 n2
为要限制的区间范围。
AND
之前的值需要小于AND
之后的值,不然查询会返回空结果。- 结果会包括两端值,即如果语句写为
BETWEEN 10 AND 20
, 那么结果中会包括取值等于 10 或 20 的数据。
空值
在表存储的数据类型中,有一类特殊的值叫空值,其定义为当一个字段不包括任何值时,称其包含空值 NULL
,空值与字段包含 0
、空字符串或仅仅包含空格是不同的概念。
在对空值进行筛选时,不能用等于号简单的判断是否 = NULL
。SQL 语句有一个特殊的 WHERE 子句,可用来检查具有 NULL
值的列。这个 WHERE 子句就 是 IS NULL
子句。 其语法如下:
SELECT device_id, gender, age
FROM user_profile
WHERE gender IS NULL;
这条语句可以返回表中所有性别列值为空的用户数据,同样如果我们想要剔除空值数据的话,也需要用一个特殊的 WHERE
子句,IS NOT NULL
,其语法如下:
SELECT device_id,gender,age
FROM user_profile
WHERE gender IS NOT NULL;
Advanced Operators
Now, let's look at how to use WHERE
to make the condition query more powerful. 以上代码中所有 WHERE
子句在过滤数据时使用的都是单一的条件。 为了进行更强的过滤控制,SQL 允许给出多个 WHERE
子句,这些子句有两种使用方式,以 AND
子句或 OR
子句的方式使用。
AND
在过滤数据时如果我们想结果同时满足多个条件,可以使用 AND
操作符给 WHERE
子句附加条件,其语法如下:
SELECT device_id, age FROM user_profile
WHERE age <30 AND gender = 'male';
这条语句返回了表中所有年龄小于 30 且性别为男性的用户。
OR
OR
操作符逻辑与 AND
操作符正好相反,在过滤数据时如果我们想要结果只需满足多个条件中的一个,可以使用 OR
操作符对条件进行连接,其语法如下:
SELECT device_id, gender, age
FROM user_profile
WHERE university= 'Shandong University' OR university = 'Fudan University';
这条语句返回了表中所有学习为复旦大学或山东大学的用户。
IN / NOT IN
IN
操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN
取一组由逗号分隔、括在圆括号中的合法值。下面的例子说明了这个操作符:
SELECT device_id, gender, age, university, gpa
FROM user_profile
WHERE university in ('Peking University','Fudan University');
这条语句返回了表中所有学校为北京大学或复旦大学的用户
下面我们再来看一下 NOT IN
。 WHERE
子句中的 NOT
操作符有且只有一个功能,那就是否定其后所跟的任何条件。所以 NOT
和 IN
一起使用等价于不等于括号中的条件,NOT IN('Peking University','Fudan University')
解释为学校不为北京大学或复旦大学。
Mixed Usage
WHERE 子句其实可以包含任意数目的 AND
和 OR
操作符,允许两者结合以进行复杂、高级的过滤。我们来看一个例子:
SELECT device_id, gender, age, university, gpa
FROM user_profile
WHERE university ='Peking University' OR gpa > 3.5 AND university = 'Shandong University';
SQL 在处理 OR
操作符前,优先处理 AND
操作符。
代码中 WHERE
函数限定条件正确的理解逻辑为:筛选出学校为北京大学或山东大学中 gpa
大于 3.5
的学生,SQL 是先对 AND
逻辑进行了理解,再处理 OR
的逻辑。一般在使用中为防止表达错误,可以采取括号的形式把想要一起判断的逻辑放在同一个括号中,例子如下:
SELECT device_id, gender, age, university, gpa
FROM user_profile
WHERE university ='Peking University' OR (gpa > 3.5 AND university = 'Shandong University');
LIKE 操作符——模糊匹配
前面介绍的所有操作符都是针对已知值进行过滤的。不管是匹配一个值还是多个值,检验大于还是小于已知值,或者检查某个范围的值,其共同点是过滤中使用的值都是已知的。但在实际运用中,有时我们会需要进行模糊匹配,这时就可以用到 LIKE
操作符。
LIKE
操作符需要和通配符结合使用,一般最常用的通配符是 %
, 在搜索串中,%
表示任何字符出现任意次数。例如,为了找出所有学校中以北京开头的用户,可使用以下 SELECT
语句:
SELECT device_id, gender, age, university, gpa
FROM user_profile
WHERE university LIKE 'Peking%';
在执行这条语句时,将检索任意以北京起头的词, %
表示“北京”之后多少字符都可以。只要是以北京开头,就会被检索到。
通配符可在搜索模式中的任意位置使用,并且可以使用多个通配符。下面的例子使用两个通配符,它们位于检索词的两端,%北京%
表示匹配任何位置上包含文本北京的值,不论它之前或之后出现什么字符。
SELECT device_id, gender, age, university, gpa
FROM user_profile
WHERE university LIKE '%Peking%';
Quiz
- SQL6 查找学校是北大的学生信息
- SQL7 查找年龄大于 24 岁的用户信息
- SQL8 查找某个年龄段的用户信息
- SQL9 查找除复旦大学的用户信息
- SQL10 用 where 过滤空值练习
- SQL11 高级操作符练习(1)
- SQL12 高级操作符练习(2)
- SQL13 Where in 和 Not in
- SQL14 操作符混合运用
- SQL15 查看学校名称中含北京的用户