学习的过程主要参考以上这本书《SQL必知必会》以及一些网络教程,小白们也可以去借阅学习。
过滤数据
只检索所需数据需要指定搜索条件(search criteria),搜索条件也称为过滤条件(filter condition)。
在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表名(FROM子句)之后给出。
使用WHERE子句
输入:
SELECT prod_name,prod_priceFROM productsWHERE prod_price=3.49;
结果:
分析:
这个例子采用了最简单的相等测试:检查一个列是否具有指定的值,据此进行过滤。
注意:同时使用ORDER BY和WHERE子句时,应该让 ORDER BY位于WHERE之后。
输入:
SELECT prod_name,prod_priceFROM productsWHERE prod_name='king doll';
输出:
分析:
上例中,单引号用来限定字符串,用来与数值列进行比较的值不用引号。
以下为操作符列表,可用于 WHERE 子句中。
操作符 | 描述 |
---|---|
= | 等于 |
<>, != | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN | 在指定的两个值之间 |
空值检查
NULL 无值(no value),与字段包含0、空字符串或仅仅包含空格不同。
有个特殊的WHERE 子句:IS NULL可以用来检查具有NULL值的列。
输入:
SELECT cust_id FROM customersWHERE cust_email IS NULL
输出:
组合WHERE子句
前面介绍的WHERE子句在过滤数据时使用的都是单一的条件,为了更强的过滤控制,这些字句可以采用两种方式:以AND子句的方式或OR子句的方式使用。
这里掌握一个概念:
操作符(operator)用来联结或改变WHERE子句中的字句的关键字,也称为逻辑操作符(logical operator)。
AND操作符
输入:
SELECT prod_id,prod_price,prod_nameFROM productsWHERE vend_id='BRS01' AND prod_price<=10;
输出:
分析:
AND操作符用在WHERE字句中的关键字,用来指示检索满足所有条件的行。
OR操作符与AND操作符不同,它指示MySQL检索匹配任一条件的行。
计算次序
WHERE字句可以包含任一数目的AND和OR操作符,允许两者进行复杂和高级的过滤。
但是,组合AND和OR如果不设置计算次序,会带来一些问题,例如:
输入:
SELECT prod_id,prod_price,prod_nameFROM productsWHERE vend_id='BRS01' OR vend_id='DLL01' AND prod_price<=10;
输出:
分析:
本意是想列出价格为10美元(含)以下且由BRS01或DLL01制造的所有产品。但是返回的行中有价格大于10美元的行。
原因在于:
SQL在处理OR操作符前,优先处理AND操作符。因此上述WHERE子句表达的意思为:由供应商DLL01制造的任何价格为10美元(含)以下的产品,或者由供应商BRS01制造的产品,而不管其价格如何。
即,AND在计算次序中优先级更高,操作符被错误地组合了。
解决办法:使用圆括号明确地分组相应的操作符。
SELECT prod_id,prod_price,prod_nameFROM productsWHERE (vend_id='BRS01' OR vend_id='DLL01') AND prod_price<=10;
IN操作符
IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值的由逗号分隔的清单,全部括在圆括号中。
输入:
SELECT prod_id,prod_price,prod_nameFROM productsWHERE vend_id IN ('BRS01','DLL01') AND prod_price<=10;
输出和上面的例子一样,IN操作符完成的是与OR相同的功能。
NOT操作符
WHERE字句中用NOT来否定后跟条件的关键字。
输入:
SELECT prod_id,prod_price,prod_nameFROM productsWHERE vend_id NOT IN ('BRS01','DLL01');
输出:
分析:
这里的NOT否定跟在它之后的条件。
通配符
前面介绍的操作符是针对已知值进行过滤,但是,怎么搜索产品名中包含文本anvil的所有产品?用简单的比较操作符肯定不行,必须使用通配符。
利用通配符可以创建比较特定数据的搜索模式。
通配符的概念是:用来匹配值的一部分的特殊字符。
为在搜索子句中使用通配符,必须使用LIKE操作符。LIKE指示MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。
百分号%通配符
%表示任何字符出现任意次数。
例如,为了找出所有包含词inch的产品。
输入:
SELECT prod_id,prod_nameFROM productsWHERE prod_name LIKE '%inch%';
输出:
注意:虽然%通配符似乎可以匹配任何东西,但是有一个例外,即NULL,即使是WHERE prod_name LIKE '%' 也不能匹配用值NULL作为产品名的行。
下划线(_)通配符
其与%的用途一样,但下划线只匹配单个字符而不是多个字符。
举个例子:
输入:
SELECT prod_id,prod_nameFROM productsWHERE prod_name LIKE '_ inch teddy bear';
输出:
下划线总是匹配一个字符,不多不少,所以12 inch teddy bear和18 inch teddy bear不能返回。
习题练习
下面附上SQLZoo网站上的部分习题练习,下图是网站提供的表-world。
1、Show the name and population in millions for the countries of the continent 'South America'. Divide the population by 1000000 to get population in millions.
2、Show the name and population for France, Germany, Italy
3、Show the countries which have a name that includes the word 'United'
4、Two ways to be big: A country is big if it has an area of more than 3 million sq km or it has a population of more than 250 million.
Show the countries that are big by area or big by population. Show name, population and area.
5、Exclusive OR (XOR). Show the countries that are big by area or big by population but not both. Show name, population and area.
Australia has a big area but a small population, it should be included.
Indonesia has a big population but a small area, it should be included.
China has a big population and big area, it should be excluded.
United Kingdom has a small population and a small area, it should be excluded.
总结
本文介绍了如何使用SELECT语句的WHERE子句过滤返回的数据,还讲解了AND和OR操作符组合成的WHERE字句,以及计算次序,如何使用IN和NOT操作符,通配符等等。