Oracle学习之路——限定查询与排序
2016-04-28 19:30
459 查看
因为昨天突然有了写博客的想法,所以这两天乘着五一,把之前已经学了的知识点都写出来,往后就应该是一周一更。奋斗坚持!!!
1.限定查询
限定查询顾名思义 就是在数据查询时设置一些的过滤条件,只有满足指定条件的才能保留下来
select [distinct] {*| 列名| 表达式 , ...} from 表名
[where
条件表达式]
条件表达式:列名 比较操作符 要比较的值
•WHERE子句紧跟在FROM子句之后
其中字符串数据和日期数据必须用单引号引起来,字符串数值区分大小写,日期数据一定要注意格式,默认格式为
“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;
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能查询空值)
这个地方使用两个通俗易懂的例子讲解and和or
and:例如登录qq成功为true。只有账号和密码都为true的时候才能成功登录true;当其中一个为true其中一个为false时显示谁的错误这时不能登录为false;当其中一个为true其中一个不填写为null时,提示谁为null;当都错误时提示错误false;当其中一个false一个不填写时为false(这个不恰当)
or:例如去餐厅吃上饭为true。钱包有钱或银行卡有钱或都有钱必然能吃上饭true;钱包有钱true 但不知道银行卡有没有钱null能吃上饭true;钱包没钱但也不知道银行卡有没有钱,就得查银行卡才能确定能不能吃饭null;钱包银行卡都没钱肯定不能吃饭false(只考虑钱包和银行卡)
not 条件:取反,not null仍然为null。not可使用在in,between…and…,like之前,还有is not null等用法。
优先级
传说中的()优先级高于一切
例题:
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(默认升序
数字排列小值在前,大值在后;日期排列相对较早在前;字符按’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);
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
and:例如登录qq成功为true。只有账号和密码都为true的时候才能成功登录true;当其中一个为true其中一个为false时显示谁的错误这时不能登录为false;当其中一个为true其中一个不填写为null时,提示谁为null;当都错误时提示错误false;当其中一个false一个不填写时为false(这个不恰当)
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 |
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);
相关文章推荐
- db2和oracle区别
- MySql类似Oracle的dual虚拟表
- Oracle单行函数
- oracle函数
- Oracle学习之路——简单查询
- oracle中CAST函数使用简介 (
- Oracle 11g笔记——数据库关闭
- Oracle 11.2.0.4 + rhel 6.5 x64一个神奇的问题
- oracle for update和for update nowait的区别 - 转
- mysql和oraclesql语法的区别
- oracle 查看锁表 清除锁表
- Oracle 12C优化器的巨大变化,上生产必读(上)
- Oracle 11g笔记——数据库启动
- oracle日期字段只取日期不要时间
- oracle添加字段 与 db2 添加字段
- Oracle中查看所有表和字段以及表注释.字段注释
- Oracle两个数据库互相访问,DBLink使用-转
- oracle 11g审计关闭,及删除日志
- ORACLE的数据类型
- oracle创建用户密码带特殊字符