實驗報告
課程名稱:數據庫原理及應用
實驗項目名稱:數據查詢與更新
實驗時間:2021年4月12日
實 驗 目 的:
(1) 觀察查詢結果, 體會SELECT語句實際應用;
(2) 要求能夠在查詢分析器中使用SELECT語句進行簡單查詢。
(3) 熟練掌握簡單表的數據查詢、數據排序和數據連接查詢的操作方法。
(4) 熟悉使用UPDATE/INSERT/DELETE/ALTER語句進行表操作;
實 驗 環 境:
MySQL 5.7.33、SQLyog-11.2.4
實 驗 內 容 及 過 程:
在實驗2的基礎上,完成以下題目
1. 在查詢分析器中用SQL語句完成以下題目
單表查詢
-
找出所有供應商的姓名和所在城市。
SELECT SNAME,CITY FROM S
-
找出所有零件的名稱、顏色、重量。
SELECT PNAME,COLOR,WEIGHT FROM P
-
找出使用供應商S1所供應零件的工程號碼。
SELECT JNO FROM SPJ WHERE SNO='S1'
-
列出所有地址在北京的供應商姓名。
SELECT SNAME FROM S WHERE CITY='北京'
-
模糊查詢,找出名字包含"螺絲"兩個字且顏色為紅色的零件名稱。
SELECT PNAME FROM P WHERE PNAME LIKE '螺絲_' AND COLOR='紅'
-
統計不同城市工程項目的數量,結果顯示"城市"、"工程項目數合計"。
SELECT CITY,COUNT(JNO) AS '工程項目書合計' FROM J GROUP BY CITY
連接查詢和嵌套查詢
-
找出工程項目J2使用的各種零件的名稱及其數量。
SELECT PNAME,QTY FROM P,SPJ WHERE P.PNO=SPJ.PNO AND JNO='J2'
-
找出上海廠商供應的所有零件號碼(要求用自然連接和嵌套查詢兩種方法)。
#自然連接 SELECT P.PNO FROM S,P,SPJ WHERE P.PNO=SPJ.PNO AND S.SNO=SPJ.SNO AND S.CITY='上海' GROUP BY PNO #嵌套查詢 SELECT PNO FROM P WHERE PNO IN( SELECT PNO FROM SPJ WHERE SNO IN( SELECT SNO FROM S WHERE CITY='上海' ) )
-
找出所有由上海供應商提供零件的工程名稱(要求用自然連接和嵌套查詢兩種方法)。
#自然連接 SELECT JNAME FROM S,J,SPJ WHERE S.SNO=SPJ.SNO AND J.JNO=SPJ.JNO AND S.CITY='上海' GROUP BY JNAME #嵌套查詢 SELECT JNAME FROM J WHERE JNO IN( SELECT JNO FROM SPJ WHERE SNO IN( SELECT SNO FROM S WHERE CITY='上海' ) )
-
統計不同地區供應商所供應的零件總數量,結果顯示供應商地區、零件總量。
SELECT CITY AS '供應商地區',SUM(QTY) AS '零件總量' FROM S,SPJ WHERE S.SNO=SPJ.SNO GROUP BY CITY
-
分類統計供應商"盛錫",不同零件的供應量,結果顯示零件名稱、零件數量。
SELECT PNAME AS '零件名稱', SUM(QTY) AS '零件數量' FROM S,P,SPJ WHERE P.PNO=SPJ.PNO AND S.SNO=SPJ.SNO AND S.SNAME='盛錫' GROUP BY PNAME
-
找出沒有使用天津產的零件的工程號碼。
SELECT JNO FROM J WHERE JNO NOT IN( SELECT JNO FROM SPJ WHERE SNO IN( SELECT SNO FROM S WHERE CITY='天津' ) )
-
查詢至少用了供應商S1提供的全部零件的工程號JNO。
SELECT JNO FROM J WHERE JNO IN( SELECT JNO FROM SPJ WHERE SNO='S1' )
-
將S、SPJ表進行左外連接,查詢結果中帶有null值的表示什么含義?
-
將SPJ、P表進行右外連接,查詢結果中帶有null值的表示什么含義?
數據更新
-
把全部紅色零件的顏色改成藍色。
UPDATE P SET COLOR='藍' WHERE COLOR='紅'
-
由S5供給J4的零件P6改為由S3供應。
UPDATE SPJ SET SNO='S3' WHERE SNO='S5' AND JNO='J4' AND PNO='P6'
-
從供應商關系中刪除供應商號是S2的記錄,並從供應情況關系中刪除相應的記錄。
DELETE FROM SPJ WHERE SNO='S2'
-
請將(S1,J6,P4,200)插入供應情況關系。
INSERT INTO SPJ(SNO,JNO,PNO,QTY) VALUES('S1','J6','P4','200')
-
為S表添加供應商,供應商編號:S6,供應商名稱:偉星,城市:北京,狀態暫未定。
INSERT INTO S(SNO,SNAME,CITY,STATUS) VALUES('S6','偉星','北京',NULL)
-
為P表添加零件,零件編號:P7,零件名稱:凹輪,顏色:藍,重量:20。
INSERT INTO P VALUES('P7','凹輪','藍',20)
-
在P表中加入屬性零件產地CITY(CHAR型)。
ALTER TABLE P ADD CITY CHAR
-
將P表中加入屬性WEIGHT改為SMALLINT型。
ALTER TABLE P MODIFY WEIGHT SMALLINT
-
刪除剛才在P表中加入的零件產地CITY屬性。
ALTER TABLE P DROP COLUMN CITY
2. 選做題
-
導入myemployees庫,右鍵root@localhost,點擊執行SQL腳本,選擇myemployees.sql路徑,點擊執行,myemployees庫導入完成。
-
myemployees庫中四張表介紹
employees 員工表
字段名 數據類型 約束 含義 employee_id int primary key 員工編號 first_name varchar(20) 名 last_name varchar(25) 姓 email varchar(25) 郵箱 phone_number varchar(20) 電話號碼 job_id varchar(10) 工種編號 salary double(10,2) 月薪 commission_pct double(4,2) 獎金率 manager_id int foreign key 上級領導的員工編號 department_id int foreign key 部門編號 hiredate datetime 入職日期 departments 部門表
字段名 數據類型 約束 含義 department_id int primary key 部門編號 department_name varchar(3) 部門名稱 manager_id int 部門領導的員工編號 location_id int foreign key 位置編號 jobs 工種表
字段名 數據類型 約束 含義 job_id varchar(10) primary key 工種編號 job_title varchar(35) 工種名稱 min_salary int 最低工資 max_salary int 最高工資 locations 位置表
字段名 數據類型 約束 含義 location_id int primary key 位置編號 street_address varchar(40) 街道 postal_code varchar(12) 郵編 city varchar(30) 城市 state_province varchar(25) 州/省 country_id varchar(2) 國家編號 -
練習題
(1)查詢員工表中涉及到的所有的部門編號
(2)查詢工資>12000的員工信息
(3)查詢部門編號不是在90到110之間,或者工資高於15000的員工信息
(4)查詢員工名中第三個字符為n,第五個字符為l的員工名和工資(員工名為last_name)
(5)查詢員工名中第二個字符為_的員工名
(6)查詢員工的工種編號是 IT_PROG、AD_VP、AD_PRES中的一個員工名和工種編號
(7)查詢有獎金的員工名和獎金率
(8)選擇工資不在8000到17000的員工的姓名和工資,按工資降序
(9)查詢郵箱中包含e的員工信息,並先按郵箱的字節數降序(LENGTH(str)求字符長度),再按部門號升序
(10)查詢部門編號為90的員工個數,工資的最大值,最小值,平均值
(11)查詢每個工種的員工平均工資
(12)查詢有獎金的每個領導手下員工的平均工資
(13)查詢哪個部門的員工個數 >5
(14)每個工種有獎金的員工的最高工資 >12000的工種編號和最高工資
(15)每個工種有獎金的員工的最高工資 >6000的工種編號和最高工資,按最高工資升序
(16)查詢員工名、部門名 (需實現兩種連接方式:普通連接、內連接)
(17)查詢部門個數 >3的城市名和部門個數,(添加分組+篩選)
(18)查詢哪個部門的員工個數 >3的部門名和員工個數,並按個數降序(添加排序)
(19)查詢員工的名字、上級的名字
(20)查詢哪個部門沒有員工(左外)
(21)有獎金的員工信息,並且工資較高的前10名顯示出來
(22)返回公司工資最少的員工的last_name,job_id和salary
(23)返回job_id與141號員工相同,salary比143號員工多的員工 姓名,job_id和工資
(24)返回其它工種中比job_id為'IT_PROG'工種任一工資低的員工的員工號、姓名、job_id以及salary
(25)返回其它部門中比job_id為'IT_PROG'部門所有工資都低的員工的員工號、姓名、job_id 以及salary
(26)查詢有員工的部門名(使用EXISTS)
(27)查詢各部門中工資比本部門平均工資高的員工的員工號, 姓名和工資
(28)查詢平均工資最高的 job 信息(用到LIMIT)
(29)查詢平均工資高於公司平均工資的部門有哪些?
(30)查詢平均工資最低的部門信息
參考代碼:
#(1)查詢員工表中涉及到的所有的部門編號 SELECT DISTINCT department_id FROM employees #(2)查詢工資>12000的員工信息 SELECT * FROM `employees` WHERE salary > 12000 #(3)查詢部門編號不是在90到110之間,或者工資高於15000的員工信息 SELECT * FROM employees WHERE NOT (department_id >= 90 AND department_id <= 110) OR salary > 15000 #(4)查詢員工名中第三個字符為n,第五個字符為l的員工名和工資(員工名為last_name) SELECT `last_name`,`salary` FROM employees WHERE `last_name` LIKE "__n_l%"; #(5)查詢員工名中第二個字符為_的員工名 SELECT `last_name` FROM employees WHERE `last_name` LIKE "_\_%"; #(6)查詢員工的工種編號是 IT_PROG、AD_VP、AD_PRES中的一個員工名和工種編號 SELECT * FROM `employees` WHERE `job_id` IN ('IT_PROG','AD_VP','AD_PRES'); #(7)查詢有獎金的員工名和獎金率 SELECT `last_name`,`commission_pct` FROM `employees` WHERE `commission_pct` IS NOT NULL #(8)選擇工資不在8000到17000的員工的姓名和工資,按工資降序 SELECT last_name,salary FROM employees WHERE salary NOT BETWEEN 8000 AND 17000 ORDER BY salary DESC; #(9)查詢郵箱中包含e的員工信息,並先按郵箱的字節數降序(LENGTH(str)求字符長度),再按部門號升序 SELECT * FROM employees WHERE email LIKE '%e%' ORDER BY LENGTH(email) DESC,department_id ASC; #(10)查詢部門編號為90的員工個數,工資的最大值,最小值,平均值 SELECT COUNT(*),MAX(salary),MIN(salary),AVG(salary),SUM(salary) FROM employees WHERE department_id = 90 #(11)查詢每個工種的員工平均工資 SELECT job_id, AVG(salary) FROM employees GROUP BY job_id #(12)查詢有獎金的每個領導手下員工的平均工資 SELECT AVG(salary), manager_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY manager_id #(13)查詢哪個部門的員工個數>5 SELECT COUNT(*), department_id FROM employees GROUP BY department_id HAVING COUNT(*) > 5 #(14)每個工種有獎金的員工的最高工資>12000的工種編號和最高工資 SELECT MAX(salary), job_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING MAX(salary) > 12000 #(15)每個工種有獎金的員工的最高工資>6000的工種編號和最高工資,按最高工資升序 SELECT job_id, MAX(salary) FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING MAX(salary) > 6000 ORDER BY MAX(salary) ASC #(16)查詢員工名、部門名 (需實現兩種連接方式:普通連接、內連接) SELECT last_name,department_name FROM employees e INNER JOIN departments d ON e.department_id=d.department_id #(17)查詢部門個數>3的城市名和部門個數,(添加分組+篩選) SELECT city,COUNT(*) 部門個數 FROM departments d INNER JOIN locations l ON d.`location_id`=l.`location_id` GROUP BY city HAVING 部門個數>3 #(18)查詢哪個部門的員工個數>3的部門名和員工個數,並按個數降序(添加排序) SELECT department_name,COUNT(*) 員工個數 FROM departments d INNER JOIN employees e ON d.`department_id`=e.`department_id` GROUP BY d.`department_id` HAVING 員工個數>3 ORDER BY 員工個數 DESC #(19)查詢員工的名字、上級的名字 SELECT e.last_name,m.last_name FROM employees e JOIN employees m ON e.manager_id = m.employee_id #(20)查詢哪個部門沒有員工(左外) SELECT DISTINCT(department_name) FROM departments d LEFT JOIN employees e ON d.`department_id`=e.`department_id` WHERE e.`employee_id` IS NULL; #(21)有獎金的員工信息,並且工資較高的前10名顯示出來 SELECT * FROM employees WHERE `commission_pct` IS NOT NULL ORDER BY `salary` DESC LIMIT 10 #(22)返回公司工資最少的員工的last_name,job_id和salary SELECT last_name,job_id,salary FROM employees WHERE salary=( SELECT MIN(salary) FROM employees ) #(23)返回job_id與141號員工相同,salary比143號員工多的員工 姓名,job_id 和工資 SELECT last_name,job_id,salary FROM employees WHERE job_id=( SELECT job_id FROM employees WHERE employee_id=141 ) AND salary>( SELECT salary FROM employees WHERE employee_id=143 ) #(24)返回其它工種中比job_id為‘IT_PROG’工種任一工資低的員工的員工號、姓名、job_id 以及salary SELECT last_name,employee_id,job_id,salary FROM employees WHERE salary<ANY( SELECT DISTINCT salary FROM employees WHERE job_id = 'IT_PROG' ) AND job_id<>'IT_PROG' #(25)返回其它部門中比job_id為‘IT_PROG’部門所有工資都低的員工 的員工號、姓名、job_id 以及salary SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary < ALL( SELECT salary FROM employees WHERE job_id = 'IT_PROG' ) AND job_id <> 'IT_PROG' #(26)查詢有員工的部門名(使用EXISTS) SELECT department_name FROM departments d WHERE EXISTS( SELECT * FROM employees e WHERE e.`department_id` = d.`department_id` ) #(27)查詢各部門中工資比本部門平均工資高的員工的員工號, 姓名和工資 SELECT salary,last_name,employee_id,e.department_id FROM employees e, ( SELECT department_id,AVG(salary) ag FROM employees GROUP BY department_id ) av_dep WHERE e.department_id = av_dep.department_id AND e.salary>av_dep.ag; #(28)查詢平均工資最高的 job 信息(用到LIMIT) SELECT j.* FROM jobs j WHERE j.`job_id` = ( SELECT job_id FROM employees GROUP BY job_id ORDER BY AVG(salary) DESC LIMIT 1 ) #(29)查詢平均工資高於公司平均工資的部門有哪些? SELECT AVG(salary),department_id FROM employees e GROUP BY department_id HAVING AVG(salary)>(SELECT AVG(salary) FROM employees) #(30)查詢平均工資最低的部門信息 SELECT d.* FROM employees e INNER JOIN departments d ON e.`department_id` = d.`department_id` GROUP BY department_id ORDER BY AVG(salary) ASC LIMIT 1;
實 驗 心 得:
通過本次實驗,我充分觀察了查詢結果,體會了SELECT語句實際應用,現在,我能夠在查詢分析器中使用SELECT語句進行簡單查詢,能夠熟練掌握簡單表的數據查詢、數據排序和數據連接查詢的操作方法,並熟悉使用UPDATE/INSERT/DELETE/ALTER語句進行表操作,收獲頗豐。