1、运算符
2、Order by
ASC NULL LAST
DESC NULL FIRST
混合排序:可同时指定1或多列升、降序
select depno,cityno,salary from emp
order depno,cityno,salary desc-- 仅salary降序,depno cityno默认升序
3、数据类型
字符(字母数字字符)
CHAR(n)定长字符串,忽略n默认为1
VARCHAR2(n)变长字符串,不可忽略n
数值(零、负数、正数)
NUMBER(n,m)n精度(小数点左右之和),m小数点后位数,忽略nm则n最大m为0
m输入值超过声明范围四舍五入,m为负数表示小数点左侧有多少位被四舍五入
日期
DATE日期和时间,年月日小时分种秒。可将日期值保存为文字,用''
TIMESTAMP(n)DATE扩展,增加带小数秒。n小数秒精度范围1-9,省略n默认6
TIMESTAMP(n) WITH TIME ZONE带时间标识符TIMESTAMP扩展,不能应用unique primary foreign约束
TIMESTAMP(n) WITH LOCAL TIME ZONE存储按服务器时区,显示按client时区
INTERVAL YEAR(n) TO MONTHn范围0-9,默认2,年和月定义的时间间隔,用于存储日期差值
INTERVAL DAY(n1) TO SECOND(n2)n1范围0-9,默认2,n2小数秒精度范围0-9,默认6
天、小时、分、秒定义的时间间隔,用于存储日期差值
LOB 大对象(存储在数据内)
可定义多个LOB列,不能unique primary foreign约束,
不能与DISTINCT、GROUP BY、ORDER BY、连接,能select insert delete
BLOB大规模二进制对明,如图片、视频,不需指定精度或范围,最大16TB
CLOB 大规模文本数据,不需指定精度或范围,最大16TB
NCLOB 以Unicode格式接受CLOB
BFILE 存储在数据库外的操作系统文件,只读的。当二进制处理
隐式转换
varchar2 char --> number
varchar2 char --> date
number --> varchar2
date --> varchar2
number date 不能隐式转换
显式转换
to_date('字符串','fxMonth DD,YYYY')字符串转换为日期
select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mm:ss') from dualerror
select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mi:ss') from dual字符到日期转换
to_number('字符串','') 字符串转换为数据
to_char(date|number,'format_model')日期、数据转换为字符串
select sysdate,to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’) from dual日期到字符转换
运算
日期 +- 数字 = 日期数字 +- 日期 = 日期日期 +- 日期 = 数字
select count(*) from emp
group by job---以job分组,分别计算每组的条目数
select max(sal) from emp
group by job---以job分组,每组中薪水最高的职员
select min(sal) from emp
group by job---以job分组,每组中薪水最低的职员
select avg(sal) from emp
group by job---以job分组,每组的平均薪水
select sum(sal) from emp
group by job---以job分组,每组职员总薪水
select avg(sal) "avg_sal" from emp
group by job
order by avg_sal---以job分组,每组的平均薪水,order by 须是分组函数字段
select job,avg(sal) from emp
where job not like 'PRESID%'
having avg(sal) > 1500
group by job;
order by 2
select job,avg(sal) from emp
where job not like 'PRESID%'
group by job;
having avg(sal) > 1500
order by 2
两个语句表达意思一样
0步:过滤掉PRESID%
1步:对数据行用group by以job字段分组
2步:每组用以sal字段应用avg函数
3步:用having筛选
4步:排序
count(*)含null行
count|avg|min|max|sum(exper)忽略null行
count|avg|min|max|sum column,exper ALL)等同上行,忽略null行
count|avg|min|max|sum distinct column去重
select e.empno,e.ename,e.sal,e.deptno,d.loc
from emp e,dept d
where e.deptno=d.deptno--ORACLE实现自连接方法
select country_name
from countries natural join regions
where region_name='americas'
select e.empno,e.ename,e.sal,deptno,d.loc-- 连接字段不能加表名
from emp e
join dept d
using(deptno) -- 可用多字段
select e.empno,e.ename,e.sal,e.deptno,d.loc
from emp e
join dept d
on e.deptno=d.deptno
select e.empno,e.ename,e.sal,e.deptno,d.loc
from emp e
left outer join dept d
on e.deptno=d.deptno
select e.empno,e.ename,e.sal,e.deptno,d.loc
from emp e,dept d
where e.deptno=d.deptno(+)--ORACLE实现左外连接方法
select e.empno,e.ename,e.sal,e.deptno,d.loc
from emp e
right outer join dept d
on e.deptno=d.deptno
select e.empno,e.ename,e.sal,e.deptno,d.loc
from emp e,dept d
where e.deptno(+)=d.deptno--ORACLE实现右外连接方法
select e.empno,e.ename,e.sal,e.deptno,d.loc
from emp e
full outer join dept d
on e.deptno=d.deptno
select *
from regions
cross join countries
where country_id='ca'
select country_name
from countries regions--ORACLE实现交叉连接方法
select * from tbs01
union all--返回两个查询合并结果集,按自然顺序表1行+表2行。不排序、不去重
select * from tbs02
select * from tbs01
union-- 返回两个查询的合并结果集,表1+表2,后排序并去重
select * from tbs02
select * from tbs01
intersect-- 同时出现在两个查询的结果集中,排序并删除重复行(表1表2交集,后排序去重)
select * from tbs02
select * from tbs01
minus--返回第一个结果集的行,且该行没有出现在第二个结果集,排序并删除重复行
select * from tbs02
列数量相同(列排列顺序应相同,列名可不同)、数据类型兼容(不隐性转换),输出结果用第一个查询的列名,数据类型用精度最高的
复合查询输出结果一定要排序,默认按列从左到右排序(删除重复行),可在复合查询结尾加order by,但不能在单个select中加order by
复合查询由几个查询组成,每个查询单独执行,然后合并结果集。合并运算通过排序结果集和合并它们实现。
⑴、字符函数
select upper(‘smith’) from dual转大写
select lower(‘smith’) from dual转小写
select initcap(‘hello world’) from dual单词首字母大小
select concat(‘hello’,’world’) from dual字符连接
select substr(‘hello’,1,3) from dual
源字符串 hello
第1个字符开始,截3位
INSTR('CORPORATE FLOOR','OR', 3, 2)
源字符串为'CORPORATE FLOOR',
在字符串中查找'OR',
第三个字符位置开始查找"OR",取第2个匹配项的位置
select length(‘hello’) from dual字符串长度
lpad(‘string’,n,’string1’)string1可选
lpad('tech', 7); 将返回' tech'返回string前7个字符
lpad('tech', 7, '0'); 将返回'000tech'返回string前7个字符,如不够在左边用string1填充
lpad('tech', 2); 将返回'te'返回string前2个字符
rpad
rpad('tech', 7); 将返回' tech'
rpad('tech', 7, '0'); 将返回'tech000'
rpad('tech', 2); 将返回'te'
trim
instr
select replace(‘hello’,’l’,’x’) from dual字符串替换
||连接运算符
select ename ||'年薪为:'|| (500+sal)*12 "员工的年薪"
from emp;
select firt_name || last_name “姓名” from student字符串连接
⑵、数值函数
select round(789.586,2) from dual 四舍五入,2小数位置
select trunc(789.586,2) from dual截断,2小数位置
select mod(10,3) from dual取模
⑶、日期函数
months_between(date2,date1)两个日期相减后的月数
add_months(date,6)给出日期加6个月
next-day(sysdate,’day’)给出日期的下一天
last_day(date)给出日期所在月的最后一天
sysdate当前日期
round
trunc