2018-08-30
现在的一切,都是为了找份好工作今天学习了Oracle的多表连接,组函数,分组查询,子查询, 常用函数。
多表连接有三种类型:内连接,外连接,自连接。
--内连接也称为等值连接,也就是两张表之间有相同字段.
比如这里有二张表,stu clazz
select s.*,c.*
from stu s,clazz c
where s.id=c.sid;
select * from scott.dept,scott.emp
where scott.dept.deptno=scott.emp.deptno
and scott.emp.ename='SMITH';
--使用别名
-- 查询指定列
select d.deptno 部门编号, d.dname 部门名称, e.sal 薪资
from scott.dept d, scott.emp e
where d.deptno = e.deptno
and e.ename = 'SMITH';
--外连接
--分左外连接(在右边那个表中加入+,左边表格内容全部显示,右边没有的就是空值)
select * from scott.dept d, scott.emp e
where d.deptno = e.deptno(+);
select * from scott.dept d left outer join scott.emp e
on d.deptno = e.deptno;
--右外连接(在左边那个表中加入+,左右边表格内容全部显示,左边没有的就是空值)
select * from scott.dept d, scott.emp e
where d.deptno(+) = e.deptno;
select * from scott.dept d right outer join scott.emp e
on d.deptno = e.deptno;
--全外连接用标准方式写full outer join。
select * from scott.dept d full outer join scott.emp e
on d.deptno = e.deptno;
--注意用标准写法的时候,where 改为on
--自连接,自己和自己连接,把自己的表当成一个临时表。首先的先创建这么一个临时表,值跟原表一样:create table temp as(select * from stu);
--组函数:
count()统计数量
avg()计算平均值
sum()计算总和
min()最小值
max()最大值
--分组查询:当出现查询结果数量不一样多的时候,就会出现错误,这个时候使用分组查询。
group by
-- 如果想在分组后,还需要进行条件过滤
-- 可以使用 having 关键字,追加条件
select deptno, sum(sal)
from scott.emp
group by deptno
having sum(sal) > 10000;
-- 常见的关键字使用顺序:
-- select > from > where > group by > having > order by
--select >from>where>group by>having>order by。
--常用函数
--dual是oracle才有的临时表
select sysdate from dual;--系统时间
create table tb_test(
currdate date
);
insert into tb_test(currdate) values(to_date('2012-09-30','yyyy/mm/dd'));是2012/09/30
insert into tb_test(currdate) values(to_date('2012-09-30','yyyy-mm-dd'));也是2012/09/30
select * from tb_test;
insert into tb_test(currdate) values(to_date('2012-09-30 09:12:12','yyyy/mm/dd hh:mi:ss'));
select * from tb_test;
select sysdate from dual;
--在日期上加上或减去一个数字结果仍为日期。
select sysdate+10 from dual;
三个函数to_char\to_date\to_number
select to_date('2018-08-30','yyyy-mm-dd') from dual;--设置日期格式·
select to_char(sysdate,'yyyy-mm-dd') from dual;--设置日期字符串
select to_char(sysdate,'yyyy/mm/dd') from dual;
select to_char(sysdate,'mm/dd') from dual;
to_char函数,可以将日期转成字符串,我们可以从中拿取年、月(一般)
比如:查询某公司4月份销售总量的问题。
select to_char(1233.5566) from dual;--数字转成字符串
select to_number('1233.687') from dual;--非数字转为数字
--两个日期之间还可以进行减法
--得到相差的天数
--还可以是负数
select sysdate-to_date('2018/07/15','yyyy-mm-dd') from dual;
select sysdate - to_date('2016-08-20','yyyy-mm-dd') from dual;
select TRUNC(sysdate - to_date('2016-08-20','yyyy-mm-dd')) from dual;
select to_date('2016-08-22 14:27:00','yyyy-mm-dd hh24:mi:ss') - sysdate from dual;
--可以用数字除24来向日期中加上或减去小时。
select sysdate+2/24 from dual;
--select sysdate/24+2 from dual;(错误)
--可以用数字除24再除60来向日期中加入分钟
select sysdate+2/24/60 from dual;
--通用函数完成一些功能
--nvl函数 如果第一个参数为null,则取第二个参数
select comm from scott.emp;
select nvl(comm,0) from scott.emp;
--使用0替换null的comm,计算年收入
select ename,sal,comm,(sal + comm)*12 年收入 from scott.emp;
select ename,sal,comm,(sal + nvl(comm,0))*12 年收入 from scott.emp;
--nvl2函数 如果第一个参数为null,则取第三个参数,否则取第二个参数
select nvl2(comm,comm,0) from scott.emp;
学习完之余,看看大自然,缓解下疲劳