zoukankan      html  css  js  c++  java
  • Oracle学习【语句查询】

    基本查询语句
    any和all
    不能单独使用,必须和比较符一起使用
    >any 大于最小的
    例如:select * from emp where sal >any(1000,2000);
    <any 小于最大的
    >all 大于最大的
    <all 小于最小的

    distinct 过滤重复关键字
    例如:select distinct age from emp;

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

    查询语句执行顺序
    from子句
    执行顺序从后往前,从右到左,故数据量较少的表尽量放在后面
    例如:select t1.col,t2.col from t1,t2 where t1.id=t2.id;
    where子句
    执行顺序自上而下,从右到左,故将能过滤掉最大数量记录的条件写在where子句的最右
    group子句
    执行顺序从左往右分组,故最好将group by 前使用where将不需要的记录在group by之前过滤掉

    group by子句 分组
    当希望得到每个部门的平均薪水,而不是整个机构的平均薪水
    把整个数据表按部门分成一个个小组,每个小组中包含一行或多行数据,在每个小组中使用分组函数进行计算,没组返回一个记过
    划分的小组有多少,最后的结果集行数就有多少

    having子句
    消耗资源,尽量避免使用,having会在检索出所有记录之后才对结果集进行过滤,需要排序等操作
    having子句用来对分组后的结果进一步限制,比如按部门分组后,得到的每个部门的最高薪水,可以继续限制输出结果
    必须跟在group by 后面,不能单独存在

    select子句
    少用*号,尽量取字段名称,oracle在解析的过程中,通过查询数据字典将*号依次转换成所有的列名,消耗时间
    order by子句 对数据按一定规则进行排序操作,必须是查询语句的最后一个子句
    执行顺序从左到右,消耗资源
    asc(ascending)升序(默认) desc(descending)降序
    null值视作最大

    多列排序:
    首先按照第一列进行排序,如果第一列数据相同,再以第二列排序,以此类推
    例如:select ename,job,sal from emp order by job desc,sal desc;


    -----------------------------------------------------------------
    创建表空间:
    create tablespace
    scott_space
    datafile 'D:oracleuserscott_space.dbf'
    size 500m
    autoextend on
    next 20m maxsize 2000m;

    创建用户:
    create user scott identified by a
    default tablespace scott_space;

    给该用户解锁
    alter user scott account unlock;

    给用户授权
    grant connect,resource to scott;

    创建表DEPT:
    CREATE TABLE DEPT
    (DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
    DNAME VARCHAR2(14) ,
    LOC VARCHAR2(13) ) ;
    向表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');

    创建表EMP:
    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);

    向表EMP中插入数据:
    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 ename from emp where deptno=30;

    2、列出所有办事员的姓名、编号、和部门编号
    select ename,empno,deptno from emp where job='CLERK';

    3、找出佣金高于薪金的员工
    select ename from emp where comm>sal;

    4、找出佣金高于薪金60%的员工
    select ename from emp where comm>(sal*0.6);

    5、找出部门10中所有经理和部门20中所有办事员的详细信息
    select * from emp where deptno=10 and job='MANAGER' or deptno=20 and job='CLERK';

    6、找出部门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');

    7、找出有佣金的员工的不同工作
    select distinct job from emp where comm is not null;

    8、找出没有佣金或佣金低于100的员工
    select ename,comm from emp where comm is null or comm<100;

    9、找出各月倒数第三天受雇的所有员工
    select ename from emp where last_day(hiredate)-hiredate=2;

    10、找出早于12年前受雇的员工
    select ename,hiredate from emp where months_between(sysdate,hiredate)/12>=12;

    11、以首字母大写的方式显示所有员工的姓名
    select initcap(ename) from emp;

    12、显示正好为5个字符的员工姓名
    select ename from emp where length(ename)=5;

    13、显示不带有R的员工姓名
    select ename from emp where ename not like '%R%';

    14、显示所有员工的前三个字符
    select substr(ename,1,3) from emp;

    15、显示所有员工的姓名,用a替换A
    select replace(ename,'A','a') from emp;

    16、显示满10年服务年限的员工的姓名和受雇日期
    select ename,hiredate from emp where months_between(sysdate,hiredate)/12>=10;

    17、显示员工的详细信息,按姓名排序
    select * from emp order by ename;

    18、显示员工的姓名和受雇日期,根据其服务年限,将最老的员工排在最前面
    select ename,hiredate from emp order by hiredate asc;

    19、显示所有员工的姓名、工作和薪金,按工作的降序排序,若工作相同按薪金排序
    select ename,job,sal from emp order by job desc,sal desc;

    20、显示所有员工姓名、加入公司的年份和月份,按受雇日期所在的月排序,若月份相同则将最早年份的员工排在最前面
    select ename,extract(year from hiredate),extract(month from hiredate) from emp order by extract(month from hiredate),hiredate;
    或者
    select ename,to_char(hiredate,'YYYY/MM') from emp order by to_char(hiredate,'MM'),to_char(hiredate,'YYYY') asc;

    21、显示在一个月为30天的情况下所有员工的日薪金,忽略余数
    select round(sal/30) from emp;

    22、找出在任何年份的2月受聘的所有员工
    select ename,hiredate from emp where extract(month from hiredate)=2;

    23、对于每个员工,显示其加入公司的天数
    select ename,floor (sysdate-hiredate) as days from emp;

    24、以年月日的方式显示所有员工的服务年限(表述意图不明)

  • 相关阅读:
    java冒泡算法和选择排序法
    JDBC操作数据库,比如修改电商数据库中的分类的id,让各商品随机
    RF使用
    安装RF框架(基于Python)
    selenium+java的常使用的一些操作
    selenium的常用操作
    selenium的8种定位方式(java举例)
    服务管理
    Linux软件安装
    项目依赖
  • 原文地址:https://www.cnblogs.com/xujianbo/p/4921847.html
Copyright © 2011-2022 走看看