第2章 编写简单的查询语句
1.使用两种方式查询所有员工(EMP)信息。2.查询(EMP)员工编号、员工姓名、员工职位、员工月薪、工作部门编号。
1.员工转正后,月薪上调20%,请查询出所有员工转正后的月薪。
2.员工试用期6个月,转正后月薪上调20%,请查询出所有员工工作第一年的年薪所得(不考虑奖金部分,年薪的试用期6个月的月薪+转正后6个月的月薪)
1.员工试用期6个月,转正后月薪上调20%,请查询出所有员工工作一年的所有收入(需考虑奖金部分),要求显示列标题为员工姓名,工资收入,奖金收入,总收入。
1.员工试用期6个月,转正后月薪上调20%,请查询出所有员工工作第一年的所有收入(需考虑奖金部分),要求显示格式为:XXX的第一年总收入为XXX。
2.查询员工表中一共有哪几种岗位类型。
1.分别选择员工表、部门表、薪资等级表中的所有数据
2.分别查看员工表、部门表、薪资等级表结构。
第3章 限制数据和对数据排序
1.查询职位为SALESMAN的员工编号、职位、入职日期。2.查询1985年12月31日之前入职的员工姓名及入职日期。
3.查询部门标号不在10部门的员工姓名、部门编号。
1.查询入职日期造82年至85年员工姓名,入职日期。
2.查询月薪在3000到5000的员工姓名,月薪。
3.查询部门编号为10或者20的员工姓名,部门编号。
4.查询经理编号为7709,7566,7788的员工姓名,经理编号。
1.查询员工姓名以W开头的员工姓名。
2.查询员工姓名倒数第2个字符为T的员工姓名。
3.查询奖金为空的员工姓名,奖金。
1.查询工资超过2000并且职位是WANAGER,或者职位是SALESMAN的员工姓名、职位、工资。
2 .查询工资超过2000并且职位是WANAGER或SALESMAN的员工姓名、职位、工资。
3.查询部门在10或者20,并且工资在3000到5000之间的员工姓名、部门、工资。
4.查询入职日期在81年,并且职位不是SALES开头的员工姓名、入职日期、职位。
5.查询职位为SALESMAN或MANAGER,部门编号为10或者20,姓名包含A的员工姓名、职位、部门编号。
1.查询部门在20或30的员工姓名,部门编号,并按照工资升序排序。
2.查询工资在2000-3000之间,部门不在10号的员工姓名,部门编号,工资,并按照部门升序,工资降序排序。
3.查询入职日期在82年至83年之间,职位以SALES或者MAN开头的员工姓名,入职日期,职位,并按照入职日期降序排序。
1.查询入职时间在1982-7-9之后,并且不从事SALESMAN工作的员工姓名、入职时间、职位。
2.查询员工姓名的第三个字母是a的员工姓名。
3.查询除了10、20号部门以外的员工姓名、部门编号。
4.查询部门号为30号员工的信息,先按工资降序排序,再按姓名升序排序。
5.查询没有上级的员工(经理号为空)的员工姓名。
6.查询工资大于等于4500并且部门为10或者20的员工的姓名,工资,部门编号。
第4章 单行函数
1.写一个查询,用首字母大写,其他字母小写显示雇员的ename,显示名字的长度,并给每列一个适当的标签,条件是满足所有雇员名字的开始字母是J、A或M的雇员,并对查询结果按雇员的ename升序排序。(提示:使用initcap、length、substr)1.查询员工姓名中包含大写或小写字母A的员工姓名。
2.查询部门编号为10或20,入职日期在81年5月1日之后,并且姓名中包含大写字母A的员工姓名,员工姓名长度。(提示:要求使用INSTR函数)
3.查询每个职工的编号,姓名,工资
-要求将查询到的数据按照一定的格式合并成一个字符串
-前10位:编号,不足部分用 填充,左对齐
-中间10位:姓名,不足部分用 填充,左对齐
-后10位:工资,不足部分用*填充,右对齐
1.写一个查询,分别计算100.456四舍五入到小数点后第2位,第1位,整数位的值。
2.写一个查询,分别计算100.456从小数点后第2位,第1位,整数位截断的值。
1.查询每个员工截止到现在一共入职多少天?
2.当前日期为2015年,指定日期格式DD-MON-RR,指定日期为01-1月-01,该日期实际所代表的日期为?
4.当前日期为1998年,指定日期格式DD-MON-RR,指定日期为01-1月-01,该日期实际所代表的日期为?
5.当前日期为1998年,指定日期格式DD-MON-RR,指定日期为01-1月-95,该日期实际所代表的日期为?
6.当前日期为1998年,指定日期格式DD-MON-YY,指定日期为01-1月-01,该日期实际所代表的日期为?
7.当前日期为1998年,指定日期格式DD-MON-YY,指定日期为01-1月-95,该日期实际所代表的日期为?
2.查询部门10,20的员工截止到2000年1月1日,工作了多少个月,入职的月份。(使用months_between, extract)
3.如果员工使用期6个月,查询职位不是MANAGER员工姓名,入职日期,转正日期,入职日期后的第一个星期一,入职当前月的最后一天日期。(使用add_months, next_day, last_day)
1.显示服务器系统当前时间,格式为2007-10-12 17:11:11。(用to_char函数)
2.显示ename,hiredate和雇员开始工作日是星期几,列标签DAY。(用to_char函数)
3.查询员工姓名,工资,格式化的工资(¥999,999.99)。(用to_char函数)
4.把字符串2015-3月-18 13:13:13转换成日期格式,并计算和系统当前时间间隔多少天。(用to_char函数)
1.计算2000年1月1日到现在又多少月,多少周(四舍五入)。
2.查询员工ename的第三个字母是A的员工信息(使用两个函数)。
3.使用trim函数将字符串‘hello’,‘Hello’,‘bllb’,‘hello’分别处理得以下字符串ello、Hello、ll、hello。
4.将员工工资按如下格式显示:123,234.00 RMB。
5.查询员工的姓名及其经理编号,要求对于没有经理的显示“No Manager”字符串。
6.将员工的参加工作日期按照如此啊格式显示:月份/年份
7.在员工表中查询除员工的工资,并计算应交税款:如果工资小于1000,税率为0,如果工资大于等于1000并小于2000,税率为10%,如果工资大于等于2000并小于3000,税率为15%,如果工资大于等于3000,税率为20%。
8.创建一个查询显示所有雇员的ename和sal。格式化sal围殴15个字符长度,用$左填充,列标签SALARY。
第5章 多表连接
1.写一个查询,显示所有员工姓名,部门编号,部门姓名。2.写一个查询,显示所有工作在CHICAGO并且奖金不为空的员工姓名,工作地点,奖金。
3.写一个查询,显示所有姓名中含有A字符的员工姓名,工作地点。
1.查询每个员工的编号,姓名,工资,工资等级,所在工作城市,按照工资等级进行升序排序。
1.查询所有工作在NEW YORK和CHICAGO的员工姓名,员工编号,以及他们的经理姓名,经理编号。
2.在上一题的基础上,添加没有经理的员工King,并按照员工编号排序。
3.查询所有员工编号,姓名,部门名称,包括没有部门的员工也要显示出来。
使用SQL-99写法,完成如下练习
1.创建一个员工表和部门表的交叉连接。
2.使用自然连接,显示入职日期在80年5月1日之后的员工姓名,部门名称,入职日期。
3.使用USING子句,显示工作在CHICAGO的员工姓名,部门名称,工作地点。
4.使用ON子句,显示工作在CHICAGO的员工姓名,本门名称,工作地点,薪资等级。
5.使用左连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来。
6.使用右外连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来。
1.显示员工SMITH的姓名,部门名称,直接上级名称。
2.显示员工姓名,部门名称,工资,工资级别,要求工资级别大于4级。
3.显示员工KING和FORD管理的员工姓名及其经理姓名。
4.显示员工姓名,参加工作时间,经理名,参加工作时间,要求参加时间比经理早。
第6章 分组函数
1.查询部门20的员工,每月的工资总和及平均工资。2.查询工作在CHICAGO的员工人数,最高工资及最低工资。
3.查询员工表中一共有几种岗位类型。
1.查询每个部门的部门编号,部门名称,部门人数,最高工资,最低工资,工资总和,平均工资。
2.查询每个部门,每个岗位的部门编号,部门名称,岗位名称,部门人数,最高工资,最低工资,工资总和,平均工资。
3.查询每个经理所管理的人数,经理编号,经理姓名,要求包括没有经理的人员信息。
1.查询部门人数大于2的部门编号,部门名称,部门人数。
2.查询部门平均工资大于2000,且人数大于2的部门编号,部门名称,部门人数,
部门平均工资,并按照部门人数升序排序。
1.查询部门平均工资在2500元以上的部门名称及平均工资。
2.查询员工岗位中不是以“SA”开头并且平均工资在2500员以上的岗位及平均工资,并按平均工资降序排序。
3.查询部门人数在2人以上的部门名称,最低工资,最高工资,并对要求的工资进行四舍五入到整数位。
4.查询岗位不为SALESMSMAN,工资和大于等于2500的岗位及每种岗位的工资和。
5.显示经理编号和经理姓名,这个经理所管理员工的最低工资,没有经理的KING也要显示,不包括最低工资小于3000的,按最低工资由高到低排序。
6.写一个查询,显示每个部门最高工资和最低工资的差额。
第7章 子查询
1.查询入职日期最早的员工姓名,入职日期。2.查询工资比SMITH工资高并且工作地点在CHICAGO的员工姓名,工资,部门名称。
3.查询入职日期比20部门入职日期最早的员工还早的员工姓名,入职日期。
4.查询部门人数大于所有部门平均人数的部门编号,部门名称,部门人数。
1.查询入职日期比10部门任意一个员工晚的员工姓名,入职日期,不包括10部门员工。
2.查询入职日期比10部门所有员工晚的员工姓名,入职日期,不包括10部门员工。
3.查询职位和10部门人员一个员工职位相同的员工姓名,职位,不包括10部门员工。
1.查询职位及经理和10部门任意一个员工职位及经理相同的员工姓名,职位,不包括10部门员工。
2.查询职位及经理和10部门任意一个员工职位或经理相同的员工姓名,职位,不包括10部门员工。
1.查询比自己职位平均工资高的员姓名,职位,部门名称,职位平均工资。
2.查询职位和经理同员工SCOTT或BLAKE完全相同的员工姓名,职位,不包括SCOTT和BLAKE本人。
3.查询不是经理的员工姓名。
1.查询入职日期最早的前5名员姓名,入职日期。
2.查询工作在CHICAGO并且入职日期最早的前2名员工姓名,入职日期。
1.按照每页显示5条记录,分别查询第1页,第2页,第3页信息,要求显示员工姓名,入职日期,部门名称。
1.按照每页显示5条记录,分别查询工资最高的第1页,第2页,第3页信息,要求显示员工姓名,入职日期,部门名称,工资。
1.查询工资高于编号为7782的员工工资,并且和7369号员工从事相同工作的员工的编号,姓名及工资。
2.查询工资最高的员工姓名和工资。
4.查询员工工资为其部门最低工资的员工的编号和姓名及工资。
5.显示经理是KING的员工姓名,工资。
6.显示比员工SMITH参加工作时间晚的员工姓名,工资,参加工作时间。
7.使用子查询的方式查询哪些职员在NEW YORK工作。
8.写一个查询显示和员工SMITH工作在同一个部门的员工姓名,雇用日期,查询结果中排除SMITH。
9.写一个查询显示其工资比全体职员平均工资高的员工编号、姓名。
10.写一个查询显示其上级领导是King的员工姓名、工资。
11.显示所有工作在RESEARCH部门的员工姓名,职位。
12.查询每个部门的部门编号、平均工资,要求部门的平均工资高于部门20的平均工资。
13.查询大于自己部门平均工资的员工姓名,工资,所在部门平均工资,高于部门平均工资的额度。
14.列出至少有一个雇员的所有部门。
15.列出薪金比"SMITH"多的所有雇员。
16.列出入职日期早于其直接上级的所有雇员。
17.找员工姓名和直接上级的名字。
18.显示部门名称和人数。
19.显示每个部门的最高工资的员工。
20.显示出和员工号7369部门相同的员工姓名,工资。
21.显示出和姓名中包含"W"的员工相同部门的员工姓名。
22.显示出工资大于平均工资的员工姓名,工资。
23.显示出工资大于本部门平均工资的员工姓名,工资。
24.显示每位经理管理员工的最低工资,及最低工资者的姓名。
25.显示比工资最高的员工参加工作时间晚的员工姓名,参加工作时间
26.显示出平均工资最高的的部门平均工资及部门名称
第8章 集合运算
1.分别使用联合运算及完全联合运算完成,按照时间升序顺序,查询员工7839的工作岗位列表。2.使用多表连接,查询每个部门的部门编号,部门人数,没有人数的部门显示0。
3.使用联合运算,查询每个部门的部门编号,部门人数,没有人数的部门显示0。
4.使用联合运算,查询10号部门及20号部门的员工姓名,部门编号。
部门 工作地点 员工姓名 入职日期
10 NEW YORK
10 CLARK 1981/6/9
10 KING 1981/11/17
10 MILLER 1982/1/23
20 DALLAS
20 ADAMS 1987/5/23
20 FORD 1981/12/3
20 JONES 1981/4/2
20 SCOTT 1987/4/19
20 SMITH 1980/12/17
30 CHICAGO
30 ALLEN 1981/2/20
30 BLAKE 1981/5/1
30 JAMES 1981/12/3
30 MARTIN 1981/9/28
30 TURNER 1981/9/8
30 WARD 1981/2/22
40 BOSTON
1.用集合运算,列出不包含job为SALESMAN的部门的部门号。
2.写一个联合查询,列出下面的信息:
EMP表中所有雇员的名字和部门编号,不管他们是否属于任何部门。
DEPT表中的所有部门编号和部门名称,不管他们是否有员工。
3.用集合运算查询出职位为SALESMAN和部门编号为10的
人员编号、姓名、职位,不排除重复结果。
4.用集合查询出部门为10和20的所有人员编号、姓名、所在部门名称。
第9章 高级子查询
如下练习,使用相关子查询完成1.查询比所在职位平均工资高的员工姓名,职位
2.查询工资为其部门最低工资的员工编号,姓名 ,工资。
如下练习,用相关子查询完成
1.查询所有雇员编号,名字和部门名字。
2.查询哪些员工是经理?
3.查询哪些员工不是经理?
4.查询每个部门工资最低的两个员工编号,姓名,工资。
如下练习,用exists或not exists完成
1.列出至少有一个雇员的所有部门名称。
2.列出一个雇员都没有的所有部门名称。
课后作业 :
如下练习,使用相关子查询完成。
1.查询薪水多于他所在部门平均薪水的雇员名字 ,部门号。
2.查询员工姓名和直接上级的名字。
3.查询每个部门工资最高的员工姓名,工资。
4.查询每个部门工资前两名高的员工姓名,工资。
第10章 层次查询
1.产生一个报告显示 BLAKE的所有下级(包括直接和间接下级)雇员的名字、薪水和部门号。2.创建一个报告显示对于雇员 SMITH 经理的层次,包括级别和姓名,首先显示他的直接经理。
3.创建一个缩进报告显示经理层次,从名字为 KING的雇员开始,显示雇员的名字、经理ID和部门ID。
4.产生一个公司组织图表显示经理层次。从最顶级的人开始,排除所有job为CLERK的人,还要排除FORD和那些对FORD报告的雇员。
第11章 数据操作与事务控制
1.向部门表新增一个部门,部门编号为50,部门名称为HR,工作地点为SY。2.向部门表新增一个部门,部门编号为60,部门名称为MARKET。
1.向员工表中新增一个员工,员工编号为8888,姓名为BOB,岗位为CLERK,经理为号7788,入职日期为1985-03-03,薪资3000,奖金和部门为空。
1.使用CREATE TABLE emp_back as
SELECT * FROM EMP WHERE 1=0,创建 emp_back表,拷贝下来即可。
CREATE TABLE emp_back
SELECT *
FROM EMP
WHERE 1=0;
2.把emp表中入职日期大于1982年1月1日之前的员 工信息复制到emp_back表中。
INSERT INTO emp_back
SELECT *
FROM emp
WHERE hiredate>='01-1月-82';
1.修改部门20的员工信息,把82年之后入职的员工入职日期向后调整10天
2.修改奖金为null的员工,奖金设置为0
3.修改工作地点在NEW YORK或CHICAGO的员工工资,工资增加500
1.重复做一下刚才的案例。
1.删除经理编号为7566的员工记录
2.删除工作在NEW YORK的员工记录
3.删除工资大于所在部门平均工资的员工记录
分析如下语句序列,哪些语句会结束事务?
1.test表为空表,分析如下语句操作后,最后test表的状态。
1.使用如下语句,创建学生表student和班级表class
create table student ( --学生表
xh char(4),--学号
xm varchar2(10),--姓名
sex char(2),--性别
birthday date,--出生日期
sal number(7,2), --奖学金
studentcid number(2) --学生班级号
Create table class ( --班级表
classid number(2), --班级编号
cname varchar2(20),--班级名称
ccount number(3) --班级人数
2.基于上述学生表和班级表,完成如下问题
(1)添加三个班级信息为:1,JAVA1班,null
2,JAVA2班,null
3,JAVA3班,null
(2)添加学生信息如下:‘A001’,‘张三’,‘男’,‘01-5月05’,100,1
(3)添加学生信息如下:'A002','MIKE','男','1905-05-06',10
(4)插入部分学生信息: 'A003','JOHN','女’
(5)将A001学生性别修改为'女‘
(6)将A001学生信息修改如下:性别为男,生日设置为1980-04-01
(7)将生日为空的学生班级修改为Java3班
(8)请使用一条SQL语句,使用子查询,更新班级表中每个班级的人数
3.使用如下语句,建立以下表
CREATE TABLE copy_emp (
empno number(4),
ename varchar2(20),
hiredate date default sysdate ,
deptno number(2),
sal number(8,2))
4.在第三题表的基础上,完成下列问题
(1)在表copy_emp中插入数据,要求sal字段插入空值,部门号50
,参加工作时间为2000年1月1日,其他字段随意
(2)在表copy_emp中插入数据,要求把emp表中部门号为10号部门
的员工信息插入
(3)修改copy_emp表中数据,要求10号部门所有员工涨20%的工资
(4)修改copy_emp表中sal为空的记录,工资修改为平均工资
(5)把工资为平均工资的员工,工资修改为空
(6)另外打开窗口2查看以上修改
(7)执行commit,窗口2中再次查看以上信息
(8)删除工资为空的员工信息
(9)执行rollback
第13章 创建和维护表
1.学校想做一个选课系统,其中涉及到课程表,学生表,请分别创建这两个表,自己思考表中应有的列及数据类型。1.通过子查询的方式创建一个表dept10,该表保存10号部门的员工数据。
1.在员工表中添加一个性别列,列名为gender,类型为char(2),默认值为“男”
2.修改员工表中性别列的数据类型为char(4)
3.修改员工表中性别列的默认值为“女”
4.删除员工表中的性别列
1.请分析按照以下要求都需要建立什么类型的字段?
–(1)最大2000个字节定长字符串
–(2)如果输入‘张三’ 后添空格6个
–(3)性别输入'男'或'女’
–(4)最大4000个字节变长字符串
–(5)如果在数据库中输入'张三'则显示数据'张三’
–(6)表示数字范围为- 10的125次方到10的126次方, 可
以表示小数 也可以表示整数
–(7)最大表示4位整数 -9999 到 9999
–(8)表示5位有效数字 2位小数的 一个小数 -999.99
到 999.99
–(9)包含年月日和时分秒
–(10)包含年月日和时分秒毫秒
–(11)二进制大对象图像/声音
2.创建表date_test,包含列d,类型为date型。试向
date_test表中插入两条记录,一条当前系统日期记录,一
条记录为“1998-08-18”。
• 3.创建与dept表相同表结构的表dtest,将dept表中部门编
号在40之前的信息插入该表。
• 3.创建与emp表结构相同的表empl,并将其部门编号为前30
号的员工信息复制到empl表。
• 4.试为学生表student增加一列学生性别gender 默认值
• 5.试修改学生姓名列数据类型为定长字符型10位。
第14章 约束
1.学校有一个选课系统,其中包括如下关系模式:系(系编号: 主键,
系名称: 唯一键,
系主任: 非空约束,
系所在校去:取值范围只能在南湖校区和浑南校区)
班级(班级编号: 主键,
班级名称: 唯一键,
所属系: 外键)
2.创建学生表,包含如下属性:
学号 定长字符型 10位 主键
姓名 变长字符型 20位 非空
性别 定长字符型 2位 取值范围只能为男或女
出生日期 日期型
1.简述5种约束的含义。
2.创建学生关系sc,包括属性名:
– 选课流水号 数值型 主键;
– 学生编号 非空 外键
– 课程编号 非空 外键;
– 成绩 0-100之间;
3.创建copy_emp,要求格式同emp表完全一样,不包含数据。
4.创建copy_dept,要求格式同dept表完全一样,不包含数据。
5.设置copy_emp 表中外键deptno,参照copy_dept中deptno,语句能否成功,为什么?
6.追加copy_dept表中主键deptno
第15章 视图
1.创建一个视图,通过该视图可以查询到工资在2000-5000内并且姓名中包含有A的员工编号,姓名,工资。2.通过上述创建的视图查询数据
1.创建一个视图,通过该视图可以查询到工作在NEW YORK和CHICAGO的员工编号,姓名,部门编号,入职日期。
2.创建一个视图,通过该视图可以查询到每个部门的部门名称及最低工资。
3.通过如上视图,查询每个部门工资最低的员工姓名及部门名称
• 1.创建视图v_emp_20,包含20号部门的员工编号,姓名,
年薪列(年薪=12*(工资+奖金);
• 2.从视图v_emp_20中查询年薪大于1万元员工的信息;
• 3.请为工资大于2000的员工创建视图,要求显示员工的部
门信息,职位信息,工作地点;
• 4.针对以上视图执行insert,update,delete,语句能否成
功,为什么
第16章 序列、索引、同义词
1.创建一个序列,该序列起始值从1开始,无最大值,增量是1,不循环。
2.查询序列的当前值及下一个值
3.使用第1题所建的序列,向部门表中插入两条记录,部门编号使用序列值,部门名称分别为:Education、Market,城市分别为:DALLAS、WASHTON
1.使用子查询的方式,创建test表。
2.快速复制test表中的数据,复制到100w条左右
3.更新test表中的empno字段为rownum
4.查询test中empno为800000的记录值,记录查询执行时间。
5.在test表的empno字段上创建索引
6.重新执行第4题,对比查询时间
1.有如下关系模式,
student(sno,sname,gender,birthday,email);--学生
course(cno,cname,type,credit);--课程
sc(sno,cno,grade);--选课
试分析哪些列上适合创建索引?
1.创建序列,起始位1,自增为1,最小值为1,最大值为9999
• 2.创建序列,起始值为50,每次增加5;
• 3.在表copy_dept中插入记录,其中部门号码采用上一步中创建的序列
• 4.请为工资创建索引,比较<10000,>1000,与round(sal)>10000,哪
个索引有效,哪个索引无效;
• 5.创建表,采用“create table copy_emp_index as select * from
emp”,生成500万条数据,把其中的“员工号”字段修改为唯一;