数据库SQL作业记录

供广大学习者参考的数据库SQL作业

这套查询作业题是基于scott库中的emp, dept, salegrade表来进行的.
请在数据库中执行scott.sql生成所需的三个表。

雇员表:记录了一个雇员的基本信息

mysql> desc emp;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| empno    | int(4)      | NO   | PRI | NULL    |       |
| ename    | varchar(20) | YES  |     | NULL    |       |
| job      | varchar(9)  | YES  |     | NULL    |       |
| mgr      | int(4)      | YES  |     | NULL    |       |
| hiredate | date        | YES  |     | NULL    |       |
| sal      | double(7,2) | YES  |     | NULL    |       |
| comm     | double(7,2) | YES  |     | NULL    |       |
| deptno   | int(2)      | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
8 rows in set (0.01 sec)

在这里插入图片描述
表中的数据
在这里插入图片描述

部门表:表示一个部门的具体信息

mysql> desc dept;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| deptno | int(2)      | NO   | PRI | NULL    |       |
| dname  | varchar(14) | YES  |     | NULL    |       |
| loc    | varchar(13) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

在这里插入图片描述
表中的数据
在这里插入图片描述

一个公司是有等级制度,用此表表示一个工资的等级

mysql> desc salgrade;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| grade | int(11) | YES  |     | NULL    |       |
| losal | int(11) | YES  |     | NULL    |       |
| hisal | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
3 rows in set (0.01 sec)

在这里插入图片描述
表中的数据
在这里插入图片描述

表关系分析

雇员表emp

  • 可以通过雇员领导编号mgr形成自连接
  • 可以通过部门编号deptno与部门表dept形成连接
  • 属性薪资sal的值是属于工资等级表salgrade的薪资区间

作业

下面是查询作业题:
1、查询,显示所有员工姓名,部门编号,部门名称

1. select emp.deptno, dname from emp, dept where emp.deptno = dept.deptno;

2、写一个查询,显示所有工作在CHICAGO并且奖金不会空的员工姓名,工作地点,奖金

2. select ename, loc, sal from emp, dept where emp.deptno = dept.deptno and loc = 'CHICAGO' and comm is not null;

3、写一个查询,显示所有姓名中含有A字符的员工姓名,工作地点

3. select loc, ename from emp, dept where emp.deptno = dept.deptno and ename like '%A%';

4、查询每个员工的编号,姓名,工资,工资等级,所在工作城市,按照工资等级进行升序排序

4. select ename, empno, sal, grade, loc from emp, dept, salgrade where emp.deptno = dept.deptno and sal between losal and hisal order by grade asc;

5、查询所有工作在new york和chicago的员工姓名,员工编号,以及他们的经理姓名,经理编号

5. select a.ename, a.empno, b.ename, b.empno from emp a, emp b, dept d where a.mgr = b.empno and a.deptno = d.deptno and d.loc in ('CHICAGA', 'NEW YORK');

6、查询员工SMITH的姓名,部门名称,直接上级名称

6. select a.ename, b.ename, d.dname from emp a, emp b, dept d where a.deptno = d.deptno and a.mgr = b.empno and a.ename = 'SMITH';

7、查询员工姓名,部门名称,工资,工资级别,要求工资级别大于四级

7. select a.ename, d.dname, a.sal, b.grade from emp a, dept d, salgrade b where a.sal between b.losal and b.hisal and b.grade > 4;

8、显示员工KING和FORD管理的员工姓名及其经理姓名

8. select a.ename, b.ename from emp a, emp b where a.mgr = b.empno and b.ename in ('KING', 'FORD');

9、显示员工姓名,参加工作时间,经理名,参加工作时间,要求参加工作时间比经理早

9. select a.ename, a.hiredate, b.ename, b.hiredate from emp a, emp b where a.mgr = b.empno and a.hiredate < b.hiredate;

10、查询部门人数大于2的部门编号,部门名称,部门人数

10.select d.deptno, d.dname, count(d.deptno) from dept d, emp a where a.deptno = d.deptno group by deptno having count(a.ename) > 2;

11、查询部门平均工资大于2000,且人数大于2的部门编号,部门名称,部门人数,部门平均工资,并按照部门人数升序排列

11. select d.deptno, d.dname, count(d.deptno), avg(a.sal) from emp a, dept d where a.deptno = d.deptno group by d.deptno, a.ename having count(a.deptno) > 2 and avg(a.sal) > 2000 order by count(a.deptno) asc;

12、查询部门20的员工,每个月的工资总和及平均工资

12. select sum(a.sal), avg(a.sal) from emp a where a.deptno = 20;

13、查询工作在CHICAGO的员工人数,最高工资及最低工资

13. select count(d.deptno), max(a.sal), min(a.sal) from emp a, dept d where a.deptno = d.deptno and d.loc = 'CHICAGO';

14、查询员工表中一共有几种岗位类型

14. select count(distinct job) from emp; 

15、查询每个部门的部门编号,部门名称,部门人数,最高工资,最低工资,工资总和,平均工资

15. select d.deptno, d.dname, count(d.deptno), max(a.sal), min(a.sal), sum(a.sal), avg(a.sal) from emp a, dept d where a.deptno = d.deptno group by d.deptno;

16、查询每个部门,每个岗位的部门编号,部门名称,岗位名称,部门人数,最高工资,最低工资,工资总和,平均工资

16. select d.deptno, d.dname, a.job, count(d.deptno), max(a.sal), min(a.sal), sum(a.sal), avg(a.sal) from emp a, dept d where a.deptno = d.deptno group by d.deptno, a.job;

17、查询每个经理管理的人数,经理编号,经理姓名,要求包括没有经理的人员信息

17. select count(b.mgr), b.empno, b.ename from emp a left join emp b on a.mgr = b.empno group by b.empno;

18、查询部门平均工资在2500以上的部门名称及平均工资

18. select d.dname, avg(a.sal) from emp a, dept d where a.deptno = d.deptno group by d.deptno having avg(a.sal) > 2500;

19、查询员工岗位中不是以"SA"开头并且平均工资在2500元以上的岗位及平均工资,并按平均工资降序排序

19. select a.job, avg(a.sal) from emp a where a.ename not like 'SA%' group by a.job having avg(a.sal) > 2500 order by avg(a.sal) desc;

20、查询部门人数在2人以上的部门名称,最低工资,最高工资,并对求得的工资进行四舍五入到整数位

20. select d.dname, round(max(a.sal), 0), round(min(a.sal), 0) from emp a, dept d where a.deptno = d.deptno group by d.deptno having count(d.deptno) > 2;

21、查询岗位不是SALESMAN,工资和大于等于2500的岗位及每种岗位的工资和

21. select a.job, sum(a.sal) from emp a group by a.job having sum(a.sal) > 2500 and a.job not in ('SALESMAN'); 

22、写一个查询,显示每个部门最高工资和最低工资的差额

22. select max(sal) - min(sal) from emp group by deptno;

资料

再附上一些简单的常用SQL命令

查询
select column_name from table_name;
select * from table_name;
select distinct column_name from table_name;
select column_name from table_name where 条件;

排序
SELECT column_name,column_name 
FROM table_name 
ORDER BY column_name,column_name ASC|DESC;

插入
第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:
INSERT INTO table_name
VALUES (value1,value2,value3,...);
第二种形式需要指定列名及被插入的值:
INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);

更新
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;

删除
DELETE FROM table_name
WHERE some_column=some_value;

MySQL 支持 LIMIT 语句来选取指定的条数数据,
SELECT column_name(s)
FROM table_name
LIMIT number;

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern;
eg.select * from table where name like '%ab%'

SQL 通配符用于搜索表中的数据。
这两种与LIKE连用
% 代替0个或多个字符
- 代替一个字符
这两种通常与REGEXP连用
[char] 字符列中的任何单一字符
[^char] 不在字符列中的任何单一字符

IN 操作符允许您在 WHERE 子句中规定多个值。
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...);
IN可以规定多个值,等于规定一个值

BETWEEN 操作符用于选取介于两个值之间的数据范围内的值。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;
请注意,在不同的数据库中,BETWEEN 操作符会产生不同的结果!

列的SQL别名语法
SELECT column_name AS alias_name
FROM table_name;
表的SQL别名语法
SELECT column_name(s)
FROM table_name AS alias_name;

GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。
SQL GROUP BY 语法
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

HAVING 子句
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。

HAVING 子句可以让我们筛选分组后的各组数据。

SQL HAVING 语法
SQL HAVING 语法
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章