Oracle中的基本查询
1.连接符 concat或||
concat将字符串连接起来,相当于java中的+号:
select concat('hello','world') from dual; 效果:helloworld
注1:dual是一个伪表(虚拟表),作用就是满足select的语法要求,比如打印输出。
2.||连接字符串:
--查询员工表中的信息,显示xxx的薪水是xxx
select ename||'的薪水是'||sal from emp;
3.where 过滤条件
Select * from 表名 where 条件
注意事项:字符和日期要包含在单引号中,字符的大小写敏感,日期格式敏感
--查询入职时间为17-11月-81的员工,默认的时间格式为DD-MM-YY
select * from emp where hiredate='17-11月-81';
注意事项:日期格式改为我们认识的1981-11-17是查询不了,并提示:文字与格式字符串不匹配
如果要用’yyyy-MM-dd’格式查询日期:
--修改本次会话的日期格式:
Alter session set nls_date_format=’yyyy-MM-dd’;
再查询就可以用yyyy-MM-dd格式
4.比较运算符
= 等于
> 大于
< 小于
>= 大于等于
<= 小于等于
<> 不等于也可以是!=
5.between .. and .. 在两个值之间,包含边界()
查询时间:
select * from 表名 where 列名between '1980-12-17' and '1981-4-3'
--设置转义字符就可以了 模糊查询
select * from 表名 where 列名like '%\_%' escape '\';
--查询工资在800-2450的员工
select * from 表名 where 列名between 800 and 2450;
in 包含
--查询部门编号10和20下的所有员工
select * from emp where deptno in(10,20);
in(‘男’,’女’)
注2:escape定义转义符
注意:Oracle中的事务是手动开启的,如果现在输入rollback;事务会回滚,要插入的数据保存需要手动commit;
is null 是空值
is not null 是非空值
6.逻辑运算符 not、and、or
7.排序 order by
asc 升序
desc 降序
order by 语句在select语句的结尾,默认是升序
order by后可以跟 列名,表达式,别名,序号
null值的排序
--按照奖金升序排列,null值排在后面,是正常的
select * from emp order by comm;
--按照奖金降序排列,Oracle中,null值最大,null值排在前面了,需要将null值排在最后
select * from emp order by comm desc nulls last;
8.取消重复行
select distinct deptno,job from emp;
9.查询处理空值
nvl(expr1, expr2)
如果expr1为空则返回expr2
select sal*13+nvl(comm, 0) total from emp;
nvl2(expr1, expr2, expr3)
如果expr1不为空,返回expr2,否则返回expr3
select empno,ename, nvl2(comm,'有奖金','没有奖金') from emp;
nullif(expr1, expr2)
如果expr1和expr2相等返回空,否则返回expr1
10.子查询
注意:子查询要少用,效率比较低。
注意:主查询和子查询可以不是同一张,只要子查询返回的结果主查询可以使用即可
11.Oracle中的伪列
- rowid
rowid是物理存在的,唯一的,但是其值并未存储在表中,所以不支持增删改操作
select rowid,emp.* from emp;
--创建class表,用于模拟重复数据
create table class(
classid number(4),
cname varchar2(20)
);
利用rowid删除重复行数据
分析:
* 找到重复的数据
方法1:select distinct * from class;
方法2:select * from class group by classid,cname having count(*)>1;
只保留一个重复的就可以了,利用rowid的唯一性,将条件改为>=1,保留没有重复的
select max(rowid) from class group by classid,cname having count(*)>=1;
使用子查询,删除重复的数据
delete from class where rowid not in(select max(rowid) from class group by classid,cname having count(*)>=1);
2.rownum
rownum伪列是Oracle进行查询获取到结果集之后在加上去的一个伪列,
这个伪列对符合条件的结果添加一个从1开始的序列号
select rownum,ename,job,sal from emp;
rownum永远按照默认的顺序生成
如果要按照排序后的效果重新生成rownum,必须使用子查询
3.利用rownum进行分页查询
--22、emp表按照姓名s%模糊查询的分页语句,要求每页显示2条记录
select * from (
select rownum r,e.* from emp e where ename like '%S%' and rownum<=4
) where r>2;