有职员表 emp,表结构如表-1所示:
表-1 职员表emp 信息
emp 表中的示例数据如图-1所示:
图-1
有部门表 dept,表结构如表-2所示:
表-2 部门表 dept 信息
dept表中的示例数据如图-2所示:
图-2
需要完成如下查询:
1、查询职员表中,在20和30号部门工作的员工姓名和部门号。
2、查询职员表中,没有管理者的员工姓名及职位,并按职位排序。
3、查询职员表中,有绩效的员工姓名、薪资和绩效,并按工资倒序排列。
4、查询职员表中,员工姓名的第三个字母是A的员工姓名。
5、查询职员表中的职员名字、职位、薪资,并显示为如图-3所示效果:
图-3
提示:列之间用逗号连接,列头显示成OUT_PUT。
6、查询职员表中员工号、姓名、工资,以及工资提高百分之20%后的结果。
7、查询员工的姓名和工资,条件限定为:工资必须大于1200,并对查询结果按入职时间进行排列,早入职排在前面,晚入职排在后面。
8、查询ACCOUNT部门以外的其他部门的编号、名称以及所在地。
参考答案
各练习的参考答案如下所示:
1.
select ename, deptno from emp where deptno in (20, 30);
2.
select ename, job from emp where mgr is null order by job;
3.
select ename, sal, comm From emp where comm is not null order by sal desc;
4.
select ename from emp where ename like ‘__A%’;
5.
select ename || ', ' || job || ', ' || sal OUT_PUT from emp;
6.
select empno, ename, sal, sal * 1.2 salary from emp;
7.
select ename, sal from emp where sal > 1200 order by hiredate;
8.
select deptno, dname, loc from dept where dname <> 'ACCOUNT';
对于如前所示的职员表 emp,需要完成如下查询:
1、查询每个部门中每个职位的最高薪水。
2、有SQL语句如下所示:
SELECT a.ename, a.sal, a.deptno, b.maxsal FROM emp a, (SELECT deptno, max(sal) maxsal FROM emp GROUP BY deptno) b WHERE a.deptno = b.deptno AND a. sal < b.maxsal;
此 SQL 语句的功能是什么?写出其查询结果。
3、假设员工表中,员工和管理者中间只有一个层级,也就是说,每个员工最多只有一个上级,作为管理者的员工不再有上级管理者,并且,上级管理者相同的员工,他们属于同一个部门。找出EMP 中那些工资高于他们所在部门的管理者工资的员工。
4、找出EMP 中那些工资高于他们所在部门普通员工平均工资的员工。
参考答案
各练习的参考答案如下所示:
1.
select deptno, job, max(sal) from emp group by deptno, job;
2.本题的查询结果为:查询比本部门最高工资低的员工,查询结果中显示员工的部门名称、工资、部门编号以及员工对应部门的最高工资。查询结果如图-4所示。
图-4
3.
select * from emp e1,emp e2 where e1.mgr = e2.empno and e1.sal>e2.sal;
4.
select a.* from emp a,(select deptno,avg(sal) sal from emp group by deptno) b where a.deptno = b.deptno and a.sal>b.sal
1、下列 SQL语句出错的原因是()。
SELECT classid,AVG(MONTHS_BETWEEN(SYSDATE,entertime)) FROM student WHERE AVG( MONTHS_BETWEEN (SYSDATE, entertime))>12 GROUP BYclassid ORDER BY AVG(MONTHS_BETWEEN (SYSDATE, entertime));
A) select短语中不能出现组函数。
B) where短语中不能限制分组结果。
C) order by子句中不能包含组函数。
D) 组函数中不能包含单行函数。
2、有学员表Student,该表的结构如表-3所示:
表- 3 学员表 Student 信息
编写 SQL 语句,查询每班中每个科目的最高成绩。
3、针对表-3所示的 Student 表,执行下述SQL语句:
1) SELECT a.name, a.score, a.classid, b.avgscore 2) FROM studenta, 3) (SELECT classid, avg(score) avgscore 4) FROM student 5) GROUP BY classid)b 6) WHERE a.classid = b.classid 7) AND a.score> b. avgscore;
关于运行结果,下列描述正确的是()。
A) 第一行出现错误
B) 第三行出现错误
C) 第六行出现错误
D) 语句正常执行
参考答案
各个练习的参考答案如下:
1.B
2.
select classid, subject, max(score)from student group by classid, subject;
3.D
1、有职员表emp,若需列出所有薪水高于平均薪水值的员工信息,则有 SQL语句如下:
SELECT ename, job FROM emp WHERE sal > avg(sal);
上述语句是否正确?如果有错,写出正确的SQL语句。
2、有学员分数表,如图-5所示:
图-5
编写一条SQL 语句,查询出每门课都大于80 分的学生姓名。
3、有USERLIST 表如图-6所示:
图-6
有 CHAEGE 表如图-7所示:
图-7
请用最少的SQL 语句,产生如表-4所示的查询结果:
表-4 查询结果
其中,数据是经过USERLIST、CHAEGE 表进行合适的连接,并以ACCOUNT 字段为关键字分组求和得到。
特别注意:电话号码421004 在USERLIST 表中有一条记录,在CHARGE 表中并没有记录。但是,在查询结果中,合同CCCC 具有一条记录。
4、有两个表emp和taxgrade,其字段分别为:
emp(员工)表: empname,empno,sal
taxgrade(税别)表: taxmin,taxmax,grade
上述字段中,除字段empname外,其他字段均为数值类型。
emp 表的数据如表-5所示:
表-5 emp表示例数据
taxgrade 表的数据如表-6所示:
表-6 taxgrade表示例数据
编写SQL语句,查询编号为1的员工的税别。
5、有学员表 student,用于记录:学号,姓名,性别,年龄,组织部门;有课程表course,用于记录:课程编号,课程名称;还有选课表 sc,用于记录:学号,课程编号,成绩。三表的结构以及关联如图-8所示:
图-8
完成如下要求的 SQL 语句:
1)写一个SQL语句,查询选修了’计算机原理’的学生学号和姓名
2)写一个SQL语句,查询’周星驰’同学选修了的课程名字
6、有表test ,表结构如表-7所示:
表-7 test表
编写 SQL 语句,查询所有年龄比所属主管年龄大的人的ID和 NAME。
7、有表 city 记载城市信息,如表-8所示:
表-8 city表
有表 state,记载省份信息,如表-9所示:
表-9 state表
欲得到如表-10所示的查询结果:
表-10 查询结果
请编写相应的SQL语句。
参考答案
各个练习的参考答案如下:
1.上述语句错误,正确的应该是:
SELECT last_name, first_name FROM employee WHERE salary > (SELECT avg(salary) FROM emp);
2.
select * from stuscore where name not in (select distinct name from stuscore where fenshu < 80)
3.
select account, count(userlist.telephone),sum(rent), nvl(sum(fee01), 0), nvl(sum(fee02), 0), nvl(sum(fee03), 0), nvl(sum(fee04), 0) from userlist LEFT OUTER JOIN charge on charge.telephone=userlist.telephone group by account;
4.
Select e.empname, e.empno, e.sal, t.grade From emp e join taxgrade t on e.sal between t.taxmin and t.taxmax;
5.
1).
select s.name from student s join sc on s.id = sc.sid join course c on c.id = sc.cid where c.name = 'computer';
2).
select c.name from student s join sc on s.id = sc.sid join course c on c.id = sc.cid where s.name = ‘zhouxingchi';
6.
select employee.name from test employee where employee.age > (select manager.age from test manager where manager.id=employee.manager);
7.
select c.cityno, c.cityname, c.stateno, s.statename from city c left outer join state s on c.stateno=s.stateno order by(c.cityno);
有科目表,记载学员的学习科目数据,如表-11所示:
表-11 t_subject表(科目表)
有学员表,记载学员的信息,如表-12所示:
表-12 t_student表(学员表)
有考核规则表,记载考核规则,如表-13所示:
表-13 t_assess_rule表(考核规则表)
有学员成绩表,如表-14所示(注,各科的成绩计算方法根据考核规则中占有的比率计算):
表-14t_performance表(成绩表)
1、如何算出一班(class_id=1)每个学生各科的成绩?
2、请对一班(class_id=1)每个学生各科成绩的总分进行排序。
参考答案
首先创建表及插入测试数据。
创建表t_student以及插入数据的语句如下:
create table t_student( student_id number(1) primary key, class_id number(1), student_name char(20)); insert into t_student values(1,1,'刘一'); insert into t_student values(2,1,'陈二'); insert into t_student values(3,1,'张三'); insert into t_student values(4,1,'李四'); insert into t_student values(5,2,'王五'); insert into t_student values(6,2,'赵六');
创建表t_assess_rule以及插入数据的语句如下:
create table t_assess_rule( rule_id number(1) primary key, class_id number(1), assess_type char(20), scale number(2), desc1 char(20)); insert into t_assess_rule values(1,1,'test_score',70,'成绩(固定)'); insert into t_assess_rule values(2,1,'check_in',10,'考勤'); insert into t_assess_rule values(3,1,'task_scale',10,'作业完成率'); insert into t_assess_rule values(4,1,'task_score',10,'作业成绩'); insert into t_assess_rule values(5,2,'test_score',70,'成绩(固定)'); insert into t_assess_rule values(6,2,'check_in',15,'考勤'); insert into t_assess_rule values(7,2,'task_scale',15,'作业完成率');
创建表t_subject以及插入数据的语句如下:
create table t_subject( subject_id number(1) primary key, subject_name char(10) ); insert into t_subject values(1,'语文'); insert into t_subject values(2,'数学');
创建表t_performance以及插入数据的语句如下:
create table t_performance( performance_id number(2) primary key , student_id number(1), subject_id number(1), test_score number(3), check_in number(3), task_scale number(3), task_score number(3) ); insert into t_performance values(1,1,1,90,100,100,90); insert into t_performance values(2,1,2,67,100,100,78); insert into t_performance values(3,2,1,71,100,100,80); insert into t_performance values(4,2,2,100,100,100,95); insert into t_performance values(5,3,1,85,100,100,90); insert into t_performance values(6,3,2,88,100,100,90); insert into t_performance values(7,4,1,81,100,100,90); insert into t_performance values(8,4,2,78,100,100,88); insert into t_performance values(9,5,1,63,95,100,66); insert into t_performance values(10,5,2,87,95,100,90); insert into t_performance values(11,6,1,84,91,100,82); insert into t_performance values(12,6,2,72,91,100,70);
本题中两个问题的参考答案如下:
1.
select s.student_name, sub.subject_name, p.test_score from t_student s join t_performance p on s.student_id = p.student_id join t_subject sub on sub.subject_id = p.subject_id where s.class_id = 1;
2.
select s.student_name, sum(p.test_score) total_score from t_student s join t_performance p on s.student_id = p.student_id join t_subject sub on sub.subject_id = p.subject_id where s.class_id = 1 group by s.student_id, s.student_name order by total_score desc;