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;

 

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