zoukankan      html  css  js  c++  java
  • SQL必知必会 -------- order by、where等

    一、排序检索数据

    1.排序数据SELECT prod_name FROM Products ORDER BY prod_name(对prod_name列以字母顺序排序数据)

    ORDER BY子句的位置
    在指定一条ORDER BY子句时,应该保证它是SELECT语句中最后一条子句。如果它不是最后的子句,将会出现错误消息。
    通过非选择列进行排序
    通常,ORDER BY子句中使用的列将是为显示而选择的列。但是,实际上并不一定要这样,用非检索的列排序数据是完全合法的。

    2.按多个列排序SELECT prod_id,prod_price,prod_name FROM Products ORDER BY prod_price,prod_name

    重要的是理解在按多个列排序时,排序的顺序完全按规定进行。换句话说,对于上述例子中的输出,仅在多个行具有相同的prod_price值时才对产品按prod_name进行排序。如果prod_price列中所有的值都是唯一的,则不会按prod_name排序。

    3.按列位置排序SELECT prod_id,prod_price,prod_name FROM Products ORDER BY 2,3 这个和按多个列排序结果是一样的,无非就是本来的列名称改成了位置序号。

    可以看到,这里的输出与上面的查询相同,不同之处在于ORDER BY子句。SELECT清单中指定的是选择列的相对位置而不是列名。ORDER BY 2表示按SELECT清单中的第二个列prod_name进行排序。ORDER BY 2,3表示先按prod_price,再按prod_name进行排序。
    这一技术的主要好处在于不用重新输入列名。但它也有缺点。首先,不明确给出列名有可能造成错用列名排序。其次,在对SELECT清单进行更改时容易错误地对数据进行排序(忘记对ORDER BY子句做相应的改动)。最后,如果进行排序的列不在SELECT清单中,显然不能使用这项技术。

    4.指定排序方向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关键字。
    请注意,DESC是DESCENDING的缩写,这两个关键字都可以使用。与DESC相对的是ASC(或ASCENDING),在升序排序时可以指定它。但实际上,ASC没有多大用处,因为升序是默认的(如果既不指定ASC也不指定DESC,则假定为ASC)。
    提示:区分大小写和排序顺序
    在对文本性数据进行排序时,A与a相同吗?a位于B之前,还是Z之后?这些问题不是理论问题,其答案取决于数据库的设置方式。
    在字典(dictionary)排序顺序中,A被视为与a相同,这是大多数数据库管理系统的默认行为。但是,许多DBMS允许数据库管理员在需要时改变这种行为(如果你的数据库包含大量外语字符,可能必须这样做)。
    这里的关键问题是,如果确实需要改变这种排序顺序,用简单的ORDER BY子句可能做不到。你必须请求数据库管理员的帮助。

    二、过滤数据

    1.where语句SELECT prod_name,prod_price FROM Products WHERE prod_price=3.49

    警告:WHERE子句的位置
    在同时使用ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE之后,否则将会产生错误。例如:SELECT prod_name,prod_price FROM Products WHERE prod_price=3.49 ORDER BY prod_name ASC

    2.检查单个值SELECT prod_name,prod_price FROM Products WHERE prod_price < 0

    3.不匹配检查SELECT vend_id,prod_name FROM Products WHERE vend_id <>'DLL01'

    4.范围值检查SELECT prod_name,prod_price FROM Products WHERE prod_price BETWEEN 5 AND 10

    5.空值检查SELECT cust_name FROM customers WHERE cust_email IS NULL

    三、高级数据过滤

    1.AND操作符SELECT prod_id,prod_price,prod_name FROM Products WHERE vend_id='DLL01' AND prod_price <=4

    SQL语句检索由供应商DLL01制造且价格小于等于4美元的所有产品的名称和价格。这条SELECT语句中的WHERE子句包含两个条件,用AND关键字联结在一起。AND指示DBMS只返回满足所有给定条件的行。如果某个产品由供应商DLL01制造,但价格高于4美元,则不检索它。

    AND
    用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行。
    这个例子只包含一个AND子句,因此最多有两个过滤条件。可以增加多个过滤条件,每个条件间都要使用AND关键字。
    说明:没有ORDER BY子句
    为了节省空间,也为了减少你的输入,我在很多例子里省略了ORDER BY子句。因此,你的输出完全有可能与书上的输出不一致。虽然返回行的数量总是对的,但它们的顺序可能不同。当然,如果你愿意也可以加上一个ORDER BY子句,它应该放在WHERE子句之后。
    2.OR操作符SELECT vend_id,prod_price,prod_name FROM Products WHERE vend_id='DLL01' OR vend_id='BRS01'

    SQL语句检索由任一个指定供应商制造的所有产品的产品名和价格。OR操作符告诉DBMS匹配任一条件而不是同时匹配两个条件。 

    3.求值顺序(AND OR)

    输入:

    SELECT prod_name, prod_price FROM Products 

    WHERE vend_id = 'DLL01' OR vend_id = 'BRS01' AND prod_price >= 10

    输出:

    问题:请看上面的结果。返回的行中有4行价格小于10美元,显然,返回的行未按预期的进行过滤。为什么会这样呢?原因在于求值的顺序。SQL(像多数语言一样)在处理OR操作符前,优先处理AND操作符。当SQL看到上述WHERE子句时,它理解为:由供应商BRS01制造的价格为10美元以上的所有产品,以及由供应商DLL01制造的所有产品,而不管其价格如何。换句话说,由于AND在求值过程中优先级更高,操作符被错误地组合了。

    解决方法

    SELECT prod_name, prod_price FROM Products 

    WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01') AND prod_price >= 10

    其实只要用括号括起来就好了

    提示:在WHERE子句中使用圆括号
    任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符。不要过分依赖默认求值顺序,即使它确实如你希望的那样。使用圆括号没有什么坏处,它能消除歧义。

    4.IN操作符

    输入:

    SELECT vend_id,prod_name,prod_price FROM Products
    WHERE vend_id IN ('DLL01','BRS01')
    ORDER BY prod_name

    输出:

    为什么要使用IN操作符?其优点为:

    • 在有很多合法选项时,IN操作符的语法更清楚,更直观。
    • 在与其他AND和OR操作符组合使用IN时,求值顺序更容易管理。
    • IN操作符一般比一组OR操作符执行得更快(在上面这个合法选项很少的例子中,你看不出性能差异)。
    • IN的最大优点是可以包含其他SELECT语句,能够更动态地建立WHERE子句。第11课会对此进行详细介绍。

    IN
    WHERE子句中用来指定要匹配值的清单的关键字,功能与OR相当。

    5.NOT操作符

    SELECT prod_name FROM Products
    WHERE NOT vend_id = 'DLL01'
    ORDER BY prod_name;

    为什么使用NOT?对于这里的这种简单的WHERE子句,使用NOT确实没有什么优势。但在更复杂的子句中,NOT是非常有用的。例如,在与IN操作符联合使用时,NOT可以非常简单地找出与条件列表不匹配的行。

    作者:今孝
    出处:http://www.cnblogs.com/jinxiao-pu/p/6814043.html
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

    觉得好就点个推荐把!

  • 相关阅读:
    C++雾中风景1:友元类与面向对象
    NFS服务器的安装与配置
    未来工作相关
    python 函数
    pycharm、sublime个性化设置
    hadoop中HDFS的NameNode原理
    Cat搭建遇坑记
    美团点评CAT监控平台研究
    阿里sentinel源码研究深入
    阿里熔断限流Sentinel研究
  • 原文地址:https://www.cnblogs.com/jinxiao-pu/p/6814043.html
Copyright © 2011-2022 走看看