oracle学习第三天

日期常用函数
last_day(date)返回日期date所在月的最后一天
select last_day(sysdate) from dual;

add_months(date,i)返回日期date加上i个月后的日期值
select add_months(sysdate,3) from dual;

months_between(date,date_)返回两个日期间隔多少个月
结果可能是负数和小数(可以用ceil函数直接进位)


next_day(date,周几)返回date日期数据的下一个周几的日期,例如4 即下一个周四的日期

least(1,2,55,100,2,24)
greatest(1,88,2,33,55)

extract(date from datetime)
例如:select extract(year from sysdate) from dual;

null和任何值进行运算返回的都是null;
select * from tablename where column = null;//对于null值不能这样进行比较
select * from tablename where column is null;
select * from tablename where column is not null;

nvl(col_null,col_not_null)将null值转变成非null值处理 请保持两个参数的类型一致
例如:select sal,comm,sal +nvl(comm,0) as 'salary' from emp;

nvl2(col_null,col_is_null,col_is_not_null)将null值转变成实际值 作用有点像三目表达式
如果是null 转成coll_is_null,如果不是null,转成col_is_not_null
select sal,comm,sal+nvl2(comm,0,1000) as 'salary' from emp;


select * from emp where sal>any(1000,2000,3000);
>any大于最小的
<any小于最大的
>all大于最大的
<all小于最小的

dinstinct 过滤重复关键字

聚合函数 即数据统计
max(col)
min(col)
avg(col)
sum(col)
count(col/*)
当使用count(column)时,该字段含null值,计数器会将该null值的这一列忽略,所以会造成统计数据有误差
select count(nvl(age,0)) from t_3;//将null值包含进查询
其中的空值可以使用nvl和nvl2函数处理


select age
from t_3
where age>15
order by age;
select 子句
少用*号,尽量取字段名称,oracle在解析的过程中,通过查询数据字典将*号依次转换成所有的列名,消耗时间
order by子句
执行顺序从左到右,消耗资源
order by 子句 对数据按一定顺序排列
asc升序,desc降序
null值视作最大
多列排序
首先按照第一列进行排序,如果第一列数据相同,再以第二列排序,以此类推

from 执行顺序从后往前,从右到左,故数据量较少的表尽量放在后面
select * t1.col,t2.col from t1,t2 where t1.id=t2.id;
where子句
执行顺序为自上而下,从右到左,故将能过滤掉最大数量记录的条件写在where子句的最右
group子句
执行顺序从左到右分组
having子句
跟在group子句之后,不能单独使用

select子句

1--创建一个表空间 scott_space
2--创建用户scott/a
3--授权
4--使用该用户创建表并插入数据

CREATE TABLE DEPT
(DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
DNAME VARCHAR2(14) ,
LOC VARCHAR2(13) ) ;
CREATE TABLE EMP
(EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT);
INSERT INTO DEPT VALUES
(10,'ACCOUNTING','NEW YORK');
INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
INSERT INTO DEPT VALUES
(30,'SALES','CHICAGO');
INSERT INTO DEPT VALUES
(40,'OPERATIONS','BOSTON');
INSERT INTO EMP VALUES
(7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
INSERT INTO EMP VALUES
(7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO EMP VALUES
(7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO EMP VALUES
(7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO EMP VALUES
(7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO EMP VALUES
(7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO EMP VALUES
(7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO EMP VALUES
(7788,'SCOTT','ANALYST',7566,to_date('13-7-87','dd-mm-rr')-85,3000,NULL,20);
INSERT INTO EMP VALUES
(7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO EMP VALUES
(7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO EMP VALUES
(7876,'ADAMS','CLERK',7788,to_date('13-7-87', 'dd-mm-rr')-51,1100,NULL,20);
INSERT INTO EMP VALUES
(7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO EMP VALUES
(7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP VALUES
(7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);

--1.选择部门30中的所有员工
select * from emp where deptno=30;
--2.列出所有办事员的姓名,编号和部门编号
select ename ,empno,deptno from emp where job='CLERK';
--找出佣金高于薪金的员工
select ename from emp where comm>sal;
--找出佣金高于薪金60%的员工
select ename from emp where comm>(sal*0.6);
--找出部门10中所有经理和部门20中所有办事员的详细资料
select * from emp where deptno=10 and job='MANAGER' or deptno=20 and job='CLERK';
--找出部门10中所有经理,部门20中所有办事员,既不是经理又不是办事员但薪金大于或等于2000的所有员工的详细资料
select * from emp where deptno=10 and job='MANAGER' or deptno=20 and job='CLERK' or sal>=2000 and job not in('MANAGER','CLERK');
--找出收取佣金的员工的不同工作
select distinct job from emp where comm is not null;
--找出没有佣金的或有佣金的低于100的员工
select ename from emp where comm is null or comm<100;
--找出各月倒数第三天受雇的所有员工
select ename from emp where last_day(hiredate)-hiredate=2;
--找出早于12年前受雇的员工
select ename from emp where months_between(sysdate,hiredate)/12>=12;
--以首字母大写的方式显示所有员工的姓名
select initcap(ename) from emp;
--显示正好为5个字符的员工姓名
select ename from emp where length(ename)=5;
--显示不带有R的员工姓名
select ename from emp where ename not like '%R%';
--显示所有员工的前三个字符
select substr(ename,1,3) from emp;
--显示所有员工的姓名,用a替换所有A
select replace(ename,'A','a') from emp;
--显示满10年服务年限的员工姓名和受雇日期
select ename,hiredate from emp where months_between(sysdate,hiredate)/12>=10;
--显示员工的详细资料,按姓名排序
select * from emp order by ename;
--显示员工的姓名和受雇日期,根据其服务年限,将最老的员工排在最前面
select ename ,hiredate from emp order by hiredate asc;
--显示所有员工的姓名,工作和薪金,按工作的降序排序,若工作相同按薪金排序
select ename,job,sal from emp order by job desc,sal asc;
--显示所有姓名,加入公司的年份和月份,按受雇日期所在月排序.若月份相同则将最早年份的员工排在最前面
select ename,extract(year from hiredate),extract(month from hiredate) from emp order by extract(month from hiredate),extract(year from hiredate) asc;
--显示在一个月为30天的情况所有员工的日薪金,忽略余数
select round(sal/30) from emp;
--找出在任何年份的2月受聘的所有员工
select ename from emp where extract(month from hiredate)=2;
--对于每个员工,显示其加入公司的天数
select ename,round(sysdate-hiredate) from emp;
--以年月日的方式显示所有员工的服务年限(表述意图不明)

原文地址:https://www.cnblogs.com/zy19930408/p/4867794.html