emp员工表(empno 员工编号,ename 员工姓名,job 工种,mgr 上级编号,hiredate 入职日期,sal 工资,comm 奖金,deptno 部门编号)
查找出2019、2020年6、7、8月份入职的员工
select *from emp where to_char(hiredate,'yyyy')in ('2019','2020') and
to_char(hiredate,'mm') in ('06','07','08') ;
to_char(date,'format'): 将数值型或者日期型数据转换成字符串格式。
例:将时间改为指定的字符串格式:注意此处需要使用单引号
select TO_CHAR(sysdate,'YYmmDD') from dual;
to_date(char,'format'):将字符串数据类型的值转换成日期格式
例:将一字符串改为时间格式:
select TO_DATE('20150405','YYYYmmDD') from dual;
select to_date('2018-06-06 11:13:11','yyyy-mm-dd hh:mi:ss') from dual;
select to_date('1980年12月17日','yyyy"年"mm"月"dd"日"') from dual;
PS:假如日期格式中含有中文,就用双引号引起来。
查询出所有经理和销售人员的年平均工资,并按年平均工资降序排序。
select round(avg(sal*12),2) ,ename ,job from emp where job in ('MANAGER','SALESMAN')
group by job,ename order by round(avg(sal*12),2);
select job ,avg(sal)*12 avgSal from emp group by job having job in
('MANAGER','SALESMAN') group by job order by avgSal desc;
以上两个语句都可以实现
--where :对整个表的条件过滤(未分组)
--having :分组基础上的条件过滤,使用聚合函数进行过滤或者过滤分组的字段
顺序:from where group by having select order by
显示员工工资大于1000,且部门平均工资高于2000的部门号和它的平均工资,并按部门编号升序排序
select round(avg(sal),2),deptno from emp
--where sal>1000
group by deptno having round(avg(sal),2)>2000 and min (sal)>1000
order by deptno asc;
注意:用where过滤时,会过滤到工资小于1000的员工,但题目是要求显示部门号,其实就是部门平均工资高于2000并且部门的每个员工工资大于1000,如果有一个部门有两个员工一个为8000,一个为800,为800的员工会被过滤但部门号仍然会被显示。
select ename ,sal , comm, comm+sal,1,2 from emp where deptno=30;
增加字段1,2并每一行的值都为1,2
select count(1) 总人数 from emp;
select count (*) 总人数 from emp;
这两行代码运行结果一样
count(1) 在结果集新增字段1,每一行的值都为1,故依旧可以到达计算数量的效果
--多表连接:在笛卡尔积的基础上,找到表与表之间的关系进行过滤
--笛卡尔积
--A=(a,b)
--B=(1,2)
--A*B={(a,1),(a,2),(b,1),(b,2)}
emp 员工表(empno 员工编号,ename 员工姓名,job 职位,mgr 上级编号,hiredate 入职日期,
sal 工资,comm 奖金,deptno 部门编号)
dept部门表(deptno 部门编号,dname 部门名称,loc 部门地址)
salgrade工资等级表(grade 等级,losal 最低工资,hisal 最高工资)
查询员工的姓名,工资和工资等级
select ename,sal,grade from emp,salgrade where sal between losal and hisal;
losal 和 hisal 是salgrade的字段名
自连接
查出比"JONES"工资高的职工的工资、工种的情况
select e2.* from emp e1,emp e2 where e1.ename='JONES'and e2.sal > e1.sal;
e2.* 显示e2表的所有情况