以下面三個(gè)表為例:
create database jepsondb;? ? ?/*新建數(shù)據(jù)庫(kù)*/
grant all privileges on jepsondb.* to jepsonuser@'%' identified by '123456';? ?
?/*賦予所有權(quán)限給新建的用戶jepsonuser,密碼是123456*/
flush privileges;? ? /*刷新權(quán)限*/
一、部門(mén)表:dept部門(mén)表(deptno部門(mén)編號(hào)/dname部門(mén)名稱/loc地點(diǎn))
create table dept (
? ? deptno numeric(2),
? ? dname varchar(14),
? ? ?loc varchar(13)
? ? );
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');
二、工資等級(jí)表:salgrade工資等級(jí)表(grade 等級(jí)/losal此等級(jí)的最低/hisal此等級(jí)的最高)
create table salgrade (
? ? grade numeric,
? ? losal numeric,
? ? hisal numeric
);
? 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);
三、員工表:emp員工表(empno員工號(hào)/ename員工姓名/job工作/mgr上級(jí)編號(hào)/hiredate受雇日期/sal薪金/comm傭金/deptno部門(mén)編號(hào))
工資 = 薪金 + 傭金
? create table emp (
? ? empno numeric(4) not null,
? ? ename varchar(10),
? ? job varchar(9),
? ? mgr numeric(4),
? ? hiredate datetime,
? ? sal numeric(7, 2),
? ? comm numeric(7, 2),
? ? deptno numeric(2)
);
? insert into emp values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);
insert into emp values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);
insert into emp values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);
insert into emp values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);
insert into emp values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);
insert into emp values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);
insert into emp values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);
insert into emp values (7788, 'SCOTT', 'ANALYST', 7566, '1982-12-09', 3000, null, 20);
insert into emp values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);
insert into emp values (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30);
insert into emp values (7876, 'ADAMS', 'CLERK', 7788, '1983-01-12', 1100, null, 20);
insert into emp values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);
insert into emp values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);
insert into emp values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);
1. 查詢出部門(mén)編號(hào)為30的所有員工的編號(hào)和姓名
? select empno,ename from emp where deptno=30;
2.找出部門(mén)編號(hào)為10中所有經(jīng)理,和部門(mén)編號(hào)為20中所有銷(xiāo)售員的詳細(xì)資料。
? select * from emp where job='MANAGER' and deptno=10 union all
? select * from emp where job='SALESMAN' and deptno=20;
3.查詢所有員工詳細(xì)信息,用工資降序排序,如果工資相同使用入職日期升序排序
? select * from emp order by (sal+ifnull(comm,0)) desc,hiredate asc;
4.列出薪金大于1500的各種工作及從事此工作的員工人數(shù)。
? select job,count(*) from emp where sal>1500 group by job;
5.列出在銷(xiāo)售部工作的員工的姓名,假定不知道銷(xiāo)售部的部門(mén)編號(hào)。
? select ename from emp where deptno=(select deptno from dept where dname='SALES');
6.查詢姓名以S開(kāi)頭的\以S結(jié)尾\包含S字符\第二個(gè)字母為L(zhǎng)? __
? select ename from emp where ename like 'S%' or ename like '%S' or ename like '%S%' or ename like '_L%';
7.查詢每種工作的最高工資、最低工資、人數(shù)
? select job, max(sal), min(sal), count(1) from emp group by job;
8.列出薪金 高于 公司平均薪金的所有員工號(hào),員工姓名,所在部門(mén)名稱,上級(jí)領(lǐng)導(dǎo),工資,工資等級(jí)
解:
①首先查出平均薪金:
? select avg(sal) from emp;? ?
②其次查出員工表emp(同時(shí)命名為e1)的員工號(hào)、員工姓名,并根據(jù)員工號(hào)deptno匹配在部門(mén)表dept(同時(shí)命名d)查出員工所在部門(mén):
? select e1.deptno,e1.ename,d.dname from emp e1?
? left join dept d on e1.deptno=d.deptno;
③接著由于上級(jí)領(lǐng)導(dǎo)也在員工表內(nèi),所以需要員工表自己與自己連接,可以看成是兩張相同的表(e1,e2)做連接,先查出自己(e1表)的上級(jí)編號(hào)mgr,再與e2匹配,所得就是上級(jí)領(lǐng)導(dǎo)命名為leader:
? ? select e1.deptno,e1.ename,d.dname,e2.ename as leader
? ? from emp e1
? ? left join dept d on e1.deptno=d.deptno
? ? left join emp e2 on e1.mgr=e2.empno;
④然后通過(guò)e1的工資wage:e1.sal+ifnull(e1.comm,0)與工資表salgrade(命名成s)連接,并用between...and...判斷工資等級(jí):
? select e1.deptno,e1.ename,d.dname,e2.ename as leader,s.grade,(e1.sal+ifnull(e1.comm,0)) as wage
? from emp e1
? left join dept d on e1.deptno=d.deptno
? left join emp e2 on e1.mgr=e2.empno
? left join salgrade s on (e1.sal+ifnull(e1.comm,0)) between s.losal and s.hisal;
⑤最后再根據(jù)①的條件得到最終結(jié)果:
? select e1.deptno,e1.ename,d.dname,e2.ename as leader,s.grade,(e1.sal+ifnull(e1.comm,0)) as wage
? from emp e1
? left join dept d on e1.deptno=d.deptno
? left join emp e2 on e1.mgr=e2.empno
? left join salgrade s on (e1.sal+ifnull(e1.comm,0)) between s.losal and s.hisal
? where e1.sal > (select avg(sal) from emp);
9.列出薪金? 高于? 在部門(mén)30工作的? 所有/任何一個(gè)員工的薪金的員工姓名和薪金、部門(mén)名稱。
解法一:
①首先查出在部門(mén)30工作的任何一個(gè)員工的最高薪金:
? select max(sal) from emp where deptno=30;
②然后查出滿足高于在部門(mén)30工作的薪資的所有員工姓名和薪金:
? select e.ename,e.sal
? from emp e
? where e.sal > (select max(sal) from emp where deptno=30);
③最后通過(guò)部門(mén)編號(hào)與部門(mén)表連接查出部門(mén)名稱:
? select e.ename,e.sal,d.dname
? from emp e
? left join dept d on e.deptno=d.deptno
? where e.sal > (select max(sal) from emp where deptno=30);
解法二:
? select e.ename,e.sal,d.dname from emp e, dept d
? where e.deptno=d.deptno and sal > all(select sal from emp where deptno=30);