在SELECT语句中使用WHERE子句实现对数据行的筛选操作,只有满足WHERE子句判断条件的行才会显示在结果集中。
SELECT columns_list
FROM table_name
WHERE conditional_expression
columns_list——字段列表;
table_name——表名;
conditional_expression——筛选条件表达式;
1. 比较筛选
可以在WHERE子句中使用比较运算符来筛选数据,基本的“比较筛选”操作主要有以下6种情况:
A=B:比较A与B是否相等。
A!B或A< >B:比较A与B是否不相等。
A>B:比较A是否大于B。
A
A>=B:比较A是否大于或等于B。
A
--查询emp表中工资(sal)大于2000的数据记录
select empno,ename,sal from emp where sal > 2000;
除了基本的“比较筛选”操作,还有以下两个特殊的“比较筛选”操作:
A{operator}ANY(B):表示A与B中的任何一个元素进行operator运算符的比较,只要有一个比较值为TRUE,就返回数据行。
A{operator}ALL(B):表示A与B中的所有元素进行operator运算符的比较,只有与所有元素比较值都为TRUE,才返回数据行。
--使用all关键字过滤工资(sal)同时不等于3000、5000、800的员工记录
select empno,ename,sal from emp where sal all(3000,5000,800);
注意:在进行比较筛选的过程中,字符串和日期的值必须使用单引号标识,否则Oracle会提示标识符无效。
2. 使用特殊关键字筛选
SQL语言提供了LIKE、IN、BETWEEN和IS NULL等关键字来筛选数据;
2.1. LIKE关键字——字符串模式匹配或字符串模糊查询
LIKE关键字需要使用通配符在字符串内查找指定的模式,主要使用以下两个通配符:
%:代表0个或多个字符。
_:代表一个且只能是一个字符。
--查询emp表中以A开头的员工名称
select empno,ename,job from emp where ename like 'A%';
在LIKE关键字前面加上NOT,表示否定的判断,如果LIKE为真,则NOT LIKE为假。另外,也可以在IN、BETWEEN、IS NULL和IS NAN等关键字前面加上NOT来表示否定的判断。
--查询工作是MANAGER的员工,但是不记得MANAGER的准确拼写了,仅记得第一个字母是M,第三个字母是N,第五个字母是G
select empno,ename,job from emp where job like 'M_N_G%';
LIKE关键字还可以帮助简化某些WHERE子句;例如:
--在emp表中,显示1981年入职的员工信息
select empno,ename,sal,hiredate from emp where hiredate like '%81%';
如果要查询的字符串中含有“%”或“_”,可以使用转义escape关键字实现查询;
--创建一张与dept表的结构和数据都相同的表dept_temp
create table dept_temp as select * from dept;
--插入一条数据
insert into dept_temp values(60,'IT_RESEARCH','SHANGHAI');
--提交
commit;
显示临时表dept_temp中所有部门名称以IT_开头的数据行,代码如下:
--通过转义字符\将_转义为本来的含义下划线而不再是单字符通配符
select * from dept_temp where dname like 'IT\_%' escape '\';
没有必要一定使用“\”字符作为转义符,可以使用任何字符来作为转义符。许多Oracle的专业人士之所以经常使用“\”字符作为转义符,是因为该字符在UNIX操作系统和C语言中就是转义符。
--使用a作为转义字符,查询出的结果是一样的
select * from dept_temp where dname like 'ITa_%' escape 'a';
2.2. IN关键字——测试一个数据值是否匹配一组目标值中的一个
IN关键字的格式是IN(目标值1,目标值2,目标值3,…)
--emp表中,使用IN关键字查询职务为CLERK、MANAGER或ANALYST的员工信息
select empno,ename,job from emp where job in('CLERK','MANAGER','ANALYST');
NOT IN表示查询指定的值不在某一组目标值中,这种方式在实际应用中也很常见。
--查询职务不为CLERK、MANAGER或ANALYST的员工信息
select empno,ename,job from emp where job not in('CLERK','MANAGER','ANALYST');
2.3. BETWEEN关键字——用于比较一个值是否在指定范围内
通常使用BETWEEN…AND和NOT…BETWEEN…AND来指定范围条件。
使用BETWEEN…AND查询条件时,指定的第一个值必须小于第二个值。因为BETWEEN…AND实质是查询条件“大于或等于第一个值,并且小于或等于第二个值”的简写形式,即BETWEEN…AND要包括两端的值,等价于比较运算符(>=…
--在emp表中,查询工资(sal)为1000~2000的员工信息
select empno,ename,sal from emp where sal between 1000 and 2000;
NOT BETWEEN…AND语句用于返回在两个指定值范围以外的某个数据值,并且不包括两个指定的值。
--在emp表中,查询工资(sal)不在1000~2000范围内的员工信息
select empno,ename,sal from emp where sal not between 1000 and 2000;
2.4. IS NULL关键字——筛选出特定列的值为空的行
空值(NULL)从技术上来说就是未知的、不确定的值,但空值与空字符串不同,因为空值是不存在的值,而空字符串是长度为0的字符串。
因为空值代表的是未知的值,所以并不是所有的空值都相等。例如,student表中有两名学生的年龄未知,但无法证明这两名学生的年龄相等,因此不能用“=”运算符来检测空值。SQL引入了IS NULL关键字来检测特殊值之间的等价性,IS NULL关键字通常在WHERE子句中使用。
--IS NULL关键字查询emp表中没有奖金(comm为空值)的员工信息
select empno,ename,sal,comm from emp where comm is null;
3. 逻辑筛选
逻辑筛选是指在WHERE子句中使用逻辑运算符AND、OR和NOT进行数据筛选操作,这些逻辑运算符可以把多个筛选条件组合起来,便于获取更加准确的数据记录。
AND逻辑运算符表示两个逻辑表达式之间是“逻辑与”的关系,可以使用AND运算符加比较运算符来代替BETWEEN…AND关键字。
--在emp表中,使用AND运算符查询工资(sal)为1000~2000的员工信息
select empno,ename,sal from emp where sal >= 1000 and sal
--在emp表中,查询工资(sal)为1000~2000的员工信息
select empno,ename,sal from emp where sal between 1000 and 2000;
上面两条语句执行结果是一样的;
OR逻辑运算符表示两个逻辑表达式之间是“逻辑或”的关系,两个表达式的结果中有一个为TRUE,则这个逻辑或表达式的值就为TRUE。
--在emp表中,使用OR逻辑运算符查询工资低于1000或工资高于2000的员工信息
select empno,ename,sal from emp where sal 2000;
NOT逻辑运算符用于对表达式执行逻辑非运算,即对条件取反,如果条件为true,使用NOT运算符后该条件将变为false,反之亦然。
领取专属 10元无门槛券
私享最新 技术干货