Oracle学习之路——限定查询与排序

时间:2022-09-16 14:44:21

因为昨天突然有了写博客的想法,所以这两天乘着五一,把之前已经学了的知识点都写出来,往后就应该是一周一更。奋斗坚持!!!

1.限定查询

	限定查询顾名思义 就是在数据查询时设置一些的过滤条件,只有满足指定条件的才能保留下来
	select [distinct] {*| 列名| 表达式 , ...} from 表名
	[where 条件表达式]
	条件表达式:列名 比较操作符 要比较的值
	•WHERE子句紧跟在FROM子句之后

2.比较运算符(=,>,>=,<,<=,<>,!=)

在Oracle中<>为不等于使用。以上比较运算符可进行数值、字符串、日期之间进行比较。其中字符串数据和日期数据必须用单引号引起来,字符串数值区分大小写,日期数据一定要注意格式,默认格式为“DD-MON-RR”如“28-4月-2016”


例题:

1.查询职位为SALESMAN的员工编号、职位、入职日期
	select empno,job,hiredate from emp where job='SALESMAN';
2.查询1985年12月31日之前入职的员工姓名及入职日期
	select ename,hiredate from emp where hiredate>'31-12月-85';或者(转换函数后期解释)select ename,hiredate from emp where to_char(hiredate,'yyyy-mm-dd')>'1985-12-31';
3.查询部门编号不在10部门的员工姓名、部门编号
	select ename,deptno from emp where deptno<>10;
或者 (使用not)
	select ename,deptno from emp where not deptno=10;

3.特殊比较运算符

between…and…判断要比较的值在某个范围
in(集合列表)判断要比较的值是否和集合中某一直相等
like(模糊查询)判断要比较的值是否满足部分匹配,通配符“_”表示一个字符串长度,“%”表示任意长度
is、like、=区别
is“是”什么、“=与什么一样”、like像什么
例题(between…and…和in
1.查询入职日期在82年至85年的员工姓名,入职日期
	select ename,hiredate from empwhere hiredate between '01-1月-1982' and '31-12月-1985'
2.查询月薪在3000到5000的员工姓名,月薪
	select ename,sal from emp where sal between 3000 and 5000;
3.查询部门编号为10或者20的员工姓名,部门编号
	select ename,deptno from emp where deptno in(10,20);
还可以使用 "or"
4.查询经理编号为7902, 7566,7788的员工姓名 ,经理编号
	select ename,mgr from emp where mgr in(7902,7566,7788);

例题(like)

5.查询员工姓名以W开头的员工姓名
	select ename from emp where ename like 'W%';
这道题在学习了字符函数之后还有where instr(ename,'W')=1;或者where substr(ename,1,1)='W';
但是还是喜欢like,就因为代码能少敲
2.查询员工姓名倒数第2个字符为T的员工姓名。 
	select ename from emp where ename like '%T_';
3.查询奖金为空的员工姓名,奖金
	select ename,comm from emp where comm is null;(is null能查询空值)

4.逻辑运算符(and,or ,not)

当需要和多个条件表达式进行比较时,需要使用逻辑运算符 把多个表达式连接起来,逻辑运算符包括AND、OR、NOT,逻 辑表达式的结果为TRUE,FALSE,NULL

时刻记住null为空值,表示不确定的值,不能认为0。
这个地方使用两个通俗易懂的例子讲解and和or

1.and:例如登录qq成功为true。只有账号和密码都为true的时候才能成功登录true;当其中一个为true其中一个为false时显示谁的错误这时不能登录为false;当其中一个为true其中一个不填写为null时,提示谁为null;当都错误时提示错误false;当其中一个false一个不填写时为false(这个不恰当)

2.or:例如去餐厅吃上饭为true。钱包有钱或银行卡有钱或都有钱必然能吃上饭true;钱包有钱true 但不知道银行卡有没有钱null能吃上饭true;钱包没钱但也不知道银行卡有没有钱,就得查银行卡才能确定能不能吃饭null;钱包银行卡都没钱肯定不能吃饭false(只考虑钱包和银行卡)

No. 条件x 条件y and or
1 true true true true
2 true null null true
3 true false false true
4 false false false false
5 false null false null
6 null null null null

not 条件:取反,not null仍然为null。not可使用在in,between…and…,like之前,还有is not null等用法。

5.运算符优先级

优先级
优先级 运算分类 举例
1 乘除 *,\
2 加减,连接 +,-,||
3 比较运算符 =,<>,<,>,<=,>=
4 特殊比较运算符 between…and…,in,like,is null
5 逻辑非 not
6 逻辑与 and
7 逻辑或 not

传说中的()优先级高于一切
例题:
1..查询工资超过2000并且职位是MANAGER,或者职位是SALESMAN的员工姓名、职位、工资 
select ename,job,sal from emp
where sal>2000 and job='MANAGER' or job= 'SALESMAN';
2.查询工资超过2000并且职位是MANAGER或SALESMAN的员工姓名 、职位、工资
select ename,job,sal from emp
where sal>2000 and (job='MANAGER' or job= 'SALESMAN');
3.查询部门在10或者20,并且工资在3000到5000之间的员工姓名 、部门、工资
select ename,job,sal from emp
where (sal between 3000 and 5000) and deptno in (10,20);
4.查询入职日期在81年,并且职位不是SALES开头的员工姓名、入职日期、职位
select ename,hiredate,job from emp where substr(hiredate,-2,2)='81' and job not like 'SALES%';

5.查询职位为SALESMAN或MANAGER,部门编号为10或者20,姓名 包含A的员工姓名职位部门编号
select ename,job,deptno from emp where job in('SALESMAN','MANAGER') and deptno in(10,20) 
and instr(ename,'A')>0;

6.Order by(默认升序 asc)

数字排列小值在前,大值在后;日期排列相对较早在前;字符按’A-Z‘;空值在升序中排最后,降序中排最前(降序为desc)
order by可有多列排序,按从前往后,且可随意指定排序方式。例如order by empno,sal
order by子句后列名可用数字代替,这个数字是select后列的顺序号;还可以写没在select列表后的列名

例题:
1.查询部门在20或30的员工姓名,部门编号,并按照工资升序排序
select ename,deptno from emp where deptno in(20,30)  order by sal asc;

2.查询工资在2000-3000之间,部门不在10号的 员工姓名、部门编号、工资,并按照部门升序,工资降序排序
select ename,deptno,sal from emp where sal between 2000 and 3000 and deptno <>10
order by deptno asc,sal desc;

3.查询入职日期在82年至83年之间,职位以 SALES或者MAN开头的员工姓名、入职日期、职位,并按照入职日期降序排序
select ename,hiredate,job from emp 
where substr(hiredate,-2,2)>='82' and substr(hiredate,-2,2)<='83' and job like 'SALES%' or job like 'MAN' order by hiredate desc;

1.查询入职时间在1982-7-9之后,并且不从事SALESMAN工作的 员工姓名、入职时间、职位
select ename,hiredate,job from emp 
where hiredate>'9-7月-1982' and job <>'SALESMAN';

2.查询员工姓名的第三个字母是a的员工姓名
select ename from emp where ename like '__A%';

3.查询除了10、20号部门以外的员工姓名、部门编号。
select ename,deptno from emp where deptno not in(10,20);

4.查询部门号为30号员工的信息,先按工资降序排序,再按姓名升序排序
select ename,deptno,sal from emp where deptno=30
order by sal desc,ename asc;

5.查询没有上级的员工(经理号为空)的员工姓名
select ename from emp where mgr is null;

6.查询工资大于等于4500并且部门为10或者20的员工的姓名、工 资、部门编号
select ename,sal,deptno from emp where sal>=4500 and deptno in(10,20);