所使用的数据库资料在:数据库资料
第三课:排序检索数据
3.1 排序数据
按单列排序
如果不排序,数据一般将以它在底层表中出现的顺序显示,这有可能是数据最初添加到表中的顺序。但是,如果数据随后进行过更新或删除,那么顺寻将不再是当初的顺序;
ORDER BY
取一个或多个列的名字,并进行顺序输出
输入:SELECT prod_nameFROM ProductsORDER BY prod_name;输出:12 inch teddy bear18 inch teddy bear8 inch teddy bearBird bean bag toyFish bean bag toyKing dollQueen dollRabbit bean bag toyRaggedy Ann
以字母顺序排序;且需注意保证ORDER BY字句,在SELECT语句中在最后一句,否则会出错;
3.2 按多个列排序
要按多个列排序,简单指定列名,列名之间用逗号分开即可
输入:SELECT prod_id, prod_price, prod_nameFROM ProductsORDER BY prod_price, prod_name;输出:prod_id prod_price prod_name------- ---------- --------------------BNBG02 3.4900 Bird bean bag toyBNBG01 3.4900 Fish bean bag toyBNBG03 3.4900 Rabbit bean bag toyRGAN01 4.9900 Raggedy AnnBR01 5.9900 8 inch teddy bearBR02 8.9900 12 inch teddy bearRYL01 9.4900 King dollRYL02 9.4900 Queen dollBR03 11.9900 18 inch teddy bear
重要的是理解在按多个列排序时,排序的顺序完全按规定进行。换句话说,对于上述例子中的输出,仅在多个行具有相同的prod_price值时才对产品按prod_name进行排序。如果prod_price列中所有的值都是唯一的,则不会按prod_name排序。
3.3 按列位置排序
上面两种情况都是按照列名进行排序,ORDER BY 还支持按相对列位置进行排序;
例子:
输入:SELECT prod_id, prod_price, prod_nameFROM ProductsORDER BY 2, 3;输出:prod_id prod_price prod_name------- ---------- --------------------BNBG02 3.4900 Bird bean bag toyBNBG01 3.4900 Fish bean bag toyBNBG03 3.4900 Rabbit bean bag toyRGAN01 4.9900 Raggedy AnnBR01 5.9900 8 inch teddy bearBR02 8.9900 12 inch teddy bearRYL01 9.4900 King dollRYL02 9.4900 Queen dollBR03 11.9900 18 inch teddy bear
分析:
ORDER BY 2表示按SELECT清单中的第二个列prod_name进行排序。ORDER BY 2,3表示先按prod_price,再按prod_name进行排序。
3.4 指定排序方向
数据排序不限于升序排序(从A到Z),这只是默认的排序顺序。还可以使用ORDER BY子句进行降序(从Z到A)排序。为了进行降序排序,必须指定DESC关键字。
下面的例子以价格降序来排序产品(最贵的排在最前面):
输入SELECT prod_id, prod_price, prod_nameFROM ProductsORDER BY prod_price DESC;输出:prod_id prod_price prod_name------- ---------- --------------------BR03 11.9900 18 inch teddy bearRYL01 9.4900 King dollRYL02 9.4900 Queen dollBR02 8.9900 12 inch teddy bearBR01 5.9900 8 inch teddy bearRGAN01 4.9900 Raggedy AnnBNBG01 3.4900 Fish bean bag toyBNBG02 3.4900 Bird bean bag toyBNBG03 3.4900 Rabbit bean bag to
如果打算用多个列排序,该怎么办?下面的例子以降序排序产品(最贵的在最前面),再加上产品名:
输入:SELECT prod_id, prod_price, prod_nameFROM ProductsORDER BY prod_price DESC, prod_name;输出:prod_id prod_price prod_name------- ---------- --------------------BR03 11.9900 18 inch teddy bearRYL01 9.4900 King dollRYL02 9.4900 Queen dollBR02 8.9900 12 inch teddy bearBR01 5.9900 8 inch teddy bearRGAN01 4.9900 Raggedy AnnBNBG02 3.4900 Bird bean bag toyBNBG01 3.4900 Fish bean bag toyBNBG03 3.4900 Rabbit bean bag to
分析▼
DESC关键字只应用到直接位于其前面的列名。在上例中,只对prod_price列指定DESC,对prod_name列不指定。因此,prod_price列以降序排序,而prod_name列(在每个价格内)仍然按标准的升序排序。
注意:在多个列上降序排序,如果想在多个列上进行降序排序,必须对每一列指定DESC关键字。
第四课:过滤数据
4.1 where 字句
只检索所需数据需要指定搜索条件(search criteria),搜索条件也称为过滤条件
在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表名(FROM子句)之后给出,如下所示:
输入:SELECT prod_name, prod_priceFROM ProductsWHERE prod_price = 3.49;输出:prod_name prod_price------------------- ----------Fish bean bag toy 3.49Bird bean bag toy 3.49Rabbit bean bag toy 3.49
分析:
这条语句从products表中检索两个列,但不返回所有行,只返回prod_price值为3.49的行;
注意:WHERE子句的位置
在同时使用ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE之后,否则将会产生错误
4.1 where 字句操作符
表4-1 WHERE子句操作符
单引号的使用
例子列出所有不是供应商DLL01制造的产品:
输入:SELECT vend_id, prod_nameFROM ProductsWHERE vend_id <> 'DLL01'输出:vend_id prod_name---------- ------------------BRS01 8 inch teddy bearBRS01 12 inch teddy bearBRS01 18 inch teddy bearFNG01 King dollFNG01 Queen doll
注意:
何时使用引号;单引号用来限定字符串。如果将值与字符串类型的列进行比较,就需要限定引号。用来与数值列进行比较的值不用引号。
4.2 范围检查
可以使用BETWEEN操作符,BETWEEN操作符可用来检索价格在5美元和10美元之间的所有产品,或在指定的开始日期和结束日期之间的所有日期。
下面的例子说明如何使用BETWEEN操作符,它检索价格在5美元和10美元之间的所有产品:
输入:SELECT prod_name, prod_priceFROM ProductsWHERE prod_price BETWEEN 5 AND 10;输出:prod_name prod_price------------------- ----------8 inch teddy bear 5.9912 inch teddy bear 8.99King doll 9.49Queen doll 9.49
分析:
从这个例子可以看到,在使用BETWEEN时,必须指定两个值——所需范围的低端值和高端值。这两个值必须用AND关键字分隔。BETWEEN匹配范围中所有的值,包括指定的开始值和结束值。
第5课:高级过滤数据(AND,OR)
这一课讲授如何组合WHERE子句以建立功能更强、更高级的搜索条件。我们还将学习如何使用NOT和IN操作符。
使用逻辑操作符来联结或改变where字句中的句子,使得条件更加高级;
5.1.1 AND操作符
输入:SELECT prod_id, prod_price, prod_nameFROM ProductsWHERE vend_id = 'DLL01' AND prod_price <= 4;输出:prod_id prod_price prod_name------- ---------- --------------------BNBG02 3.4900 Bird bean bag toyBNBG01 3.4900 Fish bean bag toyBNBG03 3.4900 Rabbit bean bag toy
分析:
此SQL语句检索由供应商DLL01制造且价格小于等于4美元的所有产品的名称和价格。这条SELECT语句中的WHERE子句包含两个条件,用AND关键字联结在一起。
这个例子只包含一个AND子句,因此最多有两个过滤条件。可以增加多个过滤条件,每个条件间都要使用AND关键字。
5.1.2 OR操作符
OR操作符与AND操作符正好相反,它指示DBMS检索匹配任一条件的行。事实上,许多DBMS在OR WHERE子句的第一个条件得到满足的情况下,就不再计算第二个条件了(在第一个条件满足时,不管第二个条件是否满足,相应的行都将被检索出来)。
输入:SELECT prod_name, prod_priceFROM ProductsWHERE vend_id = 'DLL01' OR vend_id = ‘BRS01’;输出:prod_name prod_price------------------- ----------Fish bean bag toy 3.4900Bird bean bag toy 3.4900Rabbit bean bag toy 3.49008 inch teddy bear 5.990012 inch teddy bear 8.990018 inch teddy bear 11.990
5.1.3 求值顺序
AND OR 优先级问题
假如需要列出价格为10美元及以上,且由DLL01或BRS01制造的所有产品。下面的SELECT语句使用组合的AND和OR操作符建立了一个WHERE子句:
输入:SELECT prod_name, prod_priceFROM ProductsWHERE vend_id = 'DLL01' OR vend_id = ‘BRS01’AND prod_price >= 10;输出:prod_name prod_price------------------- ----------Fish bean bag toy 3.4900Bird bean bag toy 3.4900Rabbit bean bag toy 3.490018 inch teddy bear 11.9900Raggedy Ann 4.9900
分析:
请看上面的结果。返回的行中有4行价格小于10美元,显然,返回的行未按预期的进行过滤。为什么会这样呢?原因在于求值的顺序。SQL(像多数语言一样)在处理OR操作符前,优先处理AND操作符。当SQL看到上述WHERE子句时,它理解为:由供应商BRS01制造的价格为10美元以上的所有产品,以及由供应商DLL01制造的所有产品,而不管其价格如何。换句话说,由于AND在求值过程中优先级更高,操作符被错误地组合了。
解决方法只需在改成 WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01') AND prod_price >=10
加上了一个优先级更高的 小括号就可以了;
5.2 IN操作符
IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取一组由逗号分隔、括在圆括号中的合法值。下面的例子说明了这个操作符:
输入:SELECT prod_name, prod_priceFROM ProductsWHERE vend_id IN ( 'DLL01', 'BRS01' )ORDER BY prod_name;输出:prod_name prod_price------------------- ----------12 inch teddy bear 8.990018 inch teddy bear 11.99008 inch teddy bear 5.9900Bird bean bag toy 3.4900Fish bean bag toy 3.4900Rabbit bean bag toy 3.4900Raggedy Ann 4.9900
分析:
此SELECT语句检索由供应商DLL01和BRS01制造的所有产品。IN操作符后跟由逗号分隔的合法值,这些值必须括在圆括号中。实际上IN操作符完成了与OR相同的功能。
为什么要使用IN操作符?其优点为:
- 在有很多合法选项时,IN操作符的语法更清楚,更直观。
- 在与其他AND和OR操作符组合使用IN时,求值顺序更容易管理。
- IN操作符一般比一组OR操作符执行得更快
- IN的最大优点是可以包含其他SELECT语句,能够更动态地建立WHERE子句
5.2 NOT操作符
WHERE子句中的NOT操作符有且只有一个功能,那就是否定其后所跟的任何条件。因为NOT从不单独使用(它总是与其他操作符一起使用),所以它的语法与其他操作符有所不同。NOT关键字可以用在要过滤的列前,而不仅是在其后。
为了列出除DLL01之外的所有供应商制造的产品,可编写如下的代码:
输入:SELECT prod_nameFROM ProductsWHERE NOT vend_id = 'DLL01'ORDER BY prod_name;输出:prod_name------------------12 inch teddy bear18 inch teddy bear8 inch teddy bearKing dollQueen dol
分析:
NOT 似乎也可以用<>替代,的确在上面的例子中是可以。但在更复杂的子句中,NOT是非常有用的。例如,在与IN操作符联合使用时,NOT可以非常简单地找出与条件列表不匹配的行。