|
13 | 13 | select sum(sal) from emp; |
14 | 14 | --查看表中有多少条记录 |
15 | 15 | select deptno,count(*) from emp group by deptno where count(*) >3; |
| 16 | + |
16 | 17 | --字符函数 |
17 | 18 | --concat:表示字符串的连接 等同于|| |
18 | 19 | select concat('my name is ', ename) from emp; |
@@ -53,4 +54,186 @@ select mod(-10,4) from dual; |
53 | 54 | select ceil(12.12) from dual; |
54 | 55 | --向下取整 |
55 | 56 | select floor(13.99) from dual; |
| 57 | +--取绝对值 |
| 58 | +select abs(-100) from dual; |
| 59 | +--获取正负值 |
| 60 | +select sign(-100) from dual; |
| 61 | +--x的y次幂 |
| 62 | +select power(2,3) from dual; |
| 63 | + |
| 64 | +--日期函数 |
| 65 | +select sysdate from dual; |
| 66 | +select current_date from dual; |
| 67 | +--add_months,添加指定的月份 |
| 68 | +select add_months(hiredate,2),hiredate from emp; |
| 69 | +--返回输入日期所在月份的最后一天 |
| 70 | +select last_day(sysdate) from dual; |
| 71 | +--两个日期相间隔的月份 |
| 72 | +select months_between(sysdate,hiredate) from emp; |
| 73 | +--返回四舍五入的第一天 |
| 74 | +select sysdate 当时日期, |
| 75 | +round(sysdate) 最近0点日期, |
| 76 | +round(sysdate,'day') 最近星期日, |
| 77 | +round(sysdate,'month') 最近月初, |
| 78 | +round(sysdate,'q') 最近季初日期, |
| 79 | +round(sysdate,'year') 最近年初日期 from dual; |
| 80 | +--返回下周的星期几 |
| 81 | +select next_day(sysdate,'星期一') from dual; |
| 82 | +--提取日期中的时间 |
| 83 | +select |
| 84 | +extract(hour from timestamp '2001-2-16 2:38:40 ' ) 小时, |
| 85 | +extract(minute from timestamp '2001-2-16 2:38:40 ' ) 分钟, |
| 86 | +extract(second from timestamp '2001-2-16 2:38:40 ' ) 秒, |
| 87 | +extract(DAY from timestamp '2001-2-16 2:38:40 ' ) 日, |
| 88 | +extract(MONTH from timestamp '2001-2-16 2:38:40 ' ) 月, |
| 89 | +extract(YEAR from timestamp '2001-2-16 2:38:40 ' ) 年 |
| 90 | + from dual; |
| 91 | +--返回日期的时间戳 |
| 92 | +select localtimestamp from dual; |
| 93 | +select current_date from dual; |
| 94 | +select current_timestamp from dual; |
| 95 | +--给指定的时间单位增加数值 |
| 96 | +select |
| 97 | +trunc(sysdate)+(interval '1' second), --加1秒(1/24/60/60) |
| 98 | +trunc(sysdate)+(interval '1' minute), --加1分钟(1/24/60) |
| 99 | +trunc(sysdate)+(interval '1' hour), --加1小时(1/24) |
| 100 | +trunc(sysdate)+(INTERVAL '1' DAY), --加1天(1) |
| 101 | +trunc(sysdate)+(INTERVAL '1' MONTH), --加1月 |
| 102 | +trunc(sysdate)+(INTERVAL '1' YEAR), --加1年 |
| 103 | +trunc(sysdate)+(interval '01:02:03' hour to second), --加指定小时到秒 |
| 104 | +trunc(sysdate)+(interval '01:02' minute to second), --加指定分钟到秒 |
| 105 | +trunc(sysdate)+(interval '01:02' hour to minute), --加指定小时到分钟 |
| 106 | +trunc(sysdate)+(interval '2 01:02' day to minute) --加指定天数到分钟 |
| 107 | +from dual; |
| 108 | + |
| 109 | + |
| 110 | +/* |
| 111 | +
|
| 112 | +转换函数 |
| 113 | + 在oracle中存在数值的隐式转换和显式转换 |
| 114 | + 隐式转换指的是字符串可以转换为数值或者日期 |
| 115 | +显式转换: |
| 116 | + to_char: 当由数值或者日期转成字符串的时候,必须要规定格式 |
| 117 | +*/ |
| 118 | +select '999'+10 from dual; |
| 119 | +--date :to_char |
| 120 | +select to_char(sysdate,'YYYY-MI-SS HH24:MI:SS') from dual; |
| 121 | +-- number : to_char |
| 122 | +select to_char(123.456789,'9999') from dual; |
| 123 | +select to_char(123.456789,'0000.00') from dual; |
| 124 | +select to_char(123.456789,'$0000.00') from dual; |
| 125 | +select to_char(123.456789,'L0000.00') from dual; |
| 126 | +select to_char(123456789,'999,999,999,999') from dual; |
| 127 | +--to_date:转换之后都是固定的格式 |
| 128 | +select to_date('2019/10/10 10:10:10','YYYY-MM-DD HH24:MI:SS') from dual; |
| 129 | +--to_number:转成数字 |
| 130 | +select to_number('123,456,789','999,999,999') from dual; |
| 131 | + |
| 132 | + |
| 133 | +--显示没有上级管理的公司首脑 |
| 134 | +select ename,nvl(to_char(mgr),'boss') from emp where mgr is null; |
| 135 | +--显示员工雇佣期满6个月后下一个星期五的日期 |
| 136 | +select hiredate,next_day(add_months(hiredate,6),'星期五') from emp; |
| 137 | + |
| 138 | +--条件函数 |
| 139 | +--decode,case when |
| 140 | + |
| 141 | +--给不同部门的人员涨薪,10部门涨10%,20部门涨20%,30部门涨30% |
| 142 | +select ename,sal,deptno,decode(deptno,10,sal*1.1,20,sal*1.2,30,sal*1.3) from emp; |
| 143 | +select ename, |
| 144 | + sal, |
| 145 | + deptno, |
| 146 | + case deptno |
| 147 | + when 10 then |
| 148 | + sal * 1.1 |
| 149 | + when 20 then |
| 150 | + sal * 1.2 |
| 151 | + when 30 then |
| 152 | + sal * 1.3 |
| 153 | + end |
| 154 | + from emp; |
| 155 | +------------------------------ |
| 156 | + |
| 157 | +create table test( |
| 158 | + id number(10) primary key, |
| 159 | + type number(10) , |
| 160 | + t_id number(10), |
| 161 | + value varchar2(5) |
| 162 | +); |
| 163 | +insert into test values(100,1,1,'张三'); |
| 164 | +insert into test values(200,2,1,'男'); |
| 165 | +insert into test values(300,3,1,'50'); |
| 166 | + |
| 167 | +insert into test values(101,1,2,'刘二'); |
| 168 | +insert into test values(201,2,2,'男'); |
| 169 | +insert into test values(301,3,2,'30'); |
| 170 | + |
| 171 | +insert into test values(102,1,3,'刘三'); |
| 172 | +insert into test values(202,2,3,'女'); |
| 173 | +insert into test values(302,3,3,'10'); |
| 174 | + |
| 175 | +select * from test; |
| 176 | +/* |
| 177 | +需求 |
| 178 | +将表的显示转换为 |
| 179 | +姓名 性别 年龄 |
| 180 | +--------- -------- ---- |
| 181 | +张三 男 50 |
| 182 | +*/ |
| 183 | +select decode(type, 1, value) 姓名, |
| 184 | + decode(type, 2, value) 性别, |
| 185 | + decode(type, 3, value) 年龄 |
| 186 | + from test; |
| 187 | +select min(decode(type, 1, value)) 姓名, |
| 188 | + min(decode(type, 2, value)) 性别, |
| 189 | + min(decode(type, 3, value)) 年龄 |
| 190 | + from test group by t_id; |
| 191 | + |
| 192 | +/* |
| 193 | +组函数,一般情况下,组函数都要和groupby组合使用 |
| 194 | +组函数一般用于选择列表或者having条件判断 |
| 195 | +常用的组函数有5个 |
| 196 | +avg() 平均值,只用于数值类型的数据 |
| 197 | +min() 最小值,适用于任何类型 |
| 198 | +max() 最大值,适用于任何类型 |
| 199 | +count() 记录数,处理的时候会跳过空值而处理非空值 |
| 200 | + count一般用来获取表中的记录条数,获取条数的时候可以使用*或者某一个具体的列 |
| 201 | + 甚至可以使用纯数字来代替,但是从运行效率的角度考虑,建议使用数字或者某一个具体的列 |
| 202 | + 而不要使用* |
| 203 | + |
| 204 | +sum() 求和,只适合数值类型的数据 |
| 205 | +*/ |
| 206 | +select avg(sal) from emp; |
| 207 | +select min(sal) from emp; |
| 208 | +select max(sal) from emp; |
| 209 | +select count(sal) from emp; |
| 210 | +select sum(sal) from emp; |
| 211 | +--group by,按照某些相同的值去进行分组操作 |
| 212 | +--group进行分组操作的时候,可以指定一个列或者多个列,但是当使用了groupby 之后, |
| 213 | +--选择列表中只能包含组函数的值或者group by 的普通字段 |
| 214 | +--求每个部门的平均薪水 |
| 215 | +select avg(sal) from emp group by deptno; |
| 216 | +--求平均新书大于2000的部门 |
| 217 | +select avg(sal),deptno from emp where sal is not null group by deptno having avg(sal) >2000 order by avg(sal); |
| 218 | + |
| 219 | +select count(10000) from emp; |
| 220 | +--部门下雇员的工资>2000 人数 |
| 221 | +select deptno,count(1) from emp where sal>2000 group by deptno |
| 222 | +--部门薪水最高 |
| 223 | +select deptno,max(sal) from emp group by deptno; |
| 224 | +--部门里面 工龄最小和最大的人找出来,知道姓名 |
| 225 | +select deptno,min(hiredate),max(hiredate) from emp group by deptno; |
| 226 | +select ename, deptno |
| 227 | + from emp e |
| 228 | + where hiredate in (select min(hiredate) from emp group by deptno) |
| 229 | + or hiredate in (select max(hiredate) from emp group by deptno) |
| 230 | +select * from emp |
56 | 231 |
|
| 232 | +select mm2.deptno, e1.ename, e1.hiredate |
| 233 | + from emp e1, |
| 234 | + (select min(e.hiredate) mind, max(e.hiredate) maxd, e.deptno |
| 235 | + from emp e |
| 236 | + group by e.deptno) mm2 |
| 237 | + where (e1.hiredate = mm2.mind |
| 238 | + or e1.hiredate = mm2.maxd) |
| 239 | + and e1.deptno = mm2.deptno; |
0 commit comments