oracle sql练习题
- 格式:docx
- 大小:37.06 KB
- 文档页数:6
oracle 复杂sql练习题Oracle 复杂 SQL 练习题在数据库管理系统中,SQL(Structured Query Language)是一种用于管理和操作关系数据库的标准语言。
Oracle是一种常用的关系数据库管理系统,它支持SQL语言的广泛应用。
本文将介绍一些复杂的Oracle SQL练习题,旨在提高读者对SQL语言的理解和应用能力。
1. 学生成绩统计假设有两张表:学生表(Student)和成绩表(Score)。
学生表包含学生的姓名(Name)和学号(ID),成绩表包含学生的学号(ID)和对应的科目(Subject)及成绩(Grade)。
现在需要统计每个学生的总分和平均分,并按照平均分从高到低排序。
解决方案:```sqlSELECT , SUM(sc.Grade) AS TotalGrade, AVG(sc.Grade) AS AverageGrade FROM Student sJOIN Score sc ON s.ID = sc.IDGROUP BY ORDER BY AverageGrade DESC;```2. 部门工资排名假设有两张表:员工表(Employee)和部门表(Department)。
员工表包含员工的姓名(Name)、工号(ID)和所属部门(DeptID),部门表包含部门的名称(DeptName)和部门编号(DeptID)。
现在需要统计每个部门的平均工资,并按照平均工资从高到低排序。
解决方案:```sqlSELECT d.DeptName, AVG(e.Salary) AS AverageSalaryFROM Department dJOIN Employee e ON d.DeptID = e.DeptIDGROUP BY d.DeptNameORDER BY AverageSalary DESC;```3. 订单统计假设有三张表:订单表(Order)、订单详情表(OrderDetail)和商品表(Product)。
oracle-sql练习题及答案createtabletudent(novarchar2(10)primarykey,namevarchar2(20),agenumber(2),e某varchar2(5));createtableteacher(tnovarchar2(10)primarykey,tnamevarchar2(20));createtablecoure(cnovarchar2(10),cnamevarchar2(20),tnovarcha r2(20),contraintpk_coureprimarykey(cno,tno));createtablec(novarchar2(10),cnovarchar2(10),corenumber(4,2), contraintpk_cprimarykey(no,cno));/某某某某某某某初始化学生表的数据某某某某某某//某某某某某某某某某某某某某某某初始化课程表某某某某某某某某某某某某某某某某某某某某某某某某某某某某/inertintocourevalue('c001','J2SE','t002');inertintocourevalue(' c002','JavaWeb','t002');inertintocourevalue('c003','SSH','t001') ;inertintocourevalue('c004','Oracle','t001');inertintocourevalue('c005','SQLSERVER2005','t003');inertinto courevalue('c006','C#','t003');练习:注意:以下练习中的数据是根据初始化到数据库中的数据来写的SQL 语句,请大家务必注意。
oracle sql 试题及答案在Oracle数据库管理和开发中,SQL(Structured Query Language)是一种标准化的关系型数据库语言。
在这篇文章中,我们将提供一些Oracle SQL试题及其答案,旨在帮助读者巩固和加深对Oracle SQL语言的理解。
请注意,答案中不再重复题目,仅给出相应的解答。
1. 以下SQL语句中,哪一个用于创建一个名为"Employees"的表?CREATE TABLE Employees (EmployeeID INT PRIMARY KEY,LastName VARCHAR2(50),FirstName VARCHAR2(50),DateOfBirth DATE);2. 在一个名为"Employees"的表中,你想要删除LastName为"Smith"的所有行。
你应该使用以下哪个SQL语句?DELETE FROM Employees WHERE LastName = 'Smith';3. 假设你有一个名为"Employees"的表,你想要增加一个名为"Salary"的列,数据类型为NUMBER(10,2)。
你应该使用以下哪个SQL 语句?ALTER TABLE Employees ADD (Salary NUMBER(10,2));4. 以下SQL查询语句将返回哪些列?SELECT LastName, FirstName FROM Employees;答案:该查询将返回"Employees"表中的LastName和FirstName列。
5. 以下SQL语句将返回"Employees"表中有多少条记录?SELECT COUNT(*) FROM Employees;答案:该查询将返回"Employees"表中的记录数。
oracle的sql语句的练习题及答案(员⼯表+部门表)⼀、创建表及初始化数据1、表说明:emp员⼯表(empno员⼯号/ename员⼯姓名/job⼯作/mgr上级编号/hiredate受雇⽇期/sal薪⾦/comm佣⾦/deptno部门编号) dept部门表(deptno部门编号/dname部门名称/loc地点)注意:⼯资 = 薪⾦ + 佣⾦2、创建表create table DEPT(DEPTNO NUMBER(2) not null,DNAME VARCHAR2(14),LOC VARCHAR2(13));alter table DEPT add constraint PK_DEPT primary key (DEPTNO);create table EMP(EMPNO NUMBER(4) not null,ENAME VARCHAR2(10),JOB VARCHAR2(9),MGR NUMBER(4),HIREDATE DATE,SAL NUMBER(7,2),COMM NUMBER(7,2),DEPTNO NUMBER(2));alter table EMP add constraint PK_EMP primary key (EMPNO);3、初始化数据insert into DEPT (DEPTNO, DNAME, LOC)values (10, 'ACCOUNTING', 'NEW YORK');insert into DEPT (DEPTNO, DNAME, LOC)values (20, 'RESEARCH', 'DALLAS');insert into DEPT (DEPTNO, DNAME, LOC)values (30, 'SALES', 'CHICAGO');insert into DEPT (DEPTNO, DNAME, LOC)values (40, 'OPERATIONS', 'BOSTON');commit;insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7369, 'SMITH', 'CLERK', 7902, to_date('17-12-1980', 'dd-mm-yyyy'), 800, null, 20);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7499, 'ALLEN', 'SALESMAN', 7698, to_date('20-02-1981', 'dd-mm-yyyy'), 1600, 300, 30);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7521, 'WARD', 'SALESMAN', 7698, to_date('22-02-1981', 'dd-mm-yyyy'), 1250, 500, 30);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7566, 'JONES', 'MANAGER', 7839, to_date('02-04-1981', 'dd-mm-yyyy'), 2975, null, 20);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7654, 'MARTIN', 'SALESMAN', 7698, to_date('28-09-1981', 'dd-mm-yyyy'), 1250, 1400, 30);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7698, 'BLAKE', 'MANAGER', 7839, to_date('01-05-1981', 'dd-mm-yyyy'), 2850, null, 30);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7782, 'CLARK', 'MANAGER', 7839, to_date('09-06-1981', 'dd-mm-yyyy'), 2450, null, 10);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7788, 'SCOTT', 'ANALYST', 7566, to_date('19-04-1987', 'dd-mm-yyyy'), 3000, null, 20);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7839, 'KING', 'PRESIDENT', null, to_date('17-11-1981', 'dd-mm-yyyy'), 5000, null, 10);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7844, 'TURNER', 'SALESMAN', 7698, to_date('08-09-1981', 'dd-mm-yyyy'), 1500, 0, 30);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7876, 'ADAMS', 'CLERK', 7788, to_date('23-05-1987', 'dd-mm-yyyy'), 1100, null, 20);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7900, 'JAMES', 'CLERK', 7698, to_date('03-12-1981', 'dd-mm-yyyy'), 950, null, 30);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7902, 'FORD', 'ANALYST', 7566, to_date('03-12-1981', 'dd-mm-yyyy'), 3000, null, 20);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7934, 'MILLER', 'CLERK', 7782, to_date('23-01-1982', 'dd-mm-yyyy'), 1300, null, 10);commit;⼆、题⽬练习1.列出⾄少有⼀个员⼯的所有部门。
oracle数据库sql试题及答案Oracle数据库SQL试题及答案1. 如何查询员工表中所有员工的姓名和工资,要求工资从高到低排序?```sqlSELECT name, salaryFROM employeesORDER BY salary DESC;```2. 如何统计每个部门的员工人数?```sqlSELECT department_id, COUNT(*) AS employee_countFROM employeesGROUP BY department_id;```3. 如何查询工资高于平均值的员工信息?```sqlSELECT *FROM employeesWHERE salary > (SELECT AVG(salary) FROM employees);```4. 如何找出没有直属上司的员工?```sqlSELECT *FROM employees e1WHERE NOT EXISTS (SELECT 1FROM employees e2WHERE e1.manager_id = e2.employee_id);```5. 如何查询工资在3000到5000之间的员工姓名和工资?```sqlSELECT name, salaryFROM employeesWHERE salary BETWEEN 3000 AND 5000;```6. 如何删除员工表中所有工资低于3000的员工记录?```sqlDELETE FROM employeesWHERE salary < 3000;```7. 如何更新员工表中所有部门为10的员工的工资,增加10%?```sqlUPDATE employeesSET salary = salary * 1.1WHERE department_id = 10;```8. 如何查询员工表中每个员工的姓名和他们直属上司的姓名?```sqlSELECT AS employee_name, AS manager_name FROM employees e1JOIN employees e2 ON e1.manager_id = e2.employee_id; ```9. 如何查询员工表中每个部门的平均工资?```sqlSELECT department_id, AVG(salary) AS avg_salary FROM employeesGROUP BY department_id;```10. 如何查询员工表中工资最高的员工信息?```sqlSELECT *FROM employeesWHERE salary = (SELECT MAX(salary) FROM employees); ```。
Oracle SQL&PLSQL Test一、选择题(共30题;每题3分)1.Oracle发出下列select语句:SQL> select e.empno, e.ename, d.loc2 from emp e, dept d3 where e.deptno = d.deptno4 and substr(e.ename, 1, 1) = ‘S’;下列哪个语句是Oracle数据库中可用的ANSI兼容等价语句?A.select empno, ename, loc from emp join dept on emp.deptno = dept.deptno where substr(emp.ename, 1, 1) = ‘S’;B.select empno, ename, loc from emp, dept on emp.deptno = dept.deptno where substr(emp.ename, 1, 1) = ‘S’;C.select empno, ename, loc from emp join dept where emp.deptno = dept.deptno and substr(emp.ename, 1, 1) = ‘S’;D.select empno, ename, loc from emp left join dept on emp.deptno = dept.deptno and substr(emp.ename, 1, 1) = ‘S’;2.用下列代码回答问题:Examine the data in the EMPLOYEES and DEPARTMENTS tables.You want to retrieve all employees, whether or not they have matching departments in the departments table. Which query would you use?需要检索出无论雇员是否和部门匹配的记录A. SELECT last_name, department_nameFROM employees , departments(+);B. SELECT last_name, department_nameFROM employees JOIN departments (+);C. SELECT last_name, department_nameFROM employees(+) e JOIN departments dON (e.department_id = d.department_id);D. SELECT last_name, department_nameFROM employees eRIGHT OUTER JOIN departments d ON (e.department_id = d.department_id);E. SELECT last_name, department_nameFROM employees(+) , departmentsON (e.department_id = d.department_id);F. SELECT last_name, department_nameFROM employees e LEFT OUTERJOIN departments d ON (e.department_id = d.department_id);3.公司销售数据库包含一个PROFITS表,按产品名、销售地区和季度列出利润信息。
OCPsql作业OCPsql作业1.【单选题】5分| 数据会真实的存储在哪一个数据库对象结构中A表B视图C同义词D用户2.【多选题】5分| 下面属于外连接的是ALEFTJOINBRIGHTJOINCFULLJOINDJOIN3.【多选题】5分| 下面操作中类似于内连接的操作是ALEFTJOINBJOINCSELECT*FROMA,B;DCROSSJOIN4.【多选题】5分| 下面属于集合操作的是AUNIONBUNIONALLCMINUSDORDERBY5.【多选题】5分| 下面关于用户和权限说法正确的有AWITHADMINOPTION可以级联收回BWITHGRANTOPTION可以级联收回CCREATESESSIO属于对象权限DSCHEMA和用户在ORACLE中可以看做一种概念6.【多选题】5分| 下面在ORACLE中删除整张表数据语法正确的写法有A DELETE*FROMTABLE_NAME;B DELTE FROM TABLE_NAME;C DELETE TABLE_NAME;D TRUNCATETABLE_NAME7.【判断题】5分| 提交后可以回滚。
A对B错8.【判断题】5分| union all 去重。
A对B错9.【判断题】5分| 在ORACLE中INSERT DELETE UPDATE MERGE都属于DML语句A对B错10.【判断题】5分| TRUNCATE和DROP属于DDL语句。
A对B错11.【判断题】5分| SELECT FOR UPDATE属于事务操作语句,会对SELECT找到的所有行加锁。
A对B错12.【单选题】5分| ORACLE默认的表的类型为A 索引组织表B 分区表C 堆表D 聚簇表13.【单选题】5分| 关于CHAR类型说法正确的是A 他是数字类型B 他是字符类型C 他是可变长字符类型D 他最多可以容纳5000个长度14.【单选题】5分| SYSDATE-1说法正确的是A运行报错B系统时间减去一分钟C昨天的这个时间,时分秒不变,知识日期减去一天D上个月的这个时间15.【单选题】5分| 关于GROUP说法错误的是A主要进行分组操作B分组后会自动去掉每组中的重复数据CGROUP语句后面可以连接whereDGROUP语句如果想要使用条件限制的话需要加having 16.【单选题】5分| 下面哪个子句被我们称之为谓词ASELECTBFROMCORDERBYDWHERE17.【单选题】5分| 下面对子查询说法错误的是A子查询可以在FROM后B子查询可以在WHERE后Cupdate可以使用子查询DSELECT后是不能使用子查询的18.【单选题】5分| SELECT语句的主要作用是A查询B修改数据C删除数据D锁定数据19.【单选题】5分| TRUNCATE语句属于ADMLBDDLCDCLDTCL20.【单选题】5分| 关于事务特性【A C I D】中的A说正确法的是A原子性B隔离性C一致性D持久性。
--1、选择部门30中的雇员select * from emp where deptno=30;--2、列出所有办事员的姓名、编号和部门select ename,empno,dname from emp e inner join dept d on = where job=upper('clerk’);--3、找出佣金高于薪金的雇员select * from emp where comm>sal;--4、找出佣金高于薪金60%的雇员select * from emp where comm>sal*^--5、找出部门10中所有经理和部门20中的所有办事员的详细资料select * from emp where (deptno=10 and job=upper('manager')) or (deptno=20 and job=upper('clerk '));--6、找出部门10中所有经理、部门20中所有办事员,既不是经理又不是办事员但其薪金>=2000的所有雇员的详细资料select * from emp where (deptno=10 and job=upper('manager')) or (deptno=20 and job=upper('clerk ')) or (job<>upper(‘manager’) and job<>upper(‘clerk’) and sal>=2000)--7、找出收取佣金的雇员的不同工作select distinct job from emp where comm>0;--8、找出不收取佣金或收取的佣金低于100的雇员select * from emp where nvl(comm,0)<100;|--9、找出各月最后一天受雇的所有雇员select * from emp where hiredate= last_day(hiredate);--10、找出早于25年之前受雇的雇员select * from emp where months_between(sysdate,hiredate)/12>25;select * from emp where hiredate<add_months(sysdate,-12*25);--11、显示只有首字母大写的所有雇员的姓名select ename from emp where ename=initcap(ename);--12、显示正好为6个字符的雇员姓名"select ename from emp where length(ename)=6--13、显示不带有'R'的雇员姓名Select ename from emp where ename not like ‘%R%’;Select ename from emp where instr(ename,’R’)=0;--14、显示所有雇员的姓名的前三个字符select substr(ename,1,3) from emp--15、显示所有雇员的姓名,用a替换所有'A'Select replace(ename,’A’,’a’) from emp"--16、显示所有雇员的姓名以及满10年服务年限的日期Select ename,add_months(hiredate,12*10) ‘服务年限的日期’ from emp--17、显示雇员的详细资料,按姓名排序Select * from emp order by ename--18、显示雇员姓名,根据其服务年限,将最老的雇员排在最前面Select ename from emp order by hiredate--19、显示所有雇员的姓名、工作和薪金,按工作的降序顺序排序,而工作相同时按薪金升序Select ename,job,sal from emp order by job desc ,sal asc!--20、显示所有雇员的姓名和加入公司的年份和月份,按雇员受雇日所在月排序,将最早年份的项目排在最前面select ename,to_char(hiredate,'yyyy'),to_char(hiredate,'mm') from emp order by hiredate asc--21、显示在一个月为30天的情况下所有雇员的日薪金select ename,sal/30 from emp;--22、找出在(任何年份的)2月受聘的所有雇员select * from emp where to_char(hiredate,'mm')='02';--23、对于每个雇员,显示其加入公司的天数select ename,sysdate-hiredate from emp'--24、显示姓名字段的任何位置,包含 "A" 的所有雇员的姓名select ename from emp where ename like '%A%';select ename from emp where instr(ename,’A’,1)>0;--25、以年、月和日显示所有雇员的服务年限Select months_between(sysdate,hiredate)/12 as “年”, months_between(sysdate,hiredate) as “月”, sysdate-hiredate as “日” from emp --1、列出至少有一个雇员的所有部门select distinct dname from dept where deptno in (select distinct deptno from emp);--2、列出薪金比"SMITH"多的所有雇员、select ename,sal from emp where sal>(select sal from emp where ename=upper('smith'));--3、列出所有雇员的姓名及其直接上级的姓名select , from emp e,emp m where =(+);--4、列出入职日期早于其直接上级的所有雇员select ename from emp e where hiredate<(select hiredate from emp where empno=;--5、列出部门名称和这些部门的雇员,同时列出那些没有雇员的部门select dname,ename from dept d left join emp e on =;--6、列出所有“CLERK”(办事员)的姓名及其部门名称%select ename,dname from emp e left join dept d on = where job=upper('clerk');--7、列出各种工作类别的最低薪金,显示最低薪金大于1500的记录select job,min(sal) from emp group by job having min(sal)>1500;--8、列出从事“SALES”(销售)工作的雇员的姓名,假定不知道销售部的部门编号select ename from emp where deptno = (select deptno from dept wheredname=uppder('SALES'))--9、列出薪金高于公司平均水平的所有雇员select ename from emp where sal>(select avg(sal) from emp);--10、列出与“SCOTT”从事相同工作的所有雇员@select ename from emp where job=(select job from emp where ename=upper('scott'));--11、列出某些雇员的姓名和薪金,条件是他们的薪金等于部门30中任何一个雇员的薪金select ename,sal from emp where sal in (select sal from emp where deptno=30);--12、列出某些雇员的姓名和薪金,条件是他们的薪金高于部门30中所有雇员的薪金select ename ,sal from emp where sal>(select max(sal) from emp where deptno=30);--13、列出每个部门的信息以及该部门中雇员的数量select ,dname,count(ename) from dept d left join emp e on =group by ,dname*--14、列出所有雇员的雇员名称、部门名称和薪金Select ,, from emp e left join dept d on =--15、列出从事同一种工作但属于不同部门的雇员的不同组合Select ,,,,,From emp tba,emp tbbWhere = and <>--16、列出分配有雇员数量的所有部门的详细信息,即使是分配有0个雇员Select ,dname,loc,count(empno)<From dept,empWhere =(+)Group by ,dname,loc--17、列出各种类别工作的最低工资Select min(sal) from emp group by job--18、列出各个部门的MANAGER(经理)的最低薪金Select deptno,min(sal) from emp where job=upper(‘manager’) group by deptno --19、列出按年薪排序的所有雇员的年薪select (sal+nvl(comm,0))*12 as avn from emp order by avn--20、列出薪金水平处于第四位的雇员Select * from (Select ename,sal, rank() over (order by sal desc) as grade from emp) where grade=4。
Oracle PL/SQL测试题姓名:___ _________ 一、选择题1、Oracle数据库中为新创建的表分配的初始空间通常为多大(B)A、一个块、一个块B、一个区、一个区C、一个段、一个段D、c一个表空间一个表空间2、关于存储过程参数,正确的说法是(B)A、存储过程的输出参数可以是标量类型,也可以是表类型、存储过程的输出参数可以是标量类型,也可以是表类型B、存储过程输入参数可以不输入信息而调用过程、存储过程输入参数可以不输入信息而调用过程C、可以指定字符参数的字符长度(函数的()或者过程的(number/varchar2))D、以上说法都不对、以上说法都不对3、下列说法,正确的说法是(B)A、只要在存储过程中有增删改语句,一定加自治事务、只要在存储过程中有增删改语句,一定加自治事务B、在函数内可以修改表数据、在函数内可以修改表数据C、函数不能递归调用、函数不能递归调用D、以上说法都不对、以上说法都不对4、有一产品表(编号,名称,价格,数量,所属分类),下列语法不正确的是(D)A、select * from 产品表产品表 where价格>1000 产品表B、select sum(价格所属分类 having max(价格价格)>1000 产品表 group by 所属分类价格) from 产品表C、select所属分类,sum(价格) from 产品表所属分类产品表 where 价格>1000 group by 所属分类D、select所属分类,sum(价格) from 产品表所属分类产品表 where max(价格)>1000 group by 所属分类5、关于触发器,下列说法正确的是(B)A、可以在表上创建INSTEAD OF 触发器触发器B、语句级触发器不能使用“:old”和“:new”C、行级触发器不能用于审计功能、行级触发器不能用于审计功能D、触发器可以显式调用、触发器可以显式调用6、下列那些是Oracle的伪列(ACD)A、ROWID B、ROW_NUMBER() C、LEVEL D、ROWNUM E、COLUMN 7、当表的重复行数据很多时,应该创建的索引类型应该是(、当表的重复行数据很多时,应该创建的索引类型应该是( C )A、B树B 、reverse C 、bitmap D 、函数索引、函数索引8、在建表时如果希望某列的值,在一定的范围内,应建什么样的约束?(C )A 、primary key B 、unique C 、check D 、not null 9、利用游标来修改数据时,所用的。
Oracle的sql语句练习题含答案Oracle的sql语句练习题含答案(二)Oracle_SQL练习题11.选择部门30中的所有员工.Select ename from emp where emp.deptno=?30?;2.列出所有办事员(CLERK)的姓名,编号和部门编号Select ename,empno,deptno from emp where job=?CLERK?.3.找出佣金高于薪金的员工.Select ename from emp where comm>sal4.找出佣金高于薪金的60%的员工.Select ename from emp where comm>sal*0.65.找出部门10中所有经理(MANAGER)和部门20中所有办事员(CLERK)的详细资料.Select * from emp where (job=?MANAGER? and deptno=10) or (job=?CLERK? and deptno=20)6.找出部门10中所有经理(MANAGER),部门20中所有办事员(CLERK),既不是经理又不是办事员但其薪金大于或等于2000的所有员工的详细资料. Select * from emp where job=?MANAGER?and deptno=10 or (job=?CLERK?) or(job not in (…MANAGER?,?CLERK?) and sal >=2000)7.找出收取佣金的员工的不同工作.Select distinct job from emp where NVL (comm,0)>08.找出不收取佣金或收取的佣金低于100的员工.Select ename from emp where NVL(comm,0)<1009.找出各月倒数第3天受雇的所有员工.Select ename from emp where last_day(hiredate)-2=hiredate10.找出早于12年前受雇的员工.Select ename from emp where months_between(sysdate,hiredate)/12 >1211.以首字母大写的方式显示所有员工的姓名.select initcap(ename) name ,job, hiredatefrom emp;12.显示正好为5个字符的员工的姓名Select ename from emp where ename like …_____?select ename,job,hiredate from emp where length(ename)=5;13.显示不带有"R"的员工的姓名.Select ename from emp where ename not lik e …%R%?14.显示所有员工姓名的前三个字符.15.显示所有员工的姓名,用a替换所有"A"16.显示满10年服务年限的员工的姓名和受雇日期.Select ename,hiredate from emp where months_between(systemdate,hiredate)/12 >=1017.显示员工的详细资料,按姓名排序.Select * from emp order by ename18.显示员工的姓名和受雇日期,根据其服务年限,将最老的员工排在最前面.Select ename,hiredate from emp order by months_between(sysdate,hiredate) descselect ename, hiredate from emp order by hiredate desc;19.显示所有员工的姓名、工作和薪金,按工作的降序排序,若工作相同则按薪金排序.Select ename,job,sal from emp order by job desc,sal asc20.显示所有员工的姓名、加入公司的年份和月份,按受雇日期所在月排序,若月份相同则将最早年份的员工排在最前面.Select ename,to_char(hiredate,?yyyy?) as year,to_char(hiredate,?mm?) as month from emp order by year,month asc21.显示在一个月为30天的情况所有员工的日薪金,忽略余数.Select ename,trunk(sal/30) as dailysal from emp22.找出在(任何年份的)2月受聘的所有员工。
经典_Oracle的sql语句百例训练oracle系列《一》:简单sql与单行函数使用scott/tiger用户下的emp表和dept表中顺利完成以下练,表的结构表明如下dept部门表(deptno部门编号/dname部门名称/loc地点)工资=薪金+佣金登入oracle数据库1、sqlplusscott/tiger2、sqlplus/nologsql>connscott/tiger若是使用sys的账号进行登录的话,则使用以下语句sql>conn/assysdba【1】emp表中内容查阅sql>select*fromemp;失效,原因就是没找出该表中,因为该表时scott用户的表中,所以查阅时必须加之scott.emp就可以了【2】显示当前用户sql>showuser【3】查看当前用户的所有表sql>select*fromtab;【4】若想重复继续执行上一条sql语句,则在sqlplus命令行下输出\即可【5】查询一张表的结构,例如dept表sql>descdept【6】在雇员表查阅雇员的编号、姓名、工作sql>selectempno,ename,jobfromemp;【7】可以为列名取别名,在linux下oracle如果英文别名不加上双引号则会变成大写sql>selectempno编号,ename姓名,job工作fromemp;【8】查询所有的工作sql>selectdistinctjobfromemp;工作可能会重复,加之distinct关键字【9】若要求按照以下的格式进行结果输出,如no:7469,name:smith,job:clerksql>select'no:'||empno||',name:'||ename||',job:'||jobfromemp;【10】建议列举每个雇员的姓名及年薪【11】查看每月可以得到奖金的雇员信息【12】建议基本工资大于1500,同时可以申领奖金的雇员信息【13】查询基本工资不大于1500,同时不可以领取奖金的雇员信息【14】查阅在1981年雇用的全部雇员信息,between..and涵盖等同于的情况sql>select*fromempwherehiredatebetween'01-jan-81'and'31-dec-81';【15】oracle对大小敏感,所以查询时名字要区分大小写【16】建议查阅出来雇员编号不是7369、7499的雇员信息sql>select*fromempwhereempnonotin(7369,7499);【17】sql中like语句必须特别注意通配符%和_sql>select*fromempwherehiredatelike'?%';【18】查阅雇员编号不是7369的雇员信息,采用<>或!=sql>select*fromempwhereempno<>7369;【19】要求对雇员的工资由低到高进行排序,升序为默认(asc),降序(desc)sql>select*fromempgroupbysal;【20】查阅出来部门号为10的雇员信息,查阅的信息按照工资从低至高,若工资成正比则按雇佣日期从早到晚排序sql>select*fromempwheredeptno=10groupbysaldesc,hiredateasc;数据库系统中,每个数据库之间区别最小的就是在函数的积极支持上,单行函数就是最简单的函数,单行函数分成1、字符函数:接受字符输入并且返回字符或数值2、数值函数:接受数值输入并返回数值3、日期函数:对日期型数据进行操作4、切换函数:将一种数据初始化为另一种数据类型5、通用型函数:nvl、decode函数字符函数:【1】大小写切换upper和lowersql>selectupper('smith')fromdual;【2】将雇员姓名变为开头字母大写,initcapsql>selectinitcap(ename)fromemp;字符函数中存有相连接函数concat,但不如||不好用,除了字符串处置的一些函数字符串撷取:substr()字符串长度:length()内容替代:replace()sql>selectsubstr('hello',1,3),length('hello'),replace('hello','l','x')fromdual;这里注意的是oracle中字符串截取从0和从1开始都是一样的,谨防面试提问【3】建议表明所有雇员的姓名及姓名的后3个字符sql>selectename,substr(ename,length(ename)-2)fromemp;以上操作显得较为麻烦,substr()函数是可以倒着截取sql>selectename,substr(ename,-3,3)fromemp;数值函数:1、四舍五入:round()2、截断小数位:trunc()3、取余(取模):modsql>selectround(789.536)fromdual;【1】保留2位小数,(如果是-2则对整数进行四舍五入,变为800了)sql>selectround(783.56,2)fromdual;【2】使用mod()函数进行取余操作sql>selectmod(10,3)fromdual;日期函数:1、日期-数字=日期2、日期+数字=日期3、日期-日期=数字(天数)【1】求出当前日期sql>selectsysdatefromdual;oracle提供了以下的日期函数支持:months_between():谋出来给定日期范围的月数add_months():在指定日期上加上指定的月数,求出之后的日期next_day():下一个的今天的日期last_day():谋出来给定日期的最后一天日期【2】求出从雇用日期到今天所有雇员的雇员编号、姓名和月数sql>selectempno,ename,round(months_between(sysdate,hiredate))fromemp;。
1、列出至少有一个雇员的所有部门select distinct dname from dept where deptno in (select distinct deptno from emp;2、列出薪金比"SMITH"多的所有雇员select ename,sal from emp where sal>(select sal from emp where ename=upper('smith';3、列出所有雇员的姓名及其直接上级的姓名select e.ename,m.ename from emp e,emp m where e.mgr=m.empno(+;4、列出入职日期早于其直接上级的所有雇员select ename from emp e where hiredate<(select hiredate from emp where empno=e.mgr;5、列出部门名称和这些部门的雇员,同时列出那些没有雇员的部门select dname,ename from dept d left join emp e on d.deptno=e.deptno;6、列出所有“CLERK”(办事员)的姓名及其部门名称select ename,dname from emp e left join dept d on e.deptno=d.deptno where job=upper('clerk';7、列出各种工作类别的最低薪金,显示最低薪金大于1500的记录select job,min(sal from emp group by job having min(sal>1500;8、列出从事“SALES”(销售)工作的雇员的姓名,假定不知道销售部的部门编号select ename from emp where deptno = (select deptno from dept where dname=uppder('SALES'9、列出薪金高于公司平均水平的所有雇员select ename from emp where sal>(select avg(sal from emp; 10、列出与“SCOTT”从事相同工作的所有雇员select ename from emp where job=(select job from emp where ename=upper('scott'; 11、列出某些雇员的姓名和薪金,条件是他们的薪金等于部门30中任何一个雇员的薪金select ename,sal from emp where sal in (select sal from emp where deptno=30; 12、列出某些雇员的姓名和薪金,条件是他们的薪金高于部门30中所有雇员的薪金select ename ,sal from emp where sal>(select max(sal from emp where deptno=30; 13、列出每个部门的信息以及该部门中雇员的数量select d.deptno,dname,count(ename from dept d left join emp e on (d.deptno=e.deptno group by d.deptno,dname 14、列出所有雇员的雇员名称、部门名称和薪金Select e.ename,d.dname,e.sal from emp e left join dept d on (d.deptno=e.deptno 15、列出从事同一种工作但属于不同部门的雇员的不同组合Selecttba.ename,tbb.ename,tba.job,tbb.job,tba.deptno,tba.deptno From emp tba,emp tbb Where tba.job=tbb.job and tba.deptno<>tbb.deptno 16、列出分配有雇员数量的所有部门的详细信息,即使是分配有0个雇员Selectdept.deptno,dname,loc,count(empno From dept,emp Wheredept.deptno=emp.deptno(+ Group by dept.deptno,dname,loc 17、列出各种类别工作的最低工资Select min(sal from emp group by job 18、列出各个部门的MANAGER(经理)的最低薪金Select deptno,min(sal from emp where job=upper(‘manager’ group by deptno 19、列出按年薪排序的所有雇员的年薪select (sal+nvl(comm,0*12 as avn from emp order by avn 20、列出薪金水平处于第四位的雇员Select * from (Select ename,sal, rank( over (order by sal desc as grade from emp where grade=4。
oracle练习-SQL使用scott用户,密码为tiger登录数据库orcl,数据库中有一个表,表名为emp,具体信息如下:emp职工表;表中有如下列:empno(职工编号)、ename(职工姓名)、job(岗位)、MGR(主管的职工编号)、hiredate(入职日期)、sal(薪水)、comm(津贴)、deptno(部门编号)练习一:1.查询emp(雇员)整个表内容;select * from emp;2.只查询emp表中的job和deptno两列信息;select job,deptno from emp;3.查询emp表中数据,并给列取中文别名;select job "工作" ,deptno "部门编号" from emp;4.将姓名和薪水两列连接起来显示“xxx的薪水是多少”这样的信息;select ename||'薪水是'||sal from emp;5.查询岗位为"CLERK"的职工信息;select * from emp where job='CLERK';6.查询部门编号不是10的职工信息;select * from emp where deptno!='10';7.查询comm为空值的职工信息;select * from emp where comm is null;8.查询职工姓名中带有A的职工信息;select * from emp where ename like '%A%';9.查询职工姓名中倒数第二个字符为E的职工信息;select * from emp where ename like '%E_';10.查询职工姓名中带有L和E的职工信息,并且姓名中L在前,E在后;要求:只查询出职工编号,职工姓名,薪水和部门编号这四列,并且给部门编号列取中文别名;(扩展练习)select empno"职工编号",ename"职工姓名",sal"薪水",deptno"部门编号" from emp;11.查询职工姓名中带有L和E的职工信息,并且姓名中L在前,E在后,且要求姓名第三位是L;select * from emp where ename like '__LE%'练习2:1.查询部门编号为30,MGR主管编号为7698的员工信息;select * from emp where deptno='30' and mgr='7698';2.查询部门编号为10,或者job为CLERK的员工信息select * from emp where deptno='10' or job='CLERK';3.查询sal大于等于900,小于3000,并且部门编号为10、20的职工信息;select * from emp where sal>=900 and sal<3000 or deptno='10'and deptno=20';4.查询mgr主管编号不是7698和7788,或者job岗位为CLERK 的职工信息,查询结果并且先按sal薪水降序排列,再按empno职工编号升序排列(扩展练习)select * from emp where not(mgr='7698' or mgr='7798') or job='CLERK' order by sal desc,empno asc;5.将下面SQL分别执行,能得出什么结论?(扩展练习)select * from emp where deptno='30' and mgr='7698' or job='CLERK';select * from emp where job='CLERK' or deptno='30' and mgr='7698';select * from emp where deptno='30' or mgr='7698' and job='CLERK';练习3:1.往emp表里插入一条雇员信息,雇员编号为4位,第一位为按组号取,其他三位组内讨论决定,hiredate取当前系统值,DEPTNO 部门编号取值为10、20、30当中的一个,其他字段自行决定;不提交2.将deptno取值为10的职工薪水翻倍,并且ename在原来取值的基础上拼接上TEST;不提交,设置一个保存点,保存点名字以自己的名字命名3.删除刚刚插入的的职工信息;不提交4.回滚到保存点;5.提交,最后数据会变成什么样?练习4:两个表定义如下:(如果已经有该表,则将该表删除掉再重新创建)---省份表,省份id和省份名称;create table province(pro_id varchar2(10),pro_name varchar2(30),primary key(pro_id));--公民信息表,身份证id,姓名,年龄,城市,性别,手机号,学历。
oracle sql练习题
1. 编写一个SQL查询,找出员工表中工资最高的员工的姓名和工资。
```
SELECT ename, sal
FROM emp
WHERE sal = (SELECT MAX(sal) FROM emp);
```
2. 编写一个SQL查询,计算出每个部门的平均工资,并按照平均工资降序排列。
```
SELECT deptno, AVG(sal) as avg_salary
FROM emp
GROUP BY deptno
ORDER BY avg_salary DESC;
```
3. 编写一个SQL查询,找出没有任何员工的部门(即部门中没有员工记录的部门)。
```
SELECT d.deptno, d.dname
FROM dept d
LEFT JOIN emp e ON d.deptno = e.deptno
WHERE e.deptno IS NULL;
```
4. 编写一个SQL查询,找出在每个部门中薪资排名第二高的员工的姓名和工资。
```
SELECT d.dname, e.ename, e.sal
FROM emp e
INNER JOIN dept d ON e.deptno = d.deptno
WHERE e.sal = (
SELECT DISTINCT sal
FROM emp
WHERE deptno = e.deptno
ORDER BY sal DESC
OFFSET 1 ROW FETCH FIRST 1 ROW ONLY
);
```
5. 编写一个SQL查询,找出拥有部门管理权限(即至少管理一个部门)且工资不超过5000的员工的姓名。
```
SELECT ename
FROM emp
WHERE empno IN (
SELECT DISTINCT mgr
FROM emp
WHERE sal <= 5000
);
```
6. 编写一个SQL查询,找出在工资表中有重复记录的员工姓名和工资。
```
SELECT ename, sal
FROM emp
GROUP BY ename, sal
HAVING COUNT(*) > 1;
```
7. 编写一个SQL查询,找出至少在两个部门工作过的员工的姓名。
```
SELECT ename
FROM emp
GROUP BY ename
HAVING COUNT(DISTINCT deptno) > 1;
```
8. 编写一个SQL查询,找出在每个部门中工作年限最长的员工的
姓名和工作年限。
```
SELECT d.dname, e.ename, MONTHS_BETWEEN(SYSDATE,
e.hiredate)/12 as work_years
FROM emp e
INNER JOIN dept d ON e.deptno = d.deptno
WHERE e.hiredate = (
SELECT hiredate
FROM emp
WHERE deptno = e.deptno
ORDER BY hiredate ASC
FETCH FIRST 1 ROW ONLY
);
```
9. 编写一个SQL查询,找出在每个部门中工资排名前三名的员工的姓名和工资。
```
SELECT d.dname, e.ename, e.sal
FROM emp e
INNER JOIN dept d ON e.deptno = d.deptno
WHERE (SELECT COUNT(DISTINCT sal)
FROM emp
WHERE deptno = e.deptno AND sal >= e.sal) <= 3;
```
10. 编写一个SQL查询,找出在每个部门中离职员工的数量。
```
SELECT d.dname, COUNT(*) as num_of_resigned
FROM emp e
INNER JOIN dept d ON e.deptno = d.deptno
WHERE e.job = 'SALESMAN'
GROUP BY d.dname;
```
以上是一些Oracle SQL的练习题目,通过解答这些题目可以加深对Oracle SQL语法和函数的理解和掌握。
希望对你的学习有所帮助。