学习的过程主要参考以上这本书《SQL必知必会》以及一些网络教程,小白们也可以去借阅学习。


SQL学习笔记【2】_java

过滤数据



只检索所需数据需要指定搜索条件(search criteria),搜索条件也称为过滤条件(filter condition)。


在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句表名(FROM子句)之后给出。


使用WHERE子句

输入:




SELECT prod_name,prod_priceFROM productsWHERE prod_price=3.49;

结果:

SQL学习笔记【2】_java_02

分析:

这个例子采用了最简单的相等测试:检查一个列是否具有指定的值,据此进行过滤。


注意:同时使用ORDER BY和WHERE子句时,应该让 ORDER BY位于WHERE之后。

输入:




SELECT prod_name,prod_priceFROM productsWHERE prod_name='king doll';

输出:

SQL学习笔记【2】_java_03

分析:

上例中,单引号用来限定字符串,用来与数值列进行比较的值不用引号。



以下为操作符列表,可用于 WHERE 子句中。

操作符描述
=      
等于
<>, !=不等于
>大于
<小于
>=大于等于
<=小于等于
BETWEEN
在指定的两个值之间


         空值检查

NULL    无值(no value),与字段包含0、空字符串或仅仅包含空格不同。


有个特殊的WHERE 子句:IS NULL可以用来检查具有NULL值的列。


输入:




SELECT cust_id FROM customersWHERE cust_email IS NULL

输出:

SQL学习笔记【2】_java_04


组合WHERE子句

前面介绍的WHERE子句在过滤数据时使用的都是单一的条件,为了更强的过滤控制,这些字句可以采用两种方式:以AND子句的方式或OR子句的方式使用。


这里掌握一个概念:

操作符(operator)用来联结或改变WHERE子句中的字句的关键字,也称为逻辑操作符(logical operator)


AND操作符


输入:




SELECT prod_id,prod_price,prod_nameFROM productsWHERE vend_id='BRS01' AND prod_price<=10;


输出:

SQL学习笔记【2】_java_05


分析:

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;

输出:

SQL学习笔记【2】_java_06


分析:

本意是想列出价格为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;

SQL学习笔记【2】_java_07



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');

输出:

SQL学习笔记【2】_java_08

分析:

这里的NOT否定跟在它之后的条件。



通配符

前面介绍的操作符是针对已知值进行过滤,但是,怎么搜索产品名中包含文本anvil的所有产品?用简单的比较操作符肯定不行,必须使用通配符。


利用通配符可以创建比较特定数据的搜索模式。


通配符的概念是:用来匹配值的一部分的特殊字符。


为在搜索子句中使用通配符,必须使用LIKE操作符。LIKE指示MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。



百分号%通配符

 %表示任何字符出现任意次数。


例如,为了找出所有包含词inch的产品。

输入:




SELECT prod_id,prod_nameFROM productsWHERE prod_name LIKE '%inch%';


输出:

SQL学习笔记【2】_java_09

注意:虽然%通配符似乎可以匹配任何东西,但是有一个例外,即NULL,即使是WHERE prod_name LIKE '%' 也不能匹配用值NULL作为产品名的行。



下划线(_)通配符


其与%的用途一样,但下划线只匹配单个字符而不是多个字符。

举个例子:

输入:




SELECT prod_id,prod_nameFROM productsWHERE prod_name LIKE '_ inch teddy bear';

输出:

SQL学习笔记【2】_java_10


下划线总是匹配一个字符,不多不少,所以12 inch teddy bear和18 inch teddy bear不能返回


习题练习



下面附上SQLZoo网站上的部分习题练习,下图是网站提供的表-world。

SQL学习笔记【2】_java_11

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.

SQL学习笔记【2】_java_12

2、Show the name and population for France, Germany, Italy


SQL学习笔记【2】_java_13

3、Show the countries which have a name that includes the word 'United'

SQL学习笔记【2】_java_14

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.

SQL学习笔记【2】_java_15

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.

SQL学习笔记【2】_java_16


SQL学习笔记【2】_java

总结



本文介绍了如何使用SELECT语句的WHERE子句过滤返回的数据,还讲解了AND和OR操作符组合成的WHERE字句,以及计算次序,如何使用IN和NOT操作符,通配符等等。