SQL练习题
–部门表
dept部门表(deptno部门编号/dname部门名称/loc地点)
1 | create table dept (deptno numeric(2),dname varchar(14),loc varchar(13)); |
–工资等级表
salgrade工资等级表(grade 等级/losal此等级的最低/hisal此等级的最高)
1 | create table salgrade (grade numeric,losal numeric,hisal numeric); |
–员工表
emp员工表(empno员工号/ename员工姓名/job工作/mgr上级编号/hiredate受雇日期/sal薪金/comm佣金/deptno部门编号)
工资 = 薪金 + 佣金
1 | create table emp ( |
1.查询出部门编号为30的所有员工的编号和姓名
2.找出部门编号为10中所有经理,和部门编号为20中所有销售员的详细资料。
3.查询所有员工详细信息,用工资降序排序,如果工资相同使用入职日期升序排序
4.列出薪金大于1500的各种工作及从事此工作的员工人数。
5.列出在销售部工作的员工的姓名,假定不知道销售部的部门编号。
6.查询姓名以S开头的\以S结尾\包含S字符\第二个字母为L __
7.查询每种工作的最高工资、最低工资、人数
8.列出薪金 高于 公司平均薪金的所有员工号,员工姓名,所在部门名称,上级领导,工资,工资等级
9.列出薪金 高于 在部门30工作的 所有/任何一个员工的薪金的员工姓名和薪金、部门名称。
1 | mysql> use ruozedata |
一、查询出部门编号为30的所有员工的编号和姓名
1 | mysql> select empno,ename from emp where deptno = 30; |
二、找出部门编号为10中所有经理,和部门编号为20中所有销售员的详细资料。
1 | mysql> select * from emp where job = "MANAGER" and deptno = 10 union all select * from emp where job = "SALESMAN" and deptno = 20; |
三、查询所有员工详细信息,用工资降序排序,如果工资相同使用入职日期升序排序
1 | mysql> select * from emp order by sal desc, hiredate; |
四、列出薪金大于1500的各种工作及从事此工作的员工人数。
1 | mysql> select job,count(job) from emp where sal > 1500 group by job ; |
五、列出在销售部工作的员工的姓名,假定不知道销售部的部门编号。
1 | mysql> select ename from emp left join dept on emp.deptno = dept.deptno where dept.dname = "SALES"; |
六、查询姓名以S开头的\以S结尾\包含S字符\第二个字母为L
1 | mysql> select ename from emp where ename like "S%"; |
七、查询每种工作的最高工资、最低工资、人数
1 | mysql> select job,max(sal+ifnull(comm,0)) as sal_max,min(sal+ifnull(comm,0)) as sal_min,count(empno) as count from emp group by job; |
八、列出薪金 高于 公司平均薪金的所有员工号,员工姓名,所在部门名称,上级领导,工资,工资等级
找出平均薪金:
1
2
3
4
5
6
7
8mysql> select avg(sal+ifnull(comm,0)) from emp;
+-------------------------+
| avg(sal+ifnull(comm,0)) |
+-------------------------+
| 2230.357143 |
+-------------------------+
1 row in set (0.00 sec)薪金 高于 公司平均薪金的所有员工号,员工姓名,工资:
1
2
3
4
5
6
7
8
9
10
11
12
13mysql> select empno,ename,sal+ifnull(comm,0) as empsal from emp where sal+ifnull(comm,0) > (select avg(sal+ifnull(comm,0)) from emp);
+-------+--------+---------+
| empno | ename | empsal |
+-------+--------+---------+
| 7566 | JONES | 2975.00 |
| 7654 | MARTIN | 2650.00 |
| 7698 | BLAKE | 2850.00 |
| 7782 | CLARK | 2450.00 |
| 7788 | SCOTT | 3000.00 |
| 7839 | KING | 5000.00 |
| 7902 | FORD | 3000.00 |
+-------+--------+---------+
7 rows in set (0.00 sec)加上部门名称,工资等级
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20mysql> select
-> empno,ename,sal+ifnull(comm,0) as empsal,dname,grade
-> from emp left join dept
-> on emp.deptno = dept.deptno
-> left join salgrade
-> on sal+ifnull(comm,0) between losal and hisal
-> where
-> sal+ifnull(comm,0) > (select avg(sal+ifnull(comm,0)) from emp);
+-------+--------+---------+------------+-------+
| empno | ename | empsal | dname | grade |
+-------+--------+---------+------------+-------+
| 7782 | CLARK | 2450.00 | ACCOUNTING | 4 |
| 7566 | JONES | 2975.00 | RESEARCH | 4 |
| 7788 | SCOTT | 3000.00 | RESEARCH | 4 |
| 7902 | FORD | 3000.00 | RESEARCH | 4 |
| 7654 | MARTIN | 2650.00 | SALES | 4 |
| 7698 | BLAKE | 2850.00 | SALES | 4 |
| 7839 | KING | 5000.00 | ACCOUNTING | 5 |
+-------+--------+---------+------------+-------+
7 rows in set (0.00 sec)加上领导名称
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19mysql> select
-> e1.empno,e1.ename,e1.sal+ifnull(e1.comm,0) as empsal,dname,grade,e2.ename as mgrname
-> from emp e1
-> left join emp e2 on e1.mgr = e2.empno
-> left join dept on e1.deptno = dept.deptno
-> left join salgrade on e1.sal+ifnull(e1.comm,0) between losal and hisal
-> where e1.sal+ifnull(e1.comm,0) > (select avg(sal+ifnull(comm,0)) from emp);
+-------+--------+---------+------------+-------+---------+
| empno | ename | empsal | dname | grade | mgrname |
+-------+--------+---------+------------+-------+---------+
| 7782 | CLARK | 2450.00 | ACCOUNTING | 4 | KING |
| 7788 | SCOTT | 3000.00 | RESEARCH | 4 | JONES |
| 7902 | FORD | 3000.00 | RESEARCH | 4 | JONES |
| 7566 | JONES | 2975.00 | RESEARCH | 4 | KING |
| 7654 | MARTIN | 2650.00 | SALES | 4 | BLAKE |
| 7698 | BLAKE | 2850.00 | SALES | 4 | KING |
| 7839 | KING | 5000.00 | ACCOUNTING | 5 | NULL |
+-------+--------+---------+------------+-------+---------+
7 rows in set (0.00 sec)
九、列出薪金 高于 在部门30工作的 所有/任意一个员工的薪金的员工姓名和薪金、部门名称。
1 | mysql> select ename,sal+ifnull(comm,0) as empsal,dname from emp left join dept on emp.deptno = dept.deptno where sal+ifnull(comm,0) > ALL( select sal+ifnull(comm,0) from emp where deptno=30 ); |