WHERE 子句—指定查询限制条件

  WHERE 子句——指定查询限制条件
    查询语句里的条件指定了要返回满足什么标准的信息。条件的值是 TURE 或 FALSE,从而限制查询中获取的数据。WHERE 子句用于规定选择的标准。如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中。
    WHERE 子句里可以有多个条件,它们之间以操作符 AND 或 OR 连接。如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。
一、WHERE 子句的格式
    语法:SELECT 列名 FROM 表名
          WHERE  列 操作符 值;
        叙述:1.下面的比较操作符可在 WHERE 子句中使用:
         ---------------------------------------
 操作符  描述
 ---------------------------------------
 =  等于
 <>  不等于
 >  大于
 <  小于
 >=  大于等于
 <=  小于等于
 ---------------------------------------
   注释:在某些版本的 SQL 中,操作符 <> 可以写为 !=。
        2.在 WHERE 子句中使用的逻辑操作符 :
         --------------------------------------------------------------------------
 操作符   描述
 --------------------------------------------------------------------------
 BETWEEN 值1 AND 值2 在两个值之间
 NOT BETWEEN 值1 AND 值2 不在两个值之间
 IN <值列表>  在特定的集合里(枚举)
 NOT IN <值列表>  不在特定的集合里(枚举)
 LIKE   匹配于一个模式
 NOT LIKE   不匹配于一个模式
 IS NULL   字段为空的
 IS NOT NULL  字段不为空的
 --------------------------------------------------------------------------
        注释:操作符 LIKE 利用通配符把一个值与类似的值进行比较,通配符有两个:
         百分号(%)代表任意长度的字符串;
         下划线(_)代表任意单个字符。
         例如,'A_Z' 表示所有以'A' 起头,另一个任何值的字符,且以'Z' 为结尾的字符串。'ABZ' 和'A2Z' 都符合这一个模式,而'AKKZ' 并不符合(因为在A和Z之间有两个字符,而不是一个字符)。
        'ABC%' 表示所有以'ABC' 起头的字符串。举例来说,'ABCD' 和'ABCABC' 都符合这个模式。
        '%XYZ' 表示所有以'XYZ' 结尾的字符串。举例来说,'WXYZ' 和'ZZXYZ' 都符合这个模式。
        '%AN%' 表示所有含有'AN' 这个模式的字符串。举例来说,'LOS ANGELES' 和'SANFRANCISCO' 都符合这个模式。
二、WHERE 子句使用举例
         下面,我们通过一些例子来说明 WHERE 子句的使用方法及查询结果,从中了解带WHERE 子句的 SELECT 语句的基本功能。
         例1:我们要由 Store_Information 表里
         store_name  Sales  Date
         ---------------------------------------------------------
 Los Angeles  1500  1999-01-05
 San Diego  250  1999-01-07
 San FranciSCo  300  1999-01-08
 Boston   700  1999-01-08
        找出营业额超过 1,000 的记录:
 SELECT store_name
 FROM Store_Information
 WHERE Sales > 1000;
        结果:store_name
 ----------------
 Los Angeles
        若要选出所有 Sales 高于 1,000 或是 Sales 在 500 及 275 之间的记录的话,我们可以用以下语句:
 SELECT store_name
 FROM Store_Information
 WHERE Sales > 1000
 OR (Sales < 500 AND Sales > 275) ;
        结果:store_name
 ----------------
 Los Angeles
 San FranciSCo
        例2:我们要在 Store_Information 表里找出所有含盖 Los Angeles 或 San Diego 的记录,可以用以下语句:
         SELECT * FROM Store_Information
 WHERE store_name IN ('Los Angeles', 'San Diego');
        结果:store_name  Sales  Date
 ----------------------------------------------------------
 Los Angeles  1500  1999-01-05
 San Diego  250  1999-01-07
        例3:由 Store_Information 表里找出所有介于 January 6, 1999 及 January 10, 1999 之间的记录,可以用以下语句:
         SELECT * FROM Store_Information
 WHERE Date BETWEEN 'Jan-06-1999' AND 'Jan-10-1999' ;
        结果:store_name  Sales  Date
 -----------------------------------------------
 San Diego  250  1999-01-07
 San FranciSCo  300  1999-01-08
 Boston   700  1999-01-08
        例4:在 Store_Information 表里找出所有店名含有'AN' 这个模式的记录:
 SELECT * FROM Store_Information
 WHERE store_name LIKE '%AN%' ;
        结果:store_name  Sales  Date
 ----------------------------------------------------------
 LOS ANGELES  1500  1999-01-05
 SAN FRANCISCO  300  1999-01-08
 SAN DIEGO  250  1999-01-07
三、选定条件中操作符的优先级
    以下列表显示了操作符优先级由高到低的顺序。排列在同一行的操作符具有相同的优先级。
     ---------------------------------------------------------------------
     操作符     描述
     ---------------------------------------------------------------------
     ^     乘方
     *, /     乘、除
     +, -     加、减
     <<, >>     左移、右移
     &     按位与
     |     按位或
     =, <=>, >=, >, <=, <, <>, !=, IS, LIKE, IN 等于、NULL-safe equal、大于等于、大于、小于等于、小于、不等于. . .
     BETWEEN     两值之间
     NOT     逻辑非
     AND     逻辑与
     OR     逻辑或
     ---------------------------------------------------------------------
        说明:
         <=>  NULL-safe equal 这个操作符和 = 操作符执行相同的比较操作,不过在两个操作码均为 NULL 时,其所得值为1而不为 NULL,而当一个操作码为 NULL 时,其所得值为0而不为 NULL;
         <> !=  不等于;
                 ( ... )  使用括弧来规定表达式的运算顺序。

【参考资料】
W3SChool 在线SQL教程   http://www.w3SChool.com.cn/sql/sql_where.asp  SQL WHERE 子句
   http://www.w3SChool.com.cn/sql/sql_and_or.asp  SQL AND & OR 运算符
   http://www.w3SChool.com.cn/sql/sql_like.asp  SQL LIKE 操作符
   http://www.w3SChool.com.cn/sql/sql_wildcards.asp  SQL 通配符
   http://www.w3SChool.com.cn/sql/sql_in.asp  SQL IN 操作符
   http://www.w3SChool.com.cn/sql/sql_between.asp  SQL BETWEEN 操作符

课后练习:
        1.判断正误:
         1)在使用操作符 OR 时,全部条件都必须是TRUE。
 2)在使用操作符 IN 时,所有指定的值都必须匹配。
 3)操作符 AND 可以用于 SELECT 和 WHERE 子句。
        2.  操作符 IN、BETWEEN、LIKE、IS NULL 的逻辑求反分别是什么?
        3.  下面的 SELECT 语句有错吗?错在何处?
 a.
 SELECT  SALARY
 FROM  EMPLOYEE_PAY_TBL
 WHERE  SALARY  BETWEEN 20000,30000;
 b.
 SELECT  SALARY+DATE_HIRE
 FROM  EMPLOYEE_PAY_TBL;
 c.
 SELECT  SALARY, BONUS
 FROM  EMPLOYEE_PAY_TBL
 WHERE  DATE_HIRE BETWEEN 2009-09-22 AND 2009-11-23
 AND POSITION = 'SALES'
 OR POSITION = 'MARKETING'
 AND EMPLOYEE_ID LIKE '%55%';
        4.  使用下面这个表 PRODUCTS_TBL:
 NAME                        NULL?     Type
 -----------------------------------------------------------
 PROD_ID         NOT NULL VARCHAR(10)
 PROD_DESC NOT NULL VARCHAR(25)
 COST    NOT NULL  DECIMAL(6,2)
         1)编写一个SQL语句,选择价格在1.00与12.50之间的产品,返回它们的ID、描述和价格。
         2)如果使用了操作符 BETWEEN,重新编写SQL语句,使用另一种操作符来得到相同的结果。如果没有使用BETWEEN,现在就来用一用。
         3)编写一个SELECT语句,返回价格小于1.00或大于12.50的产品,有两种方法可以实现。
         4)任选 PRODUCTS-TBL 表中的3种产品。编写一个查询,返回这3种产品的相关记录。之后,再重新编写一个查询,返回除这3种产品之外的所有产品记录。在查询中,组合使用相等操作符和连接操作符。
         5)使用IN操作符重新编写练习题7中的查询。比较两种方法,哪种更高效?哪种更易读?
         6)编写一个查询,返回所有名称以P开头的产品的记录。之后再重新编写一个查询,返回所有名称不以P开头的产品的记录。
        5. 有学生表 Student(Sno, Sname, Sage, Sdept),包括学号、姓名、年龄、系名字段;
           及成绩表 SC(studentid, courseid,grade),包括学生学号、课程编号、成绩字段。
           完成以下查询:
         1)查询年龄在20以下的学生的姓名。
         2)查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。
         3)查询年龄不在20~23岁之间的学生姓名、系别和年龄。
         4)查询'信息系'、'美术系'和'计算机系'学生的姓名和性别。
         5)查询学号为95001的学生的详细情况。
         6)查询所有姓刘学生的姓名、学号和性别。
         7)某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。
         8)查询所有有成绩的学生学号和课程号。
         9)查询计算机系年龄在20岁以下的学生姓名。
        10)查询信息系、美术系和计算机系学生的姓名和性别。