Oracle03

1.按照salary排序 显示s_emp 表中的 id first_name salary 如果工资相同

  则使用 first_name 降序排列 

2.写出处理字符串的 函数有哪些  写 5 个

3.分别写出 round(12.88)  trunc(12.88)  round(12.88,1)  trunc(12.88,1)

  round(3.33)  trunc(3.33)  的值

4.显示 s_emp 表中first_name 的前三个字符  和 后三个字符  并把这些数据 变大写

5.显示s_emp 表中第三个字符是a的 first_name 

6.显示 s_emp 表中 manager_id 是NULL的员工 显示 id first_name  salary

7.显示 s_emp 表中  first_name 叫 Carmen  并且  salary 等于 2500 的员工

显示  id  first_name  salary

  select  id,first_name,salary from  s_emp

      where  first_name='Carmen' and  salary=2500; 

--------------------------------------------------------------------

1.多表查询  10*10*10

  1.1 为什么要有多表查询

    需要的数据 已经被分散多张表中了。

  1.2 如何实现?

    查询 每个员工的  first_name  和 对应的部门编号

  select  first_name,dept_id from  s_emp;   

    在上面查询的基础上 显示部门名

  select  first_name,dept_id,name

        from  s_emp,s_dept;

    上面的查询 产生了一个超大集合 叫 笛卡尔积     

    select  first_name,dept_id,name

        from  s_emp,s_dept where  dept_id=id;

  上面的语句出错 需要使用规则:多张表中有同名的字段  使用 表名 点 区分

    select  first_name,dept_id,name

        from  s_emp,s_dept

            where  dept_id=s_dept.id;

  1.3 语法

select 需要的字段

    from  表1,表2  where  表的连接条件;

  1.4 练习

  s_dept  部门表                                  s_region  地区表

  id    number  部门编号                  id        number  地区编号 

  name  varchar2(25) 部门名            name      varchar2(25) 地区名

  region_id  number  地区编号

  显示 每个部门的名字  和 对应的地区的名字 

  select  s_dept.name,s_region.name

    from  s_dept,s_region

        where  region_id=s_region.id;

  1.5 使用表的别名 简化查询

  select  d.name,r.name

      from  s_dept d,s_region  r

        where  region_id=r.id;


  1.6 等值连接 和 非等值连接

    员工  和  部门    dept_id = s_dept.id 

    部门  和  地区    region_id = s_region.id

    表达两张表的关系 使用等号  则称之为 等值连接。 

    如果连接两张表的关系 不使用等号 则称之为非等值连接

  salgrade  工资级别表

  SQL> desc salgrade;

Name

---------------------

GRADE    级别

LOSAL    级别对应的低工资

HISAL    级别对应的高工资

  显示 s_emp 表中 每个人的id , salary  和 salary 对应的工资级别 

  select  id,salary,grade   

      from  s_emp,salgrade

          where  salary  between  losal  and  hisal;

  1.7 自连接

    一张物理表中  存储了两层业务含义的数据  要把其中的一层业务含义的数据查询出来 就需要

    使用到自连接的语法。

  s_emp 

    领导

    普通员工 

    把所有的领导查询出来?

  id      manager_id

  80      60

  100      100

  101      100

  102      100

  110      100

  select  id,first_name from  s_emp where  id=manager_id; 

      当有人的manager_id  是你的id 时  则 你就是领导


  select distinct m.id,m.first_name

        from  s_emp  e,s_emp m  where e.manager_id = m.id;

  8 个领导


  25-8=17个普通员工    下面的写法错误 

  select distinct m.id,m.first_name

        from  s_emp  e,s_emp m  where e.manager_id != m.id;


2.内连接

      内连接的特点就是 符合连接条件的数据 被选中  不符合连接条件的数据被过滤掉。

      上面的  等值连接    非等值连接  自连接 都是内连接。

3.外连接

3.1 概念和实现

  外连接的结果集 等于 内连接的结果集  加上 匹配不上的记录

(一个也不能少) 

  如何实现?

  (+)  (+) 所在的表的字段 对面的表的数据全部被匹配出来

              底层通过 NULL 记录匹配出来的 

  select distinct m.id,m.first_name

        from  s_emp  e,s_emp m  where e.manager_id(+) = m.id

        and  e.manager_id is null;

3.2 练习  s_emp  s_dept

      显示每个员工的id, first_name  和 对应的 部门名(name)

    select  e.id,first_name,name

        from  s_emp e,s_dept d

            where  e.dept_id=d.id;

      公司为了业务发展 需要抽调一部分人出来  这些人将离开原来的部门

  update  s_emp  set dept_id = null where id < 3;

  commit;

      显示每个员工的id, first_name  和 对应的 部门名(name)  没有部门编号的员工也要显示

  select  e.id,first_name,name

        from  s_emp e,s_dept d

            where  e.dept_id=d.id(+); 

3.3 练习  s_dept    s_region

    显示每个部门的名字  和 对应的地区的名字

  select d.id, d.name,r.name

      from  s_dept  d,s_region r

          where  d.region_id = r.id; 

  公司业务扩大了  增加了一些新的部门

  insert  into  s_dept  values(100,'test100',NULL);

  insert  into  s_dept  values(101,'test101',NULL);

  commit;                     

  显示每个部门的名字  和 对应的地区的名字  没有地区编号的部门也要显示 

  select d.id, d.name,r.name

      from  s_dept  d,s_region r

          where  d.region_id = r.id(+);         

  3.4 非等值连接的外连接    salgrade  s_emp

    列出每个员工的 id  salary  和  salary 对应的工资级别

  select id,salary,grade

      from  s_emp,salgrade

          where salary  between  losal and hisal;

  把 id = 25  和 id=24 的这两个人的工资 改成 12345

  update  s_emp  set  salary=12345 where id >= 24;

  commit;

  列出每个员工的 id  salary  和  salary 对应的工资级别  超出统计范围的员工也要显示

  select id,salary,grade

      from  s_emp,salgrade

          where salary  between  losal(+) and hisal(+);

  4.表连接

    内连接

            等值连接    员工和部门      部门和地区       

            非等值连接  员工的工资 和 对应的工资级别

            自连接          谁是领导?

    外连接

            等值连接    员工和部门 (找出没有部门的员工)      部门和地区 (没有地区编号的部门)       

            非等值连接  员工的工资 和 对应的工资级别  (超出统计范围的工资)

            自连接          谁是普通员工?


      外连接的结果集 等于 内连接的结果集  加上匹配不上的记录

            如何实现的?

      (+)  (+)的意思所在字段的对面的表的数据全部被匹配出来

            本质上 底层是通过 NULL 记录进行的匹配

  5.SQL99 内外连接

    5.1 内连接标准

    from  a表  join b表  on 连接条件  where 过滤条件;

    from  a表  inner join b表  on 连接条件  where 过滤条件;

          显示 每个部门的名字 和 对应的地区的名字

      select  d.name,r.name

          from  s_dept d,s_region r

              where  d.region_id = r.id;

    select  d.name,r.name

          from  s_dept d  join s_region r

              on  d.region_id = r.id;

    select  d.name,r.name

          from  s_dept d  inner  join s_region r

              on  d.region_id = r.id;

    5.2 外连接的标准

    a表  left outer  join  b 表  on 表的连接条件  where  过滤条件;

    a表  right outer  join  b 表  on 表的连接条件  where  过滤条件;

    a表  full  outer  join  b 表  on 表的连接条件  where  过滤条件;


    a表  left outer  join  b 表  就是a表发起连接  意思就是a表的数据全部被匹配出来。

    a表  right outer  join b 表  就是b表发起连接  意思就是 b表的数据全部被匹配出来。

          本质上也通过 NULL 记录进行的匹配

          显示每个部门的名字  和 对应的地区的名字  没有地区编号的部门也要显示 

      select d.id, d.name,r.name

          from  s_dept  d,s_region r

              where  d.region_id = r.id(+); 


      select d.id, d.name,r.name

          from  s_dept  d left outer  join s_region r

              on  d.region_id = r.id;


      select d.id, d.name,r.name

          from  s_region r  right outer  join  s_dept  d

              on  d.region_id = r.id;     

              使用左外连接  实现 s_emp 谁是普通员工的问题 显示  id  first_name

              谁是领导?40  谁是普通员工 40  改成 left outer  join  20

        select distinct m.id,m.first_name

            from  s_emp  e,s_emp m

                where  e.manager_id(+) = m.id and e.manager_id is null;       

      select distinct m.id,m.first_name

            from  s_emp  m  left outer join s_emp e

                on  e.manager_id = m.id where e.manager_id is null;


      select distinct m.id,m.first_name

            from  s_emp  m  left  join s_emp e

                on  e.manager_id = m.id where e.manager_id is null;


      5.3  full outer join 

            全外连接 只是一个逻辑概念,代表左外连接的结果集 加上 右外连接的结果集 然后

                  排除重复的记录。

      Oracle 中如何实现全外连接呢? 不是通过两端都加(+) 实现的。

            而是通过  union    来实现的 , union 的意思是 合并两个结果集  然后排重。

      union  all  合并两个结果集  不排重。

      select  id from  s_emp  union  select id from s_emp;

      select  id from  s_emp  union  all select id from s_emp;             

  6.组函数

    6.1 特点

        对一组数据处理 最终返回一个结果  无论sql语句影响多少行 最终只有一个结果。

    6.2 常见的组函数

    max(par1)  统计最大值

    min(par1)  统计最小值

    avg(par1)  统计平均值

    sum(par1)  统计和

    count(par1)  统计个数

    6.3 练习

        统计s_emp 表中的最高工资  最低工资  员工的个数

    select  max(salary),min(salary),count(id)  from  s_emp;

        统计s_emp 表中的工资的和  以及 工资的平均值

    select  sum(salary),avg(salary)  from  s_emp;

    6.4 特殊用法

        在count 中可以使用  *

    select  count(*) from  s_emp;

        组函数中可以使用  distinct

    select  sum(distinct salary),avg(salary)  from  s_emp;   

    6.5 组函数 对NULL 值如何处理?  忽略

    select max(manager_id) from s_emp;

    select avg(manager_id) from s_emp;


    7.分组

    7.1 概念

        按照一定的标准  把数据分割成若干部分

    7.2 提出问题

        按照部门编号分组 统计每个部门的人数

    dept_id    count

    41          3

    42          4

    50          2

    7.3 sql 中如何完成

    select  字段名,统计的数据  from  表名    where 条件

        group by 分组标准  having  组数据过滤条件 

            order by 排序标准;

按照部门编号分组  统计 每个部门的人数    显示 部门编号 和 平均工资           

select dept_id,count(id) 

    from  s_emp 

        group  by  dept_id;


    按照部门编号 分组  统计 每个部门的平均工资  显示 部门编号 和 平均工资

  select dept_id,avg(salary) 

      from  s_emp 

        group  by  dept_id;   

  7.4 练习  s_dept

      按照地区编号 分组  统计每个地区中的部门个数  显示地区编号 和 部门个数

select region_id,count(id)

  from  s_dept

      group by region_id;

  要求地区中部门个数大于2 的显示 

select region_id,count(id)

    from  s_dept

        group by region_id  having count(id) > 2; 

  7.5 按照部门编号分组  统计每个部门的平均工资  要求平均工资大于1400 的 显示

  select  dept_id,avg(salary)     

      from  s_emp 

          group by  dept_id  having  avg(salary) > 1400;


  having 执行早  还是  select 执行早?

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,825评论 6 546
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,814评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,980评论 0 384
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 64,064评论 1 319
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,779评论 6 414
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 56,109评论 1 330
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 44,099评论 3 450
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,287评论 0 291
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,799评论 1 338
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,515评论 3 361
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,750评论 1 375
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,221评论 5 365
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,933评论 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,327评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,667评论 1 296
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,492评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,703评论 2 380

推荐阅读更多精彩内容

  • 1. 了解SQL 1.1 数据库基础 ​ 学习到目前这个阶段,我们就需要以某种方式与数据库打交道。在深入学习MyS...
    锋享前端阅读 1,107评论 0 1
  • ORACLE自学教程 --create tabletestone ( id number, --序号usernam...
    落叶寂聊阅读 1,107评论 0 0
  • 一、SQL速成 结构查询语言(SQL)是用于查询关系数据库的标准语言,它包括若干关键字和一致的语法,便于数据库元件...
    shadow雨轩阅读 521评论 0 3
  • 2017年是我的幸运年,是我提升认知的开始. 笑来老师说,你一定要学会写作,因为写作是把自己的同一段时间重复销售很...
    设计师周文斌阅读 250评论 0 2
  • 爱一个人就要为她负责!具体就是处处为她着想,呵护她!当她偏离路线时,给予建议人间正道方可行远。当她落魄暗淡时,给予...
    润无阅读 223评论 0 1