數據庫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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章