SQL查询2
类型转换
-- dual用于测试
select * from dual;
-- 1.字符串连接
select concat('aa','12') from dual;
select 'aa'||'12' from dual;
-- 2.首字母大写
select initcap('abc') from dual;
--- 把大写转化小写
select lower('ABc') from dual;
select upper('abc') from dual;
-- 把所有员工的姓名小写输出
select lower(e.ename),e.empno
from emp e
-- 3.填充字符lpad/rpad
select lpad('sxt',5,'*') from dual;
select rpad('sxt',5,'*') from dual;
-- 4.去掉空白字符
select ' kallen' from dual;
select ltrim(' kallen',' ') from dual;
select rtrim(' kallen ',' ') from dual;
-- trim 删除左右两边的字符
select trim('a' from 'abc') from dual;
-- 5.求子串 substr(str,loc,len)-->loc从1开始
select substr('abcd',2,2) from dual;
-- 6.查找字符串
/*
如果找到返回>=1的索引;如果没找到返回0
*/
select instr('abcd','b') from dual;
-- 7.求长度
select length('abcd') from dual;
格式化电话号码:
1)select substr('18612341234',1,3)||'-'||substr('18612341234',4,4)||'-'||substr('18612341234',8,4)from dual;
2)-- 需求:把18612341234格式化成186-1234-1234
select replace(to_char(18612341234,'999,9999,9999'),',','-') from dual;
decode(条件,值1,“返回值1”, 值2,“返回值2”,,,“默认值”)
1)-- 需求:查询员工所在的部门名称
select
e.ename,
e.deptno,
decode(e.deptno,10,'部门1',20,'部门2',30,'部门3','未知')
from emp e;
2)case when
--根据工资分布输出
select
e.ename "姓名",e.sal"工资",
case
when e.sal <1000 then '底底层'
when e.sal <2000 then '底层'
when e.sal <3000 then '办公室'
when e.sal <5000 then '白领'
when e.sal <10000 then '高层'
else'未知'
end "描述"
from emp e
order by "工资"
注意:decode 多用于等值匹配;case when可以用于等值,多用于条件分支。
分组(group by)
在处理聚合函数时,需要对数据进行数据分组可以用:
select field1,...
from tableName
group by field1[,field2,…]
注意:对数据进行分组后,select语句的字段值只能是分组字段或者聚合函数。
例子:
--部门10的人数
select count(1)
from emp e
where e.deptno = 10;
--各个部门的人数
select e.deptno,count(1)
from emp e
group by e.deptno;
--求各个部门的月收入平均值
select e.deptno,avg(e.sal+nvl(e.comm,0)) "月收入平均值"
from emp e
group by e.deptno;
多表连接:
--多表关联
select *
from emp,dept;
--等值相连
select *
from emp e,dept d
where e.deptno = d.deptno;
--不等值相连
select *
from emp e,salgrade s
where e.sal >= s.losal and e.sal <= s.hisal