使用where语句对结果进行过滤
SELECT *|{[DISTINCT] column|expression [alias],...}
FROM table
WHERE condition(s)};
比较运算符
| 操作符 | 含义 |
|---|---|
| = | 等于(不是==\color{red}{不是==}不是==) |
| > | 大于 |
| >= | 大于、等于 |
| < | 小于 |
| <= | 小于、等于 |
| <> | 不等于(也可以是!=\color{red}{也可以是 !=}也可以是!=) |
其它比较运算符
| 操作符 | 含义 |
|---|---|
| BETWEEN…AND… | 在两个值之间(包含边界\color{red}{包含边界}包含边界) |
| IN(set) | 等于值列表中的一个 |
| LIKE | 模糊查询 |
| IS NULL | 空值 |
逻辑运算符
| 操作符 | 含义 |
|---|---|
| AND | 逻辑并 |
| OR | 逻辑或 |
| NOT | 逻辑否 |
Where语句示例
1. 字符和日期
- 字符和日期要包含在单引号中。
- 字符大小写敏感,日期格式敏感。\color{red}{字符大小写敏感,日期格式敏感。}字符大小写敏感,日期格式敏感。
- 默认的日期格式是DD−MON−RR。\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;

between\color{red}{between}between and\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的雇员编号的具体信息
分析:此时指定了查询范围,那么可以使用IN\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');

注意:如果集合中含有null,不能使用not\color{red}{注意:如果集合中含有null,不能使用not}注意:如果集合中含有null,不能使用not in;但可以使用in\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中使用LIKE\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
在Oracle中,where子句是从右向左进行解析的。\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;

注意:ORDER\color{red}{注意:ORDER }注意:ORDER BY语句要放在最后执行\color{red}{BY 语句要放在最后执行 }BY语句要放在最后执行
示例:查询雇员信息,按奖金升序排序:
select * from emp order by comm;
示例:查询雇员信息,按奖金降序排序:
select * from emp order by comm desc;

显然排序结果出现了错误,因为在Oracle中null最大\color{red}{因为在Oracle中null最大}因为在Oracle中null最大
解决方法:
可以使用 null first, nulls last 来指定null的值显示的位置。
select * from emp order by comm desc nulls last;

本文深入探讨了SQL查询语句的构造与优化方法,包括条件筛选、数据排序、空值处理及模糊查询等核心功能,提供了丰富的示例帮助读者理解和掌握SQL在数据检索中的应用。
1279

被折叠的 条评论
为什么被折叠?



