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)查询信息系、美术系和计算机系学生的姓名和性别。