所使用的数据库资料在:数据库资料
 
第三课:排序检索数据
3.1 排序数据
按单列排序
如果不排序,数据一般将以它在底层表中出现的顺序显示,这有可能是数据最初添加到表中的顺序。但是,如果数据随后进行过更新或删除,那么顺寻将不再是当初的顺序;
ORDER BY
取一个或多个列的名字,并进行顺序输出
输入:
SELECT prod_name
FROM Products
ORDER BY prod_name;
输出:
12 inch teddy bear
18 inch teddy bear
8 inch teddy bear
Bird bean bag toy
Fish bean bag toy
King doll
Queen doll
Rabbit bean bag toy
Raggedy Ann
以字母顺序排序;且需注意保证ORDER BY字句,在SELECT语句中在最后一句,否则会出错;
 
3.2  按多个列排序
要按多个列排序,简单指定列名,列名之间用逗号分开即可
输入:
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price, prod_name;
输出:
prod_id     prod_price     prod_name
-------     ----------     --------------------
BNBG02      3.4900         Bird bean bag toy
BNBG01      3.4900         Fish bean bag toy
BNBG03      3.4900         Rabbit bean bag toy
RGAN01      4.9900         Raggedy Ann
BR01        5.9900         8 inch teddy bear
BR02        8.9900         12 inch teddy bear
RYL01       9.4900         King doll
RYL02       9.4900         Queen doll
BR03        11.9900        18 inch teddy bear
重要的是理解在按多个列排序时,排序的顺序完全按规定进行。换句话说,对于上述例子中的输出,仅在多个行具有相同的prod_price值时才对产品按prod_name进行排序。如果prod_price列中所有的值都是唯一的,则不会按prod_name排序。
 
3.3     按列位置排序
上面两种情况都是按照列名进行排序,ORDER BY 还支持按相对列位置进行排序;
例子:
输入:
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY 2, 3;
输出:
prod_id     prod_price     prod_name
-------     ----------     --------------------
BNBG02      3.4900         Bird bean bag toy
BNBG01      3.4900         Fish bean bag toy
BNBG03      3.4900         Rabbit bean bag toy
RGAN01      4.9900         Raggedy Ann
BR01        5.9900         8 inch teddy bear
BR02        8.9900         12 inch teddy bear
RYL01       9.4900         King doll
RYL02       9.4900         Queen doll
BR03        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_name
FROM Products
ORDER BY prod_price DESC;
输出:
prod_id     prod_price     prod_name
-------     ----------     --------------------
BR03        11.9900        18 inch teddy bear
RYL01       9.4900         King doll
RYL02       9.4900         Queen doll
BR02        8.9900         12 inch teddy bear
BR01        5.9900         8 inch teddy bear
RGAN01      4.9900         Raggedy Ann
BNBG01      3.4900         Fish bean bag toy
BNBG02      3.4900         Bird bean bag toy
BNBG03      3.4900         Rabbit bean bag to
 
如果打算用多个列排序,该怎么办?下面的例子以降序排序产品(最贵的在最前面),再加上产品名:
输入:
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC, prod_name;
输出:
prod_id     prod_price     prod_name
-------     ----------     --------------------
BR03        11.9900        18 inch teddy bear
RYL01       9.4900         King doll
RYL02       9.4900         Queen doll
BR02        8.9900         12 inch teddy bear
BR01        5.9900         8 inch teddy bear
RGAN01      4.9900         Raggedy Ann
BNBG02      3.4900         Bird bean bag toy
BNBG01      3.4900         Fish bean bag toy
BNBG03      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_price
FROM Products
WHERE prod_price = 3.49;
输出:
prod_name               prod_price
-------------------     ----------
Fish bean bag toy       3.49
Bird bean bag toy       3.49
Rabbit 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_name
FROM Products
WHERE vend_id <> 'DLL01'
输出:
vend_id        prod_name
----------     ------------------
BRS01          8 inch teddy bear
BRS01          12 inch teddy bear
BRS01          18 inch teddy bear
FNG01          King doll
FNG01          Queen doll
注意:
何时使用引号;单引号用来限定字符串。如果将值与字符串类型的列进行比较,就需要限定引号。用来与数值列进行比较的值不用引号。
4.2 范围检查
可以使用BETWEEN操作符,BETWEEN操作符可用来检索价格在5美元和10美元之间的所有产品,或在指定的开始日期和结束日期之间的所有日期。
下面的例子说明如何使用BETWEEN操作符,它检索价格在5美元和10美元之间的所有产品:
输入:
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;
输出:
prod_name               prod_price
-------------------     ----------
8 inch teddy bear       5.99
12 inch teddy bear      8.99
King doll               9.49
Queen doll              9.49
分析:
从这个例子可以看到,在使用BETWEEN时,必须指定两个值——所需范围的低端值和高端值。这两个值必须用AND关键字分隔。BETWEEN匹配范围中所有的值,包括指定的开始值和结束值。
 
 
第5课:高级过滤数据(AND,OR)
这一课讲授如何组合WHERE子句以建立功能更强、更高级的搜索条件。我们还将学习如何使用NOT和IN操作符。
使用逻辑操作符来联结或改变where字句中的句子,使得条件更加高级;
5.1.1     AND操作符
输入:
SELECT prod_id, prod_price, prod_name
FROM Products
WHERE vend_id = 'DLL01' AND prod_price <= 4;
输出:
prod_id     prod_price     prod_name
-------     ----------     --------------------
BNBG02      3.4900         Bird bean bag toy
BNBG01      3.4900         Fish bean bag toy
BNBG03      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_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = ‘BRS01’;
输出:
prod_name               prod_price
-------------------     ----------
Fish bean bag toy       3.4900
Bird bean bag toy       3.4900
Rabbit bean bag toy     3.4900
8 inch teddy bear       5.9900
12 inch teddy bear      8.9900
18 inch teddy bear      11.990
5.1.3   求值顺序
AND  OR 优先级问题
假如需要列出价格为10美元及以上,且由DLL01或BRS01制造的所有产品。下面的SELECT语句使用组合的AND和OR操作符建立了一个WHERE子句:
输入:
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = ‘BRS01’
AND prod_price >= 10;
输出:
prod_name               prod_price
-------------------     ----------
Fish bean bag toy       3.4900
Bird bean bag toy       3.4900
Rabbit bean bag toy     3.4900
18 inch teddy bear      11.9900
Raggedy 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_price
FROM Products
WHERE vend_id IN ( 'DLL01', 'BRS01' )
ORDER BY prod_name;
输出:
prod_name               prod_price
-------------------     ----------
12 inch teddy bear      8.9900
18 inch teddy bear      11.9900
8 inch teddy bear       5.9900
Bird bean bag toy       3.4900
Fish bean bag toy       3.4900
Rabbit bean bag toy     3.4900
Raggedy 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_name
FROM Products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_name;
输出:
prod_name
------------------
12 inch teddy bear
18 inch teddy bear
8 inch teddy bear
King doll
Queen dol
分析:
NOT 似乎也可以用<>替代,的确在上面的例子中是可以。但在更复杂的子句中,NOT是非常有用的。例如,在与IN操作符联合使用时,NOT可以非常简单地找出与条件列表不匹配的行。
posted on 2016-03-15 16:01  Aiapple  阅读(2693)  评论(0编辑  收藏  举报