-- 条件(限定)查询


-- 在之前的简单查询中,是将所有的记录进行显示,但是现要对显示的记录进行过滤的操作,而这就属于限定查询的工作了,限定查询就是在之前语法的基础上增加了一个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%';