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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

    觉得好就点个推荐把!

  • 相关阅读:
    1094. Car Pooling
    121. Best Time to Buy and Sell Stock
    58. Length of Last Word
    510. Inorder Successor in BST II
    198. House Robber
    57. Insert Interval
    15. 3Sum java solutions
    79. Word Search java solutions
    80. Remove Duplicates from Sorted Array II java solutions
    34. Search for a Range java solutions
  • 原文地址:https://www.cnblogs.com/jinxiao-pu/p/6814043.html
Copyright © 2011-2022 走看看