zoukankan      html  css  js  c++  java
  • 数据库 数据库SQL语句三

    转换函数
    to_char()字符串转换日期函数
    --查询大于某个日期的员工信息
    select * from emp
    where hiredate>to_date('1980-02-12','yyyy-mm-dd');
    oracle自动转换
    char===>number
    number===>char
    date=====>char
    char=====>date
    --查询员工的薪水:两位小数,本地货币代码,千位符
    SQL> select ename,to_char(sal,'L9,999.99') from emp;
    WARD                ¥1,250.00
    JONES               ¥2,975.00
    MARTIN              ¥1,250.00
    BLAKE               ¥2,850.00
    CLARK               ¥2,450.00
    
    下面是在to_char函数经常使用的几种格式
    9    数字
    0    零
    $    美元符
    L    本地货币符号
    .    小数点
    ,    千位符
    
    
    --将字符串'¥1,250.00'转成数字
    SQL> select to_number('¥2,975.00','L9,999.99') from dual;
    TO_NUMBER('¥2,975.00','L9,999.99')
    -----------------------------------
                                   2975
    通用函数
    这些函数适用于任何数据类型,同时也适用于空值
    NVL(expr1,expr2)
    NVL2(expr1,expr2,expr3)
    nvl2(a,b,c)当a=null返回c否则返回b
    NULLIF(expr1,expr2)
    nullif(a,b) 当a=b时,否则返回a
    COALESCE(expr1,expr2,expr3....)
    coalesce(a,b,c,...)从左到右,返回第一个不为空的表达式
    case表达式(一般用于报表)
    在SQL语句中使用IF-THEN-ELSE逻辑
    使用两种方法
    1.case表达式:SQL99的语法,类似Basic,比较繁琐
    2.DECODE函数:oracle自己的语法,类似java,比较简单
    decode(列名|表达式,search1,result1,search2,result2,...,default)
    --注意:默认值写在最后,可扩展参数列表
    --给员工涨工资:总裁 1000 经理:800 其他涨500 前后工资给列出来
    --方法一
     select ename,sal 涨前工资,
     (case job when 'PRESIDENT' then sal+1000
               when 'MANAGER' then sal+800
               else sal+500
     end) 涨后工资 from emp;
    
    ENAME        涨前工资   涨后工资
    ---------- ---------- ----------
    
    ton_abc          8000       8500
    SMITH             800       1300
    ALLEN            1600       2100
    WARD             1250       1750
    JONES            2975       3775
    --方法二
     select ename,job,sal 涨前工资,
     (decode(job,'PRESIDENT',sal+1000,'MANAGER',sal+800,sal+500)) 涨后工资
     from emp;
    分组函数
    分组函数作用于一组数据,并对一组数据返回一个值。
    group by子句必须在where之后
    组函数类型
    AVG
    COUNT
    MAX
    MIN
    SUM
    --求员工的平均工资
    SQL> select avg(sal) 平均工资1,sum(sal)/count(*) from emp;
     平均工资1 SUM(SAL)/COUNT(*)
    ---------- -----------------
    2073.21429        2073.21429
    --如果列中有空值,组函数能够自动过滤空值
    --可以使用nvl()函数修正空值,使得组函数不过滤空值
    分组数据
    知识点1:可以使用group by子句将表中的数据分成若干组
    
    --查询各部门的平均工资
    SQL> select avg(sal) from emp group by deptno;
    
    select a,b,c
    from emp
    group by a,b,c,d
    --group by先对数据进行分组,然后在组上进行数据查询
    --在使用分组函数时,在select中出现的a,b,c列,必须是group by 后面集合的子集。
    --如果是组函数作为列,不需要在group by 后面集合的子集中
    --在group by中没有出现的项,不能在select进行检索(group by是分组select查询的是分组之后各组的结果)
    --查询各个部门中不同职位的平均工资
    SQL> select avg(sal) from emp group by deptno,job;--先按部门进行分组,再按职位分组
    
    SQL> select deptno,job,avg(sal) from emp group by deptno,job
         order by 1;(按select的第一个查询结果排序)
    DEPTNO JOB         AVG(SAL)
    ------ --------- ----------
        10 CLERK           1300
        10 MANAGER         2450
        10 PRESIDENT       5000
        20 ANALYST         3000
        20 CLERK            950
        20 MANAGER         2975
        30 CLERK            950
    知识点2:分组过滤(对数据分组之后,再增加检索条件)
    having
    --查询平均工资大于2000的部门
    SQL> select deptno from emp group by deptno having avg(sal)>2000;
    having和where子句
    --查询10号部门的平均工资
    方案一:先where查询10号部门,再计算平均工资
    SQL> select avg(sal) from emp where deptno=10;
    
    方案二:先分组查询每组的平均工资,再通过having过滤
    SQL> select avg(sal) from emp group by deptno having deptno=10;
    
    总结:sql优化②,这里先where过滤比较好
    --注意:where子句中不可以使用分组函数,但是having可以
    分组函数小结:只要使用了组函数或者having过滤关键字,那么在select查询的列名必须在group by集合中出现,having中的列名也必须在group by集合中出现(组函数列名),
    having子句中不可以使用别名
  • 相关阅读:
    [转]数据库优化方法(三)
    [转]根据性能监视器,分析性能瓶颈
    sqlserver获取表名,字段名
    VBA SQLServer 基本操作
    oracle常见权限分配
    oracle 里面定时执行任务,比如存储过程内容等
    cisco 路由配置
    cisco LAN
    mongodb的启动参数--quiet
    mongodb的IO测试工具 mongoperf
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/6259718.html
Copyright © 2011-2022 走看看