SQL练习题&答案 Part_1

表结构

– 部门表
CREATE TABLE dept (
id INT PRIMARY KEY PRIMARY KEY, – 部门id
dname VARCHAR(50), – 部门名称
loc VARCHAR(50) – 部门位置
);
– 添加4个部门
INSERT INTO dept(id,dname,loc) VALUES
(10,‘教研部’,‘北京’),
(20,‘学工部’,‘上海’),
(30,‘销售部’,‘广州’),
(40,‘财务部’,‘深圳’);

– 职务表,职务名称,职务描述
CREATE TABLE job (
id INT PRIMARY KEY,
jname VARCHAR(20),
description VARCHAR(50)
);
– 添加4个职务
INSERT INTO job (id, jname, description) VALUES
(1, ‘董事长’, ‘管理整个公司,接单’),
(2, ‘经理’, ‘管理部门员工’),
(3, ‘销售员’, ‘向客人推销产品’),
(4, ‘文员’, ‘使用办公软件’);

题目

– 1.计算员工的日薪(按30天),保留二位小数
– 2.计算出员工的年薪,并且以年薪排序 降序
– 3.找出奖金少于5000或者没有获得奖金的员工的信息
– 4.返回员工职务名称及其从事此职务的最低工资
– 5.返回工龄超过10年,且2月份入职的员工信息 year month
– 6.返回与 林冲 同一年入职的员工
– 7.返回每个员工的名称及其上级领导的名称
– 8.返回工资为二等级(工资等级表)的职员名字(员工表)、部门名称(部门表)
– 9.涨工资:董事长2000 经理1500 其他800

答案

-- 1.计算员工的日薪(按30天),保留二位小数
SELECT TRUNCATE(salary/30,2) FROM emp;

-- 2.计算出员工的年薪,并且以年薪排序 降序
SELECT *  FROM emp;
SELECT salary*12 + IFNULL(bonus,0) AS 年薪 FROM emp ORDER BY 年薪 DESC;

-- 3.找出奖金少于5000或者没有获得奖金的员工的信息
SELECT * FROM emp WHERE bonus<5000 OR bonus IS NULL;

-- 4.返回员工职务名称及其从事此职务的最低工资
-- 4.1 确定表和连接条件 2个表 员工表和职务表
SELECT * FROM emp e , job j WHERE e.job_id=j.id;
-- 4.2 分组 统计
SELECT j.jname , MIN(salary)
	FROM emp e , job j 
	WHERE e.job_id=j.id
	GROUP BY j.jname; 

-- 5.返回工龄超过10年,且2月份入职的员工信息 year month 
SELECT * FROM emp WHERE DATEDIFF(NOW() , joindate)/365>10 AND  MONTH(joindate)='02';


-- 6.返回与 林冲 同一年入职的员工
-- 6.1 查询林冲入职年份
SELECT YEAR(joindate) FROM emp WHERE ename='林冲';
SELECT * FROM emp WHERE YEAR(joindate)= (林冲入职的年份 2011);

-- 6.2 查询对应年份的职工
# 案例结果
SELECT * FROM emp WHERE YEAR(joindate)= 
	(
		SELECT YEAR(joindate) FROM emp WHERE ename='林冲'
	);


-- 7.返回每个员工的名称及其上级领导的名称
#自关联查询:自己表中的一个字段 关联自己表中的另外一个字段
#select * from A inner join  B  on 关联条件
# e 表示员工表 em 表示上级领导的表
SELECT e.ename,e.mgr, em.id,em.ename FROM emp e 
	INNER JOIN emp em ON e.mgr = em.id;

-- 8.返回工资为二等级(工资等级表)的职员名字(员工表)、部门名称(部门表)
-- 8.1 确定查询表和连接条件 3个表
SELECT * FROM emp e , dept d , `salarygrade` s 
	WHERE e.dept_id = d.id AND e.salary BETWEEN s.losalary AND  s.hisalary;

-- 8.2 确定显示字段
SELECT  e.ename , d.dname , s.grade
	FROM emp e , dept d , `salarygrade` s 
	WHERE e.dept_id = d.id AND e.salary BETWEEN s.losalary AND  s.hisalary;
-- 8.3 确定业务条件
SELECT  e.ename , d.dname , s.grade
	FROM emp e , dept d , `salarygrade` s 
	WHERE e.dept_id = d.id AND e.salary BETWEEN s.losalary AND  s.hisalary
	AND s.grade = 2;

-- 9.涨工资:董事长2000 经理1500 其他800
SELECT * FROM emp;
SELECT * FROM job;
-- 9.1 确定几张表连接条件 2个表
SELECT * FROM emp e , job j 
	WHERE e.job_id = j.id
-- 9.2 确定显示字段

SELECT e.ename,j.jname , e.salary
	FROM emp e , job j 
	WHERE e.job_id = j.id;
#涨工资:董事长2000 经理1500 其他800
SELECT e.ename,j.jname , e.salary 现有的工资, 
	CASE j.jname 
	    WHEN '董事长' THEN e.salary+2000
	    WHEN '经理' THEN e.salary+1500
	    ELSE e.salary+800
	END AS 涨工资之后
	FROM emp e , job j 
	WHERE e.job_id = j.id;





	
	

你可能感兴趣的:(Java,mysql,sql)