学习笔记6.11
2015-06-19 23:36
316 查看
select vend_name,upper(vend_name) as vend_name_upcase--变成大写 from Vendors order by vend_name; select vend_name,lower(vend_name) as vend_name_left from Vendors order by vend_name; select vend_name,length(vend_name) as vend_name_left from Vendors order by vend_name; select vend_name,ltrim(vend_name) as vend_name_left--除去左边的空格 from Vendors order by vend_name; select vend_name,soundex(vend_name) as vend_name_left--返回字符串sounedx值 from Vendors order by vend_name; select cust_name,cust_contact from customers where cust_contact='Michael Green'; select cust_name,cust_contact--找音似,这个叼 from customers where soundex(cust_contact)=soundex('Michael Green'); /*--ORACLE日期时间函数大全 -- TO_DATE格式(以时间:2007-11-02 13:45:25为例) Year: yy two digits 两位年 显示值:07 yyy three digits 三位年 显示值:007 yyyy four digits 四位年 显示值:2007 Month: mm number 两位月 显示值:11 mon abbreviated 字符集表示 显示值:11月,若是英文版,显示nov month spelled out 字符集表示 显示值:11月,若是英文版,显示november Day: dd number 当月第几天 显示值:02 ddd number 当年第几天 显示值:02 dy abbreviated 当周第几天简写 显示值:星期五,若是英文版,显示fri day spelled out 当周第几天全写 显示值:星期五,若是英文版,显示friday ddspth spelled out, ordinal twelfth Hour: hh two digits 12小时进制 显示值:01 hh24 two digits 24小时进制 显示值:13 Minute: mi two digits 60进制 显示值:45 Second: ss two digits 60进制 显示值:25 其它 Q digit 季度 显示值:4 WW digit 当年第几周 显示值:44 W digit 当月第几周 显示值:1 24小时格式下时间范围为: 0:00:00 - 23:59:59.... 12小时格式下时间范围为: 1:00:00 - 12:59:59 .... 1. 日期和字符转换函数用法(to_date,to_char) select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual; //日期转化为字符串 select to_char(sysdate,'yyyy') as nowYear from dual; //获取时间的年 select to_char(sysdate,'mm') as nowMonth from dual; //获取时间的月 select to_char(sysdate,'dd') as nowDay from dual; //获取时间的日 select to_char(sysdate,'hh24') as nowHour from dual; //获取时间的时 select to_char(sysdate,'mi') as nowMinute from dual; //获取时间的分 select to_char(sysdate,'ss') as nowSecond from dual; //获取时间的秒 select to_date('2004-05-07 13:23:44','yyyy-mm-dd hh24:mi:ss') from dual// 2. select to_char( to_date(222,'J'),'Jsp') from dual 显示Two Hundred Twenty-Two 3.求某天是星期几 select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual; 星期一 select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual; monday 设置日期语言 ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN'; 也可以这样 TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American') 4. 两个日期间的天数 select floor(sysdate - to_date('20020405','yyyymmdd')) from dual; 5. 时间为null的用法 select id, active_date from table1 UNION select 1, TO_DATE(null) from dual; 注意要用TO_DATE(null) 6.月份差 a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd') 那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。 所以,当时间需要精确的时候,觉得to_char还是必要的 7. 日期格式冲突问题 输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01' alter system set NLS_DATE_LANGUAGE = American alter session set NLS_DATE_LANGUAGE = American 或者在to_date中写 select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual; 注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多, 可查看 select * from nls_session_parameters select * from V$NLS_PARAMETERS 8. select count(*) from ( select rownum-1 rnum from all_objects where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002- 02-01','yyyy-mm-dd')+1 ) where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' ) not in ( '1', '7' ) 查找2002-02-28至2002-02-01间除星期一和七的天数 在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1/100秒, 而不是毫秒). 9. 查找月份 select months_between(to_date('01-31-1999','MM-DD-YYYY'),to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL; 1 select months_between(to_date('02-01-1999','MM-DD-YYYY'),to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL; 1.03225806451613 10. Next_day的用法 Next_day(date, day) Monday-Sunday, for format code DAY Mon-Sun, for format code DY 1-7, for format code D 11 select to_char(sysdate,'hh:mi:ss') TIME from all_objects 注意:第一条记录的TIME 与最后一行是一样的 可以建立一个函数来处理这个问题 create or replace function sys_date return date is begin return sysdate; end; select to_char(sys_date,'hh:mi:ss') from all_objects; 12.获得小时数 extract()找出日期或间隔值的字段值 SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer SQL> select sysdate ,to_char(sysdate,'hh') from dual; SYSDATE TO_CHAR(SYSDATE,'HH') -------------------- --------------------- 2003-10-13 19:35:21 07 SQL> select sysdate ,to_char(sysdate,'hh24') from dual; SYSDATE TO_CHAR(SYSDATE,'HH24') -------------------- ----------------------- 2003-10-13 19:35:21 19 13.年月日的处理 select older_date, newer_date, years, months, abs( trunc( newer_date- add_months( older_date,years*12+months ) ) ) days from ( select trunc(months_between( newer_date, older_date )/12) YEARS, mod(trunc(months_between( newer_date, older_date )),12 ) MONTHS, newer_date, older_date from ( select hiredate older_date, add_months(hiredate,rownum)+rownum newer_date from emp ) ) 14.处理月份天数不定的办法 select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual 16.找出今年的天数 select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual 闰年的处理方法 to_char( last_day( to_date('02' | | :year,'mmyyyy') ), 'dd' ) 如果是28就不是闰年 17.yyyy与rrrr的区别 'YYYY99 TO_C ------- ---- yyyy 99 0099 rrrr 99 1999 yyyy 01 0001 rrrr 01 2001 18.不同时区的处理 select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate from dual; 19.5秒钟一个间隔 Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS') from dual 2002-11-1 9:55:00 35786 SSSSS表示5位秒数 20.一年的第几天 select TO_CHAR(SYSDATE,'DDD'),sysdate from dual 310 2002-11-6 10:03:51 21.计算小时,分,秒,毫秒 select Days, A, TRUNC(A*24) Hours, TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes, TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds, TRUNC 4000 (A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds from ( select trunc(sysdate) Days, sysdate - trunc(sysdate) A from dual ) select * from tabname order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss'); // floor((date2-date1) /365) 作为年 floor((date2-date1, 365) /30) 作为月 d(mod(date2-date1, 365), 30)作为日. 23.next_day函数 返回下个星期的日期,day为1-7或星期日-星期六,1表示星期日 next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。 1 2 3 4 5 6 7 日 一 二 三 四 五 六 --------------------------------------------------------------- select (sysdate-to_date('2003-12-03 12:55:45','yyyy-mm-dd hh24:mi:ss'))*24*60*60 from ddual 日期 返回的是天 然后 转换为ss 24,round[舍入到最接近的日期](day:舍入到最接近的星期日) select sysdate S1, round(sysdate) S2 , round(sysdate,'year') YEAR, round(sysdate,'month') MONTH , round(sysdate,'day') DAY from dual 25,trunc[截断到最接近的日期,单位为天] ,返回的是日期类型 select sysdate S1, trunc(sysdate) S2, //返回当前日期,无时分秒 trunc(sysdate,'year') YEAR, //返回当前年的1月1日,无时分秒 trunc(sysdate,'month') MONTH , //返回当前月的1日,无时分秒 trunc(sysdate,'day') DAY //返回当前星期的星期天,无时分秒 from dual 26,返回日期列表中最晚日期 select greatest('01-1月-04','04-1月-04','10-2月-04') from dual 27.计算时间差 注:oracle时间差是以天数为单位,所以换算成年月,日 select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))/365) as spanYears from dual //时间差-年 select ceil(moths_between(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))) as spanMonths from dual //时间差-月 select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))) as spanDays from dual //时间差-天 select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24) as spanHours from dual //时间差-时 select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24*60) as spanMinutes from dual //时间差-分 select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24*60*60) as spanSeconds from dual //时间差-秒 28.更新时间 注:oracle时间加减是以天数为单位,设改变量为n,所以换算成年月,日 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n*365,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-年 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),add_months(sysdate,n) as newTime from dual //改变时间-月 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-日 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-时 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24/60,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-分 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24/60/60,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-秒 29.查找月的第一天,最后一天 SELECT Trunc(Trunc(SYSDATE, 'MONTH') - 1, 'MONTH') First_Day_Last_Month, Trunc(SYSDATE, 'MONTH') - 1 / 86400 Last_Day_Last_Month, Trunc(SYSDATE, 'MONTH') First_Day_Cur_Month, LAST_DAY(Trunc(SYSDATE, 'MONTH')) + 1 - 1 / 86400 Last_Day_Cur_Month FROM dual; 三. 字符函数(可用于字面字符或数据库列) 1,字符串截取 select substr('abcdef',1,3) from dual 2,查找子串位置 select instr('abcfdgfdhd','fd') from dual 3,字符串连接 select 'HELLO'||'hello world' from dual; 4, 1)去掉字符串中的空格 select ltrim(' abc') s1, rtrim('zhang ') s2, trim(' zhang ') s3 from dual 2)去掉前导和后缀 select trim(leading 9 from 9998767999) s1, trim(trailing 9 from 9998767999) s2, trim(9 from 9998767999) s3 from dual; 5,返回字符串首字母的Ascii值 select ascii('a') from dual 6,返回ascii值对应的字母 select chr(97) from dual 7,计算字符串长度 select length('abcdef') from dual 8,initcap(首字母变大写) ,lower(变小写),upper(变大写) select lower('ABC') s1, upper('def') s2, initcap('efg') s3 from dual; 9,Replace select replace('abc','b','xy') from dual; 10,translate select translate('abc','b','xx') from dual; -- x是1位 11,lpad [左添充] rpad [右填充](用于控制输出格式) select lpad('func',15,'=') s1, rpad('func',15,'-') s2 from dual; select lpad(dname,14,'=') from dept; 12, decode[实现if ..then 逻辑] 注:第一个是表达式,最后一个是不满足任何一个条件的值 select deptno,decode(deptno,10,'1',20,'2',30,'3','其他') from dept; 例: select seed,account_name,decode(seed,111,1000,200,2000,0) from t_userInfo//如果seed为111,则取1000;为200,取2000;其它取0 select seed,account_name,decode(sign(seed-111),1,'big seed',-1,'little seed','equal seed') from t_userInfo//如果seed>111,则显示大;为200,则显示小;其它则显 示相等 13 case[实现switch ..case 逻辑] SELECT CASE X-FIELD WHEN X-FIELD < 40 THEN 'X-FIELD 小于 40' WHEN X-FIELD < 50 THEN 'X-FIELD 小于 50' WHEN X-FIELD < 60 THEN 'X-FIELD 小于 60' ELSE 'UNBEKNOWN' END FROM DUAL 注:CASE语句在处理类似问题就显得非常灵活。当只是需要匹配少量数值时,用Decode更为简洁。 四.数字函数 1,取整函数(ceil 向上取整,floor 向下取整) select ceil(66.6) N1,floor(66.6) N2 from dual; 2, 取幂(power) 和 求平方根(sqrt) select power(3,2) N1,sqrt(9) N2 from dual; 3,求余 select mod(9,5) from dual; 4,返回固定小数位数 (round:四舍五入,trunc:直接截断) select round(66.667,2) N1,trunc(66.667,2) N2 from dual; 5,返回值的符号(正数返回为1,负数为-1) select sign(-32),sign(293) from dual; 五.转换函数 1,to_char()[将日期和数字类型转换成字符类型] 1) select to_char(sysdate) s1, to_char(sysdate,'yyyy-mm-dd') s2, to_char(sysdate,'yyyy') s3, to_char(sysdate,'yyyy-mm-dd hh12:mi:ss') s4, to_char(sysdate, 'hh24:mi:ss') s5, to_char(sysdate,'DAY') s6 from dual; 2) select sal,to_char(sal,'$99999') n1,to_char(sal,'$99,999') n2 from emp 2, to_date()[将字符类型转换为日期类型] insert into emp(empno,hiredate) values(8000,to_date('2004-10-10','yyyy-mm-dd')); 3, to_number() 转换为数字类型 select to_number(to_char(sysdate,'hh12')) from dual; //以数字显示的小时数 六.其他函数 1.user: 返回登录的用户名称 select user from dual; 2.vsize: 返回表达式所需的字节数 select vsize('HELLO') from dual; 3.nvl(ex1,ex2): ex1值为空则返回ex2,否则返回该值本身ex1(常用) 例:如果雇员没有佣金,将显示0,否则显示佣金 select comm,nvl(comm,0) from emp; 4.nullif(ex1,ex2): 值相等返空,否则返回第一个值 例:如果工资和佣金相等,则显示空,否则显示工资 select nullif(sal,comm),sal,comm from emp; 5.coalesce: 返回列表中第一个非空表达式 select comm,sal,coalesce(comm,sal,sal*10) from emp; 6.nvl2(ex1,ex2,ex3) : 如果ex1不为空,显示ex2,否则显示ex3 如:查看有佣金的雇员姓名以及他们的佣金 select nvl2(comm,ename,') as HaveCommName,comm from emp; 七.分组函数 max min avg count sum 1,整个结果集是一个组 1) 求部门30 的最高工资,最低工资,平均工资,总人数,有工作的人数,工种数量及工资总和 select max(ename),max(sal), min(ename),min(sal), avg(sal), count(*) ,count(job),count(distinct(job)) , sum(sal) from emp where deptno=30; 2, 带group by 和 having 的分组 1)按部门分组求最高工资,最低工资,总人数,有工作的人数,工种数量及工资总和 select deptno, max(ename),max(sal), min(ename),min(sal), avg(sal), count(*) ,count(job),count(distinct(job)) , sum(sal) from emp group by deptno; 2)部门30的最高工资,最低工资,总人数,有工作的人数,工种数量及工资总和 select deptno, max(ename),max(sal), min(ename),min(sal), avg(sal), count(*) ,count(job),count(distinct(job)) , sum(sal) from emp group by deptno having deptno=30; 3, stddev 返回一组值的标准偏差 select deptno,stddev(sal) from emp group by deptno; variance 返回一组值的方差差 select deptno,variance(sal) from emp group by deptno; 4, 带有rollup和cube操作符的Group By rollup 按分组的第一个列进行统计和最后的小计 cube 按分组的所有列的进行统计和最后的小计 select deptno,job ,sum(sal) from emp group by deptno,job; select deptno,job ,sum(sal) from emp group by rollup(deptno,job); cube 产生组内所有列的统计和最后的小计 select deptno,job ,sum(sal) from emp group by cube(deptno,job); 八、临时表 只在会话期间或在事务处理期间存在的表. 临时表在插入数据时,动态分配空间 create global temporary table temp_dept (dno number, dname varchar2(10)) on commit delete rows; insert into temp_dept values(10,'ABC'); commit; select * from temp_dept; --无数据显示,数据自动清除 on commit preserve rows:在会话期间表一直可以存在(保留数据) */ -- on commit delete rows:事务结束清除数据(在事务结束时自动删除表的数据) select order_num,order_date from orders where to_number(to_char(order_date,'YYYY'))=2012; select order_num--两个日期之间的2012 01 01 -2012 12 31 from orders where order_date between to_date('20120101','yyyymmdd') and to_date('20121231','yyyymmdd'); --所谓数值处理函数-------------------------------- /*主要分为三块介绍(单值函数、聚合函数、列表函数) 一、单值函数(比较简单,看一遍基本也就理解记住了) 1、基本加减乘车没有什么可说的,只需要注意一点,任何值与null一起运算 ,结果都为null,因为null代表着未知值,与null进行加减乘除运算得到的还是未知值,返回的结果还是null。 select 3+null ,3-null,3*null,3/null from dual --执行结果都是null 2、nvl和nvl2 空值置换函数 以前单独写过 ,这里不说了 3、abs 绝对值函数 select abs(2.1),,abs(-2.1) from dual--执行结果都是2.1 4、ceil 、 floor 这两个也比较简单啦 ceil 只入不舍函数 floor 只舍不入函数 select ceil(-2.6),ceil(2.6), floor(-2.6),floor(2.6) from dual 执行结果依次为 -2 3 -3 2 5、round 和 trunc 又是一对有关系的函数 round 按照给定精度进行舍入 两个参数,第一个代表要处理的数值,第二个代表精度,第二个参数可以省略,省略的时候默认值为0 trunc 按照给定精度截取数字 两个参数,第一个代表要处理的数值,第二个代表精度,第二个参数可以省略,省略的时候默认值为0 select round(2.615),round(-2.615),round(2.615,0),round(-2.615,0) ,round(2.615 ,1),round(-2.615,1),round(2.615 ,2),round(-2.615,2) from dual 执行结果依次为 3 -3 3 -32.6-2.62.62-2.62 select trunc(2.615),trunc(-2.615),trunc(2.615,0),trunc(-2.615,0) ,trunc(2.615 ,1),trunc(-2.615,1),trunc(2.615 ,2),trunc(-2.615,2) from dual 执行结果依次为1 2 -2 2 -22.6-2.62.61-2.61 注意 : round 和 trunc 这两个函数的第二个参数可以为负值,就是从小数点开始往左数 select round(248.1,-1),round(-248.1,-1),round(248.1,-2),round(-248.1,-2) from dual 执行结果依次为 250 -250 200 -200 select trunc(248.1,-1),trunc(-248.1,-1),trunc(248.1,-2),trunc(-248.1,-2) from dual 执行结果依次为 240 -240 200 -200 6、mod 取余函数 select mod(100,5),mod(22,23),mod(10,4),mod(-10,4),mod(-21.12,7),mod(100,0),mod(100,-21),mod(0,2) from dual 执行结果依次为 0 22 2 -2 -0.12 10016 0 需要注意的是数值为负值和0的情况 根据 mod(value,1) 是否等于0可以判断value值是否为整数。 7、power 和 sqrt 分别是求平方和求平方根的意思 select power(3,2),power(2,-2),SQRT(9),sqrt(0) from dual 执行结果依次为 9 0.25 3 0 需要注意的地方: sqrt是求平方根的,它就一个参数,而且必须是非负数。 oracle中 0.5可以省略成.5 今天看到.5这个字样的时候着实纠结了一会 8、sign 判断一个数值是正数 还是负数 还是0 正数返回1负数返回-1 0返回0 这个还是比较常用的 select sign(2.1),sign(0),sign(-2.1) from dual 执行结果依次为 1 0 -1 9、其余的一些幂运算 、 三角函数运算的函数就不介绍了,平时的商业开发很少用到,科技工作中会比较常用吧。 二、聚集函数 我们需要一个表来演示相关的例子了,建一个表table_a(代表不同城市早、中、晚的气温数据,数据的合理性就先不要管了) name time num_morning num_nooning num_night 哈尔滨 2013-12-14 21.0 11.0 哈尔滨 2013-12-15 22.0 28.0 35.0 哈尔滨 2013-12-16 哈尔滨 2013-12-17 36.0 22.0 哈尔滨 2013-12-18 23.0 71.0 11.0 北 京 2013-12-14 33.0 33.0 30.0 北 京 2013-12-15 25.0 27.0 北 京 2013-12-16 31.0 31.0 12.0 北 京 2013-12-17 44.0 25.0 31.0 北 京 2013-12-18 24.0 25.0 23.0 绥 化 2013-12-14 19.0 18.0 21.0 绥 化 2013-12-15 24.0 24.0 21.0 绥 化 2013-12-16 25.0 25.0 24.0 绥 化 2013-12-17 24.0 24.0 31.0 绥 化 2013-12-18 21.0 19.0 12.0 1、聚集函数中对于null的态度是 忽略 举个例子看看: 我们查询一下各个城市最近5天每天早上的平均气温 select name ,avg(num_morning) from table_a group by name 执行的结果是22 说明它忽略了两天为空的记录,根据三天计算的平均值 执行结果: name avg(num_morning) 绥 化 22.6 哈尔滨 22 北 京 31.4 再举个例子:表中有几条哈尔滨早上的气温纪录 select count(num_morning) from table_a where name ='哈尔滨'; 执行结果是3 注意:count(num_morning)可以忽略num_morning为null的数据使用count(*)就不能忽略null了 即时所有字段都为null,count(*)也不会忽略这行(起码还有rowid) 2、常用的聚合函数 max min sum avg count 平时很常用了 举个例子不多说了。 (1)、查询各个城市白天的最高气温、最低气温、总和 、统计天数、平均气温 select name, max(num_morning) 最高气温,min(num_morning) 最低气温,sum(num_morning) 总和,count(num_morning) 统计天数,avg(num_morning) 平均气温 from table_a group by name 执行结果: name 最高气温 最低气温 总和 统计天数 平均气温 绥 化 25 19 113 5 22.6 哈尔滨 23 21 66 3 22 北 京 44 24 157 5 31.4 3、stddev(标准差函数) variance(标准方差函数) 两者格式与上面的max sum等一致。 4、聚合函数中的 distinct 所有的聚合函数都有一个distinct与all选项。 distinct 表示该列有相同的值的时候只取一列。举个例子说明下: select count(distinct name),count(name),count(*),count(all name ) from table_a 执行结果: 3 15 15 15 三、列表函数 聚合函数与列表函数的区别:聚合函数是作用在多行的同一列上,组合函数是作用在一行的多个列上,很明显了吧!不明显的话下面有对应的例子,看完保证明显。 1、greatest(取多个数值的最大值) least(取多个数值的最小值) 例子: 取出 1 ,3,2,1,5,4 几个数中的最大值和最小值 select greatest(1,3,2,1,5,4),least(1 b1f3 ,3,2,1,5,4) from dual 返回值 5 1 可以对数值进行比较,对字符串进行比较 看完上面的例子再让我们求各个城市每天的最高气温 、最低气温是多少就很简单了,不写了 注意:这两个函数对null的态度跟单值函数一样,当成未知,结果都会返回null 2、coalesce 参数是一串值,返回是第一个出现的不为空的值,如果全都为空 那么返回null select coalesce(null,'','',null,'1',null) from dual 返回 1 注意:各个参数的类型必须一致。 四、运算优先级 1、符号优先级:圆括号优先级最高、其次是乘除法、再其次是加减法、当优先级相同的时候是从左向右执行。 2、and 和 or的优先级比较: and 优先级 高于 or 举个例子:查询早上气温大于中午并且早上气温大于晚上 或者 中午气温大于晚上的数据 我有两种写法: select * from table_a where num_morning>num_nooning and num_morning>num_night or num_nooning>num_night; select * from table_a where num_nooning>num_night or num_morning>num_nooning and num_morning>num_night 经测试两个sql返回结果都一样: 1 哈尔滨 2013-12-17 36.022.0 2 哈尔滨 2013-12-18 23.071.011.0 3 北 京 2013-12-14 33.033.030.0 4 北 京 2013-12-16 31.031.012.0 5 北 京 2013-12-17 44.025.031.0 6 北 京 2013-12-18 24.025.023.0 7 绥 化 2013-12-15 24.024.021.0 8 绥 化 2013-12-16 25.025.024.0 9 绥 化 2013-12-18 21.019.012.0 例子结果充分说明了and的优先级要大于or 优先级要是怕弄错的话就加括号强制先后执行就不怕了。*/ select avg(prod_price) as avg_price--平均值 from products; select count(prod_price) as price--行数 from products; select max(prod_price) as price--max min sum函数 from products; select sum(item_price*quantity) as total from orderitems where order_num=20005; --去除相同的 select avg(distinct prod_price) as nya from products where vend_id='DLL01'; --distinct必须用列名,不能用于计算或表达式 all,取全部的。 --组合 select count(*) as num_items, min(prod_price) as price_min, max(prod_price) as pricc_max, VARIANCE(prod_price) as price_var,--方差 avg(prod_price) as price_avg--不加 , from products; select count(*) as num from products where vend_id='DLL01'; --分组 select vend_id ,count(*) as num from products group by vend_id; --按vend_id排序并分组 --group_by可以嵌套,但子句不能是聚集函数,并且必须在where之后 --过滤掉<2的 select cust_id,count(*) as orders from orders group by cust_id having count(*) >=2; select vend_id,count(*) as num_prods from products where prod_price>=4 group by vend_id having count(*)>=2; --where 过滤行,having过滤分组。 select order_num,count(*) as items from orderitems group by order_num having count(*) >= 3 order by items,order_num; --select ,from ,where,group by,having,order by按顺序 select order_num from orderitems where prod_id='RGAN01'; select cust_id from orders where order_num in(select order_num from orderitems where prod_id='RGAN01'); select cust_name,cust_contact from customers where cust_id in('1000000004','1000000005');---作为子查询的只能查询单个列。 select cust_name,cust_state,(select count(*) from orders where orders.cust_id=customers.cust_id) as orders from customers order by cust_name; --天知道什么是联结 --创建联结 select vend_name,prod_name,prod_price from vendors,products where vendors.vend_id=products.vend_id; select vend_name,prod_name,prod_price from products,vendors; --并不懂内联联结 select vend_name,prod_name,prod_price from vendors inner join products on vendors.vend_id=products.vend_id; --http://www.blogjava.net/hello-syun/archive/2011/04/08/347890.html --about oracle 联结 select prod_name,vend_name,prod_price,quantity from orderitems,products,vendors where products.vend_id=vendors.vend_id and orderitems.prod_id=products.prod_id and order_num=20007;
相关文章推荐
- 宽带接入
- 无聊的6.9
- 免费馅饼
- 唯一可译码/单义代码
- 2015061907 - firebug安装和下载(3)
- 学习笔记6.9
- iOS开发- UICollectionView详解+实例
- 《3》Maven工程常见使用
- eclipse常用快捷键
- 学习笔记6.8
- Hibernate实体关系映射——双边的一对一关系
- 黑马day05 session实现防止重复提交&小案例
- Leetcode 137 Single Number II
- Binary Tree Zigzag Level Order Traversal
- GUI--Swing组件(2)
- Centos 6.5系统更改yum源为163
- 阅读笔记之《梦断代码》一
- 因特网
- 搬寝室
- Visual Studio 2012本身都是已经支持Jquery/Javascript智能提示