供廣大學習者參考的數據庫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;