oracle语句练习
-----------------------day1-----------------------------------1.查询职员表中工资大于1600的员工姓名和工资Select ename, sal from emp where sal > 1600;2.查询职员表中员工号为7369的员工的姓名和部门号码Select ename, deptno from emp where empno = 7369;3.选择职员表中工资不在4000到5000的员工的姓名和工资Select ename, sal from emp where sal not between 4000 and 5000;4.选择职员表中在20和30号部门工作的员工姓名和部门号Select ename, deptno from emp where deptno in (20, 30);5.选择职员表中没有管理者的员工姓名及职位, 按职位排序Select ename, job from emp order by job;6.选择职员表中有奖金的员工姓名,工资和奖金,按工资倒序排列Select ename, sal, comm. From emp where comm is not null order by sal desc;7.选择职员表中员工姓名的第三个字母是A的员工姓名Select ename from emp where ename like ‘__A%’;8.列出部门表中的部门名字和所在城市;select dname, loc from dept;9.显示出职员表中的不重复的岗位jobselect distinct job from emp;10.连接职员表中的职员名字、职位、薪水,列之间用逗号连接,列头显示成OUT_PUT(提示:使用连接符||、别名)select ename || ', ' || job || ', ' || sal from emp;11.查询职员表emp中员工号、姓名、工资,以及工资提高百分之20%后的结果select empno, ename, sal, sal * 1.2 salary from emp;12.查询员工的姓名和工资数,条件限定为工资数必须大于1200,并对查询结果按入职时间进行排列,早入职排在前面,晚入职排在后面。
select ename, sal from emp where sal > 1200 order by hiredate;13.列出除了ACCOUNT部门还有哪些部门。
select deptno, dname, loc from dept where dname <> 'ACCOUNT';-----------------------day2-----------------------------------1.将员工的姓名按首字母排序,并列出姓名的长度(length)select ename, length(ename) from emp order by ename;2.做查询显示下面形式的结果<enamename> earns <sal> monthly but wants <sal*3>例如:Dream SalaryKing earns $5000 monthly but wants $15000select ename || ' earns $' || sal ||' monthly but wants $' || sal * 3 “Dream Salary” from emp;3.使用decode函数,按照下面的条件:JOB GRADEPRESIDENT AMANAGER BANALYST CSALESMAN DCLERK E产生类似下面形式的结果ENAME JOB GRADESMITH CLERK ESELECT ename, job,DECODE(job,'PRESIDENT','A','MANAGER','B','ANALYST','C','SALESMAN','D','CLERK','E') AS "Grade"FROM EMP;4.查询各员工的姓名ename,并显示出各员工在公司工作的月份数(即:与当前日期比较,该员工已经工作了几个月, 用整数表示)。
select ename, round(months_between(sysdate, hiredate)) hire_months from emp;5.现有数据表Customer,其结构如下所示:cust_id NUMBER(4) Primary Key, --客户编码cname VARCHAR2(25) Not Null, --客户姓名birthday DATE, --客户生日account NUMBER. --客户账户余额(1).构造SQL语句,列出Customer数据表中每个客户的信息。
如果客户生日未提供,则该列值显示“not available” 。
如果没有余额信息,则显示“no account”。
(2).构造SQL语句,列出生日在1987年的客户的全部信息。
(3).构造SQL语句,列出客户帐户的余额总数。
1)select cust_id, cname, nvl(to_char(birthday, 'yyyy-mm-dd'), 'not available'),nvl(to_char(account, '9999'), 'no account') from Customer;2)select * from Customer where extract(year from birthday) = '1987';3) select sum(account) from Customer;6.按照”2009-4-11 20:35:10 ”格式显示系统时间。
select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') now from dual;7.构造SQL语句查询员工表emp中员工编码empno,姓名ename,以及月收入(薪水 +奖金),注意有的员工暂时没有奖金。
select empno, ename, sal + nvl(comm, 0) month_salary from emp;8.查找员工姓名的长度是5个字符的员工信息。
select * from emp where length(ename) = 5;9.查询员工的姓名和工资,按下面的形式显示:(提示:使用lpad函数)NAME SALARY-----------------------------------------------------SMITH $$$$$$$$$$24000select ename name, lpad(sal, 15, '$') salary from emp;10.查询薪水大于2000元的员工的姓名和薪水,薪水值显示为’RMB5000.00’这种形式,并对查询结果按薪水的降序方式进行排列;select ename, to_char(sal, 'L9999.00') salary from empwhere sal > 2000order by sal desc;11.构造查询语句,产生类似于下面形式的结果:NAME HIREDATE REVIEW-----------------------------------------------------------------------------------------SMITH 1980-12-17 1980年12月17日select ename name, to_char(hiredate, 'yyyy-mm-dd') hiredate,to_char(hiredate, 'yyyy"年"mm"月"dd"日"') reviewfrom emp;12.显示所有员工的姓名ename,部门号deptno和部门名称dname。
Select e.ename, d.deptno, d.dnameFrom emp e join dept d on e.deptno = d.deptno;13.选择在DALLAS工作的员工的员工姓名、职位、部门编码、部门名字Select e.ename, d.deptno, d.dnameFrom emp e join dept d on e.deptno = d.deptno and d.loc = ‘DALLAS’;14.选择所有员工的姓名ename,员工号deptno,以及他的管理者mgr的姓名ename和员工号deptno,结果类似于下面的格式"Mgr#"from emp wor, emp magwhere wor.mgr = mag.empno;15.查询各部门员工姓名和他们所在位置,结果类似于下面的格式from emp e join dept dusing (deptno);16.查询公司员工工资的最大值,最小值,平均值,总和select max(sal), min(sal), avg(sal), sum(sal) from emp;17.列出每个员工的名字,工资、涨薪后工资(涨幅为8%),元为单位进行四舍五入Select ename , sal , round(sal*1.08) from emp;18.查询出JONES的领导是谁(JONES向谁报告)。
select e1.ename from emp e1 , emp e2 where e2.mgr = e1.empno and e2.ename = 'JONES';19.JONES领导谁。
(谁向JONES报告)。
select e1.ename from emp e1 , emp e2 where e1.mgr = e2.empno and e2.ename = 'JONES';-----------------------day3-----------------------------------1.查询各职位的员工工资的最大值,最小值,平均值,总和select job, max(sal), min(sal), avg(sal), sum(sal)from empgroup by job;2.选择具有各个job的员工人数(提示:对job进行分组)select job, count(*)from empgroup by job;3.查询员工最高工资和最低工资的差距,列名为DIFFERENCE;select max(sal)-min(sal) "DIFFERENCE"from emp;4.查询各个管理者属下员工的最低工资,其中最低工资不能低于800,没有管理者的员工不计算在内select mgr, min(sal)from empwhere mgr is not nullgroup by mgrhaving min(sal) >= 800;5.查询所有部门的部门名字dname,所在位置loc,员工数量和工资平均值;select dept.dname, dept.loc, COUNT, AVGfrom deptjoin(select deptno, count(*) as "COUNT", avg(sal) as "AVG"from empgroup by deptno)using(deptno);6.查询和scott相同部门的员工姓名ename和雇用日期hiredateselect ename, hiredatefrom empwhere deptno = (select deptno from emp where emp.ename = 'SCOTT');7.查询工资比公司平均工资高的所有员工的员工号empno,姓名ename和工资sal。
Oracle练习题讲解
一、填空1.在多进程Oracle实例系统中,进程分为用户进程、后台进程和服务进程。
2.标准的SQL语言语句类型可以分为:数据定义语句(DDL)、数据操纵语句(DML)和数据控制语句(DCL)。
3.在需要滤除查询结果中重复的行时,必须使用关键字Distinct; 在需要返回查询结果中的所有行时,可以使用关键字ALL。
4.当进行模糊查询时,应使用关键字like和通配符问号(?)或百分号"%"。
5.Where子句可以接收From子句输出的数据,而HA VING子句则可以接收来自WHERE、FROM或GROUP BY子句的输入。
6.在SQL语句中,用于向表中插入数据的语句是Insert。
7.如果需要向表中插入一批已经存在的数据,可以在INSERT语句中使用Select 语句。
8.使用Describe命令可以显示表的结构信息。
9.使用SQL*Plus的Get命令可以将文件检索到缓冲区,并且不执行。
10.使用Save命令可以将缓冲区中的SQL命令保存到一个文件中,并且可以使用Run命令运行该文件。
11.一个模式只能够被一个数据库对象所拥有,其创建的所有模式对象都保存在自己的模式中。
12.根据约束的作用域,约束可以分为表级约束和列级约束两种。
列级约束是字段定义的一部分,只能够应用在一个列上;而表级约束的定义独立于列的定义,它可以应用于一个表中的多个列。
13.填写下面的语句,使其可以为Class表的ID列添加一个名为PK_CLASS_ID 的主键约束。
ALTER TABLE ClassAdd ____________ PK_LASS_ID (Constraint)PRIMARY KEY ________ (ID)14. 每个Oracle 10g数据库在创建后都有4个默认的数据库用户:system、sys、sysman和DBcnmp15. Oracle提供了两种类型的权限:系统权限和对象权限。
oracle sql练习题
oracle sql练习题1. 编写一个SQL查询,找出员工表中工资最高的员工的姓名和工资。
```SELECT ename, salFROM empWHERE sal = (SELECT MAX(sal) FROM emp);```2. 编写一个SQL查询,计算出每个部门的平均工资,并按照平均工资降序排列。
```SELECT deptno, AVG(sal) as avg_salaryFROM empGROUP BY deptnoORDER BY avg_salary DESC;```3. 编写一个SQL查询,找出没有任何员工的部门(即部门中没有员工记录的部门)。
```SELECT d.deptno, d.dnameFROM dept dLEFT JOIN emp e ON d.deptno = e.deptnoWHERE e.deptno IS NULL;```4. 编写一个SQL查询,找出在每个部门中薪资排名第二高的员工的姓名和工资。
```SELECT d.dname, e.ename, e.salFROM emp eINNER JOIN dept d ON e.deptno = d.deptnoWHERE e.sal = (SELECT DISTINCT salFROM empWHERE deptno = e.deptnoORDER BY sal DESCOFFSET 1 ROW FETCH FIRST 1 ROW ONLY);```5. 编写一个SQL查询,找出拥有部门管理权限(即至少管理一个部门)且工资不超过5000的员工的姓名。
```SELECT enameFROM empWHERE empno IN (SELECT DISTINCT mgrFROM empWHERE sal <= 5000);```6. 编写一个SQL查询,找出在工资表中有重复记录的员工姓名和工资。
```SELECT ename, salFROM empGROUP BY ename, salHAVING COUNT(*) > 1;```7. 编写一个SQL查询,找出至少在两个部门工作过的员工的姓名。
ORACLE基础练习你必须要熟练的
ORACLE基础练习1.desc table_name 可以查询表的结构2.怎么获取有哪些用户在使用数据库select username from v$session;3.如何在Oracle服务器上通过SQLPLUS查看本机IP地址? select sys_context('userenv','ip_address') from dual;4.如何给表、列加注释?SQL>comment on table 表is '表注释';注释已创建SQL>comment on column 表.列is '列注释';注释已创建。
查询该用户下的注释不为空的表SQL> select * from user_tab_comments where comments is not null;5.如何在ORACLE中取毫秒?select systimestamp from dual;6.如何在字符串里加回车?添加一个||chr(10)select 'Welcome to visit'||chr(10)||'' from dual ;7.怎样修改oracel数据库的默认日期?alter session set nls_date_format='yyyymmddhh24miss';8.怎么可以看到数据库有多少个tablespace?select * from dba_tablespaces;9.如何显示当前连接用户?SHOW USER10.如何测试SQL语句执行所用的时间?SQL>set timing on ;11.怎么把select出来的结果导到一个文本文件中?SQL>SPOOL F:\ABCD.TXT;SQL>select * from table;SQL >spool off;12.如何在sqlplus下改变字段大小?alter table table_name modify (field_name varchar2(100));改大行,改小不行(除非都是空的)13.如果修改表名?alter table old_table_name rename to new_table_name;14.如何搜索出前N条记录?(desc降序)SELECT * FROM Tablename WHERE ROWNUM < nORDER BY column;15. 如何在给现有的日期加上2年?select add_months(sysdate,24) from dual;16.Connect string是指什么?17.返回大于等于N的最小整数值?SELECT CEIL(-10.102) FROM DUAL;18.返回小于等于N的最大整数值?SELECT FLOOR(2.3) FROM DUAL;19.返回行的物理地址SELECT ROWID, ename FROM tablename WHERE deptno = 20 ;20.将N秒转换为时分秒格式?set serverout ondeclareN number := 1000000;ret varchar2(100);beginret := trunc(n/3600) || '小时' || to_char(to_date(mod(n,3600),'sssss'),'fmmi"分"ss"秒"'); ine(ret);end;21.如何监控当前数据库谁在运行什么SQL语句?SELECT osuser, username, sql_text from v$session a, v$sqltext bwhere a.sql_address =b.address order by address, piece;22.如何知道当前用户的ID号?SQL>SHOW USER;ORSQL>select user from dual;23.如何知道使用CPU多的用户session?11是cpu used by this sessionselect a.sid,spid,status,substr(a.program,1,40) prog,a.terminal,osuser,value/60/100 value from v$session a,v$process b,v$sesstat cwhere c.statistic#=11 and c.sid=a.sid and a.paddr=b.addr order by value desc;建立表空间和用户的步骤:用户建立:create user 用户名identified by "密码";授权:grant create session to 用户名;grant create table to 用户名;grant create tablespace to 用户名;grant create view to 用户名;表空间建立表空间(一般建N个存数据的表空间和一个索引空间):create tablespace 表空间名datafile ' 路径(要先建好路径)\***.dbf ' size *Mtempfile ' 路径\***.dbf ' size *Mautoextend on --自动增长--还有一些定义大小的命令,看需要default storage(initial 100K,next 100k,);用户权限授予用户使用表空间的权限:alter user 用户名quota unlimited on 表空间;或alter user 用户名quota *M on 表空间;create tablespace zq datafile 'D:\zq\zw.dbf' SIZE 1000M AUTOALLOCATE;修改用户的默认表空间alter user username default tablespace tablespacename;25.在sqlplus 中清屏命令:clear src clear screen; cl scr;怎样用语句查询表空间里面表的内容?select table_name from all_tables where tablespace_name='zq';select table_name from user_tables where tablespace_name='xx'26.如何查询表在哪个表空间中?(单引号里面的要大写)SELECT tablespace_name FROM USER_TABLES WHERE table_name = 'YOUR_TABLENAME'查一下,这个表是哪个用户下的,如果是本用户则可以用上面的sql如果是别的用户的表你就用SELECT tablespace_name FROM DBA_TABLES WHERE table_name = 'YOUR_TABLENAME' and owner='表的OWNER'还有你要确定你查的确实是一个表而不是view 或SYNONYM而且在引号里面的表名和owner都要用大写字母create table aa(a varchar2(10),b number(8,2),c date) tablespace users;如果在创建用户时没有指定默认表空间,系统默认表空间为System,在创建表时必须指定tablespace;28.如何查询一个表空间下的所有表(单引号里面的要大写)select table_name from user_tables where tablespace_name='表空间名';29.更改计算机名后会出现Oracle ORA-12541:TNS:no listener错误解决方法修改为现在的计算机名,再次启动OracleOraHome90TNSListener服务成功31.oracle10g em Database Control的启动问题修复打开http://localhost:1158/em/ 显示数据库状态没有启动,提示用户登录错误ORA-28000: the account is locked,使用PL/SQL或SQL*plus连接是正常的。
oracle实例练习
oracle实例练习1.用sys账户登录,解锁scott账户代码:Connect sys/orcl@orcl_client AS SYSDBAALTER USER "SCOTT" ACCOUNT UNLOCK2.以scott身份登录数据库conn scott/tiger@orcl3.创建学生表student(sno,sname,sgender,sbirthday,sadd) score(sno,math,english) 代码:create table student(sno char(3),sname varchar2(10),sgender char2(20),sbirthday date,sadd varchar2(50))create table score(sno char(3),math number(4,1),english number(4,1))4.插入记录student插入记录:001,小张,女,1980-8-20,济南002,小王,男,1983-4-1,莱芜003,小李,女,1980-5-20,济南004,小赵,女,1980-5-20,莱芜005, 小孔, 女, 1982-6-18 威海score插入记录:(005没参加考试,800是个进修生,不是学校的正式生)001,90,92002,85,79003,80,94004,78,77800 79, 88代码:alter session set nls_date_format ='YYYY-MM-DD HH24:MI:SS';insert into student values('001','小张','女',to_date('1980-08-20','yyyy-mm-dd'),'济南');insert into student values('002','小王','男',to_date('1983-04-01','yyyy-mm-dd'),'莱芜');insert into student values('003','小李','女',to_date('1980-05-20','yyyy-mm-dd'),'济南');insert into student values('004','小赵','女',to_date('1980-05-20','yyyy-mm-dd'),'莱芜');insert into student values('005','小孔','女',to_date('1982-06-18','yyyy-mm-dd'),'威海');insert into score values('001','90','92');insert into score values('002','85','79');insert into score values('003','80','94');insert into score values('004','78','77');insert into score values('800','79','88');5.a统计各个地区的学生数b计算各个学生的总成绩(数学+英语),并且按照成绩由高到低做出学生的成绩单报告(没考试的学生名字不要出现在报告单上,进修生的成绩也不在报告单上)报告单标题显示:学号姓名数学英语总成绩c计算各个学生的总成绩(数学+英语),并且按照成绩由高到低做出学生的成绩单报告(没考试的学生名字也要出现在报告单上,进修生的成绩不在报告单上)报告单标题显示:学号姓名数学英语总成绩代码:select sadd 地区,count(*) as 人数from student group by saddselect student.sno 学号, sname 姓名, math 数学, english 英语, (math+english) 总成绩from student inner join score on score where student.sno=score.sno order by 总成绩descselect student.sno 学号, sname 姓名, math 数学, english 英语, math+english 总成绩from student left outer join score onstudent.sno=score.sno order by 总成绩desc或select student.sno 学号, sname 姓名, math 数学,english 英语, (math+english) 总成绩from student,score where student.sno=score.sno(+) order by 总成绩desc;6.根据student表,创建一个新表student_copy(结构相同,数据只有济南的两个学生)从student表中查出莱芜得同学信息,插入到student_copy表中commit//提交刚才的插入代码:create table student_copy as select * from student Where sadd='济南';insert into student_copy(select * from student where sadd='莱芜');commit;7.插入一条新的学生纪录:006 小林男1979-7-9 泰安savepoint a //设置保存点a删除掉学号为003的学生纪录(误删)rollback to savepoint a察看结果commit(提交插入纪录的操作)/rollback(回滚到插入006记录前的数据状态)代码:insert into student values('006','小林','男',to_date('1979-07-09','yyyy-mm-dd'),'泰安');select * from student;savepoint a;delete from student where sno='003';rollback to savepoint a;select * from student;commit;/rollback;8.修改student_copy表名为student2删除表student2的数据(注意delete/truncate的区别)删除表student,score,student2代码:rename student_copy to student2;delete from student2;rollback;select * from student2;truncate table student2;rollback;select * from student2;drop table student;drop table score;drop table student2;9.创建100个表,table_0到table_99,分别插入数据,第1条数据插入到第1个表。
1.4_Oracle语法练习
SQL语法练习--华育国际罗辉使用scott/tiger用户下的emp表(数据库自带的表)完成下列练习。
1、选择部门30中的所有员工。
2、列出所有办事员(CLERK)的姓名、编号和部门编号。
在Oracle中是区分大小写的,所以此时要么将CLERK大写,要么使用upper函数。
3、找出佣金高于薪金的员工。
Comm字段表示佣金或奖金,comm>sal。
4、找出佣金高于薪金的60%的员工。
5、找出部门10中所有经理(manager)和部门20中所有办事员(clerk)的详细资料。
6、找出部门10中所有经理(manager)和部门20中所有办事员(clerk),既不是经理也不是办事员。
但其薪金大于或等于2000的所有员工的详细资料。
7、找出收取佣金的员工的不同工作。
工作会出现重复,所以distinct关键字消除掉重复的列。
8、找出不收取佣金或收取的佣金低于100的员工。
9、找出各月倒数第三天受雇的所有员工。
10、找出早于12年前受雇的员工。
11、以首字母大写的方式显示所有员工的姓名。
12、显示正好为五个字符的员工的姓名。
13、显示不带有'R'的员工的姓名。
14、显示所有员工姓名的前三个字符。
15、显示所有员工的姓名,用a替换所有A。
16、显示满10年服务年限的员工的姓名和受雇日期。
17、显示员工的详细资料,按姓名排序。
18、显示员工的姓名和受雇日期,根据其服务年限,将最老的员工排在最前面。
19、显示所有员工的姓名、工作和薪金,按工作的降序排序,若工作相同则按薪金排序。
20、显示所有员工的姓名、加入公司的年份和月份,按受雇日期所在的月份排序,若月份相同则将最早年份的员工排在最前面。
要求先求出所有员工的受雇日期。
再求出月份。
21、显示在一个月为30天的情况下所有员工的日薪金,忽略余数。
22、找出在(任何年份的)二月受聘的所有员工。
23、对于每个员工,显示其加入公司的天数。
24、显示姓名字段的任何位置包含A的所有员工的姓名。
oracle练习题(打印版)
oracle练习题(打印版)### Oracle数据库练习题#### 一、选择题1. Oracle数据库中,哪个命令用于创建表?- A. CREATE TABLE- B. CREATE DATABASE- C. DROP TABLE- D. ALTER TABLE2. 以下哪个不是Oracle数据库的数据类型?- A. NUMBER- B. CHAR- C. DATE- D. IMAGE3. 在Oracle数据库中,哪个命令用于删除表?- A. DELETE FROM- B. DROP TABLE- C. REMOVE TABLE- D. ERASE TABLE4. Oracle数据库中,如何查看当前用户?- A. SELECT USER FROM DUAL;- B. SELECT CURRENT_USER FROM DUAL;- C. SELECT USERNAME FROM ALL_USERS;- D. SELECT CURRENT_USER FROM ALL_USERS;5. 以下哪个命令用于在Oracle数据库中创建索引?- A. CREATE INDEX- B. CREATE KEY- C. CREATE CONSTRAINT- D. CREATE UNIQUE#### 二、填空题1. 在Oracle数据库中,使用____命令可以查看表结构。
2. Oracle数据库中,使用____命令可以查看当前数据库的所有表。
3. 要删除Oracle数据库中的行,可以使用____命令。
4. Oracle数据库中,____用于存储二进制数据。
5. Oracle数据库中,____命令用于查看数据库中所有的索引。
#### 三、简答题1. 描述Oracle数据库中事务的ACID属性。
2. 解释Oracle数据库中的锁定机制。
3. 说明Oracle数据库中视图的作用。
#### 四、操作题1. 创建一个名为`Employees`的表,包含以下字段:- `EmployeeID` NUMBER(10) PRIMARY KEY,- `FirstName` VARCHAR2(50),- `LastName` VARCHAR2(50),- `HireDate` DATE,- `Salary` NUMBER(10, 2),- `DepartmentID` NUMBER(10).2. 向`Employees`表中插入以下数据:- `EmployeeID`: 1001, `FirstName`: 'John', `LastName`:'Doe', `HireDate`: '2023-01-01', `Salary`: 70000,`DepartmentID`: 101.- `EmployeeID`: 1002, `FirstName`: 'Jane', `LastName`:'Smith', `HireDate`: '2023-02-15', `Salary`: 50000,`DepartmentID`: 102.3. 编写一个查询,显示所有员工的姓名和工资,按工资从高到低排序。
oracle练习题
1、编写一个PL/SQL程序块,对名字以“A”或“S”开头的所有雇员按他们基本薪水的10%给他们加薪。
2、编写一个PL/SQL程序块,对所有的销售员增加佣金500。
3、编写一个PL/SQL程序块以提升两个资格最老的“职员”为“高级职员”。
(提示:工作时间越长,资
格越老)
4、编写一个PL/SQL程序块,对所有雇员按他们基本薪水的10%给他们加薪。
如果加薪后的薪水大于5000,
则取消加薪。
5、编写一个PL/SQL程序块以接受用户输入的三个数值并显示其中的最大值。
6、编写一个PL/SQL程序块以显示指定名称的雇员所在的部门名称和部门位置。
7、编写一个给指定雇员加薪10%的PL/SQL程序块,之后,检查如果已经雇佣该雇员超过60个月,则给
他额外加薪3000。
8、编写一个PL/SQL程序块以检查指定雇员的薪水是否在有效范围内。
不同职位的薪水范围为
Designation Range
Clerk 1500~2500
Salesman 2501~3500
Analyst 3501~4500
Others 4501 and above
如果薪水在此范围内,则显示消息“Salary is OK!”,否则,更新薪水为该范围内的最小值。
9、编写一个PL/SQL程序块以显示某个雇员在此组织中的工作天数。
Oracle基础练习题及答案(聚合函数)
分组函数1.查询公司员工工资的最大值,最小值,平均值,总和select max(sal),min(sal),avg(sal),sum(sal) from emp;2.查询各job的员工工资的最大值,最小值,平均值,总和select job,max(sal),min(sal),avg(sal),sum(sal) from emp group by job;3.选择具有各个job的员工人数(提示:对job进行分组)select job,count(ename) from emp group by job;4.查询员工最高工资和最低工资的差距(DIFFERENCE)select max(sal)-min(sal) from emp;5.查询各个管理者手下员工的最低工资,其中最低工资不能低于800,没有管理者的员工不计算在内select a.mgr,min(a.sal) from emp a,emp b where a.mgr=b.empno group by a.mgr;6.查询所有部门的名字dname,所在位置loc,员工数量和平均工资select dname,loc,count(ename),avg(sal) from emp a,dept b where a.deptno(+)=b.deptno group by dname,loc;7.查询公司的人数,以及在1980-1987年之间,每年雇用的人数,结果类似下面的格式total 1980 1981 1982 198730 3 4 6 7select distinct(select count(ename) from emp) "total",(select count(ename) from emp where hiredate>=to_date('19800101','yyyymmdd') and hiredate<to_date('19810101','yyyymmdd')) "1980",(select count(ename) from emp where hiredate>=to_date('19810101','yyyymmdd') and hiredate<to_date('19820101','yyyymmdd')) "1981",(select count(ename) from emp where hiredate>=to_date('19820101','yyyymmdd') and hiredate<to_date('19830101','yyyymmdd')) "1982",(select count(ename) from emp where hiredate>=to_date('19870101','yyyymmdd') and hiredate<to_date('19880101','yyyymmdd')) "1987"from emp;。
Oracle经典练习题(很全面)
Oracle 经典练习题一.创建一个简单的PL/SQL程序块1.编写一个程序块,从emp表中显示名为“SMITH”的雇员的薪水和职位。
declarev_emp emp%rowtype;beginselect * into v_emp from emp where ename='SMITH';dbms_output.put_line('员工的工作是:'||v_emp.job||' ;他的薪水是:'||v_emp.sal);end;2.编写一个程序块,接受用户输入一个部门号,从dept表中显示该部门的名称与所在位置。
方法一:(传统方法)declarepname dept.dname%type;ploc dept.loc%type;pdeptno dept.deptno%type;beginpdeptno:=&请输入部门编号;select dname,loc into pname,ploc from dept where deptno=pdeptno; dbms_output.put_line('部门名称: '||pname||'所在位置:'||ploc); exception –异常处理when no_data_foundthen dbms_output.put_line('你输入的部门编号有误!!');when othersthen dbms_output.put_line('其他异常');end;方法二:(使用%rowtype)declareerow dept%rowtype;beginselect * into erow from dept where deptno=&请输入部门编号;dbms_output.put_line(erow.dname||'--'||erow.loc);exceptionwhen no_data_foundthen dbms_output.put_line('你输入的部门号有误');when othersthen dbms_output.put_line('其他异常');end;3.编写一个程序块,利用%type属性,接受一个雇员号,从emp表中显示该雇员的整体薪水(即,薪水加佣金)。
史上最全Oracle数据库基本操作练习题(含答案)
Oracle基本操作练习题使用表:员工表(emp):(empno NUMBER(4)notnull,--员工编号,表示唯一ename VARCHAR2(10),--员工姓名job VARCHAR2(9),--员工工作职位mgr NUMBER(4),--员工上级领导编号hiredate DATE,--员工入职日期sal NUMBER(7,2),--员工薪水comm NUMBER(7,2),--员工奖金deptno NUMBER(2)—员工部门编号)部门表(dept):(deptno NUMBER(2)notnull,--部门编号dname VARCHAR2(14),--部门名称loc VARCHAR2(13)—部门地址)说明:增删改较简单,这些练习都是针对数据查询,查询主要用到函数、运算符、模糊查询、排序、分组、多变关联、子查询、分页查询等。
建表脚本.txt建表脚本(根据需要使用):练习题:1.找出奖金高于薪水60%的员工信息。
SELECT * FROM emp WHERE comm>sal*0.6;2.找出部门10中所有经理(MANAGER)和部门20中所有办事员(CLERK)的详细资料。
SELECT * FROM emp WHERE (JOB='MANAGER' AND DEPTNO=10) OR (JOB='CLERK' AND DEPTNO=20);3.统计各部门的薪水总和。
SELECT deptno,SUM(sal) FROM emp GROUP BY deptno;4.找出部门10中所有理(MANAGER),部门20中所有办事员(CLERK)以及既不是经理又不是办事员但其薪水大于或等2000的所有员工的详细资料。
SELECT * FROM emp WHERE (JOB='MANAGER' AND DEPTNO=10) OR (JOB='CLERK' AND DEPTNO=20) OR (JOB NOT IN('MANAGER','CLERK') AND SAL>2000);5.列出各种工作的最低工资。
