一、组合WHERE子句
1、AND操作符
SELECT 字段名1,字段名2,字段名3
FROM 表名
WHERE 字段名1='abc123' AND 字段名2<=4;
在 SQL 查询的 WHERE
子句中,AND
操作符连接两个或多个条件,表示只有当所有这些条件都满足时,才会选中相应的记录。
假设有一个员工表,包含字段员工姓名(employee_name)、工资(salary)和职位(position)。如果要查询职位是 “经理” 且工资大于等于 10000 的员工记录,可以这样写:
SELECT employee_name, salary, position
FROM employees
WHERE position='经理' AND salary>=10000;
2、OR操作符
SELECT 字段名1,字段名2,字段名3
FROM 表名
WHERE 字段名1='abc123' OR 字段名1='abc111';
OR
操作符用于连接多个条件,表示只要其中一个条件满足,就会选中相应的记录。OR操作符告诉DBMS匹配任一条件而不是同时匹配两个条件。
还是以员工表为例,如果要查询职位是 “经理” 或者工资大于等于 15000 的员工记录,可以这样写:
SELECT employee_name, salary, position
FROM employees
WHERE position='经理' OR salary>=15000;
3、求值顺序
SELECT 字段名1,字段名2,字段名3
FROM 表名
WHERE (字段名1='abc123' OR 字段名1='abc111')
AND 字段名2 >=80;
将前两个条件用圆括号括了起来。因为圆括号具有比AND或OR操作符更高的优先级。
SQL(像多数语言一样)在处理OR操作符前,优先处理AND操作符。此问题的解决方法是使用圆括号对操作符进行明确分组。在 SQL 中,默认情况下会先处理 AND
操作符,然后再处理 OR
操作符。如果不明确指定优先级,可能会得到不符合预期的结果。使用圆括号可以明确指定条件的组合顺序。
以员工表为例,如果要查询职位是 “经理” 或者职位是 “主管” 且工资大于等于 8000 的员工记录,正确的写法是:
SELECT employee_name, salary, position
FROM employees
WHERE (position='经理' OR position='主管') AND salary>=8000;
如果不使用圆括号,可能会先处理 AND
操作符,导致结果不准确。
4、IN操作符
SELECT 字段名1,字段名2
FROM 表名
WHERE 字段名1 IN ('abc123' ,'abc111')
ORDER BY 字段名2;
IN
操作符允许在 WHERE
子句中指定一个值的列表,只要字段的值在这个列表中,就满足条件。它可以替代多个 OR
条件。IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取一组由逗号分隔、括在圆括号中的合法值。(IN操作符完成了与OR相同的功能)
以员工表为例,如果要查询职位是 “经理”、“主管” 或 “工程师” 的员工记录,可以这样写:
SELECT employee_name, salary, position
FROM employees
WHERE position IN ('经理', '主管', '工程师');
5、NOT操作符
SELECT 字段名1,字段名2
FROM 表名
WHERE NOT 字段名1='abc123'
ORDER BY 字段名1;
NOT
操作符用于否定后面的条件。如果条件为真,加上 NOT
后变为假;如果条件为假,加上 NOT
后变为真。
以员工表为例,如果要查询职位不是 “经理” 的员工记录,可以这样写:
SELECT employee_name, salary, position
FROM employees
WHERE NOT position='经理';
练习题
1.编写SQL语句,从Vendors表中检索供应商名称(vend_name),仅返回加利福尼亚州的供应商(这需要按国家[USA]和州[CA]进行过滤,没准其他国家也存在一个加利福尼亚州)。提示:过滤器需要匹配字符串。
2.编写SQL语句,查找所有至少订购了总量100个的BR01、BR02或BR03的订单。你需要返回OrderItems表的订单号(order_num)、产品ID(prod_id)和数量,并按产品ID和数量进行过滤。提示:根据编写过滤器的方式,可能需要特别注意求值顺序。
3.编写SQL语句,返回所有价格在3美元到6美元之间的产品的名称(prod_name)和价格(prod_price)。使用AND,然后按价格对结果进行排序。
4.下面的SQL语句有问题吗?(尝试在不运行的情况下指出。)
SELECT vend_name
FROM Vendors
ORDER BY vend_name
WHERE vend_country = 'USA' AND vend_state = 'CA';