Oracle 简单函数及查询

SQL 函数包含多行函数和单行函数
单行函数就是输入一行输出也是一行
多行函数 也称为分组函数,将多行数据返回一个值

1. 字符函数

  1. ASCII(x)用于返回字母的ASCII码
  2. length(x) 获取字符个数
  3. concat (x) 拼接字符串
  4. lower(x) 转换小写
  5. upper(x)转换大写
  6. substr(x,start【,length】) 
        x: 需要截取的字符串
        start : 开始位置
        length : 截取的长度
  7. instr (x,find_string【,start】【,occurrense】)查询find_string ,然后返回所在的位置,occirrence 第几次出现的位置
  8. replace(x, search_string,replace_string)
        x: 用于查找的 字符串
        search_string : 要查询的字符串
        replace_String: 要替换的字符串
  9. initcap(x)用于将单词首字母转换
  10. rpad(x,width【, pad_String】)
  11. lpad()(同10)

2. 数字函数

  1. abs(x)绝对值
  2. MOD(X) 余数
  3. CEIL(x) 向上取整
  4. FLOOR(x) 向下取整
  5. ROUND(x) 四舍五入
  6. POWER(x,y) x的y次幂
  7. SQRT (X) 平方根
  8. SIGN(x) 检测正负值
  9. COS(x) 
  10. ACOS(x)反余弦

3. 转换函数

  1. to_char(x) :将x转换成一个字符串,格式化字符串
  2. to_number(x, 【x,format】): 将x转换成一个数字
  3. case(x as  type): 将x转换成指定type的兼容类型
  4. asciiStr (): 将任意字符串转换成数据库字符集的acsii
  5. bin_to_num(x): 将二进制数转换成十进制
  6. to_date(): 将字符串转换成时间类型

4. 正则表达式

  1. regexp(想,pattern【,match_option】)用于在x中查找

5. 聚合函数

   1. avg()平均数,非null的平均值
    2. count() 获取非空值得数量
    3. max()和min() 函数
    4. sum()所有值得和

6. 日期函数

  1. to_char()和to_date()转化时间
  2. sysdate 获取系统当前时间
  3. months_between(x,y)函数判断2个月分差
  4. add_months(x,y)计算x+y个月后的结果

7. 其他函数

  nvl
  nvl2
  case

子查询(嵌套查询)

单行子查询: 不向外部的SQL语句返回结构,或者只返回一行
多行子查询: 向外部的SQL语句返回多行或一行
多列子查询: 向外部SQL语句返回多列
关联子查询: 引用外部SQL语句中的一列或多列,这种子查询被称为关联查询
嵌套子查询: 位于子查询中的查询,子查询最多可以嵌套255层

子查询可放在另一个查询的where子句中.

查询部门平均工资,低于部门平均工资的最高值

    1000
    1500
    800
    

    select avg(sal) from emp group by deptno

    
显示高于自身部门平均工资的员工信息
部门编号,员工姓名,工种,工资

获取每个部门的平均工资
当员工的部门编号等于 查询出来平均工资的部门编号,使用工资和平均工资比较

where中的子查询
SQL> select empno,ename from emp where deptno = (select deptno from dept where dname = 'SALES');

     EMPNO ENAME
---------- ----------
      7499 ALLEN
      7521 WARD
      7654 MARTIN
      7698 BLAKE
      7844 TURNER
      7900 JAMES

已选择6行。

having中的子查询
SQL> select deptno,avg(sal) from emp group by deptno
  2  having avg(sal) < (select max(avg(sal)) from emp group by deptno);

    DEPTNO   AVG(SAL)
---------- ----------
                  800
        30 1566.66667
        20    2518.75


from中的子查询
SQL> select d.deptno,ename,job,sal from emp,(select deptno,avg(sal) avgsal from emp group by deptno) d
  2  where emp.deptno=d.deptno and emp.sal<d.avgsal;

    DEPTNO ENAME      JOB              SAL
---------- ---------- --------- ----------
        10 SMITH      CLERK            800
        30 WARD       SALESMAN        1250
        30 MARTIN     SALESMAN        1250
        30 TURNER     SALESMAN        1500
        20 ADAMS      CLERK           1100
        30 JAMES      CLERK            950
        10 MILLER     CLERK           1300

已选择7行。

子查询常见的错误:
1. 单行子查询返回多个值
SQL> select deptno,ename from emp where deptno = (select deptno from dept);
select deptno,ename from emp where deptno = (select deptno from dept)
                                             *
第 1 行出现错误:
ORA-01427: 单行子查询返回多个行
2. 子查询不能包含order by语句
SQL> select * from emp where sal<(select avg(sal) from emp order by avg(sal) desc);
select * from emp where sal<(select avg(sal) from emp order by avg(sal) desc)
                                                      *
第 1 行出现错误:
ORA-00907: 缺失右括号

多行子查询:
    in  : 匹配子查询结构的任意一个值即可.
    all : 必须符合子查询结果的所有值
    any : 只要符合子查询结构的人一个值即可

CLERK
PRESIDENT
MANAGER

select ename,job deptno from emp where job in (CLERK,PRESIDENT,MANAGER);

查询部门编号30的所有员工,工资.
显示所有员工中工资大于上面工资中任意一个工资的员工信息

SQL> select ename,sal,deptno from emp where sal < any(select sal from emp where deptno = 30);

    ENAME             SAL     DEPTNO
    ---------- ---------- ----------
    SMITH             800         10
    JAMES             950         30
    ADAMS            1100         20
    WARD             1250         30
    MARTIN           1250         30
    MILLER           1300         10
    TURNER           1500         30
    ALLEN            1600         30
    CLARK            2450         10
    
    已选择9行。

SQL> select ename,sal,deptno from emp where sal < any(500,2000);

    ENAME             SAL     DEPTNO
    ---------- ---------- ----------
    SMITH             800         10
    ALLEN            1600         30
    WARD             1250         30
    MARTIN           1250         30
    TURNER           1500         30
    ADAMS            1100         20
    JAMES             950         30
    MILLER           1300         10
    
    已选择8行。

SQL> select ename,sal,deptno from emp where sal < all(select sal from emp where deptno = 30);

    ENAME             SAL     DEPTNO
    ---------- ---------- ----------
    SMITH             800         10


    SQL> select * from dept where deptno > all(10,20,30);
    
        DEPTNO DNAME          LOC
    ---------- -------------- -------------
            40 OPERATIONS     BOSTON
            50 b              a

多列子查询

SQL> select deptno,ename,sal from emp where (deptno,sal)in(select deptno,min(sal) from emp group by deptno);

    DEPTNO ENAME             SAL
---------- ---------- ----------
        30 JAMES             950
        20 ADAMS            1100
        10 SMITH             800

关联子查询:
关联子查询对外部查询中每一行都会运行一次,这与非关联子查询是不同的.
非关联子查询只在运行外部查询之前执行一次,
SQL> select empno,deptno,ename,sal from emp outer
where sal >
(select avg(sal) from emp inner where inner.deptno = outer.deptno)
;

         EMPNO     DEPTNO ENAME             SAL
    ---------- ---------- ---------- ----------
          7499         30 ALLEN            1600
          7566         20 JONES            2975
          7698         30 BLAKE            2850
          7782         10 CLARK            2450
          7788         20 SCOTT            3000
          7839         10 KING             5000
          7902         20 FORD             3000
    
    已选择7行。

select * from emp e,
(select deptno,avg(sal) a from emp group by deptno) d;
where e.deptno = d.deptno and e.sal<d.a


子查询 exists和not exists

select ename,job,sal,deptno from emp e
where exists(
    select 1 from dept  d
    where loc = 'NEW YORK' and d.deptno = e.deptno
    )

选课表 : 学号,课程号
学生表 : 学号,姓名
课程表 : 课程号,课程名

查询选修了java课程的学生姓名
select 姓名 from 学生表 where 学号 in(
select 学号 from 选课表 where 课程号 =
(select 课程号 from 课程表 where 课程名= 'java')
)
exists的写法
select 姓名 from 学生表
where exists
(
select * from 选课表 where 学生表.学号 = 选课表.学号 and 课程号 =(.......)
)

查询选修了所有课程的学生:

select 姓名 from 学生表
    where not exists
(
    select * from 课程表 where not exists(
        select * from 选课表 where 学生表.学号 = 选课表.学号 and 课程表.课程号 = 选课表.课程号
    )
)

嵌套子查询

SQL> select deptno,avg(sal) from emp
  2  group by deptno
  3  having avg(sal)>
  4  (select max(avg(sal)) from emp
  5  where deptno in
  6  (select deptno from dept
  7  where deptno > 10)
  8  group by deptno);


select deptno from dept where deptno > 10
查询部门编号大于10的部门编号 20,30,40,50


select max(avg(sal)) from emp where deptno in (20,30,40,50)  group by deptno
计算部门平均工资的最大值 2200

select deptno,avg(sal) from emp group by deptno  having avg(sal) > 2200
显示大于20,30,40,50部门最高平局工资的部门编号和平均工资

包含子查询的修改和删除
    
update  where
delete where

delete from emp where deptno =(
    select deptno from dept where dname = 'SALES'
)

update emp set (sal,comm) = (select sal,comm from emp where ename = 'SMITH') 
where job = (select job from emp  where ename = 'SMITH')

高级查询

集合操作 : 将两个或多个查询返回的结构结合起来
union,union all,intersect,minus

并集(获取的结果集合并到一个结果集中)

    SQL> select * from dept where deptno > 10
          2  union all
          3  select * from dept where deptno >30
          4  ;
        
            DEPTNO DNAME          LOC
        ---------- -------------- -------------
                20 RESEARCH       DALLAS
                30 SALES          CHICAGO
                40 OPERATIONS     BOSTON
                50 b              a
                40 OPERATIONS     BOSTON
                50 b              a
        
        已选择6行。
        
        SQL> select * from dept where deptno > 10
          2  union
          3  select * from dept where deptno >30
          4  ;
        
            DEPTNO DNAME          LOC
        ---------- -------------- -------------
                20 RESEARCH       DALLAS
                30 SALES          CHICAGO
                40 OPERATIONS     BOSTON
                50 b              a

并集:
SQL> select * from dept where deptno > 10
2 intersect
3 select * from dept where deptno >30
4 ;

                DEPTNO DNAME          LOC
            ---------- -------------- -------------
                    40 OPERATIONS     BOSTON
                    50 b              a

差集:
SQL> select * from dept where deptno > 10
2 minus
3 select * from dept where deptno >30;

            DEPTNO DNAME          LOC
        ---------- -------------- -------------
                20 RESEARCH       DALLAS
                30 SALES          CHICAGO

case表达式
    case search_expression
    when expression1 then result1
    when expression2 then result2
    ......
    when expression then result
    else default_result;

 员工工资小于1000
        1000~2000
        >2000

low  med  high
3     8     10


SQL> select empno,ename,
      2  case deptno
      3  when 10 then 'A'
      4  when 20 then 'B'
      5  when 30 then 'C'
      6  else 'not exists'
      7  end
      8  from emp;
    
         EMPNO ENAME      CASEDEPTNO
    ---------- ---------- ----------
          7369 SMITH      A
          7499 ALLEN      C
          7521 WARD       C
          7566 JONES      B
          7654 MARTIN     C
          7698 BLAKE      C
          7782 CLARK      A

SQL> select
  2  count(case when sal<1000 then 1 else null end) low,
  3  count(case when sal between 1000 and 2000 then 1 else null end) med,
  4  count(case when sal>2000 then 1 else null end) high
  5  from emp;

       LOW        MED       HIGH
---------- ---------- ----------
         2          6          6

一行数据展示出来所有部门的人数(列转行)

    select * from 
    (select deptno,count(1) c from emp group by deptno) t
    pivot (min(c) for deptno in(10,20,30,40,50))
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352

推荐阅读更多精彩内容

  • 引出 •请思考如下问题? –查询所有员工的每个月工资总和,平均工资? –查询工资最高和最低的工资是多少? –查询公...
    C_cole阅读 7,287评论 0 3
  • 5.多表查询 多表查询 目的:从多张表获取数据 前提:进行连接的多张表中有共同的列 等连接 通过两个表具有相同意义...
    乔震阅读 1,225评论 0 0
  • 查询是数据的一个重要操作。用户发送查询请求,经编译软件变异成二进制文件供服务器查询,后返回查询结果集给用户,查询会...
    产品小正阅读 1,384评论 0 2
  • 1.简介 数据存储有哪些方式?电子表格,纸质文件,数据库。 那么究竟什么是关系型数据库? 目前对数据库的分类主要是...
    乔震阅读 1,712评论 0 2
  • 昨天因为有点忙,没来简书 2018.11.6 早上称重59.7 KG 2018.11.7 早上称重60.4 KG ...
    lilysong阅读 165评论 0 0