条件查询

条件查询 where –哪儿

基本语法:select 字段 from 表名 where 条件;

书写顺序 执行顺序
select from
from where
where select

例子:

1
2
3
4
5
6
7
8
9
10
select * from emp where 1 = 1;
select * from emp where 1 = 2;--在where中的条件,如果成立,及输出想要的内容,不成立不输出内容,但不会报错;

查询姓名为史密斯的员工的所有信息
select * from emp where ename = 'SMITH';
select * from emp where ename = 'smith';--where查询的值 严格区分大小写
select * from emp where 'SMITH';--错误,查找值时,前面要跟上对应的列名

查询薪资为3000的员工的所有信息
select * from emp where sal = 3000;

一. 逻辑运算符

< , <= , > , >= , = , 不等于号: != 或 <> –等于一次只能查询一个内容

1
2
3
4
5
select * from emp where ename < 'SMITH';--按照首字母比较

select * from emp where sal >= 3000;

select * from emp where ename = 'SMITH',ename ='KING';--报错,等于不能一次查询多个内容

二. 包含 in() 不包含 not in()

一次查询多个内容时使用

1
2
3
4
5
6
7
8
9
10
11
select * from emp where ename in('SCOTT','KING','FORD');--in既能查询一个内容,也能查询多个内容,是等于号的上位替代品。
select * from emp where ename in('scott','KING','FORD','史密斯');--in中有表中不存在的值时不输出,不会报错。

select * from emp where sal in(1000,2000,3000);
select * from emp where sal > in(1000,2000,3000);--报错,in跟not in不能跟逻辑运算符一起使用

select * from emp where sal not in(1000,2000,3000);--not in 为 in 的反面

select * from emp where ename in(2222,'KING','FORD','史密斯');--括号内的数据类型要保持一致

select * from emp where ename in('2222','KING','FORD','史密斯');

三. 布尔连接

and 且 –需要满足所有条件才能输出
or 或 –满足其一即可输出

1
2
3
4
5
select * from emp where ename = 'SMITH' or ename = 'KING';--查相同的列,or不如in好用

select * from emp where ename = 'SMITH' or sal = 3000;--可以查不同的列

select * from emp where ename = 'FORD' and sal = 3000;

思考题

and 跟 or 的优先级相同嘛?怎么验证?
不同, and 优先级比 or 高。

1
2
3
4
查询薪资为800 且 为30005000 的全部信息--输出结果为空,说明or优先级高于and,输出结果为5000,说明and优先级高于or。
SELECT * FROM EMP WHERE SAL=800 AND SAL= 3000 OR SAL=5000;--输出5000 》 and优先级高于or

SELECT * FROM EMP WHERE SAL=800 AND (SAL= 3000 OR SAL=5000);--输出空,说明有括号先算括号内,没括号先算and后算or

四. 范围 between 最小值 and 最大值

在什么跟什么之间–包含边界值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
求薪资在8003000之间的员工信息(包含8003000)
select * from emp where sal >= 800 and sal <= 3000;

select * from emp where sal between 800 and 3000;

求薪资在8003000之间的员工信息(不包含8003000)
select * from emp where sal > 800 and sal < 3000;

select * from emp where sal between 801 and 2999;
select * from emp where sal between 800 and 3000 and sal not in(800,3000);

select * from emp where sal between 3000 and 800;--查不出数据,相当于大于等于3000小于等于800
select * from emp where sal >= 3000 and sal <= 800;

注意点:between .. and .. 必须遵照先写最小值后写最大值的写法

五. 模糊查询 like 像 not like 不像

1
2
select * from emp where ename like 'SMITH';
select * from emp where ename not like 'SMITH';

1.通配符

_ : 有且只有一个字符
% :有0到多个字符

1
2
3
4
5
6
7
8
9
10
11
12
查询所有姓名为S开头的人的信息
select * from emp where ename like 'S%';

查询所有姓名为S开头,且长度为五个字母的人的信息
select * from emp where ename like 'S____';

查询所有姓名中含有S的人的信息
select * from emp where ename like '%S%';

思考题
查询名字中倒数第二个字母为T的人的信息
select * from emp where ename like '%T_';

2.转义字符 escape

自定义一个字符,让他作为转义字符使用

转义字符本身不会输出,作用是使他后面跟着的第一个字符以原本的样貌输出
一般用于转换并输出有特殊含义的字符

注:一个escape只能作用于和他相邻的一个like语句

1
2
查询姓名中带 % 的人的名字
select * from emp where ename like '%/%%' escape '/';

3.update 更新

可以永久性修改表内的数据

1
2
3
4
5
6
7
8
9
select * from emp for update;

select * from emp;


思考题
查询名字中带有% 或 带有_的人的信息
select * from emp where ename like '%/%%' escape '/' or ename like '%/_%' escape '/';
--转义字符的作用范围为一个字段。

六. 空值的查询 is null 空值 is not null 非空

注:空值与其他值运算时,答案为空

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
查询emp表中所有有佣金的员工
select * from emp where comm is not null;

查询emp表中所有没有佣金的员工
select * from emp where comm is null;


select sal,sal+100,comm from emp;
select sal,sal+100,comm+100 from emp;--空值不参与运算


select * from emp where comm >= 1000;
select * from emp where comm <= 1000;--空值不参与比较


select * from emp where comm = 0;--查不到空值
select * from emp where comm = '';--查不到空值
select * from emp where comm is null;--查询空值的方法


思考题
计算员工一年的总薪资--总薪资为:(薪资+奖金)*12
select 12*(sal+comm) 总薪资 from emp;--空值不参与运算

select 12*(sal+nvl(comm,0)) 总薪资 from emp;--正确答案
1
2
3
4
5
6
7
8
1.nvl(字段,默认值) 函数--专门针对空值的函数,作用是把空值处理成默认值
--函数必定带括号,函数会有一个返回值
--函数看里面填字段
select nvl(comm,100),comm from emp;

2.nvl2(字段,非空处理成默认值1,空值处理成默认值2)

select nvl2(comm,1,0),comm from emp;

注意点:
nvl() 跟 nvl2() 处理空值时,默认值数据类型要跟字段保持一致

1
2
3
4
例子:select nvl(comm,'无佣金'),comm from emp;--报错原因,默认值跟字段数据类型不一致
3.求和函数 sum()--了解一下,后面专门讲
select sum(nvl2(comm,1,0)) from emp;--求出有佣金的人数
select sum(sal) from emp;--当月总薪资(不包含佣金)

七. any() 任意一个 all() 全部–需要搭配逻辑运算符使用

1
2
3
4
5
6
7
8
select * from emp where sal > any(1000,2000,3000);--大于集合内最小值
select * from emp where sal > all(1000,2000,3000);--大于集合内最大值

select * from emp where sal < any(1000,2000,3000);--小于集合内最大值
select * from emp where sal < all(1000,2000,3000);--小于集合内最小值

select * from emp where sal = any(1000,2000,3000);--等于集合内任意数值
select * from emp where sal = all(1000,2000,3000);--等于集合内所有数值--不存在