一 oracle的单行函数
转换函数
to_date(日期字符串,日期格式) 字符串的格式必须由第二个参数来判断
日期格式 :
年 yyyy,月mm,日dd,小时(hh12小时制,hh24 24小时制) 分钟 mi 秒 ss
举例 :select to_date('2015/03/09','yyyy/mm/dd') from dual
to_char(数字) 将数字转换成char类型
to_char(日期,日期格式) 将日期转换成char类型 日期格式 可以任意 输出的内容 根据日期的格式而定
举例 select to_char(sysdate,'hh24') 输出24小时制的当前时间的hour
to_number(字符串数字) 将字符串的数字转换成number类型
举例 to_number('123')输出数字 123
聚合函数
组函数会忽略空值。
组函数可以用于任何有效的表达式。
如:可以对数字、字符串和日期使用COUNT、MAX、MIN。
组函数会忽略空值。
避免使用 COUNT(*) ,而使用 COUNT(ROWID)
count(*|1|列名|rowid) 统计总行数
sum(列名) 求总和
max(列名) 求最大值
avg(列名) 求平均值
min(列名) 求最小值
分组(group by)
语法:
SELECT [DISTINCT] *|[列名 别名,…]
FROM 表名
[WHERE 条件]
[GROUP BY 分组条件]
[ORDER BY 列名 [ASC]|[DESC], ...];
注意:
如果查询中包含一个聚合函数,而所选择的列不在聚合函数中,那么这些列就必须出现在GROUP BY子句中。
聚合函数不能出现在WHERE子句中。
举例
id,name,dept,sal
1 test 10 100
2 test1 10 200
3 test2 20 300
4 test3 30 1000
如果按照部门分组 相同的值被分为一组 分组的结果为三组:10,20,30
分组的组的数量 也就是最终输出的结果的数量 最终的结果
dept max(sal) 其他的列 如果需要使用 必须使用聚合函数 聚合为一条记录
10 200 分组聚合 也就是找出组中 最大或者最小或者平均值 输出 最终聚合的结果只有一条记录
20 300
30 1000
select deptno,count(*) from emp group by deptno having count(*)>3;
将分组后的结果 在进行条件过滤 having中的条件必须是在列中能够出现
where 是在分组之前对数据进行过滤输出后 在分组 输出
having条件 是在分组之后 对分组的结果进行过滤输出
表关联
笛卡尔方式的连接
select e.ename,d.dname
from emp e,dept d
where e.deptno=d.deptno and ename='SMITH' order by ename;
内连接
语法:
SELECT [DISTINCT] *|[列名 别名,…]
FROM 主表名 别名
[INNER] JOIN 从表名 别名 ON 连接条件
[WHERE 条件];
列出所有连接表中与连接条件相匹配的数据行。
使用表别名,可以简化语句。
内连接分类
等值连接:在连接条件中使用等号(=)运算符来比较被连接列的列值
连接条件的列名相同时,可以使用USING (列名)来简化。
非等值连接:在连接条件中使用除等号运算符以外的其它比较运算符来比较被连接的列的列值。
!=、>、>=、<、<=、LIKE、BETWEEN AND、
内连接 是主表和从表的数据都匹配之后 输出 不匹配抛弃
A B
id name deptno deptno name
1 test 1 1 研发部
2 jiaozi 2 2 测试部
3 cherry 2
4 qian 3
select * from A a inner join B b on a.deptno=b.deptno
输出结果为
1 test 1 研发部
2 jiaozi 2 测试部
3 cherry 2测试部
4的记录因为在从表B中找不到所以被抛弃
select * from A a left join B b on a.deptno=b.deptno
1 test 1 研发部
2 jiaozi 2 测试部
3 cherry 2测试部
4 qian 3 (空)
4 的记录因为在从表B中找不到 所以只有主表的记录被输出