SQL练习题

SQL练习题

–部门表
dept部门表(deptno部门编号/dname部门名称/loc地点)

1
2
3
4
5
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');

–工资等级表
salgrade工资等级表(grade 等级/losal此等级的最低/hisal此等级的最高)

1
2
3
4
5
6
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员工号/ename员工姓名/job工作/mgr上级编号/hiredate受雇日期/sal薪金/comm佣金/deptno部门编号)
工资 = 薪金 + 佣金

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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.查询出部门编号为30的所有员工的编号和姓名

2.找出部门编号为10中所有经理,和部门编号为20中所有销售员的详细资料。

3.查询所有员工详细信息,用工资降序排序,如果工资相同使用入职日期升序排序

4.列出薪金大于1500的各种工作及从事此工作的员工人数。

5.列出在销售部工作的员工的姓名,假定不知道销售部的部门编号。

6.查询姓名以S开头的\以S结尾\包含S字符\第二个字母为L __

7.查询每种工作的最高工资、最低工资、人数

8.列出薪金 高于 公司平均薪金的所有员工号,员工姓名,所在部门名称,上级领导,工资,工资等级

9.列出薪金 高于 在部门30工作的 所有/任何一个员工的薪金的员工姓名和薪金、部门名称。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
mysql> use ruozedata
Database changed
mysql> create table dept (
-> deptno numeric(2),
-> dname varchar(14),
-> loc varchar(13)
-> );
Query OK, 0 rows affected (0.02 sec)

mysql> insert into dept values (10, 'ACCOUNTING', 'NEW YORK');
Query OK, 1 row affected (0.02 sec)

mysql> insert into dept values (20, 'RESEARCH', 'DALLAS');
Query OK, 1 row affected (0.00 sec)

mysql> insert into dept values (30, 'SALES', 'CHICAGO');
Query OK, 1 row affected (0.00 sec)

mysql> insert into dept values (40, 'OPERATIONS', 'BOSTON');
Query OK, 1 row affected (0.00 sec)

mysql> create table salgrade (
-> grade numeric,
-> losal numeric,
-> hisal numeric
-> );
Query OK, 0 rows affected (0.02 sec)

mysql> insert into salgrade values (1, 700, 1200);
Query OK, 1 row affected (0.00 sec)

mysql> insert into salgrade values (2, 1201, 1400);
Query OK, 1 row affected (0.00 sec)

mysql> insert into salgrade values (3, 1401, 2000);
Query OK, 1 row affected (0.00 sec)

mysql> insert into salgrade values (4, 2001, 3000);
Query OK, 1 row affected (0.00 sec)

mysql> insert into salgrade values (5, 3001, 9999);
Query OK, 1 row affected (0.00 sec)

mysql> 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)
-> );
Query OK, 0 rows affected (0.02 sec)

mysql> insert into emp values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);
Query OK, 1 row affected (0.00 sec)

mysql> insert into emp values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);
Query OK, 1 row affected (0.00 sec)

mysql> insert into emp values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);
Query OK, 1 row affected (0.00 sec)

mysql> insert into emp values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);
Query OK, 1 row affected (0.00 sec)

mysql> insert into emp values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);
Query OK, 1 row affected (0.00 sec)

mysql> insert into emp values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);
Query OK, 1 row affected (0.00 sec)

mysql> insert into emp values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);
Query OK, 1 row affected (0.00 sec)

mysql> insert into emp values (7788, 'SCOTT', 'ANALYST', 7566, '1982-12-09', 3000, null, 20);
Query OK, 1 row affected (0.00 sec)

mysql> insert into emp values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);
Query OK, 1 row affected (0.00 sec)

mysql> insert into emp values (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30);
Query OK, 1 row affected (0.00 sec)

mysql> insert into emp values (7876, 'ADAMS', 'CLERK', 7788, '1983-01-12', 1100, null, 20);
Query OK, 1 row affected (0.00 sec)

mysql> insert into emp values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);
Query OK, 1 row affected (0.00 sec)

mysql> insert into emp values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);
Query OK, 1 row affected (0.00 sec)

mysql> insert into emp values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);
Query OK, 1 row affected (0.00 sec)

mysql> show tables;
+---------------------+
| Tables_in_ruozedata |
+---------------------+
| dept |
| emp |
| salgrade |
+---------------------+
3 rows in set (0.00 sec)

mysql> select * from dept;
+--------+------------+----------+
| deptno | dname | loc |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+
4 rows in set (0.00 sec)

mysql> select * from emp;
+-------+--------+-----------+------+---------------------+---------+---------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+-------+--------+-----------+------+---------------------+---------+---------+--------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00 | 800.00 | NULL | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 00:00:00 | 1600.00 | 300.00 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 00:00:00 | 1250.00 | 500.00 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 00:00:00 | 2975.00 | NULL | 20 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 00:00:00 | 2850.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 00:00:00 | 2450.00 | NULL | 10 |
| 7788 | SCOTT | ANALYST | 7566 | 1982-12-09 00:00:00 | 3000.00 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 00:00:00 | 1500.00 | 0.00 | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1983-01-12 00:00:00 | 1100.00 | NULL | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 00:00:00 | 950.00 | NULL | 30 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 00:00:00 | 3000.00 | NULL | 20 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 00:00:00 | 1300.00 | NULL | 10 |
+-------+--------+-----------+------+---------------------+---------+---------+--------+
14 rows in set (0.00 sec)

mysql> select * from salgrade;
+-------+-------+-------+
| grade | losal | hisal |
+-------+-------+-------+
| 1 | 700 | 1200 |
| 2 | 1201 | 1400 |
| 3 | 1401 | 2000 |
| 4 | 2001 | 3000 |
| 5 | 3001 | 9999 |
+-------+-------+-------+
5 rows in set (0.00 sec)

mysql>

一、查询出部门编号为30的所有员工的编号和姓名

1
2
3
4
5
6
7
8
9
10
11
12
mysql> select empno,ename from emp where deptno = 30;
+-------+--------+
| empno | ename |
+-------+--------+
| 7499 | ALLEN |
| 7521 | WARD |
| 7654 | MARTIN |
| 7698 | BLAKE |
| 7844 | TURNER |
| 7900 | JAMES |
+-------+--------+
6 rows in set (0.00 sec)

二、找出部门编号为10中所有经理,和部门编号为20中所有销售员的详细资料。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> select * from emp where job = "MANAGER" and deptno = 10 union all select * from emp where job = "SALESMAN" and deptno = 20;
+-------+-------+---------+------+---------------------+---------+------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+-------+-------+---------+------+---------------------+---------+------+--------+
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 00:00:00 | 2450.00 | NULL | 10 |
+-------+-------+---------+------+---------------------+---------+------+--------+
1 row in set (0.00 sec)

mysql> select * from emp where job = "MANAGER" and deptno = 10 or job = "SALESMAN" and deptno = 20;
+-------+-------+---------+------+---------------------+---------+------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+-------+-------+---------+------+---------------------+---------+------+--------+
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 00:00:00 | 2450.00 | NULL | 10 |
+-------+-------+---------+------+---------------------+---------+------+--------+
1 row in set (0.00 sec)

三、查询所有员工详细信息,用工资降序排序,如果工资相同使用入职日期升序排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> select * from emp order by sal desc, hiredate;
+-------+--------+-----------+------+---------------------+---------+---------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+-------+--------+-----------+------+---------------------+---------+---------+--------+
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 | NULL | 10 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 00:00:00 | 3000.00 | NULL | 20 |
| 7788 | SCOTT | ANALYST | 7566 | 1982-12-09 00:00:00 | 3000.00 | NULL | 20 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 00:00:00 | 2975.00 | NULL | 20 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 00:00:00 | 2850.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 00:00:00 | 2450.00 | NULL | 10 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 00:00:00 | 1600.00 | 300.00 | 30 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 00:00:00 | 1500.00 | 0.00 | 30 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 00:00:00 | 1300.00 | NULL | 10 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 00:00:00 | 1250.00 | 500.00 | 30 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1983-01-12 00:00:00 | 1100.00 | NULL | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 00:00:00 | 950.00 | NULL | 30 |
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00 | 800.00 | NULL | 20 |
+-------+--------+-----------+------+---------------------+---------+---------+--------+
14 rows in set (0.00 sec)

四、列出薪金大于1500的各种工作及从事此工作的员工人数。

1
2
3
4
5
6
7
8
9
10
mysql> select job,count(job) from emp where sal > 1500 group by job ;
+-----------+------------+
| job | count(job) |
+-----------+------------+
| ANALYST | 2 |
| MANAGER | 3 |
| PRESIDENT | 1 |
| SALESMAN | 1 |
+-----------+------------+
4 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
20
21
22
23
24
25
26
27
mysql> select ename from emp left join dept on emp.deptno = dept.deptno where dept.dname = "SALES";
+--------+
| ename |
+--------+
| ALLEN |
| WARD |
| MARTIN |
| BLAKE |
| TURNER |
| JAMES |
+--------+
6 rows in set (0.00 sec)

mysql> select ename from emp
-> where deptno=
-> (select deptno from dept where dname='SALES');
+--------+
| ename |
+--------+
| ALLEN |
| WARD |
| MARTIN |
| BLAKE |
| TURNER |
| JAMES |
+--------+
6 rows in set (0.00 sec)

六、查询姓名以S开头的\以S结尾\包含S字符\第二个字母为L

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
mysql> select ename from emp where ename like "S%";
+-------+
| ename |
+-------+
| SMITH |
| SCOTT |
+-------+
2 rows in set (0.00 sec)

mysql> select ename from emp where ename like "%S";
+-------+
| ename |
+-------+
| JONES |
| ADAMS |
| JAMES |
+-------+
3 rows in set (0.00 sec)

mysql> select ename from emp where ename like "%S%";
+-------+
| ename |
+-------+
| SMITH |
| JONES |
| SCOTT |
| ADAMS |
| JAMES |
+-------+
5 rows in set (0.00 sec)

mysql> select ename from emp where ename like "_L%";
+-------+
| ename |
+-------+
| ALLEN |
| BLAKE |
| CLARK |
+-------+
3 rows in set (0.00 sec)

七、查询每种工作的最高工资、最低工资、人数

1
2
3
4
5
6
7
8
9
10
11
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;
+-----------+---------+---------+-------+
| job | sal_max | sal_min | count |
+-----------+---------+---------+-------+
| ANALYST | 3000.00 | 3000.00 | 2 |
| CLERK | 1300.00 | 800.00 | 4 |
| MANAGER | 2975.00 | 2450.00 | 3 |
| PRESIDENT | 5000.00 | 5000.00 | 1 |
| SALESMAN | 2650.00 | 1500.00 | 4 |
+-----------+---------+---------+-------+
5 rows in set (0.00 sec)

八、列出薪金 高于 公司平均薪金的所有员工号,员工姓名,所在部门名称,上级领导,工资,工资等级

  1. 找出平均薪金:

    1
    2
    3
    4
    5
    6
    7
    8
    mysql> select avg(sal+ifnull(comm,0)) from emp;
    +-------------------------+
    | avg(sal+ifnull(comm,0)) |
    +-------------------------+
    | 2230.357143 |
    +-------------------------+
    1 row in set (0.00 sec)

  2. 薪金 高于 公司平均薪金的所有员工号,员工姓名,工资:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    mysql> 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)
  3. 加上部门名称,工资等级

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    mysql> 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)
  4. 加上领导名称

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    mysql> 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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 );
+-------+---------+------------+
| ename | empsal | dname |
+-------+---------+------------+
| KING | 5000.00 | ACCOUNTING |
| JONES | 2975.00 | RESEARCH |
| SCOTT | 3000.00 | RESEARCH |
| FORD | 3000.00 | RESEARCH |
+-------+---------+------------+
4 rows in set (0.00 sec)

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) > ANY( select sal+ifnull(comm,0) from emp where deptno==30 );
+--------+---------+------------+
| ename | empsal | dname |
+--------+---------+------------+
| CLARK | 2450.00 | ACCOUNTING |
| KING | 5000.00 | ACCOUNTING |
| MILLER | 1300.00 | ACCOUNTING |
| JONES | 2975.00 | RESEARCH |
| SCOTT | 3000.00 | RESEARCH |
| ADAMS | 1100.00 | RESEARCH |
| FORD | 3000.00 | RESEARCH |
| ALLEN | 1900.00 | SALES |
| WARD | 1750.00 | SALES |
| MARTIN | 2650.00 | SALES |
| BLAKE | 2850.00 | SALES |
| TURNER | 1500.00 | SALES |
+--------+---------+------------+
12 rows in set (0.00 sec)