习题
1.Homework01
 - (1) D -- 没有在别名上加引号(ps:别名的as可以省略)
- (2) B -- 判断null或非空不能用不等于号
- (3) C
复制代码 2.Homework02
- 写出查看dept表和emp表的结构的sql语句
- 使用简单查询语句完成
- 显示所有部门名称
- 显示所有雇员名及其全年收入 13月(工资+补助),并指定列别名“年收入”
- 限制查询数据
- 显示工资超过2850的雇员的姓名和工资
- 显示工资不在1500到2850之间的员工名和工资
- 显示编号为7566的雇员姓名及所在的部门编号
- 显示部门10和30中工资超过1500的员工名及工资
- 显示无管理者的雇员名及岗位
- 排序数据
- 显示在1991-2-1到1991-5-1之间雇用的员工名,岗位以及雇用日期,并以雇用日期进行排序
- 显示获得补助的所有员工名,工资以及补助,并以工资降序进行排序
练习
- -- 2.写出查看dept表和emp表的结构的sql语句
- DESC dept;
- DESC emp;
- -- 3.使用简单查询语句完成
- -- 3.1 显示所有部门名称
- SELECT dname FROM dept;
- -- 3.2 显示所有雇员名及其全年收入 13月(工资+补助),并指定列别名“年收入”
- SELECT ename,(sal+IFNULL(comm ,0.0))*13 AS '年收入' FROM emp;
- -- 4.限制查询数据
- -- 4.1显示工资超过2850的雇员的姓名和工资
- SELECT ename,sal FROM emp
- WHERE sal>2850;
- -- 4.2显示工资不在1500到2850之间的员工名和工资
- SELECT ename,sal FROM emp
- WHERE sal>2850 OR sal<1500;
- -- 4.3显示编号为7566的雇员姓名及所在的部门编号
- SELECT ename,deptno FROM emp
- WHERE empno=7566;
- -- 4.4显示部门10和30中工资超过1500的员工名及工资
- SELECT ename,sal FROM emp
- WHERE deptno IN (10,30) AND sal >1500;
- -- 4.5显示无管理者的雇员名及岗位
- SELECT ename,job FROM emp
- WHERE mgr IS NULL;
- -- 5.排序数据
- -- 5.1显示在1991-2-1到1991-5-1之间雇用的员工名,岗位以及雇用日期,
- -- 并以雇用日期进行排序
- SELECT ename,job,hiredate FROM emp
- WHERE hiredate>='1991-02-01' AND hiredate<='1991-05-01'
- ORDER BY hiredate;
- -- 显示获得补助的所有员工名,工资以及补助,并以工资降序进行排序
- SELECT ename,sal,comm FROM emp
- WHERE comm IS NOT NULL
- ORDER BY sal DESC;
复制代码 5.Homework05
根据emp员工表,dept部门表,工资=薪金+佣金,写出正确的sql
- 列出至少有一个员工的所有部门
- 列出薪金比Smith多的所有员工
- 列出受雇日期晚于其直接上级的所有员工
- 列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
- 列出所有CLERK(办事员)的姓名及其部门名称
- 列出最低薪金大于1500的各种工作
- 列出在部门SALES(销售部)工作的员工的姓名
- 列出薪金高于公司平均薪金的所有员工
- SELECT * FROM emp;
- -- 1. 选择部门30中的所有员工
- SELECT * FROM emp
- WHERE deptno = 30;
- -- 2. 列出所有办事员(CLERK)的姓名,编号和部门编号
- SELECT ename,empno,deptno FROM emp
- WHERE job = 'CLERK';
-
- -- 3. 找出佣金高于薪金的员工
- SELECT ename FROM emp
- WHERE IFNULL(comm,0)>sal;
-
- -- 4. 找出佣金高于薪金60%的员工
- SELECT ename FROM emp
- WHERE IFNULL(comm,0)>(sal*0.6);
-
- -- 5. 找出部门10中所有经理(MANAGER)和部门20中的所有办事员(CLERK)的详细资料
- SELECT * FROM emp
- WHERE (deptno = 10 AND job= 'MANAGER')OR
- (deptno = 20 AND job= 'CLERK');
-
- -- 6. 找出部门10中所有经理(MANAGER),部门20中的所有办事员(CLERK),
- -- 还有既不是经理又不是办事员但其薪金大于或等于2000的所有员工的详细资料
- SELECT * FROM emp
- WHERE (deptno = 10 AND job= 'MANAGER')OR
- (deptno = 20 AND job= 'CLERK')OR
- (job NOT IN ('MANAGER','CLERK') AND sal>=2000);
-
- -- 7. 找出收取佣金的员工的不同工作
- SELECT DISTINCT job FROM emp
- WHERE comm IS NOT NULL;
-
- -- 8. 找出不收取佣金或收取佣金低于100的员工
- SELECT ename FROM emp
- WHERE comm IS NULL OR IFNULL(comm,0) <100;
-
- -- 9. 找出各月倒数第三天受雇的所有员工
- -- 关于最后一天 last_day(日期)可以返回该日期所在月份的最后一天
- SELECT * FROM emp
- WHERE LAST_DAY(hiredate)-2 = hiredate;
- -- 10. 找出早于12年前受雇的员工
- SELECT * FROM emp
- WHERE hiredate < DATE_SUB(NOW(),INTERVAL 12 YEAR);
- -- 11. 以首字母小写的方式显示所有员工的姓名
- -- 先截取首字母,将其小写 LCASE (LEFT(ename,1))
- -- 再截取剩下的字母 RIGHT(ename, (LENGTH(ename)-1))
- -- 将两者拼起来 CONCAT
- SELECT CONCAT(LCASE(LEFT(ename,1)),RIGHT(ename, (LENGTH(ename)-1))) FROM emp
- -- 或者
- SELECT CONCAT( LCASE(LEFT(ename,1)) ,SUBSTRING(ename,2)) FROM emp;
- -- 12. 显示正好为5个字符的员工的姓名
- SELECT ename FROM emp
- WHERE ename LIKE '_____';
- -- 或者
- SELECT ename FROM emp
- WHERE LENGTH(ename)=5;
复制代码 6.Homework06
根据emp员工表,dept部门表,工资=薪金+佣金,写出正确的sql
- 列出与SCOTT从事相同工作的所有员工
- 列出薪金高于,在部门30工作的所有员工的薪金,的员工姓名和薪金
- 列出在每个部门工作的员工数量,平均工资和平均服务期限
- 列出所有员工的姓名,部门名称和工资
- 列出所有部门的详细信息和部门人数
- 列出各种工作的最低工资
- 列出MANAGER(经理)的最低薪金
- 列出所有员工的年工资,按年薪从低到高排序
- -- 根据emp员工表,写出正确的sql语句
- SELECT * FROM emp;
- -- 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. 显示满10年服务年限的员工的姓名和受雇日期
- SELECT ename,hiredate FROM emp
- WHERE (DATEDIFF(NOW(),hiredate)/365)>10;
-
- -- 17. 显示员工的详细资料,按姓名排序
- SELECT * FROM emp
- ORDER BY ename;
- -- 18. 显示员工的姓名和受雇日期,根据其服务年限,将最老的员工排在最前面
- SELECT ename,hiredate FROM emp
- ORDER BY hiredate;
- -- 19. 显示所有的员工的姓名,工作和薪金,按工作降序排序,若工作相同则按薪金排序
- SELECT ename,job,sal FROM emp
- ORDER BY job DESC,sal;
- -- 20. 显示所有员工的姓名,加入公司的年份和月份,
- -- 按受雇日期所在月排序,若月份相同则将最早年份的员工排在最前面
- SELECT ename,CONCAT(YEAR(hiredate),'-',MONTH(hiredate))FROM emp
- ORDER BY MONTH(hiredate),YEAR(hiredate);
- -- 21. 显示在一个月为30天的情况所有员工的日薪金,忽略余数
- SELECT ename,FLOOR(sal/30) FROM emp
- WHERE LAST_DAY(hiredate) LIKE '____-__-30';
-
- -- 22. 找出在(任何年份的)2月受聘的所有员工
- SELECT * FROM emp
- WHERE hiredate LIKE '____-02-__';
-
- -- 23. 对于每个员工,显示其加入公司的天数
- SELECT ename,DATEDIFF(NOW(),hiredate) FROM emp;
- -- 24. 显示姓名字段的任何位置包含A的所有员工的姓名
- SELECT ename FROM emp
- WHERE ename LIKE '%A%';
- -- 25. 以年月日的方式显示所有员工的服务年限(大概)
- SELECT ename,
- (DATEDIFF(NOW(),hiredate)-DATEDIFF(NOW(),hiredate)%365)/365 AS '年',
- (DATEDIFF(NOW(),hiredate)%365-DATEDIFF(NOW(),hiredate)%365%31)/31 AS '月',
- DATEDIFF(NOW(),hiredate)%31 AS '天'
- FROM emp
-
- -- 或者
- SELECT ename,
- FLOOR((DATEDIFF(NOW(),hiredate)/365)) AS '年',
- FLOOR(DATEDIFF(NOW(),hiredate)%365/31) AS '月',
- DATEDIFF(NOW(),hiredate)%31 AS '天'
- FROM emp
复制代码 7.Homework07
设学校环境如下:一个系有若干个专业,每一个专业一年只招一个班,每个班有若干个学生。先要建立关于系、学生和班级的数据库,关系模式为:
班CLASS (班号classid,专业名subject,系名deptname,入学年份enrolltime,人数num)
学生STUDENT(学号studentid,姓名name,年龄age,班号classid)
系DEPARTMENT(系号departmentid,系名deptname)
试用sql语言完成下面功能:
- 建表,在定义中要求声明:
- 每个表的主外键
- deptname是唯一约束
- 学生姓名不能为空
- 插入如下数据
- -- 根据emp员工表,dept部门表,工资=薪金+佣金,写出正确的sql
- SELECT * FROM emp;
- SELECT * FROM dept;
- SELECT * FROM salgrade;
- -- 1. 列出至少有一个员工的所有部门
- SELECT DISTINCT dname FROM emp,dept
- WHERE emp.deptno=dept.deptno;
- -- 或者
- SELECT COUNT(*) AS c ,deptno
- FROM emp
- GROUP BY deptno
- HAVING c > 1;
-
- -- 2. 列出薪金比Smith多的所有员工
- -- 先查出Smith的sal
- -- 然后其他的员工的sal>smith.sal
- SELECT ename FROM emp
- WHERE sal>(SELECT sal FROM emp WHERE ename='SMITH');
-
- -- 3. 列出受雇日期晚于其直接上级的所有员工
- -- 先把emp表当做是两张表,worker , leader (自连接)
- -- 条件1. emp.hiredate>d.hiredate 条件2.emp.mgr=d.empno
- SELECT worker.ename AS '员工名',worker.hiredate AS '员工入职时间',
- leader.ename AS '上级名',leader.hiredate AS '上级入职时间'
- FROM emp AS worker, emp AS leader
- WHERE worker.mgr=leader.empno AND worker.hiredate>leader.hiredate;
- -- 4. 列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
- -- 这里因为需要显示所有部门,需要使用外连接
- SELECT dname,emp.* FROM emp RIGHT JOIN dept
- ON emp.deptno=dept.deptno ;
- -- 5. 列出所有CLERK(办事员)的姓名及其部门名称
- SELECT ename,dname FROM emp,dept
- WHERE job='CLERK' AND emp.deptno=dept.deptno;
- -- 6. 列出最低薪金大于1500的各种工作
- SELECT DISTINCT job FROM emp
- WHERE job NOT IN
- (SELECT job FROM emp
- WHERE sal <1500);
- -- 或者
- -- 查询各个部门的最低工资
- -- 使用having子句进行过滤
- SELECT MIN(sal) AS min_sal ,job
- FROM emp
- GROUP BY job
- HAVING min_sal > 1500;
-
- -- 7. 列出在部门SALES(销售部)工作的员工的姓名
- SELECT ename FROM emp,dept
- WHERE emp.deptno = dept.deptno AND dname = 'SALES';
- -- 8. 列出薪金高于公司平均薪金的所有员工
- SELECT ename FROM emp
- WHERE sal>(SELECT AVG(sal) FROM emp)
复制代码- SELECT * FROM emp;
- SELECT * FROM dept;
- SELECT * FROM salgrade;
- -- 1. 列出与SCOTT从事相同工作的所有员工
- SELECT * FROM emp
- WHERE job=(SELECT job FROM emp WHERE ename='SCOTT');
- -- 2. 列出薪金高于,在部门30工作的所有员工的薪金,的员工姓名和薪金
- -- 先查询出30号部门的最高工资
- SELECT ename ,sal FROM emp
- WHERE sal>(SELECT MAX(sal) FROM emp
- WHERE deptno = 30)
-
- -- 3. 列出在每个部门工作的员工数量,平均工资和平均服务期限
- SELECT COUNT(*) AS '员工数量',
- deptno,
- AVG(sal+IFNULL(comm,0)) AS '部门平均工资',
- AVG(DATEDIFF(NOW(),hiredate)/365) AS '平均服务期限年'
- FROM emp
- GROUP BY deptno
- -- 4. 列出所有员工的姓名,部门名称和工资
- SELECT ename,dname,sal+IFNULL(comm,0) FROM emp,dept
- WHERE emp.deptno= dept.deptno
- -- 5. 列出所有部门的详细信息和部门人数
- -- 先得到各个部门的平均人数
- SELECT dept.*, `all`
- FROM dept
- LEFT JOIN
- (SELECT COUNT(*) AS `all`,deptno
- FROM emp
- GROUP BY emp.deptno) AS temp
- ON dept.deptno=temp.deptno
-
- -- 6. 列出各种工作的最低工资
- SELECT job ,MIN(sal+IFNULL(comm,0))AS '最低工资' FROM emp
- GROUP BY job;
- -- 7. 列出MANAGER(经理)的最低薪金
- SELECT MIN(sal+IFNULL(comm,0))AS '最低工资' FROM emp
- WHERE job= 'MANAGER';
- -- 8. 列出所有员工的年工资,按年薪从低到高排序
- SELECT ename,(sal+IFNULL(comm,0))*12 AS '年工资' FROM emp
- ORDER BY (sal+IFNULL(comm,0));
复制代码- DEPARTMENT(
- 001,数学;
- 002,计算机;
- 003,计算机;
- 004,计算机;
- 005,计算机; )
复制代码 - 完成以下查询功能
- 找出所有姓李的学生
- 列出所有开设超过1个专业的系的名字
- 列出人数大于等于30的系的编号和名字
- 学校又新增了一个物理系,编号为006
- 学生张三退学,请更新相关的表
- CLASS(
- 101,软件,计算机,1995,20;
- 102,微电子,计算机,1996,30;
- 111,无机化学,化学,1995,29;
- 112,高分子化学,化学,1996,25;
- 121,统计数学,数学,1995,20;
- 131,现代语言,中文,1996,20;
- 141,国际贸易,经济,1997,30;
- 142,国际金融,经济,1996,14;
- )
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |