-- 条件(限定)查询
-- 在之前的简单查询中,是将所有的记录进行显示,但是现要对显示的记录进行过滤的操作,而这就属于限定查询的工作了,限定查询就是在之前语法的基础上增加了一个WHERE子句,用于指定限定条件,此时语法如下:
语法:
SELECT [DISTINCT] 列名 [[AS] 别名] FROM 表名 [表的别名] [WHERE 条件]
执行顺序:
1.FROM 表名 [表别名]
2.[WHERE 条件]
3.SELECT [DISTINCT] 列名 [[AS] 别名]
-- 关系运算符
运算符 名称 用法 结果(Boolean值)
> 大于 列名>12 Boolean
< 小于 列名<10 Boolean
>= 大于等于 列名>=22 Boolean
<= 小于等于 列名<=列名 Boolean
= 等于 列名 = 列名 Boolean
<>(!=) 不等于 列名<>'张三' Boolean
例如:
-- 1.查询emp表中,基本工资高于1500的雇员的所有信息
SELECT * FROM emp WHERE sal>1500;
-- 2.查询emp表中,名字叫做 SMITH 的雇员的所有信息
SELECT * FROM emp WHERE ename='SMITH';
-- 3.查询emp表中,职位不是销售 SALESMAN 的雇员的 编号、姓名、职位
SELECT empno,ename,job FROm emp WHERE job<>'SALESMAN';
-- 逻辑运算符
运算符 名称 用法 结果(Boolean值)
AND 与 条件1 AND 条件2 Boolean
OR 或 条件1 OR 条件2 Boolean
NOT 非 NOT 条件 Boolean
代码示例:
-- 查询emp表中,基本工资在 1200~2500之间 的雇员的所有信息
SELECT * FROM emp WHERE sal>=1200 AND sal<=2500;
-- 查询emp表中,基本工资大于3000,或者职位是办事员CLERK 的雇员的所有信息
SELECT * FROM emp WHERE sal>3000 OR job='CLERK';
-- 查询emp表中,基本工资<不>在 1200~2500之间 的雇员的所有信息
SELECT * FROM emp WHERE NOT (sal>=1200 AND sal<=2500);
-- 区间运算符
运算符 名称 用法 结果(Boolean值)
BETWEEN…AND... 从(最小值)到(最大值);包含最小值和最大值 SAL BETWEEN 1200 AND 2500 Boolean
代码示例:
-- 查询emp表中,基本工资在 1200~2500(包含1200和2500)之间 的雇员的所有信息
SELECT * FROM emp WHERE sal BETWEEN 1200 AND 2500;
-- 查询emp表中,所有时间 hiredate 在1981年雇佣的雇员信息。1981年指:(1981-01-01~1981-12-31)
SELECT * FROM emp WHERE hiredate BETWEEN '01-1月-81' AND '31-12月-81';
注:
范围运算符 一般用在 数值类型 和 时间类型上比较多。
虽然可以用在字符串上,但是结果意义不大。
-- 空判断运算符
运算符 名称 用法 结果(Boolean值)
IS NULL 是否为空 comm IS NULL Boolean
IS NOT NULL 是否不为空 comm IS NOT NULL Boolean
注:
这里的 NULL 可以理解成 类似于java的空引用。
但 如果是数值类型的 NULL 绝不代表是 0 。
Oracle 数据库 的空判断不能使用 关系运算符判断。只能使用 IS NULL 或者 IS NOT NULL 进行判断。
如:comm = null,这是错误的。
代码示例:
-- 查询emp表中,所有佣金 COMM 为空的雇员信息(没有提层的雇员)。
SELECT * FROM emp WHERE comm IS NULL;
-- 查询emp表中,所有佣金 COMM <不>为空的雇员信息(拥有提层的雇员)。
SELECT * FROM emp WHERE comm IS NOT NULL;
-- 谓词(等值) 运算符
运算符 名称 用法 结果(Boolean值)
IN 在之中 empno IN(7499,7844,9999) 编号是否 在7499,7844,9999之中(等值判断) Boolean
NOT IN 不在之中 empno NOT IN(7499,7844,9999) 编号是否 不在7499,7844,9999之中(等值判断) Boolean
代码示例:
-- 查询emp表中,编号是 7499 或是 7844 或是 9999 或是 7566 的雇员信息。(使用逻辑运算符可以解决该问题,但是语法长度较长,比较繁琐)
SELECT * FROM emp WHERE empno IN(7499,7844,9999,7566);
-- 查询emp表中,编号不为( 7499 、7844、9999 、7566 )其中一个的雇员信息。(使用逻辑运算符可以解决该问题,但是语法长度较长,比较繁琐)
SELECT * FROM emp WHERE empno NOT IN(7499,7844,9999,7566);
需要注意的是:
NOT IN(null);括号内不能 有 null元素,因为有些列数据永远 不为null,所以条件永远成立,就变成所有条件都满足,即为:全查询了。而我们在查询的时候是把数据加载内存中处理,如果在数据比较多的数据库中(如银行信息等)全查询,那么就有可能照成计算机内存爆满而死了的可能…。但是这里要说的是,Oracle内部对 NOT IN (null)做了特殊处理,不允许NOT IN 直接出现null、如果出现了 null,将不会反回任何数据。
所以,在开发中要时刻注意 全查询会带来的危害。
-- 模糊查询运算符(设计到的通配符有:_ 、%)
运算符 名称 用法 结果(Boolean值)
LIKE 包含 ename LIKE '_A%' ;名字第二位字符为A Boolean
通配符解释:
通配符 '_' :代表匹配一位;
通配符 % :代表匹配 0 至多位;
代码示例:
-- 查询emp表中,雇员姓名以 A 字符开头的雇员信息
SELECT * FROM emp WHERE ename LIKE 'A%';
-- 查询emp表中,雇员姓名以 S字符结尾的雇员信息
SELECT * FROM emp WHERE ename LIKE '%S';
-- 查询emp表中,雇员姓名的第二位字符是 A 的雇员信息
SELECT * FROM emp WHERE ename LIKE '_A%';
-- 查询emp表中,雇员姓名中包含 A 字符的雇员信息
SELECT * FROM emp WHERE ename LIKE '%A%';
-- 查询emp表中,雇员薪资中包含 9 的雇员信息(LIKE 除了可以用在字符串上也可以用在数值上)
SELECT * FROM emp WHERE sal LIKE '%9%';