学习笔记6.11

来源:互联网 发布:东汉国力 知乎 编辑:程序博客网 时间:2024/06/03 21:33
select vend_name,upper(vend_name) as vend_name_upcase--变成大写from Vendorsorder by vend_name; select vend_name,lower(vend_name) as vend_name_leftfrom Vendorsorder by vend_name;select vend_name,length(vend_name) as vend_name_leftfrom Vendorsorder by vend_name;select vend_name,ltrim(vend_name) as vend_name_left--除去左边的空格from Vendorsorder by vend_name;select vend_name,soundex(vend_name) as vend_name_left--返回字符串sounedx值from Vendorsorder by vend_name;select cust_name,cust_contactfrom customerswhere cust_contact='Michael Green';select cust_name,cust_contact--找音似,这个叼from customerswhere 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(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 dual25,trunc[截断到最接近的日期,单位为天] ,返回的是日期类型   select sysdate S1,                          trunc(sysdate) S2,                 //返回当前日期,无时分秒     trunc(sysdate,'year') YEAR,        //返回当前年的1月1日,无时分秒     trunc(sysdate,'month') MONTH ,     //返回当前月的1日,无时分秒     trunc(sysdate,'day') DAY           //返回当前星期的星期天,无时分秒   from dual26,返回日期列表中最晚日期   select greatest('01-1月-04','04-1月-04','10-2月-04') from dual27.计算时间差     注: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 dual2,查找子串位置   select instr('abcfdgfdhd','fd') from dual3,字符串连接   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 dual6,返回ascii值对应的字母   select chr(97) from dual7,计算字符串长度    select length('abcdef') from dual8,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 emp2, 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 sum1,整个结果集是一个组   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 --执行结果都是null2、nvl和nvl2 空值置换函数以前单独写过 ,这里不说了3、abs 绝对值函数select abs(2.1),,abs(-2.1) from dual--执行结果都是2.14、ceil 、 floor 这两个也比较简单啦ceil 只入不舍函数floor 只舍不入函数select ceil(-2.6),ceil(2.6), floor(-2.6),floor(2.6) from dual执行结果依次为 -2 3 -3 25、round 和 trunc 又是一对有关系的函数round 按照给定精度进行舍入 两个参数,第一个代表要处理的数值,第二个代表精度,第二个参数可以省略,省略的时候默认值为0trunc 按照给定精度截取数字 两个参数,第一个代表要处理的数值,第二个代表精度,第二个参数可以省略,省略的时候默认值为0select 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.62select 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 -200select trunc(248.1,-1),trunc(-248.1,-1),trunc(248.1,-2),trunc(-248.1,-2) from dual执行结果依次为 240 -240 200 -2006、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 -19、其余的一些幂运算 、 三角函数运算的函数就不介绍了,平时的商业开发很少用到,科技工作中会比较常用吧。二、聚集函数我们需要一个表来演示相关的例子了,建一个表table_a(代表不同城市早、中、晚的气温数据,数据的合理性就先不要管了)nametimenum_morningnum_nooningnum_night哈尔滨2013-12-1421.0 11.0哈尔滨2013-12-1522.028.035.0哈尔滨2013-12-16   哈尔滨2013-12-17 36.022.0哈尔滨2013-12-1823.071.011.0北 京2013-12-1433.033.030.0北 京2013-12-1525.027.0 北 京2013-12-1631.031.012.0北 京2013-12-1744.025.031.0北 京2013-12-1824.025.023.0绥 化2013-12-1419.018.021.0绥 化2013-12-1524.024.021.0绥 化2013-12-1625.025.024.0绥 化2013-12-1724.024.031.0绥 化2013-12-1821.019.012.0 1、聚集函数中对于null的态度是 忽略举个例子看看: 我们查询一下各个城市最近5天每天早上的平均气温select name ,avg(num_morning) from table_a group by name 执行的结果是22 说明它忽略了两天为空的记录,根据三天计算的平均值执行结果:nameavg(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最高气温最低气温总和统计天数平均气温绥 化2519113522.6哈尔滨232166322北 京4424157531.43、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,3,2,1,5,4) from dual 返回值 5 1可以对数值进行比较,对字符串进行比较看完上面的例子再让我们求各个城市每天的最高气温 、最低气温是多少就很简单了,不写了注意:这两个函数对null的态度跟单值函数一样,当成未知,结果都会返回null2、coalesce 参数是一串值,返回是第一个出现的不为空的值,如果全都为空 那么返回nullselect 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.02 哈尔滨 2013-12-18 23.071.011.03 北 京 2013-12-14 33.033.030.04 北 京 2013-12-16 31.031.012.05 北 京 2013-12-17 44.025.031.06 北 京 2013-12-18 24.025.023.07 绥 化 2013-12-15 24.024.021.08 绥 化 2013-12-16 25.025.024.09 绥 化 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 totalfrom orderitems where order_num=20005;--去除相同的select avg(distinct prod_price) as nyafrom productswhere 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 numfrom productswhere vend_id='DLL01';--分组select vend_id ,count(*) as numfrom productsgroup by vend_id;--按vend_id排序并分组--group_by可以嵌套,但子句不能是聚集函数,并且必须在where之后--过滤掉<2的select cust_id,count(*) as ordersfrom ordersgroup by cust_idhaving count(*) >=2;select vend_id,count(*) as num_prodsfrom productswhere prod_price>=4group by vend_idhaving count(*)>=2;--where 过滤行,having过滤分组。select order_num,count(*) as itemsfrom orderitemsgroup by order_numhaving count(*) >= 3order by items,order_num;--select ,from ,where,group by,having,order by按顺序select order_numfrom orderitemswhere 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_contactfrom customerswhere cust_id in('1000000004','1000000005');---作为子查询的只能查询单个列。select cust_name,cust_state,(select count(*) from orders where orders.cust_id=customers.cust_id) as ordersfrom customersorder by cust_name;--天知道什么是联结--创建联结select vend_name,prod_name,prod_pricefrom vendors,productswhere vendors.vend_id=products.vend_id;select vend_name,prod_name,prod_pricefrom products,vendors;--并不懂内联联结select vend_name,prod_name,prod_pricefrom vendors inner join productson 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,quantityfrom orderitems,products,vendorswhere products.vend_id=vendors.vend_idand orderitems.prod_id=products.prod_idand order_num=20007;

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 吃错东西拉肚子怎么办 宝贝受凉吐了怎么办 宝贝胃受凉呕吐怎么办 9岁儿童拉肚子怎么办 四个月孩子拉稀怎么办 6岁儿童拉肚子怎么办 猫咪拉屎特别臭怎么办 新生儿呕奶打嗝怎么办 猫拉屎特别臭怎么办 小孩积食不拉屎怎么办 8岁儿童连拉带吐怎么办 新生儿突然喷奶怎么办? 一岁宝突然吐奶怎么办 宝宝喉咙吼吼的怎么办 奶水像清水一样怎么办 新生婴儿受凉了怎么办 小狗拉稀带血怎么办 新生儿老是喷奶怎么办 初生婴儿受凉了怎么办 婴幼儿受凉吐奶怎么办 宝宝肚子积食了怎么办 宝宝着凉发烧拉肚子怎么办 1岁拉稀水怎么办 新生儿婴儿呕奶怎么办 儿童肚子着凉拉肚子怎么办 七个月宝宝拉肚子怎么办 小孩大便果冻状怎么办 五个月婴儿拉稀怎么办 孩子老是着凉怎么办呢 五个月孩子拉肚子怎么办 肚子着凉了拉稀怎么办 小孩子着凉吐奶怎么办 儿童大便有粘液怎么办 宝宝拉鼻涕屎怎么办 婴儿拉白色粘液怎么办 宝宝不肯吃鱼肝油怎么办 婴儿不肯吃鱼肝油怎么办 宝宝吃鱼肝油吐怎么办 五个月婴儿夏天怎么办 厌奶期宝宝瘦了怎么办 二个月的宝宝不喝夜奶怎么办