条件查询
SQL 条件查询
限制查询是筛选结果集的一种方法,但是我们可以使用
SELECT * FROM artists WHERE [Filter Conditions];
Conditions
条件只是对或错的陈述。数据库将使用这些语句并在扫描表时评估所有行中的语句,并仅返回真实结果。举例来说,假设我们要查看
SELECT * FROM artists WHERE id = 85;
该查询指示数据库扫描name=“Santana”
:
SELECT * FROM artists WHERE name = 'Santana';
多项匹配
在上面的示例中,我们正在查询唯一字段,因此我们只能得到一个答案。但是,情况并非总是如此。在轨道表中,许多不同的轨道属于同一张专辑,您可以看到在轨道数据库中有一个
SELECT * FROM tracks WHERE album_id = 89;
条件组合
AND
在
SELECT * FROM tracks WHERE album_id = 89 AND composer = 'Green Day';
OR
当您关心是否两个条件都为真时,也可以使用
SELECT * FROM tracks WHERE composer='Green Day' OR composer='AC/DC';
NOT
您可以通过简单地将
SELECT * FROM tracks WHERE NOT composer='Green Day';
Ordering and Parenthesis
您可以结合使用任意数量的
就像数学一样,您可以使用括号指定运算顺序。最佳做法是,在逻辑和顺序不太明确的地方使用括号。为了进行探索,让我们尝试拉动所有组成“ Green Day”的曲目,以及通过
SELECT * FROM tracks WHERE composer = 'Green Day' OR (composer = 'AC/DC' AND milliseconds > 240000);
请注意,使用括号可以清楚地表明我们只想要更长的
SELECT * FROM tracks WHERE (composer = 'Green Day' OR composer = 'AC/DC') AND milliseconds > 240000;
操作符
到目前为止,我们仅使用等于(=)或大于(>)运算符来创建条件。还有更多可供我们使用的东西。他们是不言自明的,只需要一些练习就可以下来。下表描述了最常用的运算符:
OPERATOR | DESCRIPTION |
---|---|
= | equal |
< | less than |
> | greater than |
<= | less than or equal |
>= | greater than or equal |
!= | not equal |
<> | not equal (yup, there are two ways) |
典型的使用方式如下:
SELECT * FROM tracks WHERE unit_price <= .99 AND milliseconds > 250000;
模糊检索
当您想匹配一个精确的字符串(例如
OPERATOR | DESCRIPTION |
---|---|
LIKE | a string matches a pattern |
ILIKE | case insensitive version of LIKE |
SIMILAR TO | a string matches a regex pattern |
LIKE
SYMBOL | DESCRIPTION |
---|---|
_ |
matches any single character |
% |
matches any number of characters |
为了制作与任何字符串内的“ Green Day”相匹配的模式,我们在两侧放置%符号,这意味着在
SELECT * FROM tracks WHERE composer LIKE '%Green Day%';
页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决;索引文件具有
ILKIE
如果您希望模式不关心字符是大写还是小写,可以使用
SELECT * FROM tracks WHERE composer ILIKE '%day%';
'Little Richard' LIKE '%Richard' true
'Little Richard' LIKE '_______Richard' true
'Little Richard' LIKE '______Richard' false
'Little Richard' LIKE '%richard' false
'Little Richard' ILIKE '%richARD' true
'Little Richard' LIKE '_ittle %' true
SIMILAR TO
对于
SELECT * FROM tracks WHERE composer SIMILAR TO '%(AC/DC|Green Day)%';
NULL 过滤
数据库中的空单元格称为
IS NULL -- matches NULL values
IS NOT NULL -- matches all non NULL values
expression IS NOT NULL
SELECT *
FROM contacts
WHERE last_name IS NOT NULL;
Case-When
CASE expression
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
WHEN conditionN THEN resultN
ELSE result
END as field_name
-- 简单Case函数
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
-- Case搜索函数
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END sex_description
这两种方式,可以实现相同的功能。简单
--比如说,下面这段SQL,你永远无法得到“第二类”这个结果
CASE WHEN col_1 IN ( 'a', 'b') THEN '第一类'
WHEN col_1 IN ('a') THEN '第二类'
ELSE'其他' END
有如下数据
国家 |
人口 |
---|---|
中国 | 600 |
美国 | 100 |
加拿大 | 100 |
英国 | 200 |
法国 | 300 |
日本 | 250 |
德国 | 200 |
墨西哥 | 50 |
印度 | 250 |
根据这个国家人口数据,统计亚洲和北美洲的人口数量。应该得到下面这个结果。
洲 | 人口 |
---|---|
亚洲 | 1100 |
北美洲 | 250 |
其他 | 700 |
想要解决这个问题,你会怎么做?生成一个带有洲
SELECT SUM(population),
CASE country
WHEN '中国' THEN '亚洲'
WHEN '印度' THEN '亚洲'
WHEN '日本' THEN '亚洲'
WHEN '美国' THEN '北美洲'
WHEN '加拿大' THEN '北美洲'
WHEN '墨西哥' THEN '北美洲'
ELSE '其他' END
FROM Table_A
GROUP BY CASE country
WHEN '中国' THEN '亚洲'
WHEN '印度' THEN '亚洲'
WHEN '日本' THEN '亚洲'
WHEN '美国' THEN '北美洲'
WHEN '加拿大' THEN '北美洲'
WHEN '墨西哥' THEN '北美洲'
ELSE '其他' END;
同样的,我们也可以用这个方法来判断工资的等级,并统计每一等级的人数。
SELECT
CASE WHEN salary <= 500 THEN '1'
WHEN salary > 500 AND salary <= 600 THEN '2'
WHEN salary > 600 AND salary <= 800 THEN '3'
WHEN salary > 800 AND salary <= 1000 THEN '4'
ELSE NULL END salary_class,
COUNT(*)
FROM Table_A
GROUP BY
CASE WHEN salary <= 500 THEN '1'
WHEN salary > 500 AND salary <= 600 THEN '2'
WHEN salary > 600 AND salary <= 800 THEN '3'
WHEN salary > 800 AND salary <= 1000 THEN '4'
ELSE NULL END;
还可以用一个
国家 |
性别 |
人口 |
---|---|---|
中国 | 1 | 340 |
中国 | 2 | 260 |
美国 | 1 | 45 |
美国 | 2 | 55 |
加拿大 | 1 | 51 |
加拿大 | 2 | 49 |
英国 | 1 | 40 |
英国 | 2 | 60 |
按照国家和性别进行分组,得出结果如下
国家 | 男 | 女 |
---|---|---|
中国 | 340 | 260 |
美国 | 45 | 55 |
加拿大 | 51 | 49 |
英国 | 40 | 60 |
普通情况下,用
SELECT country,
SUM( CASE WHEN sex = '1' THEN
population ELSE 0 END), --男性人口
SUM( CASE WHEN sex = '2' THEN
population ELSE 0 END) --女性人口
FROM Table_A
GROUP BY country;
这样我们使用