Oracle-SQL-练习题及答案
Oracle经典练习题及标准答案
Oracle经典练习题及标准答案oracle经典练习sql/*1、选择在部门30中员工的所有信息*/select * from scott.emp where deptno = '30'/*2、列出职位为(MANAGER)的员工的编号,姓名*/select empno, ename from scott.emp where job = 'MANAGER'/*3、找出奖金高于工资的员工*/select * from scott.emp where comm > sal/*4、找出每个员工奖金和工资的总和*/select ename, sal + nvl(comm, 0) from scott.emp/*5、找出部门10中的经理(MANAGER)和部门20中的普通员工(CLERK) */select *from scott.empwhere deptno = '10'and job = 'MANAGER'unionselect *from scott.empwhere job = 'CLERK'and deptno = '20'/*6、找出部门10中既不是经理也不是普通员工,而且工资大于等于2000的员工*/ select *from scott.empwhere job != 'MANAGER'and job != 'CLERK'and sal > 2000/*7、找出有奖金的员工的不同工作*/select distinct(job) from scott.emp where comm is not null /*8、找出没有奖金或者奖金低于500的员工*/select *from scott.empwhere comm is not nulland comm > 500/*9、显示雇员姓名,根据其服务年限,将最老的雇员排在最前面*/select enamefrom scott.emporder by (months_between(sysdate, hiredate) / 12) descselect ename,hiredate from scott.emp order by hiredate/*10、找出每个月倒数第三天受雇的员工*/select * from scott.emp where hiredate = last_day(hiredate) - 2/*11、分别用case和decode函数列出员工所在的部门,deptno=10显示'部门10',deptno=20显示'部门20'deptno=30显示'部门30'deptno=40显示'部门40'否则为'其他部门'*/select ename,case deptnowhen 10 then'部门10'when 20 then'部门20'when 30 then'部门30'when 40 then'部门40'else'其他部门'end 工资情况from scott.empselect ename,decode(deptno,10,'部门10',20,'部门20',30,'部门30',40,'部门40','其他部门') 工资情况from scott.emp/*12、分组统计各部门下工资>500的员工的平均工资*/select avg(sal) from scott.emp where sal > 500 group by deptno/*13、统计各部门下平均工资大于500的部门*/select deptno from scott.emp group by deptno having avg(sal) > 500 /*14、算出部门30中得到最多奖金的员工奖金*/ select max(comm) from scott.emp where deptno = 30/*15、算出部门30中得到最多奖金的员工姓名*/select enamefrom scott.empwhere deptno = 30and comm = (select max(comm) from scott.emp where deptno = 30) /*16、算出每个职位的员工数和最低工资*/select count(ename), min(sal), job from scott.emp group by job/*17、列出员工表中每个部门的员工数,和部门no */select count(ename), deptno from scott.emp group by deptno/*18、得到工资大于自己部门平均工资的员工信息*/select *from scott.emp ewhere sal > (select avg(sal) from scott.emp where e.deptno = deptno)select *from scott.emp e1,(select avg(sal) sals, deptno from scott.emp group by deptno) e2where sal > salsand e1.deptno = e2.deptno/*19、分组统计每个部门下,每种职位的平均奖金(也要算没奖金的人)和总工资(包括奖金) */select avg(nvl(comm,0)), sum(sal + nvl(comm, 0))from scott.empgroup by deptno,job/*20、笛卡尔集*/select * from scott.emp, scott.dept/*21、显示员工ID,名字,直属主管ID,名字*/select empno,ename,mgr,(select ename from scott.emp e1 where e1.empno = e2.mgr) 直属主管名字from scott.emp e2/*22、DEPT表按照部门跟EMP表左关联*/select *fromscott.dept, scott.empwherescott.dept.deptno = scott.emp.deptno(+)/*23、使用此语句重复的内容不再显示了*/select distinct (job) from scott.emp/*24、重复的内容依然显示*/select *from scott.empUNION ALLselect * from scott.emp/*23和24题和22题是一样的*//*25、只显示了两个表中彼此重复的记录。
Oracle最新的Sql笔试题及答案
Oracle最新的Sql笔试题及答案部门表(SM_DEPT)字段名称数据类型是否主键注释DEPT_ID NUMBER Y部门IDPARENT_DEPARTMENT_ID NUMBER N上级部门DEPARTMENT_NAME VARCHAR2(50)N部门名称⽤户部门中间表(SM_USER_DEPT)字段名称数据类型是否主键注释ID NUMBER Y主键DEPT_ID NUMBER N部门IDUSER_ID NUMBER N⽤户ID⽤户表(SM_USER)字段名称数据类型是否主键注释USER_ID NUMBER Y⽤户IDUSER_NAME VARCHAR2(50)N⽤户名称LOGON_NAME VARCHAR2(50)N登录名IS_SALES VARCHAR2(1)N是否为业务员客户信息表(CTM_CUSTOMERS)字段名称数据类型是否主键注释CUSTOMER_ID NUMBER Y客户IDCUSTOMER_NAME VARCHAR2(50)N客户姓名CITY VARCHAR2(50)N所属城市STATE VARCHAR2(25)N所属州ZIP_CODE VARCHAR2(10)N邮政编码CONTACT_NAME VARCHAR2(50)N联系⼈ADDRESS VARCHAR2(50)N联系地址TYPE VARCHAR2(50)N客户类型COMMENTS VARCHAR2(100)N备注订单头表(PIM_HEADERS)字段名称数据类型是否主键注释PI_ID NUMBER Y订单IDPI_NO VARCHAR2(50)N订单号CREATION_DATE DATE N创建⽇期CUSTOMER_ID NUMBER N关联客户表的客户IDOPERATOR_ID NUMBER N关联⽤户表的⽤户IDCURRENCY_CODE VARCHAR2(50)N订单币种EXCHAHGE_RATE NUMBER N汇率订单⾏表(PIM_LINES)字段名称数据类型是否主键注释PI_ID NUMBER N订单IDPI_LINES_ID VARCHAR2(50)Y订单⾏IDPRODUCT_CODE NUMBER N产品编码字段名称数据类型是否主键注释QUANTITY NUMBER N产品数量PRICE NUMBER N产品单价问题1.编写SQL语句,查询PIM_HEADERS表,符合⽇期在2011-03-01和2011-03-25之间的PI订单,显⽰订单号,创建⽇志,订单客户名称,订单业务员名称selectt1.PI_NO,t1.CREATION_DATE,t2.CUSTOM_NAME,ER_NAMEfrom (select*from PIM_HEADERSwhere CREATION_DATE betweento_date('2011-03-01','yyyy-mm-dd')andto_date('2011-03-25','yyyy-mm-dd')) t1left join CTM_CUSTOMERS t2on t1.CUSTOMER_ID = t2.CUSTOMER_IDleft join SM_USER t3on t1.OPERATOR_ID = ER_ID2.编写SQL语句,查询所有部门名称及其给部门的业务员的个数,部门在2011-01-01到2011-03-01之间创建的PI订单数select t1._DEPARTMENT_NAME,count(ER_NAME),count(t3.PI_NO)from SM_DEPT t1left join SM_USER_DEPT t2on t1.dept_id = t2.dept_idleft join (select*from PIM_HEADERSwhere CREATION_DATE betweento_date('2011-01-01','yyyy-mm-dd')andto_date('2011-03-01','yyyy-mm-dd')) t3on er_id = t3.OPERATOR_IDgroup by t1.DEPT_ID3.编写SQL语句,查询所有客户及其相关PI订单号,PI创建⽇期,PI订单相关业务员姓名及其业务所属部门名称selectt1.*,t2.PI_NO,t2.CREATION_DATE,ER_NAME,t5.DEPARTMENT_NAMEfrom SM_CUSTOMERS t1left join PIM_HEADERS t2on t1.CUSTOER_ID = t2.CUSTOMER_IDleft join SM_USER t3on t2.OPERATOR_ID = er_idleft join SM_USER_DEPT t4on ER_ID = ER_IDleft join SM_DEPT t5on t4.DEPT_ID = t5.DEPT_ID4.编写SQL语句,更新没有下过PI订单的客户名称的备注为“从未发⽣业务往来”update CTM_CUSTOMERS t1 set COMMENTS = '从未反⽣业务往来'where not exists (select PI_NO from PIM_HEADERS t2where t2.CUSTOMER_ID = t1.CUSTOMER_ID) ;commit;5.编写SQL语句,查询所有客户名称及其所属城市,并按照城市名称降序,⽤户名称升序排序select CUSTOM_NAME,CITYfrom CTM_CUSTOMERSorder by city desc,CUSTOMER_NAME asc6.编写SQL语句,查询出所有的客户的PI订单的下单⾦额,显⽰客户名称,订单币种,订单总数量及订单总额selectt2.CUSTOMER_NAME,t1.CURRENCY_CODE,t3.TOTAL,t4.TOTAL_MONEYfrom PIM_HEADERS t1left join CTM_CUSTOMERS t2on t1.CUSTOMER_ID = t2.CUSTOMER_IDleft join (select PI_ID,sum(QUANTITY) TOTAL,sum(QUANTITY*PRICE) TOTAL_MONEYfrom PIM_LINESgroup by PI_ID) t3on t1.PI_ID = t3.PI_ID;7.编写函数,函数需传⼊部门ID,返回结果部门对应所有业务员姓名连接起来,中间⽤逗号隔开create or replace function getUserByDeptId( dept_id number) return varchar2isres varchar2(200);cursor mycursor(did number) isselect t2.CUSTOMER_NAMEfrom (select *from SM_USER_DEPTwhere dept_id = did) t1left join SM_USER t2on ER_ID = ER_ID ;beginfor c_row in mycursor(dept_id) loopres := res ||','|| c_rowend loop;return res;end;。
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数据库及SQL语言考试题一(含答案)
ORACLE 数据库及SQL 语言考试题及答案考试试题说明:试题包括三类,名词解释、ORACLE 数据库知识问答、SQL 语句编写,主要用于考察新同事ORACLE 数据库知识和SQL 语言掌握情况。
名词解释可以在回答中阐明名词的定义和你所了解的任何相关信息,没有字数限制,但避免长篇大论,简要描述即可。
ORACLE 数据库知识问答,重点在于切中要害,回答按点给分,每题2分。
SQL 语句编写检查大家的实际SQL 语句编写能力及掌握情况,注意格式规范,要清晰易读。
一、名词解释一、名词解释1. 数据库数据库是按照数据结构来组织、存储和管理数据的仓库。
2. 实例实例是一组Oracle 后台进程/线程以及一个共享内存区,这些内存由同一个计算机上运行的线程/进程所共享。
3. 表空间表空间是数据库的逻辑划分,用于存放数据库对象,主要是数据表,所以称作表空间。
ORACLE 自身存在一些表空间,如system 、user 和undo 表空间。
数据库用户也可以自己定义自己的表空间,并为每个表空间分配对应的数据文件。
4. 索引索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
索引不论逻辑上和物理上都与相关的表的数据无关,索引需要独立的存储空间,所以索引在创建之初就需要设置对应的表空间。
二、ORACLE 数据库知识问答1. 数据表Pirmary Key 和Unique Key 的作用和区别作用:Pirmary Key 和Unique Key 都是为数据表提供唯一性约束。
区别:Primary key 的1个或多个列必须为NOT NULL ,如果列为NULL ,在增加PRIMARY KEY 时,列自动更改为NOT NULL 。
而UNIQUE KEY 对列没有此要求。
一个表只能有一个PRIMARY KEY ,但可以有多个UNIQUE KEY 。
2. dos 模式下数据库用户备份、恢复命令数据库备份:exp 用户名/密码@连接标识符数据库恢复:imp 用户名/密码@连接标识符3. 列举五个常用的集合函数max,min,sum,avg,count4. round 与trunc 在处理数字方面的区别,并举例说明round 返回四舍五入后的值,而trunc 返回截取后的值,不进行四舍五入。
oracle试题
oracle试题一、选择题1. 在Oracle数据库中,用于创建表的语句是什么?A. CREATE DATABASEB. CREATE TABLEC. CREATE INDEXD. CREATE VIEW答案:B2. 下列哪个命令可以用于查询当前数据库中的所有表?A. DESCB. SHOW TABLESC. LIST TABLESD. SELECT * FROM ALL_TABLES答案:C3. 在Oracle中,如何删除一个表?A. REMOVE TABLE table_name;B. DELETE TABLE table_name;C. DROP TABLE table_name;D. ERASE TABLE table_name;答案:C4. 在Oracle SQL中,哪个关键字用于选择所有列?A. ALLB. EACHC. EVERYD. ALL COLUMNS答案:A5. 如何在Oracle SQL查询中对结果进行排序?A. ORDER BY column_name ASC/DESC;B. SORT BY column_name ASC/DESC;C. ARRANGE BY column_name ASC/DESC;D. CLASSIFY BY column_name ASC/DESC;答案:A二、填空题1. 在Oracle数据库中,用来创建视图的关键字是_______。
答案:CREATE VIEW2. 若要在Oracle中为表添加一个新的列,应使用_______语句。
答案:ALTER TABLE3. 在Oracle SQL中,用于合并两个或多个查询结果的关键字是_______。
答案:UNION4. 若要在Oracle数据库中重命名表,应使用_______语句。
答案:RENAME5. 在Oracle中,用来删除表中的行的语句是_______。
答案:DELETE三、简答题1. 请简述Oracle数据库中的事务是什么?答:事务是一组SQL语句的集合,它们作为一个单一的工作单元执行。
oracle上机试题及答案
oracle上机试题及答案Oracle上机试题及答案1. 查询当前数据库版本- 请写出SQL语句来查询当前数据库的版本。
答案:```sqlSELECT * FROM V$INSTANCE;```2. 创建表- 编写SQL语句创建一个名为`employees`的表,包含字段`id`(主键,自动增长),`name`(姓名),`department`(部门),`salary`(薪资)。
答案:```sqlCREATE TABLE employees (id NUMBER GENERATED ALWAYS AS IDENTITY,name VARCHAR2(100),department VARCHAR2(50),salary NUMBER(10, 2),PRIMARY KEY (id));```3. 插入数据- 向`employees`表中插入一行数据,姓名为"John Doe",部门为"IT",薪资为5000。
答案:```sqlINSERT INTO employees (name, department, salary) VALUES('John Doe', 'IT', 5000);```4. 更新数据- 更新`employees`表中姓名为"John Doe"的员工的薪资为6000。
答案:```sqlUPDATE employees SET salary = 6000 WHERE name = 'John Doe'; ```5. 删除数据- 删除`employees`表中所有薪资低于3000的员工记录。
答案:```sqlDELETE FROM employees WHERE salary < 3000;```6. 查询数据- 查询`employees`表中所有员工的姓名和薪资,并按薪资从高到低排序。
Oracle的sql语句练习题含答案(二).
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语句练习题含答案
Oracle的sql语句练习题含答案--1、选择部门30中的雇员select * from emp where deptno=30;--2、列出所有办事员的姓名、编号和部门select ename,empno,dname from emp e inner join dept d on e.deptno = d.deptno where job=upper('clerk‟);--3、找出佣金高于薪金的雇员select * from emp where comm>sal;--4、找出佣金高于薪金60%的雇员select * from emp where comm>sal*0.6--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);< P>--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 e mp--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 whereename=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 wherejob=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 whereename=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、列出从事同一种工作但属于不同部门的雇员的不同组合Select tba.ename,tbb.ename,tba.job,tbb.job,tba.deptno,tba.deptnoFrom emp tba,emp tbbWhere tba.job=tbb.job and tba.deptno<>tbb.deptno--16、列出分配有雇员数量的所有部门的详细信息,即使是分配有0个雇员Select dept.deptno,dname,loc,count(empno)From dept,empWhere dept.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 试题及答案
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语句的练习题及答案(员工表+部门表)
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试题及答案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); ```。
oralce题库及答案
一、选择题1.当你执行以下查询语句:SELECT empno,ename FROM emp WHERE empno =7782 OR empno =7876; 在WHERE 语句中,以下哪个操作符能够取代OR?A. INB. BETWEEN ……C. LIKED. <=E. >=2. 以下哪行有错?(1) SELECT deptno(2) FROM emp(3) GROUP BY deptno(4) HAVING COUNT(deptno)=(5) (SELECT max(count(deptno))(6) FROM emp(7) GROUP BY deptno);A. Line 3B. Line 4C. Line 5D. Line 7E. 都没错.3. 以下哪个命令能够被用来从表 STATE中 drop 列 UPDATE_DT ?A. ALTER TABLE STATE DROP COLUMN UPDATE_DT;B. ALTER TABLE STATE REMOVE COLUMN UPDATE_DT;C. DROP COLUMN UPDATE_DT FROM STATE;D. 你不能从那个表中DROP该列.数据概念语言是用于()的方式。
〔选择一项〕确保数据的准确性B、概念和修改数据结构C、查看数据D、删除和更新数据五、执行下面的语句:select ,from employees e, deptment dwhere (+) = ;会显示什么样的结果?A. 显示dept表的全数信息,没有对应员工以null代替B. 显示emp表的全数信息,没有对应部门以null代替C. 报错D. 语法正确,但可不能运行6、emp表结构如下:empno number(9,3)ename varchar2(10)sal number (9,3)mgr (4)什么命令能够让你添加loc列到列sal后:()A. alter table emp add column3( loc varchar2(20));B. alter table emp modify after column3 ( loc varchar2(20));C. alter table add ( sal ) column3 ( loc varchar2( 20));D. 无法指定新列显现的位置7. beginfor I in 1..10 loopif I = 3 or I = 9 then null ;else insert into ord values (I);end if ;end loop ;end ;多少行数据insert到了ord表?()A. 3B. 4C. 8D. 9E. 18. 下面哪个 like 命令会返回名字为HOTKA 的行?ename like ‘_HOT%'ename like ‘H_T%'ename like ‘%TKA_'ename like ‘%TOK%'9. 在Oracle的SQL PLUS中执行DML语句后,没有提交便正常退出后,事务将:( )A.自动回滚B.自动提交C.报错警告D.提示是不是保留11、Oracle启动的初始化参数文件搜寻顺序是:A.B.C.D.答案:从C到D到A12、显示系统时刻:答案:select sysdate from dual;13、执行下面的语句:select ,from employees e, deptment dwhere (+) = ;会显示什么样的结果?A. 显示dept表的全数信息,没有对应员工以null代替B. 显示emp表的全数信息,没有对应部门以null代替C. 报错D. 语法正确,但可不能运行1六、create table ord( ordid number (3) constraint ord_v_pk primary key,#orderdate date,ship4date date ,3item_id number (7) constraint it_v not null) ;上面的语句,哪两行有错误?a. 1b. 2c. 3d. 4e. 5要以自身的模式创建私有同义词,用户必需拥有()系统权限。
Oracle考试(全)答案
O racle SQL开发基础一、填空题共3题题号: 1 本题分数:2.00 分SELECT TO_CHAR(ADD_MONTHS(TO_DATE(‘20081210’,’YYYYMMDD’),5)+2,’YYYYMMDD’) FROM DUAL;的运行结果是_____20090512______________。
题号: 2 本题分数:2.00 分在ORACLE中,用于事务提交和回滚的SQL语句分别是_________commit______和_______rollback_________。
题号: 3 本题分数:6.00 分数据库按物理上结构必须由数据文件、控制文件和重做日志组成。
二、单选题共30题题号: 4 本题分数:2.00 分Select语句的执行顺序是()(1)select (2)from (3)where (4)group by (5)having (6)order byA、123456B、234561C、234516D、124563题号: 5 本题分数:2.00 分查询语句SELECT SUBSTR(‘Hello World’,4,5) FROM DUAL;返回结果,正确的是A、loWorB、WorldC、lloWoD、lo WoD题号: 6 本题分数:2.00 分哪个活动将导致自动回滚()A、GRANTB、CREATEC、系统崩溃D、从SQL*Plus退出SQL语句分类Select查询语句DML语句(数据操作语言)Insert / Update / Delete / MergeDDL语句(数据定义语言)Create / Alter / Drop / TruncateDCL语句(数据控制语言)Grant / Revoke事务控制语句Commit / Rollback / Savepoint题号: 7 本题分数:2.00 分数据库中有两张表,employees(雇员表),departments(部门表),表结构为课程中试验案例, 如果想要获得全部雇员的信息,不管这个雇员是否被分配了部门,以下答案正确的是A、SELECT last_name,department_name FROM employees JOIN departments(+)B、SELECT last_name,department_name FROM employees(+) JOIN departmentsC、SELECT last_name, department_name FROM employees e RIGHT JOIN departments d ON (e.department_id =d.department_id)D、SELECT last_name, department_name FROM employees e LEFT JOIN departments d ON (e.department_id =d.department_id)题号: 8 本分数:2.00 分关于Listener的描述正确的是()A、监听、接收客户端连接请求B、防止黑客入侵C、验证连接数据库用户的身份。
oracle-sql入门练习及答案
oracle-sql⼊门练习及答案1,通过命令⾏⽅式打开sqlplus2,执⾏登录命令sqlplus scott/scott@192.168.248.129/orcl3进⾏sqlplus命令测试Set time onSet pagesize 数字Set linesizes 数字Set pause on/offDescribe命令查看表或视图结构也可以descShow 查看相应参数如:show parameter,show user,show error等Get命令把⼀个sql脚本⽂件内容放⼊缓冲区⽤系统编辑程序编辑命令在SQL*PLUS中运⾏操作系统缺省的⽂本编辑程序(EDIT)命令为:edit或者ed将缓存中的sql语句保存到⽂件中:SAVE ⽂件名【具体路径】查看缓存sql:list执⾏⽂件中的sql语句:START my.sql@ my.sql清空缓冲区:clear buffer格式化命令:columncolumn sal format $999,999.00如:SQL> select ename, sal from emp2SQL> /ENAME SAL---------- ------------SMITH $800.00ALLEN $1,600.00WARD $1,250.00JONES $2,975.00MARTIN $1,250.00BLAKE $2,850.00CLARK $2,450.00重置为默认值:clear columns;将屏幕上的内容写⼊到⽂件中spool fileName结束写⼊spool off3.Oracle查询1) 查询EMP表,显⽰部门号为10的所有雇员的NAME 、JOB、SALARY和 DEPTNO,并以岗位降序、⼯资升序进⾏排序。
select ename,job,sal,deptno from emp where deptno=10 order by job desc , sal asc2) 从EMP表中查询所有雇员的NAME和补助(SALARY+COMM),并处理null⾏。
oracle sql题
oracle sql题一、题目要求本题目旨在考察对OracleSQL语言的理解和运用能力。
请根据题目要求,完成相应的SQL查询。
二、题目描述请根据以下描述,完成SQL查询:该数据库包含一个名为Employees的表,包含以下列:EmployeeID(员工ID)、Name(姓名)、Department(部门)和Salary(薪资)。
要求完成以下查询:1.按照薪资从高到低排序。
2.只考虑薪资大于等于5000的员工。
3.排除部门为“Sales”的员工。
4.查询结果包括姓名和部门信息。
三、SQL查询语句根据题目要求,以下为对应的SQL查询语句:```sqlSELECTName,DepartmentFROMEmployeesWHERESalary>=5000ANDDepartment<>'Sales'ORDERBYSalaryDESC;```四、答案解析该SQL查询语句通过条件筛选Salary大于等于5000的员工,并且排除部门为“Sales”的员工,最后按照薪资从高到低进行排序,最终返回姓名和部门信息。
五、注意事项1.请确保SQL语句语法正确,符合OracleSQL语言规范。
2.请注意数据表中的真实数据类型和约束条件,避免出现错误。
3.请根据实际情况进行测试,确保查询结果的准确性。
六、额外提示如果需要进一步优化SQL查询,可以考虑使用索引来提高查询性能。
对于Salary列,可以创建索引以提高大于等于5000的筛选速度。
同时,对于Department列,也可以考虑创建索引以优化排除“Sales”部门的性能。
七、参考代码(可选)以下是一个可能的参考代码实现,供参考:```sql--创建Salary索引CREATEINDEXidx_salaryONEmployees(Salary);--执行SQL查询SELECTName,DepartmentFROMEmployeesWHERESalary>=5000ANDDepartment<>'Sales'ORDERBYSalaryDESC;```请注意,这只是参考代码,实际使用时需要根据数据库结构和数据量进行适当的调整。
oracle练习题及答案
o r a c l e练习题及答案(总7页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--试题一一、填空题(每小题4分,共20分)1、数据库管理技术经历了___人工管理、文件系统、数据库系统__三个阶段2、数据库三级数据结构是:外模式、模式、内模式3、Oracle数据库中,SGA由_数据库缓冲区,重做日志缓冲区,共享池组成4、在Oracle数据库中,完正性约束类型有:Primay key约束。
Foreign key约束,Unique约束,check约束,not need约束5、PL/SQL中游标操作包括:声明游标,打开游标,提取游标,关闭游标二、正误判断题(每小题2分,共20分)1、数据库中存储的基本对象是数据(T)2、数据库系统的核心是DBMS(T)3、关系操作的特点是集合操作(T)4、关系代数中五种基本运算是并、差、选择、投影、连接(F)5、Oracle进程就是服务器进程(F)6、oraclet系统中SGA所有用户进程和服务器进程所共享(T)7、oracle数据库系统中数据块的大小与操作系统有关(T)8、oracle数据库系统中,启动数据库和第一步是启动一个数据库实例(T)9、PL/SQL中游标的数据是可以改变的(F)10、数据库概念模型主要用于数据库概念结构设计(T)三、简答题(每小题7分,共35分)1、何谓数据与程序的逻辑独立性和物理独立性2、试述关系代数中等值连接与自然连接的区别与联系3、何谓数据库,数据库设计一般分为哪些阶段4、简述Oracle逻辑数据库的组成5、试任举一例说明游标的使用方法五、设有雇员表emp(empno,ename,age,sal,tel,deptno),其中:empno-----编号,name------姓名,age -------年齡,sal-----工资,tel-----电话deptno-----部门号。
请按下列要求分别晨SQL*PLUS下编程。
Oracle_PLSQL测试题与答案
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价格>1000B、select sum(价格) from 产品表group by 所属分类having max(价格)>1000C、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、ROWIDB、ROW_NUMBER()C、LEVELD、ROWNUME、COLUMN7、当表的重复行数据很多时,应该创建的索引类型应该是(C )A、B树B、reverseC、bitmapD、函数索引8、在建表时如果希望某列的值,在一定的范围内,应建什么样的约束?(C )A、primary keyB、uniqueC、checkD、not null9、利用游标来修改数据时,所用的。
Oracle SQL 练习题及答案
42、查询全部学生都选修的课程的课程号和课程名
43、查询没学过“谌燕”老师讲授的任一门课程的学生姓名
44、查询两门以上不及格课程的同学的学号及其平均成绩
45、检索“c004”课程分数小于60,按分数降序排列的同学学号
46、删除“s002”同学的“c001”课程的成绩
10、查询没有学全所有课的同学的学号、姓名;
11、查询至少有一门课与学号为“s001”的同学所学相同的同学的学号和姓名;
12、查询至少学过学号为“s001”同学所有一门课的其他同学学号和姓名;
13、把“SC”表中“谌燕”老师教的课的成绩都更改为此课程的平均成绩;
14、查询和“s001”号的同学学习的课程完全相同的其他同学学号和姓名;
insert into student values ('s004','琴沁',20,'女');
insert into student values ('s005','王丽',20,'女');
insert into student values ('s006','李波',21,'男');
insert into student values ('s007','刘玉',21,'男');
15、删除学习“谌燕”老师课的SC 表记录;
16、向SC 表中插入一些记录,这些记录要求符合以下条件:没有上过编号“c002”课程的同学学号、“c002”号课的平均成绩;
17、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本文由NiCoBee贡献Oracle SQL 练习题注:这些查询题目涵盖了各种查询的技术,请大家认真做,做好了的查询语句之后,有兴趣的同学可以再创建相应的视图和存储过程create table wkj_student(sno varchar2(10) primary key,sname varchar2(20),sage number(2),ssex varchar2(5));create table wkj_teacher(tno varchar2(10) primary key,tname varchar2(20));create table wkj_course(cno varchar2(10),cname varchar2(20),tno varchar2(20),constraint pk_course primary key (cno,tno));create table wkj_sc(sno varchar2(10),cno varchar2(10),score number(4,2),constraint pk_sc primary key (sno,cno));/*******初始化学生表的数据******/insert into student values ('s001','张三',23,'男');insert into student values ('s002','李四',23,'男');insert into student values ('s003','吴鹏',25,'男');insert into student values ('s004','琴沁',20,'女');insert into student values ('s005','王丽',20,'女');insert into student values ('s006','李波',21,'男');insert into student values ('s007','刘玉',21,'男');insert into student values ('s008','萧蓉',21,'女');insert into student values ('s009','陈萧晓',23,'女'); insert into student values ('s010','陈美',22,'女'); commit;/******************初始化教师表***********************/ insert into teacher values ('t001', '刘阳');insert into teacher values ('t002', '谌燕');insert into teacher values ('t003', '胡明星');commit;/***************初始化课程表****************************/ insert into course values ('c001','J2SE','t002');insert into course values ('c002','Java Web','t002');insert into course values ('c003','SSH','t001');insert into course values ('c004','Oracle','t001');insert into course values ('c005','SQL SERVER 2005','t003');insert into course values ('c006','C#','t003');insert into course values ('c007','JavaScript','t002');insert into course values ('c008','DIV+CSS','t001');insert into course values ('c009','PHP','t003');insert into course values ('c010','EJB3.0','t002');commit;/***************初始化成绩表***********************/insert into sc values ('s001','c001',78.9);insert into sc values ('s002','c001',80.9);insert into sc values ('s003','c001',81.9);insert into sc values ('s004','c001',60.9);insert into sc values ('s001','c002',82.9);insert into sc values ('s002','c002',72.9);insert into sc values ('s003','c002',81.9);insert into sc values ('s001','c003','59');insert into sc values ('s002','c003','58');commit;练习:注意:以下练习中的数据是根据初始化到数据库中的数据来写的SQL 语句,请大家务必注意。
1、查询“c001”课程比“c002”课程成绩高的所有学生的学号;2、查询平均成绩大于60 分的同学的学号和平均成绩;3、查询所有同学的学号、姓名、选课数、总成绩;4、查询姓“刘”的老师的个数;5、查询没学过“谌燕”老师课的同学的学号、姓名;6、查询学过“c001”并且也学过编号“c002”课程的同学的学号、姓名;7、查询学过“谌燕”老师所教的所有课的同学的学号、姓名;8、查询课程编号“c002”的成绩比课程编号“c001”课程低的所有同学的学号、姓名;9、查询所有课程成绩小于60 分的同学的学号、姓名;10、查询没有学全所有课的同学的学号、姓名;11、查询至少有一门课与学号为“s001”的同学所学相同的同学的学号和姓名;12、查询至少学过学号为“s001”同学所有一门课的其他同学学号和姓名;13、把“SC”表中“谌燕”老师教的课的成绩都更改为此课程的平均成绩;14、查询和“s001”号的同学学习的课程完全相同的其他同学学号和姓名;15、删除学习“谌燕”老师课的SC 表记录;16、向SC 表中插入一些记录,这些记录要求符合以下条件:没有上过编号“c002”课程的同学学号、“c002”号课的平均成绩;17、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分18、按各科平均成绩从低到高和及格率的百分数从高到低顺序19、查询不同老师所教不同课程平均分从高到低显示20、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]21、查询各科成绩前三名的记录:(不考虑成绩并列情况)22、查询每门课程被选修的学生数23、查询出只选修了一门课程的全部学生的学号和姓名24、查询男生、女生人数25、查询姓“张”的学生名单26、查询同名同性学生名单,并统计同名人数27、1981 年出生的学生名单(注:Student 表中Sage 列的类型是number)28、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列29、查询平均成绩大于85 的所有学生的学号、姓名和平均成绩30、查询课程名称为“数据库”,且分数低于60 的学生姓名和分数31、查询所有学生的选课情况;32、查询任何一门课程成绩在70 分以上的姓名、课程名称和分数;33、查询不及格的课程,并按课程号从大到小排列34、查询课程编号为c001 且课程成绩在80 分以上的学生的学号和姓名;35、求选了课程的学生人数36、查询选修“谌燕”老师所授课程的学生中,成绩最高的学生姓名及其成绩37、查询各个课程及相应的选修人数38、查询不同课程成绩相同的学生的学号、课程号、学生成绩39、查询每门功课成绩最好的前两名40、统计每门课程的学生选修人数(超过10 人的课程才统计)。
要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列41、检索至少选修两门课程的学生学号42、查询全部学生都选修的课程的课程号和课程名43、查询没学过“谌燕”老师讲授的任一门课程的学生姓名44、查询两门以上不及格课程的同学的学号及其平均成绩45、检索“c004”课程分数小于60,按分数降序排列的同学学号46、删除“s002”同学的“c001”课程的成绩1. 查询“c001”课程比“c002”课程成绩高的所有学生的学号*********************************select a.* from(select * from sc a where o='c001') a,(select * from sc b where o='c002') bwhere a.sno=b.sno and a.score > b.score;*********************************select * from sc awhere o='c001'and exists(select * from sc b where o='c002' and a.score>b.score and a.sno = b.sno)*********************************2. 查询平均成绩大于60 分的同学的学号和平均成绩;*********************************select sno,avg(score) from sc group by sno having avg(score)>60;*********************************3. 3、查询所有同学的学号、姓名、选课数、总成绩;*********************************select a.*,s.sname from (select sno,sum(score),count(cno) from sc group by sno) a ,student s where a.sno=s.sno错错误示范select st.*,count(o),sum(sc.score)from student st,scwhere st.sno=sc.snogroup by st.snoselect count(o) sum (sc.score) 不是单数分组,要先group,不然和select stu.sno关联不起来*********************************4. 4、查询姓“刘”的老师的个数;*********************************select count(*) from teacher where tname like '刘%';*********************************5. 5、查询没学过“谌燕”老师课的同学的学号、姓名;*********************************select a.sno,a.sname from student awhere a.snonot in(select distinct s.snofrom sc s,(select c.*from course c ,(select tnofrom teacher twhere tname='谌燕')twhere c.tno=t.tno) bwhere o = o )*********************************select * from student st where st.sno not in(select distinct sno from sc s join course c on o=ojoin teacher t on c.tno=t.tno where tname='谌燕')*********************************6. 6、查询学过“c001”并且也学过编号“c002”课程的同学的学号、姓名;*********************************select st.* from student stjoin sc a on st.sno=a.snojoin sc b on a.sno=b.snowhere o='c001' and o='c002' ;*********************************7. 7、查询学过“谌燕”老师所教的所有课的同学的学号、姓名;*********************************select st.* from student st join sc s on st.sno=s.snojoin course c on o=ojoin teacher t on c.tno=t.tnowhere t.tname='谌燕'*********************************8. 8、查询课程编号“c002”的成绩比课程编号“c001”课程低的所有同学的学号、姓名;*********************************select * from student stjoin sc a on st.sno=a.snojoin sc b on st.sno=b.snowhere o='c002' and o='c001' and a.score < b.score*********************************9. 9、查询所有课程成绩小于60 分的同学的学号、姓名*********************************select st.*,s.score from student stjoin sc s on st.sno=s.snojoin course c on o=owhere s.score <60*********************************10.查询没有学全所有课的同学的学号、姓名*********************************select stu.sno,stu.sname,count(o) from student stuleft join sc on stu.sno=sc.snogroup by stu.sno,stu.snamehaving count(o)<(select count(distinct cno)from course)===================================select * from student where sno in(select sno from(select stu.sno,o from student stucross join course cminusselect sno,cno from sc))===================================*********************************11. 查询至少有一门课与学号为“s001”的同学所学相同的同学的学号和姓名*********************************select st.* from student st,(select distinct a.sno from(select * from sc) a,(select * from sc where sc.sno='s001') bwhere o=o) hwhere st.sno=h.sno and st.sno<>'s001'12. 查询至少学过学号为“s001”同学所有一门课的其他同学学号和姓名;*********************************select * from scleft join student ston st.sno=sc.snowhere sc.sno<>'s001'and o in(select cno from scwhere sno='s001')*********************************13. 把“SC”表中“谌燕”老师教的课的成绩都更改为此课程的平均成绩*********************************update sc c set score=(select avg(c.score) from course a,teacher b where a.tno=b.tnoand b.tname='谌燕'and o=ogroup by o)where cno in(select cno from course a,teacher bwhere a.tno=b.tnoand b.tname='谌燕')不会做14.(原来是错的我改过来了) 查询和“s001”号的同学学习的课程完全相同的其他同学学号和姓名******************************************************************15. 删除学习“谌燕”老师课的SC 表记录;*********************************delete from scwhere o in(select cno from course cleft join teacher t on c.tno=t.tnowhere t.tname='谌燕')*********************************16. 16、向SC 表中插入一些记录,这些记录要求符合以下条件:没有上过编号“c002”课程的同学学号、“c002”号课的平均成绩;*********************************insert into sc (sno,cno,score)select distinct st.sno,o,(select avg(score)from sc where cno='c002')from student st,scwhere not exists(select * from sc where cno='c002' and sc.sno=st.sno) and o='c002';*********************************17. 17、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分*********************************select cno ,max(score),min(score) from sc group by cno;*********************************18. 18、按各科平均成绩从低到高和及格率的百分数从高到低顺序*********************************select cno,avg(score),round(sum(case when score>=60 then 1 else 0 end)/count(*),2)*100||’%’as 及格率from sc group by cnoorder by avg(score) , 及格率desc*********************************19. 19、查询不同老师所教不同课程平均分从高到低显示*********************************select max(t.tno),max(t.tname),max(o),max(ame),o,avg(score) from sc , course c,teacher twhere o=o and c.tno=t.tnogroup by oorder by avg(score) desc20. 20、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]*********************************答案是错的select o,ame,sum(case when score between 100 and 85 then 1 else 0 end) AS "[100-85]", sum(case when score between 85 and 70 then 1 else 0 end) AS "[85-70]", sum(case when score between 70 and 60 then 1 else 0 end) AS "[70-60]", sum(case when score <60 then 1 else 0 end) AS "[<60]"from sc, course cwhere o=ogroup by o ,ame;改正后的select o,ame,sum(case when score>85 and score<100 then 1 else 0 end) 85到100,sum(case when score>70 and score<850 then 1 else 0 end) 70到85,sum(case when score>60 andthen 1 else 0 end) 60到70,sum(case when score <60 then 1 else 0 end) 60以下from sc, course cwhere o=ogroup by o ,ame;21. 查询各科成绩前三名的记录:(不考虑成绩并列情况)*********************************select * from(select sno,cno,score,row_number()over(partition by cno order by score desc) rn from sc)where rn<4*********************************22. 22、查询每门课程被选修的学生数*********************************select cno,count(sno)from sc group by cno;*********************************23. 23、查询出只选修了一门课程的全部学生的学号和姓名*********************************select sc.sno,st.sname,count(cno) from student stleft join scon sc.sno=st.snogroup by st.sname,sc.sno having count(cno)=1;*********************************24. 4、查询男生、女生人数*********************************select ssex,count(*)from student group by ssex;25. 25、查询姓“张”的学生名单*********************************select * from student where sname like '张%';*********************************26. 26、查询同名同性学生名单,并统计同名人数*********************************select sname,count(*)from student group by sname having count(*)>1;*********************************27. 27、1981 年出生的学生名单(注:Student 表中Sage 列的类型是number)*********************************select sno,sname,sage,ssex from student t where to_char(sysdate,'yyyy')-sage =1988*********************************28. 28、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列*********************************select cno,avg(score) from sc group by cno order by avg(score)asc,cno desc; *********************************29. 29、查询平均成绩大于85 的所有学生的学号、姓名和平均成绩*********************************select st.sno,st.sname,avg(score) from student stleft join scon sc.sno=st.snogroup by st.sno,st.sname having avg(score)>85;*********************************30. 30、查询课程名称为“数据库”,且分数低于60 的学生姓名和分数*********************************select sname,score from student st,sc,course cwhere st.sno=sc.sno and o=o and ame='Oracle' and sc.score<60 *********************************31. 查询所有学生的选课情况;*****************************select st.sno,st.sname,ame from student st,sc,course cwhere sc.sno=st.sno and o=o;**************************** *****32. 查询任何一门课程成绩在70 分以上的姓名、课程名称和分数;*********************************select st.sname,ame,sc.score from student st,sc,course cwhere sc.sno=st.sno and o=o and sc.score>70*********************************33. 33、查询不及格的课程,并按课程号从大到小排列*********************************select sc.sno,ame,sc.score from sc,course cwhere o=o and sc.score<60 order by o desc;*********************************34. 34、查询课程编号为c001 且课程成绩在80 分以上的学生的学号和姓名;*********************************select st.sno,st.sname,sc.score from sc,student stwhere sc.sno=st.sno and cno='c001' and score>80;*********************************35. 35、求选了课程的学生人数*********************************select count(distinct sno) from sc;*********************************y有问题36、查询选修“谌燕”老师所授课程的学生中,成绩最高的学生姓名及其成绩*********************************select st.sname,score from student st,sc ,course c,teacher twherest.sno=sc.sno and o=o and c.tno=t.tnoand t.tname='谌燕' and sc.score=(select max(score)from sc where o=o)*********************************37. 37、查询各个课程及相应的选修人数*********************************select cno,count(sno) from sc group by cno;*********************************38. 38、查询不同课程成绩相同的学生的学号、课程号、学生成绩*********************************select a.* from sc a ,sc b where a.score=b.score and o<>o*********************************39. 39、查询每门功课成绩最好的前两名*********************************select * from (select sno,cno,score,row_number()over(partition by cno order by score desc) my_rn from sc t)where my_rn<=2*********************************40. 40、统计每门课程的学生选修人数(超过10 人的课程才统计)。