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持久性。
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语法和函数的理解和掌握。
希望对你的学习有所帮助。