问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

ORACLE 正常单表查询不使用索引,加入基本函数后就走索引了。。

发布网友 发布时间:2022-04-07 20:38

我来回答

2个回答

懂视网 时间:2022-04-08 01:00

(一)基本语句 1、语法
  • select 【distinct】 * | {列名...}  from 表名 【where {条件}】
  • 2、注意 1)distinct:指显示结果时,是否剔除重复数据
  • 指查询的字段数据,全部一致,才算重复。
  • SELECT distinct deptno,job,empno FROM EMP order by deptno;
  • 查询的这(deptno,job,empno)三个字段需要一样,才算重复。
  • SELECT a.deptno,a.job FROM EMP a; 
    SELECT distinct a.deptno,a.job FROM EMP a order by a.deptno
    
    
  • 查询的这(deptno,job)2个字段需要一样

  • 2)去重:
    SELECT a.deptno,a.job FROM EMP a; 
    SELECT distinct a.deptno,a.job FROM EMP a order by a.deptno
  • 查询的这(deptno,job)2个字段需要一样
  • (二)其他用法 1、算数表达式 1)方法:
  • ABS(x) :绝对值
  • sign(x) :判断正负。
  • 正值返回1,负值返回-1,0返回0
  • ceil(x):向上取整。
  • select ceil(3.1),ceil(0),ceil(-3.9) from dual; --4、0、-3
  • floor(x) :向下取整。
  • power(x,y) :返回x的y次幂 
  • mod(x,y) :返回x除以y的余数
  • round(x[,y]) :返回四舍五入后的值 
  • trunc(x[,y]) :返回x按精度y截取后的值 。*
  • select trunc(5555.66666,2.1),trunc(5555.66666,-2.6),trunc(5555.033333) from dual;

  • 显示:5555.66、5500、5555
  • sqrt(x) :返回x的平方根
  • 2)、实例:显示每个雇员的年工资
  • 语句:
  • SELECT a.ename,(a.sal*13+nvl(a.comm,0)*13) as "年薪", a.ename||'-'||(a.sal*13+nvl(a.comm,0)*13) as "拼接字串"FROM EMP a ;

  • comm:为奖金
  • 注意:
  • nvl(字段,0):处理null值
  • as "" :增加别名
  • ||:拼接字串
  • 2、where 条件 1)to_char()函数:
    SELECT * FROM EMP a WHERE to_char(a.hiredate,'yyyy-mm-dd') > '1981-11-17';

    2)like:‘%’-0~多个;‘_’-1个 3)between:薪水在2000~2500的员工
    SELECT * FROM EMP a WHERE a.sal between 2000 and 2500;--包含本身,都是闭区间SELECT * FROM EMP a WHERE a.sal >= 2000 and a.sal <= 2500;

    4)in:员工编号号为7369,7521,7654的员工
    SELECT * FROM EMP a WHERE a.empno in (7369,7521,7654);


    5)is null :没有上级的员工
    SELECT * FROM EMP a WHERE a.mgr IS NULL;

    6)逻辑操作符:NOT 、And 、Or
    SELECT * FROM EMP a WHERE (a.sal >500 or a.job='MANAGER') and a.ename like 'J%';
  • and 与 or的优先级:NOT > AND > OR
  • where 后面如果有or的条件,则or自动会把左右的查询条件分开
  • 用()来区分执行顺序
  • 7)order by:对结果进行排序(先有结果,支持对别名排序)
  • asc-升序(默认)/desc-降序
  • 排序实例
  • SELECT * FROM EMP a order by a.sal;--一个条件
    SELECT * FROM EMP a order by a.deptno , a.hiredate desc;--2个条件

  • 先按deptno 排序
  • 在第一个排序结果中,按第二个条件。
  • 按列的别名排序
  • SELECT a.ename,(a.sal*13+nvl(a.comm,0)*13) as "年薪" FROM EMP a order by 年薪;
  • 这边可以按照列的编号排序
  • SELECT a.ename,(a.sal*13+nvl(a.comm,0)*13) as "年薪" FROM EMP a order by 1;
  • 这边的编号,不能超出显示的列的数量。

  • 二、聚合函数:max、min、avg、sum、count
    1、取最高和最低工资:max、min 1)SQL实例
    SELECT max(a.sal),min(a.sal) FROM emp a ;
    SELECT max(a.sal*13) , min(a.sal*13) FROM emp a ;
  • --放在一起,前提条件是max 和min都返回一个值
  • 2)注意:max 与min 只能返回一个值。
    2、显示平均工资与工资总额:avg、sum 1)SQL实例
    SELECT round(avg(a.sal),2),sum(a.sal) FROM emp a ;
  • round:四舍五入
  • 2)注意:avg:计算平均值,不会把sal为null的统计在内
    SELECT avg(a.comm) FROM emp a ;
    SELECT sum(a.comm)/count(*) FROM emp a ;
  • 为空的参与,可以这么解决
  • 3、计算总的员工数:count 1)SQL实例
    SELECT count(*) FROM emp a ;SELECT count(a.empno) FROM emp a ;

    2)注意:
    SELECT count(a.comm) FROM emp a ;
  • 不统计 null 的列。
  • 4、扩展练习 1)显示工资最高的员工的名字,工作岗位
    SELECT a.ename,a.job FROM emp a WHERE a.sal = (SELECT max(a.sal) FROM emp a);
  • 子查询
  • 可以先查出最高工资
  • 然后查出哪位员工的工资是这么多
  • 分析执行顺序
  • sql执行默认是从右到左执行
  • 先执行:SELECT max(a.sal) FROM emp a 得到 5000
  • 再执行:SELECT a.ename,a.job FROM emp a WHERE a.sal =5000;
  • 2)显示工资高于平均工资的员工信息
    SELECT a.ename,a.job FROM emp a WHERE a.sal > (SELECT avg(a.sal) FROM emp a);

    三、分组:group by 和 having
    1、解释:
  • group by:对查询的结果进行分组统计
  • having:修饰分组的条件,限制分组显示结果。
  • 不支持别名
  • 2、实例: 1)显示每个部门的平均工资和最高工资
  • SQL:
  • SELECT avg(a.sal), max(a.sal),a.deptno FROM emp a group by a.deptno;
  • 分析:
  • SELECT avg(a.sal), max(a.sal),a.deptno FROM emp 报错
  • avg(a.sal) 和max(a.sal)为一个结果,而 a.deptno 很多结果。
  • 2)显示每个部门的每种岗位的平均工资和最低工资
  • SQL:
  • SELECT avg(a.sal), max(a.sal),a.deptno,a.job FROM emp a group by a.deptno ,a.job order by a.deptno ;
  • 分析:
  • 先对【部门】分组,再对【岗位】分组。
  • 【排序】都是放在末尾

  • 3)显示部门平均工资低于2000 的部门号和它的平均工资
  • SQL:
  • SELECT avg(a.sal) as "平均工资", a.deptno FROM emp a group by a.deptno having avg(a.sal)<2000
  • 分析:
  • having:限制分组显示结果。后面不支持别名,只能重新计算。
  • 先分组,计算各个部门的平均工资。再利用having对分组后的结果进行删选。
  • 3、原则总结: 1)聚合函数(avg...)只能出现在选择列表、having、order by 子句中,绝不能出现在group by  函数 和where中。 2)如果在 select 语句中同时包含 group by 、having、order by 那么他们的顺序是 group by 、having、order by 。 3)在选择列中如果有列、表达式和聚合函数,那么这些列和表达式必须有一个出现在 group by 子句中,否则就会出错。
  • SELECT avg(a.sal), max(a.sal),a.deptno,a.job FROM emp a group by a.deptno, a.job;
  • 这边的 deptno 和 job 必须都要 出现在 group by 中。
  • 原因为聚合函数 每次返回一个结果

  • Oracle基础(四):单表查询

    标签:order by   group by   having   where条件   聚合函数   

    热心网友 时间:2022-04-07 22:08

    其一:sql查询优化中有一条是:避免在索引列上使用函数,你的where t_name=upper('111')没有违背这个规则;如果你将这一条件变成where upper(t_name)那肯定不会走索引,而是走全表scan;
    其二:oracle 9i后都不采用rbo,而是走cbo;也就是说你这一个查询在查询分析、至查询计划的时候,其使用索引的i/o 、cpu等 的代价是大于你的全表扫描的代价,那么这句查询就不会去使用索引,你要知道使用索引也会增加oracle的I/O、CPU的代价;
    综上,建议楼主研究下RBO/CBO
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    单位高温防护欠缺致员工中暑如何对待 狗狗为什么爱看视频 360浏览器怎么设置倍速播放 ...先讲女主的灵魂飘荡了一段时间,然后重生,请问是那本? 拯救者散热器怎么开 电脑如何一键还原系统电脑一键还原怎么操作 神舟笔记本电脑怎么重新设置神舟战神bios恢复出厂设置 神舟电脑恢复出厂设置神舟战神怎么恢复原厂系统 水泥楼梯如何铺木楼梯 家里面楼梯是水泥的不想铺地毯或者地砖还能铺什么 劳动生产率指数是指? 全员劳动生产率适合评价什么类型的企业? 建筑业劳动生产率如何计算? 什么是全员劳动生产率? 劳动生产率指数是质量指标指数吗? 企业劳动生产率怎么算? 企业工人平均劳动生产率怎么算 劳动生产率与价值总量的关系 劳动强度与劳动生产率有什么区别和联系/ 全员劳动生产率最佳值 劳动生产率是哪类指标,总量指标、相对指标还是平均指标? 最新脑筋急转弯 快手好友被拉黑怎么恢复快手拉黑对方会知道吗? 脑筋急转弯 友情和爱情怎样区分? 脑筋急转弯:友情和爱情怎样区分? 有没有脑筋急转弯答案是我爱你 让别人回答出我爱你的脑筋急转弯。。。太弱智的不要 脑筋急转弯:爱是什么? 能表达出我爱你的脑筋急转弯 有没有答案是我爱你之类的脑筋急转弯? 药店24小时 岳阳楼区 投诉平安保险公司最好的方法 保险公司投诉案件分享 如何投诉保险公司的问题 这张原本是动态图,谁知道她出自哪里吗?是微信上面经常看到的一个动态图片 保险公司 工作人员被投诉是什么结果 前两天我发了一个朋友圈,内容是和别的女孩打麻将的小视频? 衣服上沾了红酒渍怎么去除 求一张大雁的gif动态图片 如何清除衣服上的红酒渍 衣服上的红酒渍怎么洗掉?急用 实体真的不好干,怎么开微信商城来卖东西? 办理道路运输许可证法人变更需要的资料 道路交通运输许可证变更法人! 机动车维修道路运输经营许可证可以换法人吗 道路运输营业执照更换法人代表需要什么手续 停车场(道路运输经营许可证)变更法人、续期换证需要准备哪些资料? 长沙道路运输许可证办理申请变更需要什么资料 道路经营许可证变更法人,需要什么资料 普通货运经营许可证法人变更需要r资料