MySQL 职工表 综合案例查询练习题 (20191014 - 20191015 )

MySQL 综合案例 新建基础数据

employee 与 dept

CREATE TABLE employee(
e_no INT(11) PRIMARY KEY NOT NULL COMMENT"员工编号",
e_name VARCHAR(50) NOT NULL COMMENT"员工姓名",
e_gender CHAR(2) COMMENT"员工性别",
dept_no INT(11) NOT NULL COMMENT"员工编号",
e_job VARCHAR(50) NOT NULL COMMENT"职位",
e_salary INT(11) NOT NULL COMMENT"薪水",
hireDate DATE NOT NULL COMMENT"入职时间"
);

CREATE TABLE dept(
d_no INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT COMMENT"部门编号",
d_name VARCHAR(50) NOT NULL COMMENT"部门名称",
d_location VARCHAR(100) COMMENT"部门地址"
);

INSERT INTO dept 
VALUES (10, 'ACCOUNTING', 'ShangHai'),
(20, 'RESEARCH ', 'BeiJing '),
(30, 'SALES ', 'ShenZhen '),
(40, 'OPERATIONS ', 'FuJian ');

INSERT INTO employee 
VALUES (1001, 'SMITH', 'm',20, 'CLERK',800,'2005-11-12'),
(1002, 'ALLEN', 'f',30, 'SALESMAN', 1600,'2003-05-12'),
(1003, 'WARD', 'f',30, 'SALESMAN', 1250,'2003-05-12'),
(1004, 'JONES', 'm',20, 'MANAGER', 2975,'1998-05-18'),
(1005, 'MARTIN', 'm',30, 'SALESMAN', 1250,'2001-06-12'), 
(1006, 'BLAKE', 'f',30, 'MANAGER', 2850,'1997-02-15'),
(1007, 'CLARK', 'm',10, 'MANAGER', 2450,'2002-09-12'),
(1008, 'SCOTT', 'm',20, 'ANALYST', 3000,'2003-05-12'),
(1009, 'KING', 'f',10, 'PRESIDENT', 5000,'1995-01-01'),
(1010, 'TURNER', 'f',30, 'SALESMAN', 1500,'1997-10-12'),
(1011, 'ADAMS', 'm',20, 'CLERK', 1100,'1999-10-05'),
(1012, 'JAMES', 'm',30, 'CLERK', 950,'2008-06-15');

MySQL 综合案例 查询练习题

#在employee表中,查询所有记录的e_no、e_name和e_salary字段值
  SELECT e_no,e_name,e_salary FROM employee;
  
  # 在employee表中,查询dept_no等于10和20的所有记录
  SELECT * FROM employee WHERE dept_no = 20 OR dept_no = 10;
  SELECT * FROM employee WHERE dept_no IN (10,20);
  
  # 在employee表中,查询工资范围在800~2500之间的员工信息
  SELECT * FROM employee WHERE e_salary BETWEEN 800 AND 2500;
  
  #在employee表中,查询部门编号为20的部门中的员工信息。
  SELECT * FROM employee WHERE dept_no = 20;
  
  #在employee表中,查询每个部门最高工资。
  SELECT dept_no,MAX(e_salary) FROM employee GROUP BY dept_no;
  
  #在employee表中,查询每个部门最高工资的员工信息。(员工编号,员工姓名,部门编号,工资)
    #1.内连接
    SELECT * FROM employee AS e ,
    (SELECT dept_no ,MAX(e_salary) AS salary FROM employee GROUP BY dept_no) AS se
    WHERE e.dept_no = se.dept_no AND e.e_salary = se.salary
    #1.1.双重内连接(输出部门名称,在1基础上扩展)
    SELECT cc.e_no,cc.e_name,dept.`d_name`,dept.`d_no`,cc.salary
    FROM
    dept INNER JOIN 
    (SELECT * FROM employee AS e ,
    (SELECT dept_no AS no1,MAX(e_salary) AS salary FROM employee GROUP BY dept_no) AS se
    WHERE e.dept_no = se.no1 AND e.e_salary = se.salary) AS cc
    ON dept.`d_no` = cc.dept_no;
    #2. in 返回的字段,(此处存在问题是 没法略过 a部门最高工资中,存在员工等于 b部门的最高工资的情况)
    SELECT * FROM employee WHERE e_salary IN (SELECT MAX(e_salary) FROM employee GROUP BY dept_no);
    #3. not exists(*这里使用not exists,意思是不存在这样的员工,部门与其它人的相同的,但是工资不比其它低*)
    SELECT * FROM employee AS emp WHERE NOT EXISTS (SELECT * FROM employee WHERE dept_no = emp.dept_no AND e_salary > emp.`e_salary`)

  #查询员工BLAKE所在部门和部门所在地。
  SELECT  d_location FROM employee AS em, dept AS de WHERE `e_name`='BLAKE' AND em.`dept_no`=de.`d_no`; 
  
#使用连接查询,查询所有员工的部门和部门信息  
SELECT * FROM employee AS em LEFT JOIN dept AS de ON em.`dept_no` = de.`d_no`;

# 在employee表中,计算每个部门各有多少名员工
  SELECT  dept_no,COUNT(e_no)AS '人数' FROM employee GROUP BY dept_no;
  
  #在employee表中,计算不同类型职工的总工资数
  SELECT e_job ,SUM(e_salary) FROM employee GROUP BY e_job;
  
  #在employee表中,计算不同部门的平均工资
  SELECT dept_no,AVG(e_salary) FROM employee GROUP BY dept_no;
  
  #在employee表中,查询工资低于1500的员工信息
  SELECT * FROM employee WHERE e_salary <1500;
  
  #在employee表中,将查询记录先按部门编号由高到低排列,再按员工工资由高到低排列。
  SELECT * FROM employee ORDER BY dept_no DESC,e_salary DESC;
  
  #在employee表中,查询员工姓名以字母’A’或’S’开头的员工的信息。
  SELECT * FROM employee WHERE e_name LIKE 'A%' OR e_name LIKE'S%';
  SELECT * FROM employee WHERE e_name REGEXP '^[as]';
  
  #在employee表中,查询到目前为止,工龄大于等于10年的员工信息。

发布了15 篇原创文章 · 获赞 14 · 访问量 5716

猜你喜欢

转载自blog.csdn.net/qq_39204060/article/details/102553528