培训第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 --经理号不是空,说明是普通员工
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