【MySQL课后题】第三章——MySQL数据库的基本操作
【MySQL课后题】第三章——MySQL数据库的基本操作
一、假设某商业集团中有若干公司,人事数据库中有3个基本表。
职工表:EMP(E#, ENAME, AGE, SEX, ECITY)。
其属性分别表示职工工号、姓名、年龄、性别和居住城市。
工作表:WORKS(E#, C#, SALARY)。
其属性分别表示职工工号、所在公司的编号和工资。
公司表:COMP(C#, CNAME, CITY, MGR_E#)。
其属性分别表示公司编号、公司名称、公司所在城市和公司经理的工号。
在3个基本表中,字段AGE和SALARY为数值型,其他字段均为字符型。
1. 准备工作
-
新建一个数据库
CREATE DATABASE db_first;
-
建立表结构
use db_first; CREATE TABLE EMP ( `E#` varchar(4) PRIMARY KEY, ENAME varchar(50), AGE int(11), SEX varchar(2), ECITY varchar(50) ); CREATE TABLE WORKS ( `E#` varchar(4), `C#` varchar(4), SALARY decimal(10, 2), PRIMARY KEY (`E#`, `C#`) ); CREATE TABLE COMP ( `C#` varchar(4) PRIMARY KEY, CNAME varchar(50), CITY varchar(50), `MEG_E#` varchar(4) );
-
插入表数据
INSERT INTO EMP VALUES ( '0001', '张三', 55, '男', '北京' ), ( '0002', '李四', 45, '女', '上海' ), ( '0003', '王五', 23, '男', '北京' ), ( '0004', '赵六', 80, '女', '上海' ), ( '0005', '孙七', 52, '女', '广州' ); INSERT INTO WORKS VALUES ( '0001', '0001', 8848.00 ), ( '0001', '0002', 1.00 ), ( '0001', '0003', 9527.00 ), ( '0002', '0002', 18888.88 ), ( '0002', '0003', 1999.00 ), ( '0003', '0001', 211.22 ), ( '0003', '0002', 1573.99 ), ( '0004', '0002', 233.23 ), ( '0005', '0003', 14332.23 ); INSERT INTO COMP VALUES ( '0001', '联华公司', '北京', '0001' ), ( '0002', '第二分公司', '上海', '0002' ), ( '0003', '第三分公司', '广州', '0001' );
2. 题目
-
检索超过50岁的男职工的工号和姓名
-- 1. 检索超过50岁的男职工的工号和姓名 SELECT `E#`, ENAME FROM emp WHERE SEX = "男" AND age > 50;
-
假设每个职工可在多个公司工作,检索每个职工的兼职公司数目和总工资。显示为 (E#, NUM, SUM_SALARY),其属性分别表示工号、公司的数目和总工资。
/** * 2. 假设每个职工可在多个公司工作,检索每个职工的兼职公司数目和总工资。 * 显示为 (E#, NUM, SUM_SALARY),其属性分别表示工号、公司的数目和总工资。 */ SELECT `E#`, count(*) NUM, sum( salary ) SUM_SALARY FROM works GROUP BY `E#`;
-
检索联华公司低于本公司职工平均工资的所有职工的工号和姓名。
-- 3. 检索联华公司低于本公司职工平均工资的所有职工的工号和姓名。 SELECT emp.`E#`, emp.ENAME FROM emp JOIN works ON works.`E#` = emp.`E#` JOIN comp ON comp.`C#` = works.`C#` WHERE comp.CNAME = "联华公司" AND works.SALARY <( SELECT AVG( SALARY ) FROM works JOIN comp ON works.`C#` = comp.`C#` WHERE comp.CNAME = "联华公司" );
-
检索职工人数最多的公司的编号和名称。
-- 4. 检索职工人数最多的公司的编号和名称。 SELECT comp.`C#`, comp.CNAME FROM comp JOIN works ON comp.`C#` = works.`C#` GROUP BY `C#` HAVING count(*)>= ALL ( SELECT count(*) FROM works GROUP BY works.`C#` );
-
检索平均工资高于联华公司平均工资的公司编号和名称。
-- 5. 检索平均工资高于联华公司平均工资的公司编号和名称。 SELECT comp.`C#`, comp.CNAME FROM comp JOIN works ON comp.`C#` = works.`C#` GROUP BY `C#` HAVING AVG( works.SALARY )>( SELECT AVG( works.SALARY ) FROM works JOIN comp ON works.`C#` = comp.`C#` WHERE comp.CNAME = "联华公司" );
-
为联华公司的职工加薪5%。
-- 6. 为联华公司的职工加薪5%。 UPDATE works SET works.SALARY = works.SALARY * 1.05 WHERE works.`C#` IN ( SELECT comp.`C#` FROM comp WHERE comp.CNAME = "联华公司" );
-
在表WORKS中删除年龄大于60岁的职工记录。
-- 7. 在表WORKS中删除年龄大于60岁的职工记录。 DELETE FROM works WHERE works.`E#` IN ( SELECT emp.`E#` FROM emp WHERE emp.AGE > 60 );
-
建立一个有关女职工的视图 emp_woman, 属性包括(E#, ENAME, C#, CNAME, SALARY)。然后对视图 emp_woman 进行操作,检索每一个女职工的总工资(假设每个职工可在多个公司兼职)。
-- 8. 建立一个有关女职工的视图 emp_woman, 属性包括(E#, ENAME, C#, CNAME, SALARY)。 CREATE VIEW emp_woman AS SELECT emp.`E#`, emp.ENAME, comp.`C#`, comp.CNAME, works.SALARY FROM emp JOIN works ON emp.`E#` = works.`E#` JOIN comp ON comp.`C#` = works.`C#` WHERE emp.SEX = "女"; -- 然后对视图 emp_woman 进行操作,检索每一个女职工的总工资(假设每个职工可在多个公司兼职)。 SELECT `E#`, ENAME, sum( salary ) FROM emp_woman GROUP BY `E#`;
二、完成以下MySQL题目的要求。
1. 准备工作
-
新建一个数据库
CREATE DATABASE db_second; use db_second;
2. 题目
-
创建表 workinfo,要求创建表的同时在id字段上创建名为index_id的唯一索引,且降序排列。workinfo的表结构如下标所示。
字段名 字段描述 数据类型 非空 主键 唯一 自增 id 编号 INT 是 是 是 是 name 职位名称 VARCHAR(20) 是 否 否 否 type 职位类型 VARCHAR(10) 否 否 否 否 address 工作地址 VARCHAR(50) 否 否 否 否 wages 工资 INT 否 否 否 否 contents 工作内容 TINYTEXT 否 否 否 否 extra 附加信息 TEXT 否 否 否 否 CREATE TABLE workinfo ( id int NOT NULL PRIMARY KEY UNIQUE AUTO_INCREMENT, name varchar(20) NOT NULL, type varchar(10), address varchar(50), wages int, contents tinytext, extra text, UNIQUE INDEX index_id (id DESC) );
-
使用CREATE INDEX语句为name字段创建长度为10的索引index_name。
-- 2. 使用CREATE INDEX语句为name字段创建长度为10的索引index_name。 CREATE INDEX index_name ON workinfo(name(10));
-
使用ALTER TABLE语句在type和address字段上创建名为index_t的索引。
-- 3. 使用ALTER TABLE语句在type和address字段上创建名为index_t的索引。 ALTER TABLE workinfo ADD INDEX index_t ( type, address );
-
使用ALTER TABLE语句在extra字段上创建名为index_ext的全文索引。
-- 4. 使用ALTER TABLE语句在extra字段上创建名为index_ext的全文索引。 ALTER TABLE workinfo ADD FULLTEXT INDEX index_ext ( extra );
-
删除表workinfo的唯一性索引index_id。
-- 5. 删除表workinfo的唯一性索引index_id。 DROP INDEX index_id ON workinfo;
三、某工厂的信息管理数据库中有如下两个关系模式。
职工(职工号,姓名,年龄,月工资,部门号,电话,办公室)
部门(部门号,部门名,负责人代码,任职时间)
1. 题目
(1) 查询每个部门月工资最高的“职工号”的SQL语句如下。
SELECT 职工号 FROM 职工 E
WHERE 月工资=(SELECT MAX(月工资)
FROM 职工 M
WHERE M.部门号=E.部门号);
① 请用30字以内的文字简要说明该查询语句对查询效率的影响。
② 对该查询语句进行修改,使它既能实现相同功能,又能提高查询效率。
答:
① 该查询使用了子查询,导致每个部门的最高工资都需多次计算,效率较低。
② 使用临时表存储每个部门的最高工资,避免重复查询SELECT E.职工号 FROM 职工 E JOIN ( SELECT 部门号, MAX(月工资) AS 最高工资 FROM 职工 GROUP BY 部门号 ) AS M ON E.部门号 = M.部门号 AND E.月工资 = M.最高工资;
(2)假定分别在“职工”关系中的“年龄”和“月工资”字段上创建索引,如下的SELECT查询语句可能不会促使查询优化器使用索引,从而降低查询效率,请写出既能实现相同功能又能提高查询效率的SQL语句。
SELECT 姓名,年龄,月工资 FROM 职工
WHERE 年龄>35 OR 月工资<1000;
答:
(SELECT 姓名, 年龄, 月工资 FROM 职工 WHERE 年龄 > 35) UNION (SELECT 姓名, 年龄, 月工资 FROM 职工 WHERE 月工资 < 1000);
原文地址:https://blog.csdn.net/realoser/article/details/142899099
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!