zoukankan      html  css  js  c++  java
  • Oracle表查询

    使用scott用户中存在的emp、dept表等做演示

    一、单表查询

    查看表结构:desc dept;
    
    查看所有列:select
    * from dept;
    查询指定列:select ename,sal,job,deptno
    from emp;
    如何取消重复行:select disrinct deptno,job
    from emp;

    1.1 基本查询

    ①查询SMITH的薪水,工作,部门号
    select deptno,job,sal from emp where eanme=’SMITH’;
    
    
    ②显示每个雇员的年工资 select ename,sal
    *12 from emp; 不合理 select ename,sal*12+comm*12 from emp; 不合理
    ③修改列的名字,起别名 select ename ‘姓名’, sal
    *12 ‘年收入’ from emp;
    ④如何处理null值:nvl函数处理 select ename,sal
    *12+nvl(comm,0)*12 ‘年收入’ from emp; 每个雇员的年工资
    ⑤如何连接字符串(
    ||) select ename || ‘is a’ || job from emp;
    ⑥工资高于3000元的员工 select ename,sal
    from emp where sal>3000;
    1982.1.1后入职的员工 select ename,hiredate from emp where hiredate>’1-1月-1982
    显示工资在2000
    -3000的员工情况 Select ename,sal from emp where sal>=2000 and sal<=3000;
    ⑦使用like操作
    %:表示任意0到多个字符 _:表示任意单个字符
    查询首字符为S的员工的姓名和工资 select ename,sal
    from emp where ename like ‘S%’;
    查询第三个字符为大写O的所有的员工姓名和工资 select ename,sal
    from emp where ename like ‘__O%’;
    ⑧where中使用in 显示雇员的编号为123,
    345,800的雇员情况 select * from emp where empno in (7844,345,800);
    ⑨使用is null的操作 显示没有上级的雇员的情况 select
    * from emp where mgr is null;
    使用逻辑操作符号 查询工资高于500或是岗位为MANAGER的雇员,用时还要满足他们的姓名手写字母为大写的J select
    * from emp where (sal>500 or job=’MANAGER’) and ename like ‘J%’;
    使用order by 按照工资高低显示雇员的信息 select
    * from emp order by sal; 从低到高 select * from emp order by sal desc; 从高到低
    按照部门号升序而雇员的工资降序排列显示雇员的信息 Select
    * from emp order by deptno, sal desc;
    使用列的别名排序 按照年薪排序 select ename,(sal
    +nvl(comm,0))*12 “年薪” from emp order by “年薪” asc; 从低到高

    1.2 复杂查询

    ①数据分组:max、min、avg、sum、count
    
    所有员工中最高工资和最低工资 select ename,sal
    from emp where sal=(select max(sal) from emp); select ename,sal from emp where sal=(select min(sal) from emp);
    工资最高的员工的名字,工作岗位 select ename job
    from emp where sal=(select max(sal) from emp);
    工资高于平均工资的员工信息 select
    * from emp where sal>(select avg(sal) from emp);

    ②group by与having group by用于对查询的结果分组统计 having用于限制分组显示结果
    显示每个部门的平均工资和最高工资 select avg(sal),max(sal),deptno
    from emp group by deptno;
    显示每个部门的每种岗位的平均工资和最低工资 select avg(sal),min(sal),deptno,job
    from emp group by deptno,job;
    显示平均工资低于2000的部门号和它的平均工资 select deptno, avg(sal),max(sal)
    from emp group by deptno having avg(sal)<2000;

    ③总结:分组函数只能出现在选择列表、having、order by中 如果在select语句中同时包含有group by、having、order by 那么它们的顺序是group by、having、order by 在选择列中如果有列、表达式和分组函数,那么这些列和表达式必须有一个出现在group by中,否则就会出错 如:select deptno,avg(sal),max(sal)
    from emp group by deptno having avg(sal)<2000;

    二、多表查询

    2.1 基本查询

    ①显示雇员名,雇员工资及所在部门的名字(笛卡尔积)
    select a1.name,a1.sal,a2.dname from emp a1,dept a2 where a1.deptno=a2.deptno;
    注:多表查询的条件是 至少不能少于表的个数-1
    
    
    ②显示部门号为10的部门名、员工名和工资 Select a1.dname,a2.ename,a2.sal
    from dept a1,emp a2 where a1.deptno=a2.deptno and a1.deptno=10;
    ③显示各个员工的姓名、工资及工资的级别 Select a1.ename,a1.sal,a2.grade
    from dept a1,salgrade a2 where a1.sal between a2.losal and a2.hisal;
    ④显示雇员名,雇员工资及所在部门的名字,并按部门排序 select a1.ename,a2.dname,a1.sal
    from emp a1,dept a2 where a1.deptno=a2.deptno order by a1.deptno;
    ⑤自连接:在同一张表中的连接查询 显示FORD员工的上级领导的姓名 select worker.ename,boss.ename
    from emp worker,emp boss where worker.mgr=boss.empno and worker.ename=’FORD’;

    2.2 复杂查询

    ①子查询:嵌入在其他sql语句中的select语句
    单行子查询:只返回一行数据的子查询语句
    显示与SMITH同一部门的所有员工:先查询出SMITH的部门号
    select * from emp where deptno=( select deptno from emp where ename=‘SMITH’
    )
    多行子查询:返回多行数据的子查询 显示和部门10的工作相同的雇员的名字、岗位、工资和部门号 select
    * from emp where job in (select distinct job from emp where deptno=10);
    在多行子查询中使用all操作符 显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号 select ename,sal,deptno
    from emp where sal>all (select sal from emp where deptno=30);
    在多行子查询中使用any操作符 显示工资比部门30的任意一个员工的额工资高的员工的姓名、工资和部门号 Select ename,sal,deptno
    from emp where sal>any (select sal from emp where deptno=30);
    在from子句中使用子查询:显示高于自己部门平均工资的员工信息 解决:首先查询出各个部门的平均工资和部门号 select deptno,avg(sal) mysql
    from emp group by deptno; 把上面的查询看做是一张子表 select a2.ename,a2.sal,a2.deptno,a1.mysql from emp a2,(select deptno,avg(sal) mysal from emp group by deptno) a1 where a2.deptno=a1.deptno and a2.sal>a1.mysal; 注:当在from子句中使用子查询时,该子查询会被作为一个视图来对待,因此叫作内嵌视图,当在from子句中使用子查询时,必须给子查询指定别名

    ②分页查询 oracle分页一共有三种方式: rownum分页 select a1.
    *,rownum rn from (select * from emp) a1;

    ③用查询结果创建新表(快捷建表) create table mytable(id,name,sal,job,deptno) as select empno,ename,sal,job,deptno
    from emp;

    ④合并查询 在实际应用中,为了合并多个select语句的结果,可以使用集合操作符号union、union all、intersect、minus union:用于取得两个结果集的并集,当使用该操作符是,会自动去掉结果集中重复行 如:select ename,sal,job
    from emp where sal>2500 union select ename,sal,job from emp where job=’MANAGER’;

    union all:操作与union相似,但是它不会取消重复行,而且不会排序 select ename,sal,job
    from emp where sal>2500 union all select ename,sal,job from emp where job=’MANAGER’;
    intersect:用于取得两个结果的交集 select ename,sal,job
    from emp where sal>2500 intersect select ename,sal,job from emp where job=’MANAGER’;
    minus:用于取得两个结果集的差集,它只会显示存在第一个集合中,而不会存在第二个集合中的数据 select ename,sal,job
    from emp where sal>2500 minus select ename,sal,job from emp where job=’MANAGER’;

    内连接:

    左连接:

    右连接:right join

    三、子查询

     

     

    四、日期函数:

    1、日期和字符转换函数用法:(to_char,to_date,to_namber)

    使用to_date函数将字符转换成数字。

    使用to_char函数对日期的转换,并也可以对数字转换。

    使用to_namber函数将字符转换成日期

    格式:必须包含在单引号中且大小写敏感;可以包含任意的有效的日期格式;日期之间用逗号隔开。

    注意:(1)Dual 是一个‘伪表’作用于用来测试函数和表达式;(2)sysdate 格式化当前系统日期和时间

    2、日期函数调试

    Months_between :两个日期相差的月数

    代码:Select months_between(’01-9月-95’,’11-1月-94’) from  employees

    显示:19.6774

    Add_months :向指定日期中加上若干个月数

    代码:Select months_between(’11-1月-94’,6) from  employees

    显示:11-07-94

    Next_day :指定日期的下一个星期 对应的日期

    代码:Select next_day(‘01-9月-95’,‘星期五’) from employees

    显示:08-09-95

    Last_day :本月的最后一天

    代码:select last_day(‘01-2月-95’)from employees

    显示:28-02-95

    Rround :日期四舍五入

    Select round(sysdate,‘year’)from employees

    显示:01-10-19

    Select round(sysdate,‘month)from employees

    显示:01-04-9

    Trunc :日期截断

    Select trunc(sysdate,‘year’)from employees

    显示:01-10-19

    Select round(sysdate,‘month’)from employees

    显示:01-04-9

    3、系统的日期和时间格式

    是指格式当前系统的日期和时间,并使用to_char数字转换函数。

    代码:Select to_char(sysdate,yyyy-mm-dd hh24:mi:ss) from dual;

     

    注意:使用双引号向日期添加字符。

    4、数字符号转换格式

    To_char格式:9数字、0零、$美元符、L本地货币符号、.小数点、,千位符

     

    5、字符隐式格式

    若字符串中有特殊字符,例如 ’123456789’,则无法进行隐式转换,需要使用to_numbar()来完成

     

    6、查询相关的日期

    对于把日期作为查询条件的查询,一般都使用to_date() 把一个字符串转为日期,这样可以不必关注日期格式

  • 相关阅读:
    HashMap的小总结 + 源码分析
    Java的Cloneable接口还有深浅复制
    由Reference展开的学习
    类型信息小笔记
    String的小笔记
    Thinking In Java持有对象阅读记录
    Longest Palindromic Substring笔记
    Eclipse部署项目的原理简介eclipse,wtpwebapps,tomcat
    如何给不支持新特性的浏览器打补丁(让老版本IE兼容新特性)
    Listener监听器与Filter过滤器
  • 原文地址:https://www.cnblogs.com/zhangguosheng1121/p/11908553.html
Copyright © 2011-2022 走看看