码迷,mamicode.com
首页 > 数据库 > 详细

SQL含义+单行函数

时间:2017-11-11 17:53:36      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:基础上   排序   size   小数点   工资   无法   补充   字母转   strong   

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!,go2)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;

--请把员工工资分为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;    

 注意:case后面是否出现列名,取决于when后面条件是否出现比较列
       如果when后面已经出现列名,那case后面务必不能写列名,
       如果when后面是值,那么必须在case后面指定列名,否则无法确定所给的值的真正含义。
    
    
    


第十二中 日期函数
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
to_number:字符转换成数字
                    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.00select to_char(1500,$999,999,999.99) from dual;

--找出每个员工的名字和它的薪水(如:$2,500.00select 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; 
  

 

SQL含义+单行函数

标签:基础上   排序   size   小数点   工资   无法   补充   字母转   strong   

原文地址:http://www.cnblogs.com/lxy151/p/7819445.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!