oracle从零开始学习笔记

查询现有数据库:select name from V$database;

解锁用户scott:alter user scott account unlock;

普通用户连接:conn scott

默认密码:tiger

普通管理员:system/system

超级管理员:Sys/sys

断开连接:disconnect

当前用户:show user

查看该用户下的所有对象:select * from tab;

dual表是oracle内虚拟的一个表,妙用很多

单行函数

模糊查询

%表示零个或多个字符

_ 表示一个字符

对于特殊符号可使用ESCAPE标识符来查找

select * from emp where ename like ‘%*_%‘ escape ‘*‘

上面的escape表示*后面的那个符号不被当成特殊字符处理,就是查找普通的_符号

Scott用户自带的表结构

雇员表EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO)

部门表dept(deptno,dname,loc)

工资等级表salgrade(grade,losal,hisal)

奖金表BONUS(ENAME,JOB,SAL,COMM)

单表查询example

选择在部门30中员工的所有信息

select * from emp where deptno=30;

列出职位为(manager)的员工的编号,姓名

select empno,ename from emp where job=‘MANAGER‘

找出奖金高出工资的员工

select * from emp where comm>sal;

找出每个员工奖金和工资的总和

select ename,comm+sal from emp;

找出部门10中的经理(MANAGER)和部门20中的普通员工(CLERK);

找出部门10中既不是经理也不少普通员工,而且工资大于2000的员工

SELECT * FROM EMP WHERE DEPTNO=10 AND JOB NOT IN (‘MANAGER‘,‘CLERK‘) AND SAL>=2000;

找出有奖金的员工的不同工作

select distinct job from EMP where comm is not null and comm>0;

找出没有奖金或者奖金低于500的员工

select * from emp where comm<500 or comm is null;

显示雇员姓名,根据其服务年限,将最老的雇员排在最前面

select ename from emp order by hiredate;

字符函数

upper,lower(大写,小写)

initcap(将每个能识别的单词的第一个字母大写,其他小写,中间出息中文,空格都将视为一个单词)

concat(‘a‘,‘b‘);  ‘a‘||‘b‘  连接俩字符串

length()字符串长度

substr(‘abcde‘,length(‘abcde‘)-2,2)   从第三个字符开始取‘abcde’的2个字符,结果为‘cd‘,第三个值可缺省

replace(ename,‘A‘,a)将ename的所有A换为a

instr(‘Hello world‘,‘or‘)第二个字符串在第一个字符串中的位置(结果为8)

lpad(‘Smith‘,10,‘*‘)       *****Smith

rpad(‘smith‘,10,‘*‘)       Smith*****

trim(‘    Mr Smith       ‘)过滤首尾空格

trim([BOTH|LEADING|TRAILING] ‘*‘ from ‘****ab***‘)  ab

数值函数

round(419,-1) 精确到小数点后多少位,进行四舍五入,-1的结果为420

round(412.313,2)结果为412.31

mod(5,4) 取余,1

trunc类似round,截取时不进行四舍五入

日期函数

months_between(date1,date2),返回相差的月数date1-date2

add_months(to_date(‘19910522‘,‘yyyymmdd‘))增加一个月

next_day(sysdate,‘星期一‘)下一个星期一的日期

last_day(sysdate)对应月份的最后一天

转换函数

//sysdate---2015-03-16

to_char(sysdate,‘yyyy‘)2015

to_char(sysdate,‘fmyyyy-mm-dd‘)2015-3-16

to_char(sysdate,‘yyyy-mm-dd‘)2015-03-16

select to_char(sal,‘L999,999,999‘)from emp; ¥800 ¥3,000

to_char(sysdate,‘D‘)返回这是这周的第几天,注意这里返回的是美国习惯,即周日是第一天

to_number(‘13‘)

to_date(‘20051103‘,‘yyyymmdd‘)

通用函数

nvl(字段名,‘x’)该字段若为空值时,显示为X

nullif(表达式1,表达式2)如果表达式1等于表达式2,则返回空值,否则返回表达式1的值

nvl2(表达式,不为空设值,为空设值)

coalesce(表达式1,表达式2,表达式3)依次考察各参数表达式,遇到非null值即停止并返回该值

select empno,ename,sal,case deptno when 10 then ‘财务部‘  when 20 then ‘研发部‘  when 30 then ‘销售部‘ else‘未知部门‘ end

部门 from emp;

select empno,ename,sal,decode( deptno, ‘财务部‘, 20,‘研发部‘ ,30,‘销售部‘,‘未知部门‘ )部门 from emp;

练习:

1.找出每个月倒数第三天受雇的员工(如:2009-5-29)

select * from emp where hiredate+2=last_day(hiredate);

2.找出30年前的雇的员工

select * from emp where hiredate<=add_months(sysdate,-30*12);

3.所有员工名字前加上Dear ,并且首字母大写

select * from ‘Dear ‘|| initcap(ename) from emp;

4.找出姓名为5个字母的员工

select * from emp where length(ename)=5;

5.找出姓名中不带R这个字母的员工

select * from emp where ename not like ‘%R%‘;

6.显示所有员工的姓名的第一个字

select substr(ename,1,1) from emp;

7.显示所有员工,按名字第一个字母降序排列,若相同,则按工资升序排列

select ename,sal from emp order by substr(ename,1,1) desc,sal;

8.假设一个月为30天,找出所有员工的日薪,不计小数

select ename,round(sal/30)daily_sal from emp;

9.找到2月受雇的员工

select * from emp where to_char(hiredate,‘fmmm‘)=‘2‘;

10.列出员工加入公司的天数(四舍五入)

select ename,round(months_between(sysdate,hiredate)*30)from emp;

11.分别用case和decode函数列出员工所在的部门,deptno显示‘部门10’,deptno=20显示‘部门20’否则为‘其他部门’

select ename,case deptno when 10 then‘部门10‘ when 20 then ‘部门20‘ else ‘其他部门‘ end 部门 from emp;

select ename,decode(deptno,10,‘部门10‘,20,‘部门20‘,‘其他部门‘)部门 from emp;

分组函数

count

如果数据库表没有数据,count(*)返回的不是null,而是0

avg,max,min,sum

用avg算均值时,若为null,不算均数,如emp表中除了1400,300,500,0外,都为空值,算出来的值为550,此时可用nvl()函数强制分组函数处理空值

select avg(nvl(comm,0)) from emp;

group by 不允许出现在where中(用having)

select deptno,avg(sal) from emp group by deptno;

having 字句

select deptno,job,avg(sal) from emp where hiredate >=todate(‘1981-05-01‘,‘yyyy-mm-dd‘) group by deptno,job having avg(sal) >1200 order by deptno,job;

分组函数嵌套

select max(avg(sal)) from emp group by deptno;

练习:

1.统计各部门下工资大于500员工的平均工资表

select avg(sal) where sal>500 group deptno;

2.统计各部门下平均工资大于1600的部门

select deptno,avg(sal) from emp group by deptno having avg(sal)>1600;

3.算出部门30中薪水最高的员工薪水

select max(sal)  from where deptno=30;

4.算出部门30中薪水最高的员工姓名

select ename from emp where sal=(select max(sal)  from where deptno=30);

5.算出每个职位的员工数和最低工资

select job,min(sal),count(*)from emp group by job;

6.算出每个部门,每个职位的平均工资和平均奖金(平均值包括没有奖金)如果平均奖金大于300,显示‘奖金不错‘,如果平均奖金100到300,显示‘奖金一般‘,如果平均奖金小于100,显示“基本没有奖金”,按部门编号降序,平均工资降序排列

select deptno,job,avg(sal)平均工资,avg(nvl(comm,0))平均奖金,case when avg(nvl(comm,0))>=300 then ‘奖金不错‘ avg(nvl(comm,0))>100 and avg(nvl(comm,0))<300 then ‘奖金一般‘ else ‘基本没有奖金‘ end 奖金状况 from emp group by deptno,job order by deptno desc, avg(sal) desc;

7.列出员工表中每个部门的员工数,和部门no

select deptno,count(*) from emp group by deptno;

8.得到工资大于自己部门平均工资的员工信息

select * from emp e1,(select deptno,avg(sal)avgsal from emp group by deptno)e2 where e1.deptno=e2.deptno and e1.sal>e2.avgsal;

9.分组统计每个部门下,每种职位的平均奖金和总工资(包括奖金)

select deptno,job,avg(nvl(comm,0)),sum(sal+nvl(comm,0)) from emp group by deptno,job;

时间: 2024-10-05 21:20:00

oracle从零开始学习笔记的相关文章

oracle从零开始学习笔记 三

笔试题 设有关系EMP(ENO,ENAME,SALARY,DNO)其中各属性的含义依次为职工号.姓名.工资.所在部门号, 以及关系DEPT(DNO,DNAME,MANAGER)其中各含义依次为部门号.部门名称.部门经理的职工号 1.请通过SQL语句创建表EMP.DEPT. create table emp(eno number(5) primary key ,ename varchar2(5),salary number(8),dno number(3)); create table dept(

oracle从零开始学习笔记 二

多表查询 等值连接(Equijoin) select ename,empno,sal,emp.deptno from emp,dept where dept.deptno=emp.deptno; 非等值连接(Non-Equijoin) select ename ,empno,grade from emp,salgrade where sal>losal and sal<hisal;//between and 是包含俩边界值的,not between and 是不包含边界的 (between 1

Oracle Rac11g 学习笔记

查看集群节点状态 命令是olsnodes -i 显示每个节点的VIP, -n 显示每个节点在RAC集群中的编号 -p 显示每个节点所使用的私有IP地址 -s 显示每个节点的状态(activive或者inactive) 列车集群中所有资源 crs_stat -t 查看crs资源状态 crsctl check crs 查看ctss服务的状态 crsctl check ctss 查看集群中所有节点状态 crsctl check cluster -all 查看ASM实例进程 ps -ef | grep

oracle 触发器 学习笔记

触发器 是特定事件出现的时候,自动执行的代码块.类似于存储过程,但是用户不能直接调用他们. 功能: 1. 允许/限制对表的修改 2. 自动生成派生列,比如自增字段 3. 强制数据一致性 4. 提供审计和日志记录 5. 防止无效的事务处理 6. 启用复杂的业务逻辑 开始 create trigger biufer_employees_department_id before insert or update of department_id on employees referencing old

oracle入门学习笔记

Oracle学习笔记 推荐书籍:<Oracle有用教程(从入门到精通)>.<深入浅出Oracle> 1. 当前主流数据库: |-微软:SQL Server.access |-瑞典:Mysql |-IBM: DB2 |-Sybase: Sybase |-Oracle:Oracle A. 小型数据库:access.foxbase. 负载量小,100人内,成本千元内,安全性要求不高. 比如留言板等. B. 中型数据库:Mysql.SQL Server.Informix.日訪问量5000-

Oracle数据库学习笔记(一)

Oracle以其跨平台操作系统和硬件平台.稳定性.安全性.性能优越而著称于世.主要包括两个方向: 1).数据库管理员方向,主要学习对Oracle本身进行管理,提升性能,优化数据存储结构: 2).数据库程序员方向,在Oracle基础上对Oracle进行程序开发. PL/SQL是Oracle公司对关系型数据库的标准语言SQL的过程化语言扩展,特征包括:变量定义.控制结构.自定义的子程序.对象类型. PL/SQL程序的最基本的组成单元是PL/SQL块,分为:匿名块.命名块.命名块又可分为子程序.包.触

Oracle数据库学习笔记

创建表的同时插入数据:create table zhang3 as select * from zhang1;create table zhang3(id,name) as select * from zhang1; 将查询数据插入到某个表中:insert into zhang3 select * from zhang1;insert into zhang3(id,name) select * from zhang1; 有关完整性约束,表名,列名的两个视图:user_constraints, u

Oracle数据库学习笔记2

create tablespace jym datafile 'D:\newer' size 2M autoextend on;       创建一个表空间 drop tablespace; 删除一个表空间 (必须先执行这个命令才能删除创建上面在D盘的newer文件,不然启动Oracle会报错) create user zhang identified by 123456; 创建一个用户 grant connect to zhang; 授权给zhang用户连接服务器的权限 grant selec

Oracle数据库学习笔记1(11g版本的安装&amp;PL/SQL工具的安装和使用)

1.安装Oracle11g 1.1 .口令就是数据库登录密码,学生党用口令就设置简单点了,违反Oracle口令设置规则也可以继续下一步 1.2 Oracle默认给三个账户用户scott(普通用户),需要在安装界面的时候把锁定取消,后面给上口令密码.SYS用户:超级管理员,权限最高,它的角色是DBA.默认密码是change_on_install.具有创建数据库的权限.我安装的时候口令统一设置了****.SYSTEM用户:系统管理员,权限很高,它的角色是DBA operator,默认密码manage