zoukankan      html  css  js  c++  java
  • 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;
    --以年月日的方式显示所有员工的服务年限(表述意图不明)

  • 相关阅读:
    删除 Visual studio 生成后的临时文件
    C# 中的委托和事件(转)
    C#复制DataRow出现“该行已经属于此表”错误的解决办法(转)
    ini配置文件读取类
    c# wpf窗体前端显示问题
    注册系统热键类(原创)
    C# 窗体最小化的托盘/系统通知区域(转)
    php explode()返回值
    $_SERVER['SCRIPT_NAME']
    svn合并初次使用心得
  • 原文地址:https://www.cnblogs.com/zy19930408/p/4867794.html
Copyright © 2011-2022 走看看