1、习题1请根据给出的数据库表结构来回答相应问题:DEPT (DEPTNO INT, DNAME VARCHAR(14),LOC VARCHAR(13);EMP (EMPNO INT,ENAME VARCHAR(10), JOB VARCHAR(9), MGR INT, HIREDATE DATE,SAL FLOAT, COMM FLOAT, DEPTNO INT);BONUS (ENAME VARCHAR(10), JOB VARCHAR(9), SAL INT, COMM INT);SALGRADE ( GRADE INT, LOSAL INT, HISAL INT);其中表中包含如下数据:D
2、EPT表:EMP表:SALGRADE表:BONUS表: 无数据根据上面描述完成下面问题:( 注意 :注意保存脚本,尤其是DDL和DML,以便进行数据还原)DDL1. 写出上述表的建表语句。此外,在DEPT上创建名为”PK_DEPT”的主键约束,在EMP表上创建名为” PK_EMP”的主键约束以及指向表DEPT的外键约束” FK_DEPTNO”。命令:create table DEPT(DEPTNO int ,DNAME nvarchar,LOC nvarchar,primary key(pk_dept);Create table EMP(EMPNO int ,ENAME nvarchar, J
3、OB nvarchar, MGR int,HIREDATE datetime,SAL int ,COMM float, DEPTNO int,primary key (pk_emp),foregin key(fk_deptno)references dept);DML2. 给出相应的INSERT语句来完成题中给出数据的插入。命令:insert(“1”,”accounting”,”null”)3. 将所有员工的工资上浮10%.然后查询员工姓名、薪水、补助。(emp.sal为工资,m为补助)命令:select ename,sal*1.1,commFrom emp结果:单表查询4. 查看EMP表中部
4、门号为10的员工的姓名,职位,参加工作时间,工资。命令:select ename,job,hiredate,salFrom empWhere emp.depyno=10 结果:5. 查所有已有的职位,要求去除重复项。命令: select distinct jobFrom emp结果:6. 计算每个员工的年薪,并取列名为Salary of Year(emp.sal为员工的月薪),要求输出员工姓名,年薪。命令:select ename, sal*12 as salary of yearFrom emp结果:7. 查询每个员工每个月拿到的总金额(emp.sal为工资,m为补助)。(提示:isnull
5、(ex1,ex2)表示如果ex1为空则返回ex2)命令:select ename, isnull(sal+comm,sal) as totalFrom emp结果:8. 显示职位是主管(manager)的员工的姓名,工资。命令:select ename,salFrom empWhere emp.job=manager结果:9. 显示第3个字符为大写O的所有员工的姓名及工资。命令:select enmae ,salFrom empWhere emp.ename like _O%结果:10.显示职位为销售员(SALESMAN)或主管(MANAGER)的员工的姓名,工资,职位。命令:selecte
6、ename,sal,jobFrom empWhere emp.job=salesman or manager结果:11.显示所有没有补助的员工的姓名。命令:select enameFrom empWhere m is null结果:12.显示有补助的员工的姓名,工资,补助。命令:select ename,sal,commFrom empWhere m is not null结果: 13.排序显示所有员工的姓名,工资(按工资降序方式)。命令:select ename,salFrom empOrder by emp.sal desc结果:14.显示员工的最高工资和最低工资。命令:select ma
7、x(sal) as 最高工资,min(sal) as 最低工资From emp结果:15.显示所有员工的平均工资和总计工资。命令:select avg(sal) as 平均工资,sum(sal) as 总计工资From emp结果:16.显示补助在员工中的发放比例、即有多少比例的员工有补助。(此题需注意两个问题:1.select语句中进行除法如何保留小数点后数据。2.count函数如何处理null型数据。)命令:select cast(cast(count(comm)as float)/cast(count(*)as float)as numeric(13,12)from emp结果:聚合查询
8、17.显示每种职业的平均工资。命令:select job,avg(sal) as averageFrom empGroup by emp.job结果:18.显示每个部门每种岗位的平均工资和最高工资。命令:select deptno,job,avg(sal) as average,max(sal) as maxFrom empGroup by deptno,job结果:19.显示平均工资低于2500的部门号,平均)工资及最高工资。命令:select deptno,avg(sal) as average,max(sal) as maxFrom empGroup by deptno having a
9、vg(sal)2500 or emp.job=manager结果: 22.排序显示所有员工的姓名,部门号,工资(以部门号升序,工资降序,雇用日期升序显示)。命令:select ename,deptno,sal,hiredateFrom empOrder by deptno asc,sal desc,hiredate asc 结果:23.采用自然连接原理显示部门名以及相应的员工姓名。(Sql server不支持NATURAL JOIN语法。)命令:select dname,enameFrom emp,deptwhere dept.deptno=emp.noorder by dname/ sele
10、ct dname,enameFrom emp join dept on emp.deptno=dept.deptno结果:24.查询SCOTT的上级领导的姓名。命令:select enameFrom emp where empno=(select mrg from emp where ename=scott)/select a.enamefrom emp a join emp b on a.empno=b.mrg and b.ename=scott/select b.ename from emp a join emp b on a.deptno=b.deptno where a.ename=scott and b.job=manager结果:25.显示部门的部门名称,员工名即使部门没有员工也显示部门名称。