首先建一张员工表(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;