MySQL练习题

MySQL练习题

  • 让emp表中所员工的工资 + 200, 同时显示之前的工资和加薪之后的工资
SELECT
	sal,
	(sal + 200)
FROM
	emp;
  • 员工试用期6个月,转正后月薪上调20%,请查询出所有员工工作第一年的所有收入,要求显示列标题为员工姓名,工资收入,奖金收入,总收入
SELECT
	ename AS 员工姓名,
	sal AS 工资收入,
	ifnull(comm, 0) AS 奖金收入,
	(
		sal * 6 + sal * 1.2 * 6 + ifnull(comm, 0)
	) AS 总收入
FROM
	emp;
  • 查询员工表中一共有哪几种岗位类型
SELECT DISTINCT
   job
FROM
   emp;
  • 查询职位为SALESMAN的员工编号、职位、入职日期。
SELECT
	empno,
	job,
	hiredate
FROM
	emp
WHERE
	job = 'SALESMAN';
  • 查询1985年12月31日之前入职的员工姓名及入职日期。
SELECT
	empno,
	hiredate
FROM
	emp
WHERE
	hiredate < '1985-12-31';
  • 查询部门编号不在10部门的员工姓名、部门编号
SELECT
	empno,
	deptno
FROM
	emp
WHERE
	deptno <> 10;
  • 查询入职日期在82年至85年的员工姓名,入职日期
SELECT
	ename,
	hiredate
FROM
	emp
WHERE
	hiredate BETWEEN '1982-01-01'
AND '1985-01-01';
  • 查询月薪在3000到5000的员工姓名,月薪。
SELECT
	ename,
	sal
FROM
	emp
WHERE
	sal BETWEEN 3000
AND 5000;
  • 查询经理编号为7902, 7566, 7788的员工姓名,经理编号
SELECT
	ename,
	mgr
FROM
	emp
WHERE
	mgr IN (7902, 7566, 7788);
  • 查询员工姓名以W开头的员工姓名。
SELECT
	ename
FROM
	emp
WHERE
	ename LIKE 'W%';
  • 查询员工姓名倒数第2个字符为T的员工姓名。
SELECT
	ename
FROM
	emp
WHERE
	ename LIKE "%T_";
  • 查询奖金为空的员工姓名,奖金
SELECT
	ename,
	comm
FROM
	emp
WHERE
	comm IS NULL;
  • 查询工资超过2000并且职位是 MANAGER或SALESMAN的员工姓名、职位、工资。
SELECT
	ename,
	job,
	sal
FROM
	emp
WHERE
	sal > 2000
AND job IN ('MANAGER', 'SALESMAN');
  • 查询部门在10或者20,并且工资在3000到5000之间的员工姓名、部门、工资。
SELECT
	ename,
	deptno,
	sal
FROM
	emp
WHERE
	deptno IN (10, 20)
AND sal BETWEEN 3000
AND 5000;
  • 查询入职日期在81年,并且职位不是SALES开头的员工姓名、入职日期、职位。
SELECT
	ename,
	hiredate,
	job
FROM
	emp
WHERE
	hiredate BETWEEN '1981-01-01'
AND '1982-01-01'
AND job NOT LIKE 'SALES%';
  • 查询职位为SALESMAN或MANAGER,部门编号为10或者20,
    姓名包含A的员工姓名、职位、部门编号。
SELECT
	ename,
	job,
	deptno
FROM
	emp
WHERE
	job IN ('SALESMAN', 'MANAGER')
AND deptno IN (10, 20)
AND ename LIKE 'A';
  • 查询部门在20或30的员工姓名,部门编号,并按照工资升序排序。
SELECT
	ename,
	deptno,
	sal
FROM
	emp
WHERE
	deptno IN (20, 30)
ORDER BY
	sal;
  • 查询工资在2000-3000之间,部门不在10号的员工姓名,部门编号,工资,并按照部门升序,工资降序排序。
SELECT
	ename,
	deptno,
	sal
FROM
	emp
WHERE
	sal BETWEEN 2000
AND 3000
AND deptno NOT IN (10)
ORDER BY
	deptno ASC,
	sal DESC;
  • 查询入职日期在81年至82年之间,职位以SALES或者MAN开头的员工姓名,入职日期,职位,并按照入职日期降序排序
 SELECT
	ename,
	hiredate,
	job
FROM
	emp
WHERE
	(
		hiredate BETWEEN '1981-01-01'
		AND '1983-01-01'
	)
AND (
	job LIKE 'SALES%'
	OR job LIKE 'MAN%'
)
ORDER BY
	hiredate DESC;
  • 查询入职日期最早的前5名员工姓名,入职日期。
SELECT
	ename,
	hiredate
FROM
	emp
ORDER BY
	hiredate
LIMIT 5;
  • 查询20号部门下入职日期最早的前2名员工姓名,入职日期。
SELECT
	ename,
	hiredate
FROM
	emp
WHERE
	deptno = 20
ORDER BY
	hiredate
LIMIT 2;
  • 按照每页显示5条记录,分别查询第1页,第2页,第3页信息,
    要求显示员工姓名、入职日期、部门编号。
SELECT
	ename,
	hiredate,
	deptno
FROM
	emp
LIMIT 0,
 5;

SELECT
	ename,
	hiredate,
	deptno
FROM
	emp
LIMIT 5,
 5;

SELECT
	ename,
	hiredate,
	deptno
FROM
	emp
LIMIT 10,
 5;
  • 查询入职时间在1982-7-9之后,并且不从事SALESMAN工作的员工姓名、入职时间、职位。
SELECT
	ename,
	hiredate,
	job
FROM
	emp
WHERE
	hiredate > '1982-07-09'
AND job <> 'SALESMAN';
  • 查询员工姓名的第三个字母是a的员工姓名。
SELECT
	ename
FROM
	emp
WHERE
	ename LIKE '__a%';
  • 查询除了10、20号部门以外的员工姓名、部门编号。
SELECT
	ename,
	deptno
FROM
	emp
WHERE
	deptno NOT IN (10, 20);
  • 查询部门号为30号员工的信息,先按工资降序排序,再按姓名升序排序。
SELECT
	*
FROM
	emp
WHERE
	deptno = 30
ORDER BY
	sal DESC,
	ename;
  • 查询工资大于等于4500并且部门为10或者20的员工的姓名\工资、部门编号。
SELECT
	ename,
	sal,
	deptno
FROM
	emp
WHERE
	sal >= 4500
AND deptno IN (10, 20);
  • 写一个查询,显示所有员工姓名,部门编号,部门名称。
SELECT
	e.ename,
	e.empno,
	e.job
FROM
	emp e,
	dept d
WHERE
	e.deptno = d.deptno;
  • 写一个查询,显示所有工作在CHICAGO并且奖金不为空的员工姓名,工作地点,奖金
SELECT
	e.ename,
	d.loc,
	e.comm
FROM
	emp e,
	dept d
WHERE
	e.deptno = d.deptno
AND d.loc = 'CHICAGO'
AND comm IS NOT NULL;
  • 写一个查询,显示所有姓名中含有A字符的员工姓名,工作地点。
SELECT
	e.ename,
	d.loc
FROM
	emp e,
	dept d
WHERE
	e.deptno = d.deptno
AND e.ename LIKE '%A%';
  • 查询每个员工的姓名和直接上级姓名
SELECT
	w.ename 员工姓名,
	m.ename 领导姓名
FROM
	emp w,
	emp m
WHERE
	w.mgr = m.empno;



  • 查询所有雇员姓名,部门编号,部门名称,包括没有部门的员工也要显示出来(左外连接)
SELECT
	e.ename,
	e.deptno,
	d.dname
FROM
	emp e
LEFT OUTER JOIN dept d ON (e.deptno = d.deptno);

  • 查询所有雇员姓名,部门编号,部门名称,包括没有员工的部门也要显示出来 (右外连接)
SELECT
	e.ename,
	e.deptno,
	d.dname
FROM
	emp e
RIGHT OUTER JOIN dept d ON (e.deptno = d.deptno);

  • 创建一个员工表和部门表的交叉连接。
SELECT
	e.ename,
	e.deptno,
	d.deptno
FROM
	emp e
CROSS JOIN dept d;
  • 使用自然连接,显示入职日期在80年5月1日之后的员工姓名,部门名称,入职日期
SELECT
	e.ename,
	d.dname,
	e.hiredate
FROM
	emp e
NATURAL JOIN dept d
WHERE
	hiredate > '1980-05-01';
  • 使用左连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来。
SELECT
	w.ename,
	m.ename
FROM
	emp w
LEFT JOIN emp m ON w.mgr = m.empno;
  • 使用右连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来。
SELECT
	w.ename,
	m.ename
FROM
	emp m
RIGHT JOIN emp w ON w.mgr = m.empno;
  • 显示员工SMITH的姓名,部门名称,直接上级名称
SELECT
	w.ename 员工姓名,
	m.ename 领导姓名,
	d.dname 部门名称
FROM
	emp w,
	emp m,
	dept d
WHERE
	w.mgr = m.empno
AND w.deptno = d.deptno
AND w.ename = 'SMITH';
  • 显示员工姓名,部门名称,工资,工资级别,要求工资级别大于4级。
SELECT
	e.ename,
	d.dname,
	e.sal,
	s.grade
FROM
	emp e,
	dept d,
	salgrade s
WHERE
	e.deptno = d.deptno
AND e.sal BETWEEN s.losal
AND s.hisal
AND s.grade > 4;
  • 显示员工KING和FORD管理的员工姓名及其经理姓名。
SELECT
	e.ename AS '管理的员工姓名',
	m.ename AS '员工姓名',
	p.ename AS '经理姓名'
FROM
	emp e,
	emp m
LEFT OUTER JOIN emp p ON (m.mgr = p.empno)
WHERE
	m.ename IN ('KING', 'FORD')
AND e.mgr = m.empno;
  • 显示员工姓名,参加工作时间,经理名,参加工作时间,要求参加时间比经理早。
SELECT
	w.ename 员工姓名,
	m.ename 经理姓名,
	w.hiredate 员工入职时间,
	m.hiredate 经理入职时间
FROM
	emp w,
	emp m
WHERE
	w.mgr = m.empno
AND w.hiredate > m.hiredate;
  • 查询部门30有多少个员工领取奖金
SELECT
	COUNT(comm)
FROM
	emp
WHERE
	deptno = 30;
  • 查询入职日期最早和最晚的日期
SELECT
    MIN(hirdate),
    MAX(HIREDATE)
FROM
    emp
  • 查询职位以SALES开头的所有员工平均工资、最低工资、最高工资、工资和。
SELECT
    AVG(SAL) 平均工资,
    MIN(SAL) 最低工资,
    MAX(SAL) 最高工资,
    SUM(SAL) 工资和
FROM
    emp
WHERE
    JOB LIKE 'SALES%'
  • IFNULL 函数可以使分组函数强制包含含有空值的记录
SELECT
    COUNT(IFNULL(COMM,0))
FROM
    emp;
  • 所有员工的平均奖金
SELECT
    AVG(IFNULL(COMM,0))
FROM
    emp;
  • 有奖金的平均奖金
SELECT
    AVG(COMM)
FROM
    emp;
  • 查询部门20的员工,每个月的工资总和及平均工资。
SELECT
    AVG(sal) 平均工资,
    SUM(sal) 工资和
FROM
    emp
WHERE
    deptno = 20;
  • 查询工作在CHICAGO的员工人数,最高工资及最低工资。
SELECT
    COUNT(m.empno) 员工人数,
    MAX(sal) 最高工资,
    MIN(sal) 最低工资
FROM
    emp m,
    dept d
WHERE
    m.deptno = d.DEPTNO
AND d.loc = 'CHICAGO';
  • 查询员工表中一共有几种岗位类型
SELECT
    COUNT(DISTINCT JOB)
FROM
    emp;
group by 语句
  • 查询每个部门的部门编号, 平均工资
SELECT
	deptno,
	avg(sal)
FROM
	emp
GROUP BY
	deptno;
  • 查询每个部门的部门编号, 每个部门的最低工资
SELECT
	deptno,
	min(sal)
FROM
	emp
GROUP BY
	deptno;
  • 查询每个部门的部门编号, 每个部门的最高工资
SELECT
	deptno,
	max(sal)
FROM
	emp
GROUP BY
	deptno;
  • 查询每个部门每个岗位的工资总和
SELECT
	deptno,
	job,
	sum(sal)
FROM
	emp
GROUP BY
	deptno,
	job;
  • 查询每个部门的部门编号,部门名称,部门人数,最高工资,最低工资,工资总和,平均工资。
SELECT
    d.DEPTNO 部门编号,
    d.DNAME 部门名称,
    COUNT(*) 部门人数,
    MAX(e.SAL) 最高工资,
    MIN(e.SAL) 最低工资,
    SUM(e.SAL) 工资总和,
    AVG(e.SAL) 平均工资
FROM
    emp e,
    dept d
WHERE
    e.DEPTNO = d.DEPTNO
GROUP BY
    e.DEPTNO, d.DNAME;
  • 查询每个部门,每个岗位的部门编号,部门名称,岗位名称,部门人数,最高工资,最低工资,工资总和,平均工资。
SELECT
    d.DEPTNO 部门编号,
    d.DNAME 部门名称,
    e.JOB 岗位名称,
    COUNT(*) 部门人数,
    MAX(e.SAL) 最高工资,
    MIN(e.SAL) 最低工资,
    SUM(e.SAL) 工资总和,
    AVG(e.SAL) 平均工资
FROM
    emp e,
    dept d
WHERE
    e.DEPTNO = d.DEPTNO
GROUP BY
    d.DEPTNO,d.DNAME, e.JOB;
  • 查询每个经理所管理的人数,经理编号,经理姓名,要求包括没有经理的人员信息。
SELECT
    COUNT(*) 管理人数,
    m.EMPNO 经理编号,
    m.ENAME 经理姓名
FROM
    emp w
LEFT OUTER JOIN emp m ON w.MGR = m.EMPNO
GROUP BY
    m.EMPNO,
    m.ENAME
  • 查询每个部门最高薪水大于2900的部门编号,最高工资
SELECT
    e.DEPTNO,
    MAX(e.sal)
FROM
    emp e
GROUP BY
    e.DEPTNO
HAVING
    MAX(e.SAL) > 2900
  • 查询每个工种, 工资总和, 并且工作不是以 SALE开头的且每个工种的工资和大于5000时输出,并按照结果的工资总数进行升序排序
SELECT
    job 工种, 
    SUM(sal) 工资总和 
FROM
    emp
WHERE
    job NOT LIKE 'SALES%'
GROUP BY
    job
HAVING
    SUM(sal) > 5000
ORDER BY
    SUM(sal);
  • 查询部门人数大于2的部门编号,部门名称,部门人数。
SELECT
    e.DEPTNO 部门编号,
    d.DNAME 部门名称,
    COUNT(*) 部门人数
FROM
    emp e,
    dept d
WHERE
    e.DEPTNO = d.DEPTNO
GROUP BY
    e.DEPTNO
HAVING
    COUNT(*) > 2
  • 查询部门平均工资大于2000,且人数大于2的部门编号,部门名称,部门人数,部门平均工资,并按照部门人数升序排序。
SELECT
    e.DEPTNO 部门编号,
    d.DNAME 部门名称,
    COUNT(*) 部门人数,
    AVG(e.SAL) 部门平均工资
FROM
    emp e,
    dept d
WHERE
    e.DEPTNO = d.DEPTNO
GROUP BY
    e.DEPTNO
HAVING
    (COUNT(*) > 2)
AND (AVG(e.SAL) > 2000)
ORDER BY
    3
  • 查询工资比Jones工资高的员工信息
SELECT
    *
FROM
    emp e
WHERE
    e.SAL > ( SELECT e.SAL from emp e WHERE e.ENAME = 'JONES');
  • 查询工资最低的员工姓名
SELECT
    e.ENAME
FROM
    emp e
WHERE
    e.SAL = (SELECT MIN(e.sal) from emp e);
  • 显示和工号7369从事相同工作并且工资大于7876的员工姓名和工作
SELECT e.ENAME, e.JOB
from emp e
WHERE
    e.JOB = (SELECT JOB FROM emp WHERE EMPNO = 7369) and 
    e.sal > (SELECT SAL FROM emp WHERE EMPNO = 7876);
  • 查询部门最低工资比20部门最低工资高的部门编号及最低工资
SELECT e.DEPTNO 部门编号 ,MIN(e.SAL)
from emp e
GROUP BY e.DEPTNO
HAVING
MIN(e.SAL) > (SELECT MIN(sal) from emp WHERE DEPTNO = 20) 
  • 查询入职日期比10部门任意一个员工晚的员工姓名、入职日期,不包括10部门员工
SELECT
	e.ename AS '员工姓名',
	e.hiredate AS '入职日期'
FROM
	emp e
WHERE
	e.deptno <> 10
AND e.hiredate > ANY (
	SELECT
		hiredate
	FROM
		emp
	WHERE
		deptno = 10
);
  • 查询入职日期比10部门所有员工晚的员工姓名、入职日期,不包括10部门员工
SELECT
	e.ename AS '员工姓名',
	e.hiredate AS '入职日期'
FROM
	emp e
WHERE
	e.empno <> 10
AND e.hiredate > ALL (
	SELECT
		hiredate
	FROM
		emp
	WHERE
		deptno = 10
);
  • 查询职位和10部门任意一个员工职位相同的员工姓名,职位,不包括10部门员工
SELECT
	e.ename AS '员工姓名',
	e.job AS '职位'
FROM
	emp e
WHERE
	e.deptno <> 10
AND e.job = ANY (
	SELECT
		job
	FROM
		emp
	WHERE
		deptno = 10
);
  • 查询部门平均工资在2500元以上的部门名称及平均工资。
    
SELECT
	d.dname AS '部门名称',
	avg(e.sal) AS '平均工资'
FROM
	emp e,
	dept d
WHERE
	e.deptno = d.deptno
GROUP BY
	e.deptno
HAVING
	avg(e.sal) > 2500;
  • 查询员工岗位中不是以“SA”开头并且平均工资在2500元以上的岗位及平均工资,并按平均工资降序排序。
    
SELECT
	e.job AS '岗位',
	avg(e.sal) AS '平均工资'
FROM
	emp e
WHERE
	e.job NOT LIKE 'SA%'
GROUP BY
	e.job
HAVING
	avg(e.sal) > 2500
ORDER BY
	2 DESC;
  • 查询部门人数在2人以上的部门名称、最低工资、最高工资。
SELECT
	d.dname AS '部门名称',
	min(e.sal) AS '最低工资',
	max(e.sal) AS '最高工资'
FROM
	emp e,
	dept d
WHERE
	e.deptno = d.deptno
GROUP BY
	d.deptno
HAVING
	count(e.empno) > 2;
  • 查询岗位不为SALESMAN,工资和大于等于2500的岗位及每种岗位的工资和。
SELECT
	e.job AS '岗位',
	sum(e.sal) AS '工资和'
FROM
	emp e
WHERE
	e.job <> 'SALESMAN'
GROUP BY
	e.job
HAVING
	sum(e.sal) > 2500;
  • 显示经理号码和经理姓名,这个经理所管理员工的最低工资,没有经理的KING也要显示,不包括最低工资小于3000的,按最低工资由高到低排序
SELECT
	m.empno AS '经理编号',
	m.ename AS '经理姓名',
	min(w.sal) AS '管理员工的最低工资'
FROM
	emp w
LEFT OUTER JOIN emp m ON (w.mgr = m.empno)
GROUP BY
	m.empno
HAVING
	min(w.sal) > 3000
ORDER BY
	3 DESC;
  • 查询工资高于编号为7782的员工工资,并且和7369号员工从事相同工作的员工的编号、姓名及工资。
SELECT
	e.empno AS '员工编号',
	e.ename AS '员工姓名',
	e.sal AS '员工工资'
FROM
	emp e
WHERE
	e.sal > (
		SELECT
			sal
		FROM
			emp
		WHERE
			empno = 7782
	)
AND e.job = (
	SELECT
		job
	FROM
		emp
	WHERE
		empno = 7369
);
  • 查询工资最高的员工姓名和工资。
SELECT
	e.ename AS '员工姓名',
	e.sal AS '员工工资'
FROM
	emp e
ORDER BY
	e.sal DESC
LIMIT 1;
SELECT
	e.ename AS '员工姓名',
	e.sal AS '员工工资'
FROM
	emp e
WHERE
	e.sal = (SELECT max(sal) FROM emp);
  • 查询部门最低工资高于10号部门最低工资的部门的编号、名称及部门最低工资。
SELECT
	d.deptno AS '部门编号',
	d.dname AS '部门名称',
	min(e.sal) AS '部门最低工资'
FROM
	emp e,
	dept d
WHERE
	e.deptno = d.deptno
GROUP BY
	d.deptno
HAVING
	min(e.sal) > (
		SELECT
			min(sal)
		FROM
			emp
		WHERE
			deptno = 10
	);
  • 查询员工工资为其部门最低工资的员工的编号和姓名及工资。
SELECT
	e.empno AS '员工编号',
	e.ename AS '员工姓名',
	e.sal AS '员工工资'
FROM
	emp e
WHERE
	e.sal IN (
		SELECT
			min(e.sal)
		FROM
			emp e
		GROUP BY
			e.deptno
	);
  • 显示经理是KING的员工姓名,工资。
SELECT
	w.ename AS '员工姓名',
	w.sal AS '员工工资'
FROM
	emp w,
	emp m
WHERE
	w.mgr = m.empno
AND m.ename = 'KING';
SELECT
	w.ename AS '员工姓名',
	w.sal AS '员工工资'
FROM
	emp w
WHERE
	w.mgr = (
		SELECT
			empno
		FROM
			emp
		WHERE
			ename = 'KING'
	);
  • 显示比员工SMITH参加工作时间晚的员工姓名,工资,参加工作时间。
SELECT
	w.ename AS '员工姓名',
	w.sal AS '员工工资',
	w.hiredate AS '参加工作时间'
FROM
	emp w
WHERE
	w.hiredate > (
		SELECT
			hiredate
		FROM
			emp
		WHERE
			ename = 'SIMTH'
	);

版权声明:本文为weixin_45642839原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。