第五章-第八章
第五章 排序检索数据
本章将讲授如何使用SELECT语句的ORDER BY子句,根据需要排序检索出的数据。
排序数据
为了明确地排序用SELECT语句检索出的数据,可使用ORDER BY子句。ORDER BY子句取一个或多个列的名字,据此对输出进行排序。
请看下面的例子:
SELECT prod_name
FROM products
ORDER BY prod_name;
分析:这条语句除了指示MySQL对prod_name列以字母顺序排序数据的ORDER BY字句外,与前面的语句相同。
多个列排序
为了按多个列排序,只要指定列名,列名之间用逗号分开即可(就像选择多个列时所做的那样)。
例子如下:
SELECT prod_id,prod_price,prod_name
FROM products
ORDER BY prod_price,prod_name;
分析:在按多个列排序时,排序完全按所规定的顺序进行。对于上述例子中的输出,仅在多个行具有相同的prod_price值时才对产品按prod_name进行排序。如果prod_price列中所有的值都是唯一的,则不会按prod_name排序。
指定方向排序
数据排序不限定于升序排序(从A到Z)。这只是默认的顺序,还可以使用ORDER BY字句以降序(从Z到A)顺序排序。为了进行降序排序,必须制定DESC关键字。
下面的例子按价格以降序排序产品(最贵的排在最前面):
SELECT prod_id,prod_price,prod_name
FROM products
ORDER BY prod_price DESC;
如果对多个列排序 (最贵的排在前,然后再对产品名字排序)
SELECT prod_id,prod_price,prod_name
FROM products
ORDER BY prod_price DESC,prod_name;
分析:DESC关键字只应用到直接位于其前面的列名。上述例子中只对prod_price列指定DESC,对prod_name列不指定。因此,prod_price以降序排序,而prod_name仍按默认的升序排序。
与DESC相反的关键字是升序ASC(ASCENDING),在升序排序时可以指定它。但实际上,ASC没有多大用处,因为升序是默认的(如果既不指定ASC也不指定DESC,则假定为ASC)。
第五章小结:
本章学习了如何用SELECT语句的ORDER BY子句对检索出的数据进行排序。这个子句必须是SELECT语句中的最后一条子句。可根据需要,利用它在一个或多个列上对数据进行排序。
第六章 过滤数据
使用WHERE子句
在SELECT语句中,数据根据WHERE子句中指定的搜索条件过滤数据。
SELECT prod_name,prod_price
FROM products
WHERE prod_price = 2.50;
WHERE子句的操作符
操作符 | 说明 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
> = | 大于等于 |
BETWEEN | 在指定的两个值之间 |
不匹配检查
SELECT vend_id,prod_name
FROM products
WHERE vend_id <>1003;
空值检查
SELECT语句有一个特殊的WHERE子句,可用来检查具有NULL值的列。这个WHERE子句就是IS NULL子句。
SELECT cust_id
FROM customers
WHERE cust_email IS NULL;
第六章小结
本章介绍了如何用SELECT语句的WHERE子句过滤返回的数据。我们学习了如何对相等、不相等、大于、小于、值的范围以及NULL值等进行测试。
第七章 数据过滤
AND操作符
为了通过不止一个列进行过滤,可使用AND操作符给WHERE子句附加条件。
SELECT prod_id,prod_price,prod_name
FROM products
WHERE vend_id = 1003 AND prod_price <= 10;
分析:此SQL语句检索由供应商1003制造且价格小于等于10美元的所有产品的名称和价格。
这条SELECT语句中的WHERE子句包含两个条件,并且用AND关键字联结它们。AND指示DBMS只返回满足所有给定条件的行。
OR操作符
OR操作符与AND操作符不同,它指示MySQL检索匹配任一条件的行。
SELECT prod_id,prod_price,prod_name
FROM products
WHERE vend_id = 1002 OR vend_id = 1003;
分析:此SQL语句检索由任一个指定供应商制造的所有产品的产品名和价格。OR操作符告诉DBMS匹配任一条件而不是同时匹配两个条件。如果这里使用的是AND操作符,则没有数据返回(此时创建的WHERE子句不会检索到匹配的产品)
计算次序
WHERE可包含任意数目的AND和OR操作符。允许两者结合以进行复杂和高级的过滤。
假如需要列出价格为10美元(含)以上且由1002或1003制造的所有产品。
SELECT prod_id,prod_price,prod_name
FROM products
WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;
分析:这条SELECT语句与前一条的唯一差别是,这条语句中,前两个条件用圆括号括了起来。因为圆括号具有较AND或OR操作符高的计算次序,DBMS首先过滤圆括号内的OR条件。
IN操作符
IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值的由逗号分隔的清单,全都括在圆括号中。
SELECT prod_name,prod_price
FROM products
WHERE vend_id IN (1002,1003)
ORDER BY prod_name;
分析:此SELECT语句检索供应商1002和1003制造的所有产品。IN操作符后跟由逗号分隔的合法值清单,整个清单必须括在圆括号中。
SELECT prod_name,prod_price
FROM products
WHERE vend_id = 1002 OR vend_id = 1003
ORDER BY prod_name;
IN操作符优点如下:
在使用长的合法选项清单时,IN操作符的语法更清楚且更直观。
在使用IN时,计算的次序更容易管理(因为使用的操作符更少)。
IN操作符一般比OR操作符清单执行更快。
IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句。第14章将对此进行详细介绍。
NOT操作符
WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件。
例子:列出除1002和1003之外的所有供应商制造的产品
SELECT prod_name,prod_price
FROM products
WHERE vend_id NOT IN (1002,1003)
ORDER BY prod_name;
分析:这里的NOT否定跟在它之后的条件,因此,MySQL不是匹配1002和1003的vend_id,而是匹配1002和1003之外供应商的vend_id。
在更复杂的子句中,NOT是非常有用的。
MySQL中的NOT
MySQL支持使用NOT对IN、BETWEEN和EXISTS子句取反,这与多数其他DBMS允许使用NOT对各种条件取反有很大的差别。
第七章小结
本章讲授如何用AND和OR操作符组合成WHERE子句,而且还讲授了如何明确地管理计算的次序,如何使用IN和NOT操作符。
第八章 用通配符进行过滤
like操作符
通配符(wildcard) 用来匹配值的一部分的特殊字符。
搜索模式(search pattern)由字面值、通配符或两者组合构成的搜索条件。
为在搜索子句中使用通配符,必须使用LIKE操作符。LIKE指示MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。
百分号(%)通配符
最常使用的通配符是百分号(%)。
SELECT prod_id,prod_name
FROM products
WHERE prod_name LIKE 'jet%';
分析:此例子使用了搜索模式'jet'。在执行这条句子时,将检索任意以jet开头的词。%告诉哦MySQL接受jet之后的任意字符,不管它有多少字符。
通配符可在搜索模式中任意位置使用,并且可以使用多个通配符。下面的例子使用两个通配符,它们位于模式的两端:
SELECT prod_id,prod_name
FROM products
WHERE prod_name LIKE '%anvil%';
分析:搜索模式 '%anvil%'表示匹配任何位置包含文本anvil的值,而不论它之前或之后出现什么字符。
通配符也可以出现在搜索模式的中间,虽然这样做不太有用。下面的例子找出以s起头以e结尾的所有产品:
SELECT prod_name
FROM products
WHERE prod_name LIKE 's%e';
请注意:除了一个或多个字符外,%还能匹配0个字符。%代表搜索模式中给定位置的0个、1个或多个字符。
下划线(_)通配符
下划线的用途与%一样,但下划线只匹配单个字符而不是多个字符。
SELECT prod_id,prod_name
FROM products
WHERE prod_name LIKE '_ton anvil';
分析:此WHERE子句中的搜索模式给出了后面跟有文本的两个通配符。结果只显示匹配搜索模式的行:第一行下划线匹配1,第二行下划线匹配2。.5 ton anvil产品没有匹配,因为搜索模式要求匹配两个通配符而不是一个。
SELECT prod_id,prod_name
FROM products
WHERE prod_name LIKE '%ton anvil';
与%能匹配0个字符不一样,_总是匹配一个字符,不能多也不能少。
使用通配符的技巧
不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。把通
配符置于搜索模式的开始处,搜索起来是最慢的。
仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。
总之,通配符是一种极重要和有用的搜索工具,以后我们经常会用到它。
第八章小结
本章介绍了什么是通配符以及如何在WHERE子句中使用SQL通配符,并且还说明了通配符应该细心使用,不要过度使用。