Skip to main content

条件查询

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

iddevice_idgenderageuniversitygpa
12138male21Peking University3.4
23214maleFudan University4.0
36543female20Peking University3.2
42315female23Zhejiang University3.6
55432male25Shandong University3.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 n2n1n2 为要限制的区间范围。

tip
  1. AND 之前的值需要小于 AND 之后的值,不然查询会返回空结果。
  2. 结果会包括两端值,即如果语句写为 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 INWHERE 子句中的 NOT 操作符有且只有一个功能,那就是否定其后所跟的任何条件。所以 NOTIN 一起使用等价于不等于括号中的条件,NOT IN('Peking University','Fudan University')解释为学校不为北京大学或复旦大学。

Mixed Usage

WHERE 子句其实可以包含任意数目的 ANDOR 操作符,允许两者结合以进行复杂、高级的过滤。我们来看一个例子:

SELECT device_id, gender, age, university, gpa
FROM user_profile
WHERE university ='Peking University' OR gpa > 3.5 AND university = 'Shandong University';
tip

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

Reference

  1. MySQL WHERE by mysqltutorial
  2. MySQL AND by mysqltutorial
  3. MySQL OR by mysqltutorial
  4. MySQL IN by mysqltutorial
  5. MySQL BETWEEN by mysqltutorial
  6. MySQL LIKE by mysqltutorial
  7. MySQL IS NULL by mysqltutorial
  8. MySQL Quiz: Basic operators by nowcoder
  9. MySQL Quiz: Advanced operators by nowcoder