Mysql练习

数据库文件

emp表
/*
Navicat MySQL Data Transfer

Source Server         : 数据库教学
Source Server Version : 80016
Source Host           : localhost:3306
Source Database       : test

Target Server Type    : MYSQL
Target Server Version : 80016
File Encoding         : 65001

Date: 2022-05-17 11:34:31
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `emp`
-- ----------------------------
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
  `empno` int(11) DEFAULT NULL,
  `ename` varchar(50) DEFAULT NULL,
  `job` varchar(50) DEFAULT NULL,
  `mgr` int(11) DEFAULT NULL,
  `hiredate` date DEFAULT NULL,
  `sal` decimal(7,2) DEFAULT NULL,
  `comm` decimal(7,2) DEFAULT NULL,
  `deptno` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of emp
-- ----------------------------
INSERT INTO `emp` VALUES ('7369', 'SMITH', 'CLERK', '7902', '1980-12-17', '800.00', null, '20');
INSERT INTO `emp` VALUES ('7499', 'ALLEN', 'SALESMAN', '7698', '1981-02-20', '1600.00', '300.00', '30');
INSERT INTO `emp` VALUES ('7521', 'WARD', 'SALESMAN', '7698', '1981-02-22', '1250.00', '500.00', '30');
INSERT INTO `emp` VALUES ('7566', 'JONES', 'MANAGER', '7839', '1981-04-02', '2975.00', null, '20');
INSERT INTO `emp` VALUES ('7654', 'MARTIN', 'SALESMAN', '7698', '1981-09-28', '1250.00', '1400.00', '30');
INSERT INTO `emp` VALUES ('7698', 'BLAKE', 'MANAGER', '7839', '1981-05-01', '2850.00', null, '30');
INSERT INTO `emp` VALUES ('7782', 'CLARK', 'MANAGER', '7839', '1981-06-09', '2450.00', null, '10');
INSERT INTO `emp` VALUES ('7788', 'SCOTT', 'ANALYST', '7566', '1987-04-19', '3000.00', null, '20');
INSERT INTO `emp` VALUES ('7839', 'KING', 'PRESIDENT', null, '1981-11-17', '5000.00', null, '10');
INSERT INTO `emp` VALUES ('7844', 'TURNER', 'SALESMAN', '7698', '1981-09-08', '1500.00', '0.00', '30');
INSERT INTO `emp` VALUES ('7876', 'ADAMS', 'CLERK', '7788', '1987-05-23', '1100.00', null, '20');
INSERT INTO `emp` VALUES ('7900', 'JAMES', 'CLERK', '7698', '1981-12-03', '950.00', null, '30');
INSERT INTO `emp` VALUES ('7902', 'FORD', 'ANALYST', '7566', '1981-12-03', '3000.00', null, '20');
INSERT INTO `emp` VALUES ('7934', 'MILLER', 'CLERK', '7782', '1982-01-23', '1300.00', null, '10');

dept表
/*
Navicat MySQL Data Transfer

Source Server         : 数据库教学
Source Server Version : 80016
Source Host           : localhost:3306
Source Database       : test

Target Server Type    : MYSQL
Target Server Version : 80016
File Encoding         : 65001

Date: 2022-05-17 11:34:40
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `dept`
-- ----------------------------
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
  `deptno` int(11) DEFAULT NULL,
  `dname` varchar(14) DEFAULT NULL,
  `loc` varchar(13) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of dept
-- ----------------------------
INSERT INTO `dept` VALUES ('10', 'ACCOUNTING', 'NEW YORK');
INSERT INTO `dept` VALUES ('20', 'RESEARCH', 'DALLAS');
INSERT INTO `dept` VALUES ('30', 'SALES', 'CHICAGO');
INSERT INTO `dept` VALUES ('40', 'OPERATIONS', 'BOSTON');

练习

  1. 查询出部门编号为30的所有员工

    SELECT deptno FROM emp WHERE deptno = 20;

  2. 所有销售员的姓名、编号和部门编号

    SELECT empname,empnp,deptno FROM emp WHERE job = ‘SALESMAN’;

  3. 找出奖金高于工资的员工

    SELECT ename FROM emp WHERE comm > sal;

  4. 找出奖金高于工资60%的员工

    SELECT ename FROM emp WHERE comm > sal*0.6;

  5. 找出部门编号为10中所有经理,和部门编号为20中所有销售员的详细资料

    SELECT ename,empno,hiredate FROM emp WHERE job = ‘MANAGER’ AND deptno = 10 OR job = ‘SALESMAN’ AND deptno = 20;

  6. 找出部门编号为10中所有经理,部门编号为20中所有销售员,还有即不是经理又不是销售员但其工资大或等于2000的所有员工详细资料

    SELECT ename,empno,hiredate FROM emp WHERE job = ‘MANAGER’ AND deptno = 10 OR job = ‘SALESMAN’ AND deptno = 20 OR sal > 2000;

  7. 有奖金的岗位

    SELECT job FROM emp WHERE comm > 0;

  8. 无奖金或奖金低于500的员工

    SELECT ename FROM emp WHERE comm < 500 or comm is NULL;

  9. 查询名字由五个字组成的员工

    SELECT ename FROM emp WHERE LENGTH(ename) = 5;

  10. 查询1982年入职的员工

    SELECT ename FROM emp WHERE hiredate BETWEEN CAST(‘1982-01-01’ AS DATETIME ) AND CAST(‘1982-12-31’ AS DATETIME);

  11. 查询所有员工详细信息,用编号升序排序

    SELECT ename,empno,hiredate FROM emp ORDER BY empno;

  12. 查询所有员工详细信息,用工资降序排序,如果工资相同使用入职日期升序排序

    SELECT ename,empno,hiredate FROM emp ORDER BY sal,hiredate desc;

  13. 查询每个部门的平均工资

    SELECT AVG(sal),count(0) FROM emp WHERE deptno = 10 OR deptno = 20 OR deptno = 30 GROUP BY deptno;

  14. 求出每个部门的员工数量

    SELECT deptno,count(0) FROM emp WHERE deptno = 10 OR deprno = 20 OR deptno = 30 GROUP BY deptno;

  15. 查询每个岗位的最高工资、最低工资、人数

    SELECT COUNT(empno),MAX(sal),MIN(sal),loc from emp e,dept d
    where (e.deptno=d.deptno and loc=‘NEW YORK’) or (e.deptno=d.deptno and loc=‘CHICAGO’) or (e.deptno=d.deptno and loc=‘BOSTON’) or (e.deptno=d.deptno and loc=‘DALLAS’) GROUP BY LOC ;

  16. 查询非销售人员工作名称以及从事同一工作雇员的月工资的总和,并且要满足从事同一工作的雇员的月工资合计大于2000,输出结果按月工资的合计升序排列

    select job,sum(sal) from emp where job<>‘SALESMAN’ GROUP BY job HAVING sum(sal)>2000 ORDER BY sum(sal) asc;

  17. 查出至少有一个员工的部门。显示部门编号、部门名称、部门位置、部门人数

    SELECT COUNT(empno),d.deptno,dname
    ,loc
    from emp e,dept d
    where (e.deptno=d.deptno and dname=‘ACCOUNTING’) or (e.deptno=d.deptno and dname=‘RESEARCH’) or (e.deptno=d.deptno and dname=‘SALES’) or (e.deptno=d.deptno and dname=‘OPERATIONS’) GROUP BY dname,loc,deptno;

    sql配置sql_mode配置了only_full_group,意思是使用了group by必须包含select中的所有字段!!!

  18. 列出工资比ALLEN高的所有员工

    select * from emp where sal>(SELECT sal from emp where ename=‘ALLEN’);

  19. 列出所有员工的姓名及其直接上级的姓名

    SELECT a.ename,(SELECT b.ename FROM emp b WHERE a.mgr = b.empno) ‘上司’ FROM emp a;

  20. 列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称

    SELECT a.empno ‘员工编号’,a.ename ‘员工姓名’,d.deptno ‘所在部门’ FROM emp a,dept d WHERE a.hiredate<(SELECT hiredate FROM emp b WHERE b.empno = a.mgr);

  21. 列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门

    SELECT e.ename,e.empno,d.deptno FROM emp e RIGHT OUTER JOIN dept d ON e.deptno = d.deptno GROUP BY e.ename,e.empno,d.deptno;

  22. 列出所有文员(CLERK)的姓名及其部门名称,部门的人数

    SELECT e.ename,d.dname,count(d.dname) ‘部门人数’ FROM emp e,dept d WHERE e.deptno = d.deptno AND e.job = ‘CLERK’ GROUP BY e.ename,d.dname;

  23. 列出最低薪金大于1500的各种岗位及从事此岗位的员工人数

    SELECT job,count(*) FROM emp WHERE sal>1500
    GROUP BY job;

  24. 列出在销售部(SALESMAN)工作的员工的姓名,假定不知道销售部的部门编号

    SELECT e.ename FROM emp e,dept d WHERE e.deptno = d.deptno AND d.dname = ‘SALES’;

  25. 列出薪金高于公司平均薪金的所有员工信息,所在部门名称,上级领导,工资等级

    SELECT a.empno,a.ename,job,(SELECT b.ename FROM emp b WHERE b.empno = a.mgr) ‘上司’,sal,d.dname FROM emp a,dept d WHERE d.deptno = a.deptno AND a.sal > (SELECT AVG(sal) FROM emp);

  26. 列出与SMITH从事相同工作的所有员工及部门名称

    SELECT e.ename,d.dname FROM emp e,dept d WHERE e.job=(SELECT a.job FROM emp a WHERE a.ename = ‘SMITH’) AND e.deptno = d.deptno AND e.ename <> ‘SMITH’;

  27. 列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金、部门名称

    SELECT e.ename,e.sal,d.dname FROM emp e,dept d WHERE e.sal > (SELECT MAX(sal) FROM emp WHERE deptno = 30) AND e.deptno = d.deptno;

  28. 列出在每个部门工作的员工数量、平均工资

    SELECT d.dname,count(*),AVG(sal) FROM emp e,dept d WHERE d.deptno = e.deptno GROUP BY d.dname;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值