大多数情况下,查询关注的是表中所有行的一个子集,需要用到Where过滤,本文主要介绍过滤的条件连接符(AND, OR, (),NOT),条件类型(相等条件、范围条件、成员条件、通配条件)以及当列名包含NULL值的注意事项。
1) AND:a AND b,选取要a和b都为真的数据子集
2) OR:a OR b,选取要a或b都为真的数据子集
3) ():当条件为3个或以上时,常常需要用到,比如 a AND (b OR c)
4) NOT:NOT a,选区非a的数据子集,NOT 对开发者来说,增加了对条件评估的难度,一般尽量避免使用:
如:WHERE end_date IS NULL
AND NOT (title = 'Teller' OR start_date < '2007-01-01')
可转换为:WHERE end_date IS NULL
AND title != 'Teller' AND start_date > '2007-01-01'
1) 相等条件,操作符 =,!=,<>
2) 范围条件,操作符 >,<, between,例如:
SELECT emp_id, fname, lname, start_date
FROM employee
WHERE start_date < '2007-01-01';
WHERE start_date BETWEEN '2005-01-01' AND '2007-01-01';
使用BETWEEN是,跟这BETWEEN后的一定要是范围的下限,AND后接范围上限,否则会是空集,这是因为BETWEEN a AND b等价于a<=x<=b
3) 成员条件,操作符 IN, NOT IN, 例如:
SELECT account_id, product_cd, cust_id, avail_balance
FROM account
WHERE product_cd IN ('CHK','SAV','CD','MM');
IN 后面也可以接子查询,如:
SELECT account_id, product_cd, cust_id, avail_balance
FROM account
WHERE product_cd IN (SELECT product_cd FROM product
WHERE product_type_cd = 'ACCOUNT');
4) 匹配条件,通配符:"_"表示一个字符通配符,“%”表示任意个字符通配符,关键词LIKE
SELECT lname
FROM employee
WHERE lname LIKE '_a%e%'; #第二个字符为a,且后面有e字符
SELECT emp_id, fname, lname
FROM employee
WHERE lname LIKE 'F%' OR lname LIKE 'G%'; # 查找姓氏以F和G开头的员工姓名
注意:表达式为"IS NULL",不能写出"=NULL",两个NULL只也不能判断相等,如:
如果改成 = NULL, 则查询结果是空集但不会报错(不熟悉SQL常犯错误):
如果值中包括NULL, 则在使用"!="时要考虑到NULL值的数据,因为"!="只对有值的情况进行判断:
例如:查找上级ID不是6(Helen Fleming)的所有员工
SELECT emp_id, fname, lname, superior_emp_id
FROM employee
WHERE superior_emp_id != 6;
结果不包含superior_emp_id列为NULL的Michael Smith
SELECT emp_id, fname, lname, superior_emp_id
FROM employee
WHERE superior_emp_id != 6 OR superior_emp_id IS NULL;