生活不止眼前的苟且,還有詩和遠方。 請根據給出的資料庫表結構來回答相應問題: DEPT (DEPTNO INT, DNAME VARCHAR(14),LOC VARCHAR(13)); EMP (EMPNO INT,ENAME VARCHAR(10), JOB VARCHAR(9), MGR INT ...
生活不止眼前的苟且,還有詩和遠方。
請根據給出的資料庫表結構來回答相應問題:
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);
其中表中包含如下數據:
DEPT表:
EMP表:
SALGRADE表:
BONUS表: 無數據
根據上面描述完成下麵問題:
(註意:註意保存腳本,尤其是DDL和DML,以便進行數據還原)
DDL
1.寫出上述表的建表語句。此外,在DEPT上創建名為”PK_DEPT”的主鍵約束,在EMP表上創建名為” PK_EMP”的主鍵約束以及指向表DEPT的外鍵約束” FK_DEPTNO”。
命令:
create table DEPT (DEPTNO INT,
DNAME VARCHAR(14),
LOC VARCHAR(13),
constraint pk_dept primary key (DEPTNO));
create table EMP (EMPNO INT,
ENAME VARCHAR(10),
JOB VARCHAR(9),
MGR INT,
HIREDATE DATETIME,
SAL FLOAT,
COMM FLOAT,
DEPTNO INT,
constraint pk_emp primary key (EMPNO),
constraint fk_deptno foreign key (deptno) references dept(deptno));
create table BONUS(ENAME VARCHAR(10),
JOB VARCHAR(9),
SAL INT,
COMM INT);
create table SALGRADE ( GRADE INT,
LOSAL INT,
HISAL INT);
DML
2.給出相應的INSERT語句來完成題中給出數據的插入。
命令:
insert into dept values(10, 'accounting', 'New York');
insert into dept values(20, 'research', 'Dallas');
insert into dept values(30, 'sales', 'Chicago');
insert into dept values(40, 'operations', 'Boston');
insert into emp values(7369, 'SMITH', 'CLERK', 7902, '1980-12-17 0:00:00', 800, NULL, 20);
insert into emp values(7499, 'ALLEN', 'SALESMAN', 7698, '1981-2-20 0:00:00', 1600, 300, 30);
insert into emp values(7521, 'WARD', 'SALESMAN', 7698, '1981-2-22 0:00:00', 1250, 500, 30);
insert into emp values(7566, 'JONES', 'MANAGER', 7839, '1981-4-2 0:00:00', 2975, NULL, 20);
insert into emp values(7654, 'MARTIN', 'SALESMAN', 7698, '1981-9-28 0:00:00', 1250, 1400, 30);
insert into emp values(7698, 'BLAKE', 'MANAGER', 7839, '1981-5-1 0:00:00', 2850, NULL, 30);
insert into emp values(7782, 'CLARK', 'MANAGER', 7839, '1981-6-9 0:00:00', 2450, NULL, 10);
insert into emp values(7788, 'SCOTT', 'ANALYST', 7566, '1987-6-13 0:00:00', 3000, NULL, 20);
insert into emp values(7839, 'KING', 'PRESIDENT', NULL, '1981-11-17 0:00:00', 5000, NULL, 10);
insert into emp values(7844, 'TURN', 'SALESMAN', 7698, '1981-9-8 0:00:00', 1500, 0, 30);
insert into emp values(7876, 'ADAMS', 'CLERK', 7788, '1987-6-13 0:00:00', 1100, NULL, 20);
insert into emp values(7900, 'JAMES', 'CLERK', 7698, '1981-12-3 0:00:00', 950, NULL, 30);
insert into emp values(7934, 'MILLER', 'CLERK', 7782, '1982-1-23 0:00:00', 1300, NULL, 10);
INSERT INTO SALGRADE VALUES(1, 700, 1200);
INSERT INTO SALGRADE VALUES(2, 1201, 1400);
INSERT INTO SALGRADE VALUES(3, 1401, 2000);
INSERT INTO SALGRADE VALUES(4, 2001, 3000);
INSERT INTO SALGRADE VALUES(5, 3001, 9999);
3.將所有員工的工資上浮10%.然後查詢員工姓名、薪水、補助。(emp.sal為工資,emp.comm為補助)
命令:
UPDATE EMP SET SAL = SAL + SAL * 0.1;
SELECT ENAME, SAL, COMM FROM EMP;
結果:
單表查詢
4.查看EMP表中部門號為10的員工的姓名,職位,參加工作時間,工資。
命令:
SELECT ENAME, JOB, HIREDATE, SAL FROM EMP WHERE DEPTNO = 10;
結果:
5.查所有已有的職位,要求去除重覆項。
命令:
SELECT DISTINCT JOB FROM EMP;
結果:
6.計算每個員工的年薪,並取列名為Salary of Year(emp.sal為員工的月薪),要求輸出員工姓名,年薪。
命令:
SELECT ENAME ename, SAL*12 'Salary Of Year' FROM EMP;
結果:
7.查詢每個員工每個月拿到的總金額(emp.sal為工資,emp.comm為補助)。(提示:isnull(ex1,ex2)表示如果ex1為空則返回ex2)
命令:
SELECT ENAME ename, isnull(comm, 0)+ sal total FROM EMP;
結果:
8.顯示職位是主管(manager)的員工的姓名,工資。
命令:
SELECT ENAME, SAL FROM EMP WHERE JOB = 'MANAGER';
結果:
9.顯示第3個字元為大寫O的所有員工的姓名及工資。
命令:
SELECT ENAME, SAL FROM EMP WHERE ENAME like '__O%';
結果:
10.顯示職位為銷售員(SALESMAN)或主管(MANAGER)的員工的姓名,工資,職位。
命令:
select ename, sal, job from emp where job = 'SALESMAN' or job = 'MANAGER';
結果:
11.顯示所有沒有補助的員工的姓名。
命令:
select ename from emp where comm is null;
結果:
12.顯示有補助的員工的姓名,工資,補助。
命令:
select ename, sal, comm from emp where comm is not null;
結果:
13.排序顯示所有員工的姓名,工資(按工資降序方式)。
命令:
select ename, sal from emp order by sal desc;
結果:
14.顯示員工的最高工資和最低工資。
命令:
select max(sal) 最高工資, min(sal) 最低工資from emp;
結果:
15.顯示所有員工的平均工資和總計工資。
命令:
select avg(sal) 平均工資, sum(sal) 總計工資from emp;
結果:
16.顯示補助在員工中的發放比例、即有多少比例的員工有補助。(此題需註意兩個問題:1.select語句中進行除法如何保留小數點後數據。2.count函數如何處理null型數據。)
命令:
select count(comm) * 1.0 / count(ename) from emp;
結果:
聚合查詢
17.顯示每種職業的平均工資。
命令:
select job, avg(sal) average from emp group by job;
結果:
18.顯示每個部門每種崗位的平均工資和最高工資。
命令:
select deptno, job, avg(sal) average, max(sal) max from emp group by deptno, job;
結果:
19.顯示平均工資低於2500的部門號,平均工資及最高工資。
命令:
select deptno, avg(sal) average, max(sal) max from emp group by deptno having avg(sal) < 2500;
結果:
20.上一條語句以平均工資升序排序。
命令:
select deptno, avg(sal) average, max(sal) max from emp group by deptno having avg(sal) < 2500 order by avg(sal) asc;
結果:
多表查詢
21.顯示工資高於2500或崗位為MANAGER的所有員工的姓名,工資,職位,和部門號。
命令:select ename, sal, job, deptno from emp where sal > 2500 or job = 'MANAGER';
結果:
22.排序顯示所有員工的姓名,部門號,工資(以部門號升序,工資降序,雇用日期升序顯示)。
命令:select ename, deptno, sal from emp order by deptno asc, sal desc, hiredate asc;
結果:
23.採用自然連接的原理顯示部門名以及相應的員工姓名。(Sql server不支持NATURAL JOIN語法。)
命令:select dname, ename from emp, dept where emp.deptno = dept.deptno;
結果:
24.查詢SCOTT的上級領導的姓名。
命令:select leader.ename from emp, emp leader where emp.ename = 'SCOTT' and emp.mgr = leader.empno;
結果:
25.顯示部門的部門名稱,員工名即使部門沒有員工也顯示部門名稱。
命令:select dname, ename from dept left join emp on dept.deptno = emp.deptno;
結果:
子查詢
26.顯示所有員工的名稱、工資以及工資級別。
命令:select ename, sal, grade from emp, salgrade where emp.sal between salgrade.losal and salgrade.hisal;
結果:
27.顯示ACCOUNTING部門所有員工的名稱,工資。
命令:select ename, sal from emp, dept where emp.deptno = dept.deptno and dept.dname = 'ACCOUNTING';
結果:
28.顯示職位屬於10號部門所提供職位範圍的員工的姓名,職位,工資,部門號。
命令:select ename, job, sal, deptno from emp where job in (select job from emp where deptno = 10);
結果:
29.顯示在所有員工用中高於30號部門中任一個員工工資的員工的姓名,工資和部門號。
命令:select ename, sal, deptno from emp where sal > all (select sal from emp where deptno = 30);
結果:
集合查詢
30.顯示工資高於2500或職位為MANAGER的員工的姓名,工資和職位(採用UNION語法實現)。
命令:select ename, sal, job from emp where sal > 2500
union
select ename, sal, job from emp where job = 'MANAGER';
結果:
31.顯示工資高於2500且職位為MANAGER的員工的姓名,工資和職位(採用INTERSECT語法實現)。
命令:select ename, sal, job from emp where sal > 2500
intersect
select ename, sal, job from emp where job = 'MANAGER';
結果:
32.顯示工資高於2500但職位不是MANAGER的員工的姓名,工資和職位(採用MINUS語法實現)。
命令:select ename, sal, job from emp where sal > 2500
EXCEPT
select ename, sal, job from emp where job = 'MANAGER';
結果: