使用where语句对结果进行过滤
SELECT *|{[DISTINCT] column|expression [alias],...}
FROM table
WHERE condition(s)};
比较运算符
操作符 | 含义 |
---|---|
= | 等于(不是==\color{red}{不是==}不是==) |
> | 大于 |
>= | 大于、等于 |
< | 小于 |
<= | 小于、等于 |
<> | 不等于(也可以是!=\color{red}{也可以是!=}也可以是!=) |
其它比较运算符
操作符 | 含义 |
---|---|
BETWEEN…AND… | 在两个值之间(包含边界\color{red}{包含边界}包含边界) |
IN(set) | 等于值列表中的一个 |
LIKE | 模糊查询 |
ISNULL | 空值 |
逻辑运算符
操作符 | 含义 |
---|---|
AND | 逻辑并 |
OR | 逻辑或 |
NOT | 逻辑否 |
Where语句示例
1. 字符和日期
- 字符和日期要包含在单引号中。
- 字 符 大 小 写 敏 感 , 日 期 格 式 敏 感 。 \color{red}{字符大小写敏感,日期格式敏感。} 字符大小写敏感,日期格式敏感。
- 默认的日期格式是 D D − M O N − R R 。 \color{red}{DD-MON-RR。} DD−MON−RR。
示例:查询名叫KING的员工
select * from emp where ename='KING';
示例:查询入职日期是17-11月-81的员工
select * from emp where hiredate='17-11月-81';
2. 非空和空的限制
示例:查询每月能得到奖金的雇员
分析:只要字段中存在内容表示不为空,如果不存在内容就是null。
语法:列名 IS NOT NULL
为空:列名 IS NULL
select * from emp where sal is not null;
示例:查询工资大于1500或者有奖金的雇员。
分析:多个查询条件或满足,条件之间使用“OR”
select * from emp where sal > 1500 or comm is not null;
示例:查询工资不大于1500和没有奖金的人
语法:NOT(查询条件)
select * from emp where not(sal > 1500) and comm is null;
范围限制
示例:基本工资大于1500但是小于3000的全部雇员
分析:sal>1500, sal<3000
select * from emp where sal>1500 and sal<3000;
b e t w e e n \color{red}{between} between a n d \color{red}{and} and 等价于 sal>=1500 and sal <= 3000
select * from emp where sal between 1500 and 3000;
示例:查询1981-1-1到1981-12-31号入职的雇员
分析:between and 不仅可以使用在数值之间,也可以用在日期的区间
select * from emp where hiredate between '1-1月-1981' and '31-12月-1981';
示例:查询雇员编号是7369,7499,7521的雇员编号的具体信息
分析:此时指定了查询范围,那么可以使用 I N \color{red}{IN} IN关键字
语法:
- 列名 IN (值1,值2,…)
- 列名 NOT IN (值1,值2,…)
其中的值不仅可以是数值类型,也可以是字符串
select * from emp where empno in (7369,7499,7521);
示例:查询雇员姓名是‘SMITH’,‘ALLEN’,‘WARD’的雇员具体信息
select * from emp where ename in ('SMIT','ALLEN','WARD');
注 意 : 如 果 集 合 中 含 有 n u l l , 不 能 使 用 n o t \color{red}{注意:如果集合中含有null,不能使用not} 注意:如果集合中含有null,不能使用not i n ; 但 可 以 使 用 i n \color{red}{ in;但可以使用in} in;但可以使用in
示例:查询不是10和20号部门的员工
select * from emp where deptno not in (10,20);
添加一个null到集合中
select * from emp where deptno not in (10,20,null);
模糊查询
在常用的网站中经常会有模糊查询,即:输入一个关键字,把符合的内容全部的查询出来,在sql中使用 L I K E \color{red}{LIKE} LIKE语句完成。
在LIKE中主要使用一下两种通配符
- “%” : 可以匹配任意长度的内容
- “_” : 可以匹配一个长度的内容
示例:查询出所有雇员姓名中第二个字符包含“M”的雇员
select * from emp where ename like '_M%';
在LIKE中如果没有关键字表示查询全部
示例:查询名字中带有“M”的雇员
select * from emp where ename like '%M%';
在oracle中不等号的用法可以有两种形式“<>”和"!="
示例:查询雇员编号不是7369的雇员信息
select * from emp where empno <> 7369;
select * from emp where empno != 7369;
查 询 带 有 特 殊 字 符 的 关 键 字 \color{red}{查询带有特殊字符的关键字} 查询带有特殊字符的关键字
插入一条数据:
insert into emp (empno,ename) values(14,'TOM_CAT');
示例:查询名字含有下划线的员工
分析:使用escape关键字声明转义字符,一般使用“\”
select * from emp where ename like '%\_%' escape '\';
SQL优化
select * from emp where condition1 and condition2
在 O r a c l e 中 , w h e r e 子 句 是 从 右 向 左 进 行 解 析 的 。 \color{red}{在Oracle中,where子句是从右向左进行解析的。} 在Oracle中,where子句是从右向左进行解析的。
所以,在and条件中,我们应尽量把可能为false的条件放在右边,这样就可以短路计算提升效率。
使用order by对结果排序
排序的语法:
在sql中可以使用ORDER BY 对查询结果进行排序
语法:
SELECT * | 列名 FROM 表名 {WHERE 查询条件} ORDER BY 列名1 ASC|DESC,列名2...ASC|DESC
示例:查询雇员的工资从低到高
分析:ORDER BY 列名 默认的排序规则是升序排列,可以不指定ASC,如果按着降序排列必须指定DESC
select * from emp order by sal;
如果存在多个排序字段可以用逗号分隔。
asc和desc作用于距离最近的列。
select * from emp order by sal asc, hiredate desc;
order by后面可以 + 列、表达式、别名、序号
select empno,ename,sal,sal*12 年薪 from emp order by 年薪 desc;
注 意 : O R D E R \color{red}{注意:ORDER } 注意:ORDER B Y 语 句 要 放 在 最 后 执 行 \color{red}{BY 语句要放在最后执行 } BY语句要放在最后执行
示例:查询雇员信息,按奖金升序排序:
select * from emp order by comm;
示例:查询雇员信息,按奖金降序排序:
select * from emp order by comm desc;
显然排序结果出现了错误, 因 为 在 O r a c l e 中 n u l l 最 大 \color{red}{因为在Oracle中null最大} 因为在Oracle中null最大
解决方法:
可以使用 null first, nulls last 来指定null的值显示的位置。
select * from emp order by comm desc nulls last;