zoukankan      html  css  js  c++  java
  • SQL-基础学习2--ORDER BY ,DESC,WHERE, BETWEEN,AND ,OR ,IN ,NOT

    所使用的数据库资料在:数据库资料
     
    第三课:排序检索数据
    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可以非常简单地找出与条件列表不匹配的行。
  • 相关阅读:
    documentFragment文档碎片
    OpenResty之resty.limit.count 模块介绍
    vue前端分页多条件搜索
    element ui Tree树形控件获取未全选父节点和子节点id
    如何使 pdf 文件在浏览器里面直接下载而不是打开
    关于本博客
    圆锥曲线基础知识点
    NOI2021游记
    20210716模拟赛
    计数+动态规划
  • 原文地址:https://www.cnblogs.com/Aiapple/p/5279870.html
Copyright © 2011-2022 走看看