• SQL含义+单行函数


    1.SQL含义

    SQL(Structured Query Language)结构化查询语言。
       查询是一种从一个或多个表或视图中检索数据的操作,不会改变表中的数据。
       查询数据是数据库的核心操作,是使用频率最高的操作。

     

    2.select的表结构

    select语句的基本用法格式
       select【distinct】* |列名1【as c1】,列名2[as c2]...,列名n,组函数(...)
       from 表名1 别名1,表名2 别名2...
       [where 条件]
       [group by 列名1,列名2....,列名n ]
       [having 条件]
       [order by 排序列名1  ASC|DESC(降序),排序列名2 ASC(升序)|DESC ]

     

    3.SQL执行计划顺序,及其distinct(去重)、||、nvl空置置换函数

       SQL执行计划
          (8)SELECT (9)DISTINCT (11)<Top Num> <select list>
    
          (1)FROM [left_table]
    
          (3)<join_type> JOIN <right_table>
    
          (2) ON <join_condition>
    
          (4)WHERE <where_condition>
    
          (5)GROUP BY <group_by_list>
    
          (6)WITH <CUBE | RollUP>
    
          (7)HAVING <having_condition>
    
          (10)ORDER BY <order_by_list>
      
       表的别名,列的别名
       distinct    关键字: 去重,必须放在开头字段前,会作用于后面所有的字段
                       本身是 二重循环查询,当数据量较大时,不适用
        
            ||   表示拼接(拼接符为||'这里可以添加内容'||
         nvl(列,值)  表示空值置换函数
      !!注意:null值和所有数据计算,结果都为null

     

    4.dual是oracle中的虚拟表

    dual :是Oracle自带的一张虚拟表,没有任何意义,为了保证sql语句的完整性。
    --查询当前数据库系统时间(sysdate)
       select sysdate from dual;
    -- 获取 ‘hello’
      select  'hello'  from dual;

     

    5.SQL的单行函数

    单行函数
      
       第一种:数字函数 round() 和  trunc()
       
         round(列 | 值 | 表达式,小数的有效位数)  四舍五入
            select round(3.141592,3from dual;
       结果:3.142  那么(3.1415923)里面3为取小数点第三位,四舍五入后的结果
         trunc(列 | 值 | 表达式,小数的有效位数) 直接截取
             select trunc(3.141592,3from dual;
      结果:3.141  那么(3.141592,3)里面3同上,不四舍五入
    
      补充select round(3.14159,0) from dual;
            (3.14159,0)里面的0代表取整,即结果为3
          
           select round(33.14159,-1) from dual;
             (33.14159,-1) 里面的-1代表取十位数30
                          换成-2取百位数,这里取0
    
         trunc同上!!!!
    
    
    --查询订单表s_ord中总金额total(取整)
    select trunc(total,0) from s_ord where trunc(total,0)=200;(不四舍五入)
    select round(total,0) from s_ord;(四舍五入)
    
    
    第二种  求余数  mod()
      mod(列|值,列|值)     求余数
    --求5/2的余数
      abs(列|值)        求绝对值
    --求-2的绝对值
    
    --查询订单表s_ord中总金额total(取整)
    select trunc(total,0) from s_ord where trunc(total,0)=200;(不四舍五入)
    select round(total,0) from s_ord;(四舍五入)
    
    
    第三种 求绝对值  abs()
     abs(列|值)        求绝对值
    --求-2的绝对值
    
    
    第四种  字符函数   length()
      length(列 | 值 | 表达式):求长度
    
    --获取员工表中员工名字及其名字长度
    select  first_name,length(first_name) from  s_emp;
        ;
    --查询出员工姓名长度为6的员工信息
    select * from s_emp where length(first_name)=6;
    
    
    第五种  大小写字母转换 upper(),lower(),initcap()
    upper(列|值|表达式);全部转大写字母
    lower(列|值|表达式);全部转小写字母
    initcap(列|值|表达式);每个单词首字母大写
    %(百分号),_(下划线)为通配符
    
    select upper('abc')from dual;==>ABC
    select lower('ABC')from dual;==>abc
    select initcap('hello world')from daul;==>Hello World
    
    
     
    第六中  填充补全 lpad(),rpad()
    lpad(列|值,宽度,填充字符);从左边补不足宽度个填充字符
    rpad(列|值,宽度,填充字符);从右边补不足宽度个填充字符
    
    
    select lpad('abc',10,'de')from dual;
    ----------------
        dedededabc
    
    select rpad('abc',10,'de')from dual;
    ------------------
        abcdededed
    注意:包含自己在内10个
    
     
    第七种  左右截取  ltrim(),rtrim()
    ltrim(列|值,截取字符);从左边截取字符
    rtrim(列|值,截取字符);从右边截取字符
    
    
    select rtrim('abcdedede','de') from dual;
    ------------
        abc
    select rtrim('abcddedede','de') from dual;
    --------------
        abc  ==》表示从右边开始截取de|d|e,直到不同于截取字符的字符为止
    
    
    第八种 置换指定字符即替换  replace()
    replace(列|值,被置换的字符,置换的字符);置换指定字符
    
    select replace('helloworld','owo','***')from dual;==》hell***rld
    
    select replace(111222333,22222,666)from dual;==>111666333
    
    
    
    
    第八种 转换指定字符
    translate(参数一,参数二,参数三);转换指定字符
    参数一:要处理的内容,列|值   
    参数二:要检索的内容      先执行
    参数三:检索后,与检索内容一一对应替换的内容(如果无替换值,则全部去掉)
    
    select translate('zhongg48','z23090o45664g','p23tddy67') from dual;
    ===》  phyn68
    
    参数1和参数2对比,数字都有,参数3没有去掉;参数1中的字母,参数2中有的按参数2的位置和参数三一一对应
    
    
    
    第九种 查询指定字符串的下标  instr()
    instr()查找指定字符窜中所在的位置下标
    select instr('go,go,come on!','go')from dual;==>1
    select instr('go,go,come on!','go'2)from dual;==>4
    select instr('go,go,come on!','go',-1)from dual;==>4
    
    select instr('go,go,come on!','go',-12)from dual; ==>1
     -1代表从右边数,从第一位开始数,2为第二次出现的位置下标
    
    select instr('go,go,come on!','go',-25)from dual;==>0                    -2也是从右边开始,从第二位开始数,5 为第五次出现的位置下标
    
     总结:负数从右边开始,正数从左边开始
     注意:数据库字符串下标从1开始计数。
    
    
    
    
    第十种  获取从指定下标开始的字符串 substr() 
    
    substr(列|值,指定位置下标,保留几位)
    select substr('hello world!',3)from dual;表示:
     从指定下标处开始即从下标3开始,一个位数为:llo world;   
    两位数为(3,3):llo即第二个数为取3个数也是其长度(length)用公式表示为下面
    
    select length(substr('hello world!',3,4))from daul;表示:4
    
    
    
    第十一种  decode()及case when then ;
    decode()
    a.类似一个三目运算符
    比较第一和第二个参数,如果相等取第三个参数,如果不相等取第四个参数。
    
    select decode('A','A','B','C')from dual;==》B
    select decode(1,1,2,3)from dual;==》2
    select decode(1,2,2,3)from dual;==》3
    
    b.if else if else
    decode(A,b,c,d,e,f,g,h)
    如果A=b,输出c;
    如果A=d,输出e;
    如果A=f,输出g;
    如果b,d,f都不满足A,输出h.
    
    --输出显示每个订单编号及支付方式,支付方式要么是现金,要么是信用卡,否则就是未知数。
    select id,decode(payment_type,'CASH','现金','CREDIT','信用卡','未知数' )fro s_ord;
    
    --输出区域表(s_region)中,每个地区对应的中文
    select id,decode(name,'North America','北美','South America','南美','Africa / Middle East','非洲/中东','Asia','亚洲','Europe','欧洲') from s_region;
    
    
    case when 可以把它看成switch功能;
    select name "部门名"case region_id
        when 1 then '北美'
        when 2 then '南美'
        when 3 then '中东'
        when 4 then '亚洲'
        when 5 then '欧洲'
        else '未知区域'
    end "区域名"
    from s_dept;
    
     注意:case后面是否出现列名,取决于when后面条件是否出现比较列
           如果when后面已经出现列名,那case后面务必不能写列名,
           如果when后面是值,那么必须在case后面指定列名,否则无法确定所给的值的真正含义。
    --请把员工工资分为3等,超过2000员的为高等在1500到2000之间的为中等,低于1500的为低等 

    select first_name,salary,
    case
    when salary
    >2000 then '高等'
    when salary between
    1500 and 2000 then '中等'
    when salary<1500 then '低等'
    else'其它'
    end
    " 薪资"
    from s_emp;

    第十二中 日期函数

    oracle默认的日期格式为 dd
    -MON-yy

    select sysdate from daul;
    dd 表示2位数的日
    mon
    /month 表示月份,如:6月
    mm 表示2位数的月,如:
    06
    yyyy 表示4位数的年份
    HH24 表示24小时
    HH 表示12小时
    mi 表示分钟
    ss 表示秒
    fm 表示去掉前面的0,如:
    fm
    06,值为6 = fmmm
    day 表示星期几
    日期函数: sysdate 当前日期
    months_between(date1,date2) 2个日期之间的月数

    --查询2014年11月1日和2016年12月9日之间的间隔月数

    select
    trunc(
    abs(
    months_between(to_date('2014-11-1','yyyy-mm-dd'),to_date('2016-12-9','yyyy-mm-dd'))),2)
    from dual;
    add_months(date1,n),在date1的基础上加n个月

    --半年后的日期是什么?
    select add_months(system,6)
    from dual;

    --半年前的日期是什么?
    select add_months(sysdate,-6)
    from dual;

    next_day(date1,
    '星期几'),在date1的基础上,下星期几是什么时候

    --即将到来的星期五是几号?
    select next_day(sysdate,'星期五')
    from dual;

    last_day(date1),date1日期所在月的最后一天是什么时候

    --查询当月底是几号
    select last_day(sysdate)
    from emp;

    --查询所有员工的工作月数
    select trunc(months_between(sysdate,start_date),0)
    from s_emp;

    --查询所有员工的工作天数
    select round(sysdate-start_date)
    from s_emp;

    --显示41 号部门员工 姓名, 进入公司的天数,年数,月份数,星期数【分别加上中文别名】
    select e.first_name 姓名, sysdate - e.hiredate 天数, months_between(sysdate,e.hiredate) 月数,
    (months_between(sysdate,e.hiredate))
    /12年分数
    from s_emp e where e.deptno = 41 ;

    第十三种 转换函数 to_number,to_date,to_char
    select to_number('9837492.563','999999999.999') from dual to_date:

    字符转换成日期
    select to_date('2009-10-3 15:10:23','yyyy-mm-dd hh24:mi:ss') from dual to_char:

    日期
    /数字 转换成 字符 --获得当前年份,月份,日期
    select to_char (sysdate,'yyyy-mm-dd hh24:mi:ss') from dual
    select to_char(9837492,'$999,999,999.99') from dual
    select to_char(9837492.563,'999999999.99') from dual

    to_date() 把字符串改为日期 to_number() 把字符装换成数字 to_char 把数字或日期转换为字符串

    1.to_char(number,fmt);格式化数字
    2.to_char(date,fmt);格式化日期
    9 代表任意数据 L 代表本地的货币符号 $ 代表美元 0 代表0 . 代表. , 代表,

    --格式化输出员工工资($1,500.00
    select to_char(1500,'$999,999,999.99') from dual;

    --找出每个员工的名字和它的薪水(如:$2,500.00
    select ename,to_char(sal,'$999,999.99') from emp;

    --将'2011-09-12 ' 转换成 date 类型
    select to_date('2011-09-12','yyyy-mm-dd') from dual ; ==>2011/09/12

    -- 获得字符串 '2011-09-12 ' 的月份
    select to_number(to_char( to_date('2010-09-18','yyyy-mm-dd') , 'mm')) from dual; ==>9

    --获得 8732034.56 用如下形式表示: 8,732,034.56
    select to_char( 8732034.56,'9,999,999.99') from dual;

    --获得 8732034.56 用如下形式表示: $8,732,034.56
    select to_char( 8732034.56,'$9,999,999.99') from dual;

     

  • 相关阅读:
    2019-2020 20191232《信息安全专业导论》第七周学习总结
    求最大公约数伪代码
    2019-2020-1 20191232《信息安全专业导论》第五周学习总结
    2019-2020 20191232《信息安全专业导论》第二周学习总结
    冲刺分析
    冲刺第5天——json
    2020课程设计(基于gmssl的CA系统构建及应用)个人报告——20181211沈芮吉
    2020课程设计gmssl
    2020课程设计第三周任务——20181211沈芮吉
    2020课程设计第二周任务——20181211沈芮吉
  • 原文地址:https://www.cnblogs.com/lxy151/p/7819445.html
Copyright © 2020-2023  润新知