MySQL 单表查询

首先建一张员工表(emp)

CREATE TABLE `emp` (
  `empno` int(11) NOT NULL COMMENT ‘员工编号‘,
  `ename` varchar(20) COLLATE utf8mb4_bin NOT NULL COMMENT ‘员工姓名‘,
  `job` varchar(20) COLLATE utf8mb4_bin DEFAULT NULL COMMENT ‘工作‘,
  `mgp` int(11) DEFAULT NULL COMMENT ‘上级编号‘,
  `hiredate` datetime DEFAULT NULL COMMENT ‘受雇日期‘,
  `sal` decimal(10,2) DEFAULT NULL COMMENT ‘薪金‘,
  `comm` decimal(10,2) DEFAULT NULL COMMENT ‘佣金‘,
  `deptno` int(11) DEFAULT NULL COMMENT ‘部门编号‘,
  PRIMARY KEY (`empno`) USING BTREE,
  KEY `emp_dno_fk` (`deptno`) USING BTREE,
  CONSTRAINT `emp_dno_fk` FOREIGN KEY (`deptno`) REFERENCES `dept` (`deptno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC

然后下面是我在今年初在高博应诺参加Java开发冬令营的时候的MySQL练习题,现在回顾一下

-- 1、选择部门30中的雇员。
select * from emp where deptno=30;
-- 2、列出所有办事员的姓名、编号和部门。“CLERK”
select ename,empno,deptno from emp where job=‘CLERK‘;
-- 3、找出佣金高于薪金的雇员
select * from emp where comm>sal;
-- 4、找出佣金高于薪金的60%的雇员
select * from emp where comm>sal*0.6;
-- 5、找出部门10中所有经理和部门20中所有办事员的详细资料
select * from emp where deptno=10 and job=‘MANAGER‘ or deptno=20 and job=‘CLERK‘;
-- 6、找出部门10中所有经理、部门20中所有办事员以及既不是经理又不是办事员,但其薪金大于或等于2000的所有雇员的详细资料
select * from emp where deptno=10 and job=‘MANAGER‘ or deptno=20 and job=‘CLERK‘ or job<>‘CLERK‘ and job<>‘MANAGER‘ and sal>=2000;
-- 7、找出收取佣金的雇员的不同工作(排重)
select DISTINCT(job) from emp where comm is not null;
-- 8、找出不收取佣金或收取的佣金低于100的雇员
select * from emp where comm is null or comm<100;
-- 9、找出各月最后一天受雇的所有雇员
select * from emp where hiredate=LAST_DAY(hiredate);
-- 10、找出早于30年之前受雇的雇员
select * from emp where DATEDIFF(DATE_ADD(hiredate,INTERVAL 30 YEAR),CURRENT_DATE()) < 0;
-- 11、显示只有首字母大写的所有雇员的姓名
select CONCAT(UPPER(SUBSTR(ename,1,1)),LOWER(SUBSTR(ename,2))) from emp;
-- 12、显示正好为4个字符的雇员的姓名
select ename from emp where CHAR_LENGTH(ename)=4;
-- 13、显示不带有"R"的雇员姓名
select ename from emp where ename not like ‘%R%‘;
-- 14、显示所有雇员的姓名的前三个字符
select LEFT(ename,3) from emp;
-- 15、显示所有雇员的姓名,用"a"替换所有的"A"
select REPLACE(ename,‘A‘,‘a‘) from emp;
-- 16、显示所有雇员的姓名以及满30年服务年限的日期
select ename,DATE_ADD(hiredate,INTERVAL 30 YEAR) from emp;
-- 17、显示雇员的详细资料,按姓名升序排序
select* from emp ORDER BY ename;
-- 18、显示雇员姓名,根据其服务年限,将最老的雇员排在最前面。
select ename,hiredate from emp ORDER BY hiredate,ename DESC;
-- 19、显示所有雇员的姓名、工作和薪金,按工作内的工作的降序顺序排序,而工作按薪金排序
select ename,job,sal from emp ORDER BY job DESC,sal;
-- 20、显示所有雇员的姓名和加入公司的年份和月份,按雇员受雇日所在月排序,并将最前年份的排在最前面
select ename,YEAR(hiredate),MONTH(hiredate) from emp ORDER BY 3,2,1 DESC;
-- 21、显示在一个月为30天的情况下所有雇员的日薪金,忽略余数
select  ename,TRUNCATE(sal/30,0) from emp;
-- 22、找出在(任何年份的)2月受聘的所有雇员
select * from emp where MONTH(hiredate)=2;
-- 23、对于每个雇员,显示其加入公司的天数
select ename,DATEDIFF(CURRENT_DATE(),hiredate) from emp;
-- 24、显示姓名字段的任何位置包含"A"的所有雇员的姓名
select ename from emp where ename like ‘%A%‘;
-- 25、以年、月和日显示所有雇员的服务年限
select ename,TIMESTAMPDIFF(YEAR,hiredate,CURRENT_DATE()) 服务年数,TIMESTAMPDIFF(MONTH,hiredate,CURRENT_DATE()) 服务月数,TIMESTAMPDIFF(DAY,hiredate,CURRENT_DATE()) 服务天数 from emp;

相关推荐