1.假设某商业集团中有若干公司,人事数据库中有3个基本表
职工表
:EMP(E#.ENAME,AGE, SEX, ECITY)。 其属性分别表示职工工号、姓名、年龄、性别和居住城市。
工作表
:WORKS(E#,C#,SALARY)。其属性分别表示职工工号、所在公司的编号和工资。
公司表
:COMP(C#,CANME,CITY,MGR E#)。其属性分别表示公司编号、公司名称、公司所在城市和公司经理的工号
在3个基本表中,字段AGE和SALARY为数值型,其他字段均为字符型
创建数据库表
create database goods;
use goods;CREATE TABLE EMP (`E#` varchar(4) PRIMARY KEY,ENAME varchar(50),AGE int,SEX char(2),ECITY varchar(20)
);CREATE TABLE WORKS (`E#` varchar(10),`C#` varchar(10),SALARY decimal(8, 2),PRIMARY KEY (`E#`, `C#`)
);CREATE TABLE COMP (`C#` varchar(10) PRIMARY KEY,CNAME varchar(20),CITY varchar(20),`MEG_E#` varchar(10)
);
插入数据
INSERT INTO EMP VALUES( '0001', '张三', 56, '女', '成都' ),( '0002', '李四', 44, '男', '深圳' ),( '0003', '王五', 28, '男', '武汉' ),( '0004', '赵六', 57, '男', '成都' ),( '0005', '小红', 67, '女', '北京' ),( '0006', '小明', 70, '男', '上海' );INSERT INTO WORKS VALUES( '0001', '0001', 2800.00 ),( '0001', '0002', 1500.00 ),( '0002', '0003', 9580.00 ),( '0002', '0002', 1598.00 ),( '0003', '0001', 5500.00 ),( '0003', '0002', 2230.00 ),( '0004', '0002', 3300.00 ),( '0005', '0003', 1332.00 );INSERT INTO COMP VALUES( '0001', '联华公司', '成都', '0001' ),( '0002', '联华武汉分部', '武汉', '0002' ),( '0003', '联华重庆分部', '重庆', '0001' );
(1)检索超过50岁的男职工的工号和姓名。
SELECT `E#`,ENAME FROM EMP WHERE AGE>50 AND SEX="男";
(2)假设每个职工可在多个公司工作,检索每个职工的兼职公司数目和总工资。显示为(E#,NUM,SUM SALARY),其属性分别表示工号、公司数目和总工资。
SELECT `E#`,COUNT(*)NUM,SUM(SALARY) AS SUM_SALARY FROM WORKS GROUP BY `E#`;
(3)检索联华公司低于本公司职工平均工资的所有职工的工号和姓名。
SELECT E.`E#`, E.ENAME FROM EMP E
JOIN WORKS W ON E.`E#` = W.`E#`
JOIN COMP C ON W.`C#` = C.`C#`
WHERE C.CNAME = '联华公司' AND W.SALARY < (SELECT AVG(W.SALARY)FROM WORKS WJOIN COMP C ON W.`C#` = C.`C#`WHERE C.CNAME = '联华公司'
);
(4)检索职工人数最多的公司的编号和名称。
SELECT C.`C#`, C.CNAME FROM COMP C
JOIN WORKS W ON C.`C#` = W.`C#`
GROUP BY C.`C#` ORDER BY COUNT(W.`E#`) DESC LIMIT 1;
(5)检索平均工资高于联华公司平均工资的公司编号和名称。
SELECT C.`C#`, C.CNAME FROM COMP C
JOIN WORKS W ON C.`C#` = W.`C#`
GROUP BY C.`C#` HAVING AVG(W.SALARY) > (SELECT AVG(W.SALARY) FROM WORKS WJOIN COMP C ON W.`C#` = C.`C#` WHERE C.CNAME = '联华公司'
);
(6)为联华公司的职工加薪 5%。
UPDATE WORKS W SET SALARY = SALARY * 1.05
WHERE W.`C#` IN (SELECT `C#` FROM COMP WHERE CNAME = '联华公司');
(7)在表 WORKS中删除年龄大于60岁的职工记录。
DELETE FROM works
WHERE works.`E#` IN ( SELECT emp.`E#` FROM emp WHERE emp.AGE > 60 );
(8)建立一个有关女职工的视图emp woman,属性包括(E#,ENAME,C#,CANME.SALARY)。然后对视图empwoman 进行操作,检索每一个女职工的总工资(假设每个职工可在多个公司兼职)。
CREATE VIEW emp_woman AS SELECT
emp.`E#`, emp.ENAME, comp.`C#`, comp.CNAME, works.SALARY FROM empJOIN works ON emp.`E#` = works.`E#`JOIN comp ON comp.`C#` = works.`C#`
WHERE emp.SEX = "女";SELECT `E#`, ENAME, sum( salary ) FROM emp_woman GROUP BY `E#`;