mysql练习1

/*已知公司的员工表EMP(EID, ENAME, BDATE, SEX, CITY),
  部门表DEPT(DID, DNAME, DCITY),
  工作表WORK(EID,DID,STARTDATE,SALARY)。各个字段说明如下:
EID——员工编号,最多6个字符。例如A00001(主键)
ENAME——员工姓名,最多10个字符。例如SMITH
BDATE——出生日期,日期型
SEX——员工性别,单个字符。F或者M
CITY——员工居住的城市,最多20个字符。例如:上海
DID——部门编号,最多3个字符。例如 A01 (主键)
DNAME——部门名称,最多20个字符。例如:研发部门
DCITY——部门所在的城市,最多20个字符。例如:上海
STARTDATE——员工到部门上班的日期,日期型
SALARY——员工的工资。整型。
*/

#创建表EMP,DEPT,WORK。
CREATE DATABASE test1;

CREATE TABLE EMP(
EID VARCHAR(6)PRIMARY KEY,
ENAME VARCHAR(10),
BDATE DATE,
SEX ENUM('F','M'),
CITY VARCHAR(20)
) 

CREATE TABLE DEPT(
DID VARCHAR(3) PRIMARY KEY,
DNAME VARCHAR(20),
DCITY VARCHAR(20)
)

CREATE TABLE `WORK` (
EID VARCHAR(6) PRIMARY KEY,
DID VARCHAR(3),
STARTDATE DATE,
SALARY INT)

/*2.向每个表中插入适当的数据。例如:插入三条部门的数据,
分别为每个部门插入两条员工。
*/
INSERT INTO EMP VALUES
('A00001','tom','1982-05-21','M','纽约'),
('A00002','lily','1983-05-21','F','纽约'),
('A00003','jack','1988-05-21','M','华盛顿'),
('A00004','lucy','1986-05-21','F','华盛顿'),
('A00005','张飞','1990-05-21','M','石家庄'),
('B00006','赵云','1982-07-21','M','石家庄'),
('B00007','关羽','1982-11-21','M','太原'),
('P00008','刘备','1956-05-21','M','太原'),
('P00009','曹操','1957-05-21','M','郑州'),
('R00010','吕布','1988-05-21','M','南京'),
('R00011','貂蝉','1946-05-21','F','南京'),
('Q00012','孙权','1974-05-21','M','北京'),
('Q00013','鲁肃','1985-05-21','M','北京'),
('Y00014','韩信','2000-05-21','M','成都'),
('Z00015','姜维','2001-05-21','M','成都');

INSERT INTO DEPT VALUES
('A01','人事部','北京'),
('A02','研发部','北京'),
('A03','财务部','北京');

INSERT INTO `WORK` VALUES
('A00001','A01','2015-05-01',5000),
('A00002','A01','2015-05-01',8000),
('A00003','A01','2012-05-01',9000),
('A00004','A01','2014-05-01',6000),
('A00005','A01','2011-05-01',4000),
('B00006','A01','2014-05-01',4000),
('B00007','A02','1995-05-01',7000),
('P00008','A02','1990-05-01',7000),
('P00009','A02','1998-05-01',8000),
('R00010','A03','1996-05-01',8000),
('R00011','A03','2003-05-01',4000),
('Q00012','A03','2008-05-01',4000),
('Q00013','A03','2011-05-01',9000),
('Y00014','A03','2014-05-01',9000),
('Z00015','A03','2004-05-01',9000);

#3.查询“研发”部门的所有员工的基本信息。
#思路:建立三个表连在一起的视图,利用视图筛选研发部。
CREATE VIEW ewd AS
SELECT e.*,d.*,w.startdate,w.salary FROM emp e 
LEFT JOIN WORK w ON e.`EID`=w.`EID` 
LEFT JOIN dept d ON d.`DID`=w.`DID`; 

SELECT * FROM ewd WHERE DNAME='研发部';

/*4.查询拥有最多的员工的部门的基本信息(要求只取出一个部门的信息),如果有多个部门人数一样,
那么取出部门编号最小的那个部门的基本信息。
*/
#思路:按照部门人数降序desc,部门ID升序排列asc,limit获取第一个结果。
SELECT did 部门编号,dname 部门名称,COUNT(*) 人数 FROM ewd GROUP BY did ORDER BY 人数 DESC,did ASC LIMIT 1;

#5.显示部门人数大于5的每个部门的编号,名称,人数。
#思路:按部门分组,筛选条件人数>5。
SELECT did 部门编号,dname 部门名称,COUNT(*) 人数 FROM ewd GROUP BY did HAVING 人数>5;

#6.查询出工资比其所在部门平均工资高的所有职工信息。
#思路:创建did,平均工资组成的容器d,d和word表以did为基准连接在一起组成新的容器。
SELECT * FROM WORK w LEFT JOIN (SELECT did,AVG(salary) ag 
FROM WORK GROUP BY did) d ON d.did=w.`DID` WHERE salary>ag;

#思路:分别查询did为A01/A02/A03时的结果,然后用did相同的人员工资和其平均工资比较,依次显示。
SELECT * FROM ewd e WHERE salary>
(SELECT AVG(salary) FROM ewd WHERE did=e.`DID`); 
/*注意ewd必须设置成变量,
当查询A00001时 e.did=A01,比较的是A01部门的平均工资,
当查询A00007时 e.did=A02,比较的是A02部门的平均工资,
。。。。。。。。。
依次拿查询对象的工资和其所属部门的平均工资比较。

注意下面的方法是错误的,did始终没有变化。
*/
SELECT * FROM ewd  WHERE salary>
(SELECT AVG(salary) FROM ewd WHERE did=ewd.`DID`);
   
#7.显示部门人数大于5的每个部门的最高工资,最低工资。
#思路:按did分组,以人数>5为条件筛选。
SELECT  did,COUNT(*) c,MAX(salary),MIN(salary) 
FROM ewd GROUP BY did HAVING c>5;

#8.列出员工编号以字母P至S开头的所有员工的基本信息。
#思路:SUBSTR(变量名,起始位置<,截取数量>)函数。
SELECT * FROM ewd WHERE SUBSTR(EID,1 ,1) BETWEEN 'p' AND 's';

#9.删除年龄超过60岁的员工。
#思路:year()函数。
DELETE FROM emp WHERE YEAR(NOW())-YEAR(BDATE)>60;

#10.为工龄超过10年的职工增加10%的工资。
#思路:year()函数。
UPDATE WORK SET salary=salary*1.1 WHERE YEAR(NOW())-YEAR(startdate)>10;

你可能感兴趣的:(学习记录)