培训第4天----Oracle的相关知识

    今天写的主要是Oracle的知识点。这里我想说的是:

    没有写不出的sql ,只有写不出的人(我真的是贼垃圾的那种,一个查询sql都要想半天)。好,下面进入正题。

    Oracle有两个基本操作:(1).用于解锁账户:alter user scott account unlock;

                                           (2).用于更改密码:alter user scott identified by "1111";

    解锁账户需要用系统管理员的身份来操作,因为system 的权限排第2。用户更改自身的密码

不需要系统管理员权限,但是更改别的账户的密码就需要系统管理员的权限(user as sysdba)。


    “--”是Oracle数据库的注释,而Mysql数据库的注释是“#”。

    Oracle中的账户要想操作数据必须有两种最基本的权限。一个是可以连接的权限:grant connect to qiaotao,

二是可以操作数据的权限;grant resource to qiaotao;

    用系统用户来创建用户:create user qiaotao2 identified by qiaotao2;


    Oracle 也是一种关系型数据库(其中是表结构),同样支持sql 语言。数据类型有了少许的变化,函数名称发生了改变。

    Emp(员工表)
create table EMP
(
  员工编号 唯一标识
  EMPNO    NUMBER(4) not null,-- 相当于mysql中的int,不能为空
   员工姓名 

  ENAME    VARCHAR2(10), -- 相当于mysql中的varchar,VARCHAR2(10)可以存储 5 个汉字,而VARCHAR(10)却

                                                 可以存储10个汉字。

   当前员工的工作
  JOB      VARCHAR2(9),
   当前员工的经理号
  MGR      NUMBER(4),
   入职日期
  HIREDATE DATE,         -- 相当于mysql中的Date
   员工的薪资
  SAL      NUMBER(7,2),     --这个相当于一个浮点型,其中的7代表站7位,2代表2个小数。
   员工的奖金
  COMM     NUMBER(7,2),
  部门编号(部门表的主键作为了员工表的外键,部门与员工是one-to-many的关系)
  DEPTNO   NUMBER(2)
)


Dept(部门表)
create table DEPT

  DEPTNO NUMBER(2) not null, -- 部门编号,不能为空
  DNAME  VARCHAR2(14), -- 部门名称
  LOC    VARCHAR2(13) -- 部门所在区域
)


SALGRADE(薪资等级表)
create table SALGRADE
(
  GRADE NUMBER, -- 薪资编号(等级)
  LOSAL NUMBER, -- 当前薪资的最低水准
  HISAL NUMBER  -- 当前薪资的最高水准
)


BONUS
create table BONUS
(
  ENAME VARCHAR2(10), -- 员工名称
  JOB   VARCHAR2(9), -- 职位
  SAL   NUMBER,  -- 薪资
  COMM  NUMBER   -- 奖金

)

上面的这4张表是Oracle中自带的4张表。下面我们就 基于scott库来进行查询练习(涉及到三张表emp,dept,salgrade)。

   通用的翻译句式为:从这个表中查询满足条件的所有信息。

--1 .找出佣金(COMM)高于薪金(SAL)60%的雇员的信息。
    select e.*
           from emp e 
                where (e.comm > (e.sal*0.6));   
--2 .找出部门10中所有经理(MANAGER)和部门20中所有办事员(CLERK)的详细资料。

   select e.* 

            from emp e

                      where (e.job = 'MANAGER' and e.deptno=10)  or
                                 (e.job = 'CLERK' and e.deptno = 20)             
--3. 找出部门10中所有经理(MANAGER),部门20中所有办事员(CLERK)
      以及既不是经理又不是办事员但其薪金(sal)大于或等2000的所有雇员的详细资料。

    select  e.* 

            from emp e

                  where (e.job = 'MANAGER' and e.deptno=10) or
                             (e.job = 'CLERK' and e.deptno = 20) or
                             (e.job != 'MANAGER' and e.job !='CLERK' and e.sal >= 2000)
--4. 找出收取佣金(COMM)的雇员的不同工作。    
    select distinct e.job
             from emp e

                  where e.comm is not null  

    在Oracle中,不能空的表现形式只能是 is not null。distinct关键字可以用于将查询的重复结果只显示一个。           

    select e.job
             from emp e
                  where e.comm is not null

                        group by e.job     


    我们也可以用group by分组的形式来消除重复的数据。group by是按重复数据分组的,换句话说,就是将重复

的数据只显示一条但是组内却有好几条相同的数据。所以我们在显示的时候只能显示group by中的数据,而不能是

别的字段的数据,但是有一个特殊的情况,可以将函数查询的内容作为查询输出。 select e.job  (count(*))

   
 
--5 .找出不收取佣金或收取的佣金低于300的雇员的所有信息。    
    select e.*
             from emp e

                  where e.comm is null or e.comm < 300     

     是空的表现形式为 is null。  

 
--6. 找出各月最后一天受雇的所有雇员。              
    select last_day(e.hiredate)
             from emp e
--时间可以算数运算单位为天
--7 .找出晚于26年之前受雇的雇员。
--考虑到闰年问题直接进行365计算会产生误差
--select hiredate,sysdate,(sysdate-hiredate)/365 from emp 
select * from emp e

       where sysdate >= ADD_MONTHS(e.hiredate,26*12)

6,7两个例子可以作为参考。

--8 .显示只有首字母大写的的所有雇员的姓名。 

select INITCAP(ename) FROM emp;

      从这个表中挑选满足函数的字段。

--9. 显示正好为5个字符的雇员的姓名。

select e.ename 

            from emp e

                      where length(e.ename) = 5

--10 .显示不带有“R”的雇员姓名。

select e.ename 

            from emp e

                       where e.ename not like '%R%'

        not like %R% 表示不带有R字符。

-- 聚合函数不需要考虑分组问题
-- sum() count() avg() min() max() 

select job,count(*) 

            from emp -- 分组概念,根据分组来合并相同的行

               group by job  
           
-- 11.找出所有的普通员工
   select e.*
           from emp e

                where e.mgr is not null    --经理号不是空,说明是普通员工


-- 12.求部门中哪些人的薪水最高  
   select e2.ename,e2.sal,e2.deptno from emp e2
          where e2.sal in (
                            -- 子查询 将结果作为条件进行再次查询
                            (select max(e.sal)
                                     from emp e
                                          group by e.deptno)
                           )
-- 13.求部门平均薪水的等级  
   -- 如果存在两张关联表存在重复列需要指明列的归属否则出现ambious异常               
   Select deptno,avg_sal,grade 
               -- 子表中 deptno,avg(sal)
               -- 子表中查询结果的列想作为父表的查询结果必须给结果列起别名
          from (select deptno,avg(sal) avg_sal from emp group by deptno) t
          join
                salgrade s
               -- 以非等条件作为连接条件
          on (t.avg_sal between s.losal and s.hisal);
          
-- 14.求部门平均的薪水等级
   select e.deptno,avg(s.grade)
          from emp e
               join 
               salgrade s
               on e.sal between s.losal and s.hisal
               group by e.deptno      


-- 15.雇员中哪些人是经理人
   select distinct m.* from emp e join emp m
            on e.mgr = m.empno  
  



    

猜你喜欢

转载自blog.csdn.net/qq_41160264/article/details/80991253