这篇博客本来昨天就应该发了,但是不知道为什么发不出去,所以只能今天修改一下后再发了,哎╮(╯▽╰)╭
目录
- 先做个数据准备
- 查询获得奖金的员工的信息
- 查询姓名以A、B、S开头的员工的信息
- 查询找到姓名长度为6个字符的员工的信息
- 查询姓名中不包含R字符的员工信息。
- 查询员工的信息并按工作降序工资升序排列
- 计算员工的日薪(按30天计)
- 查询拥有员工的部门的部门名和部门号
- 查询雇佣日期早于其经理雇佣日期的员工及其经理姓名
- 查询工资水平大于平均工资的员工
- 查询与部门编号为30的员工工资水平相同的员工信息
- 查询工资高于部门编号为30的部门所有员工工资水平的员工信息
- 查询部门号、部门名、部门所在位置及其每个部门的员工总数
- 计算员工的年薪并且以年薪排序
- 查询工资为第3等级的职员名字、工资、所属部门以及部门所在地
- 查询工资等级大于smith的员工的信息
- 解析一下最后一题(我是认真的!!!)
先做个数据准备
-- 创建部门表
DROP TABLE IF EXISTS dept;
CREATE TABLE dept(
-- 部门编号
deptno int PRIMARY KEY,
-- 部门名称
dname VARCHAR(14),
-- 部门所在地
loc VARCHAR(13)
);
-- 向部门表插入数据
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');
-- 创建员工表
DROP TABLE IF EXISTS emp;
CREATE TABLE emp(
-- 员工编号
empno int PRIMARY KEY,
-- 员工姓名
ename VARCHAR(10),
-- 工作岗位
job VARCHAR(9),
-- 直属领导
mgr int,
-- 入职时间
hiredate DATE,
-- 工资
sal double,
-- 奖金
comm double,
-- 所属部门
deptno int
);
-- 为员工表表添加外键约束
ALTER TABLE emp ADD CONSTRAINT FOREIGN KEY EMP(deptno) REFERENCES dept (deptno);
-- 向员工表插入数据
INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,"1980-12-17",800,NULL,20);
INSERT INTO emp VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp VALUES(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp VALUES(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp VALUES(7788,'SCOTT','ANALYST',7566,'1987-07-03',3000,NULL,20);
INSERT INTO emp VALUES(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp VALUES(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp VALUES(7876,'ADAMS','CLERK',7788,'1987-07-13',1100,NULL,20);
INSERT INTO emp VALUES(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp VALUES(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp VALUES(7934,'MILLER','CLERK',7782,'1981-01-23',1300,NULL,10);
-- 创建工资等级表
DROP TABLE IF EXISTS salgrade;
CREATE TABLE salgrade(
-- 等级
grade int,
-- 最低工资
losal double,
-- 最高工资
hisal double
);
-- 向工资等级表插入数据
INSERT INTO salgrade VALUES (1,700,1200);
INSERT INTO salgrade VALUES (2,1201,1400);
INSERT INTO salgrade VALUES (3,1401,2000);
INSERT INTO salgrade VALUES (4,2001,3000);
INSERT INTO salgrade VALUES (5,3001,9999);
查询获得奖金的员工的信息
严格意义上来说奖金为0也是不算获得奖金的,这个因人而异吧
select * from emp where comm is not null or comm != 0;
查询姓名以A、B、S开头的员工的信息
以A开头:like ‘A%’
以A结尾:like ‘%A
满足其中一个条件用or连接,同时满足用and连接’
查询找到姓名长度为6个字符的员工的信息
我觉得你们可能更加喜欢这种:
select * from emp where length(ename)=6;
查询姓名中不包含R字符的员工信息。
包含R是like ‘%R%’
查询员工的信息并按工作降序工资升序排列
排序方式(order by)默认是升序(asc),而降序是desc,两种排序之间用逗号隔开
计算员工的日薪(按30天计)
round是用于保留小数的哦~
查询拥有员工的部门的部门名和部门号
distinct用于去除重复数据,只能放在第一个查询字段的前面(注意:需要数据完全相同才能去重,如果无法理解,可以在查询字段加入员工姓名比较一下)
查询雇佣日期早于其经理雇佣日期的员工及其经理姓名
inner join内连接:说白了就是根据外链接的字段将两个表合成一个。
表名 as 别名 :可以在这次的代码中给表取另外一个名字,as是可以省略的,还有,日期是可以比较的哦(神奇吧~)
查询工资水平大于平均工资的员工
获取平均值、最大值、最小值、总数等的功能代码不能直接写在where的条件语句中
查询与部门编号为30的员工工资水平相同的员工信息
sal in ()表示sal与()内的多个sal数据中的一个相等,则获取满足条件的信息。
与=区别在于=号比较范围只有一个,而in有多个(个人理解,有误请纠正)
查询工资高于部门编号为30的部门所有员工工资水平的员工信息
大于all()表示比较的数值大于括号内的所有获取的数值,即大于其中的最大值。但是!如果满足条件的数据不存在,则会返回空。
查询部门号、部门名、部门所在位置及其每个部门的员工总数
题意:按工作进行分组(group by),后获取各分组的员工总数(count(ename))
计算员工的年薪并且以年薪排序
按什么字段排序,方法是order by 条件字段;
查询工资为第3等级的职员名字、工资、所属部门以及部门所在地
这个题目只要理清思路,将每个部分拆开作为一个单独的部分分别完成就行,本身并没有什么特别的难点。
查询工资等级大于smith的员工的信息
解析一下最后一题(我是认真的!!!)
首先我们要先理清楚题目:
查询工资等级大于smith的员工的信息
注意不要被带过去,工资等级大于smith不代表一定要用工资等级进行比较,我们完全可以先获取smith的工资等级,再通过这个工资等级获取对应等级的最大工资,最后,只要大于这个最大工资,那么获取到的员工的工资等级就大于smith的工资等级了
个人做题步骤:
未明确的条件可以先用括号括起来,然后慢慢补充
第一步:明确最终目标的实现条件(工资大于某个工资等级的最大工资)
select * from emp where sal > ();
第二步:在第一步基础上,将括号内当成独立的一题,而获取目标是第一步缺少的部分(哪个工资等级的最大工资)
select * from emp where sal > (select hisal from salgrade where grade = ());
第三步:在第二步的基础上继续当成独立的一题补充缺少的因素,代码中间缺少的因素先括号括起来,把这一步其他部分先写完(通过什么(工资)来获取这个工资等级)
select * from emp where sal > (select hisal from salgrade where grade = (select grade from salgrade where () between losal and hisal));
第四步:最后将最终缺少的部分通过已知条件获得(获取的是谁的或什么条件的工资)
select * from emp where sal > (select hisal from salgrade where grade = (select grade from salgrade where (select sal from emp where ename = ‘smith’) between losal and hisal));
如此一来,这道题就完成了!以后就算有更加复杂的相关题目,也不过是多几个相同的步骤罢了……当然了,这是一口气解题的思路,如果愿意把代码分开写,思路可能更加便于理解~
但是!我就是不想写这种思路!!!(~ ̄▽ ̄~)