數據庫原理及應用.實驗3.數據查詢與更新


實驗報告

課程名稱:數據庫原理及應用
實驗項目名稱:數據查詢與更新
實驗時間:2021年4月12日


實 驗 目 的:

  (1) 觀察查詢結果, 體會SELECT語句實際應用;
  (2) 要求能夠在查詢分析器中使用SELECT語句進行簡單查詢。
  (3) 熟練掌握簡單表的數據查詢、數據排序和數據連接查詢的操作方法。
  (4) 熟悉使用UPDATE/INSERT/DELETE/ALTER語句進行表操作;

實 驗 環 境:

  MySQL 5.7.33、SQLyog-11.2.4

實 驗 內 容 及 過 程:

在實驗2的基礎上,完成以下題目

1. 在查詢分析器中用SQL語句完成以下題目

單表查詢

  1. 找出所有供應商的姓名和所在城市。

    SELECT SNAME,CITY FROM S
    
  2. 找出所有零件的名稱、顏色、重量。

    SELECT PNAME,COLOR,WEIGHT FROM P
    
  3. 找出使用供應商S1所供應零件的工程號碼。

    SELECT JNO FROM SPJ WHERE SNO='S1'
    
  4. 列出所有地址在北京的供應商姓名。

    SELECT SNAME FROM S WHERE CITY='北京'
    
  5. 模糊查詢,找出名字包含"螺絲"兩個字且顏色為紅色的零件名稱。

    SELECT PNAME FROM P
    WHERE PNAME LIKE '螺絲_' AND COLOR='紅'
    
  6. 統計不同城市工程項目的數量,結果顯示"城市"、"工程項目數合計"。

    SELECT CITY,COUNT(JNO) AS '工程項目書合計'
    FROM J GROUP BY CITY
    

連接查詢和嵌套查詢

  1. 找出工程項目J2使用的各種零件的名稱及其數量。

    SELECT PNAME,QTY
    FROM P,SPJ
    WHERE P.PNO=SPJ.PNO AND JNO='J2'
    
  2. 找出上海廠商供應的所有零件號碼(要求用自然連接和嵌套查詢兩種方法)。

    #自然連接
    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='上海'
    	)
    )
    
  3. 找出所有由上海供應商提供零件的工程名稱(要求用自然連接和嵌套查詢兩種方法)。

    #自然連接
    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='上海'
    	)
    )
    
  4. 統計不同地區供應商所供應的零件總數量,結果顯示供應商地區、零件總量。

    SELECT CITY AS '供應商地區',SUM(QTY) AS '零件總量'
    FROM S,SPJ
    WHERE S.SNO=SPJ.SNO
    GROUP BY CITY
    
  5. 分類統計供應商"盛錫",不同零件的供應量,結果顯示零件名稱、零件數量。

    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
    
  6. 找出沒有使用天津產的零件的工程號碼。

    SELECT JNO
    FROM J
    WHERE JNO NOT IN(
    	SELECT JNO
    	FROM SPJ
    	WHERE SNO IN(
    		SELECT SNO
    		FROM S
    		WHERE CITY='天津'
    	)
    )
    
  7. 查詢至少用了供應商S1提供的全部零件的工程號JNO。

    SELECT JNO 
    FROM J
    WHERE JNO IN(
    	SELECT JNO
    	FROM SPJ
    	WHERE SNO='S1'
    )
    
  8. 將S、SPJ表進行左外連接,查詢結果中帶有null值的表示什么含義?

  9. 將SPJ、P表進行右外連接,查詢結果中帶有null值的表示什么含義?

數據更新

  1. 把全部紅色零件的顏色改成藍色。

    UPDATE P
    SET COLOR='藍'
    WHERE COLOR='紅'
    
  2. 由S5供給J4的零件P6改為由S3供應。

    UPDATE SPJ
    SET SNO='S3'
    WHERE SNO='S5' AND JNO='J4' AND PNO='P6'
    
  3. 從供應商關系中刪除供應商號是S2的記錄,並從供應情況關系中刪除相應的記錄。

    DELETE FROM SPJ WHERE SNO='S2'
    
  4. 請將(S1,J6,P4,200)插入供應情況關系。

    INSERT INTO SPJ(SNO,JNO,PNO,QTY)
    VALUES('S1','J6','P4','200')
    
  5. 為S表添加供應商,供應商編號:S6,供應商名稱:偉星,城市:北京,狀態暫未定。

    INSERT INTO S(SNO,SNAME,CITY,STATUS)
    VALUES('S6','偉星','北京',NULL)
    
  6. 為P表添加零件,零件編號:P7,零件名稱:凹輪,顏色:藍,重量:20。

    INSERT INTO P
    VALUES('P7','凹輪','藍',20)
    
  7. 在P表中加入屬性零件產地CITY(CHAR型)。

    ALTER TABLE P ADD CITY CHAR
    
  8. 將P表中加入屬性WEIGHT改為SMALLINT型。

    ALTER TABLE P MODIFY WEIGHT SMALLINT
    
  9. 刪除剛才在P表中加入的零件產地CITY屬性。

    ALTER TABLE P DROP COLUMN CITY
    

2. 選做題

  1. 導入myemployees庫,右鍵root@localhost,點擊執行SQL腳本,選擇myemployees.sql路徑,點擊執行,myemployees庫導入完成。

  2. 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) 國家編號
  3. 練習題

    (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語句進行表操作,收獲頗豐。

附 錄:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM