2019-04-13

sql练习第一周(oracle)

EXISTS的用法

EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False。

EXISTS(包括 NOT EXISTS )子句的返回值是一个BOOL值。 EXISTS内部有一个子查询语句(SELECT ... FROM...), 我将其称为EXIST的内查询语句。其内查询语句返回一个结果集。 EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值。

一种通俗的可以理解为:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。

例子:select * from TableA where exists(select 1 from TableB where TableA .ANAME=TableB.BNAME)

EXISTS与IN的使用效率的问题,通常情况下采用exists要比in效率高,因为IN不走索引。同时in中的查询值不能超过1000。

not in和not exists的区别:

not in的执行顺序是:是在表中一条记录一条记录的查询(查询每条记录)符合要求的就返回结果集,不符合的就继续查询下一条记录,直到把表中的记录查询完。也就是说为了证明找不到,所以只能查询全部记录才能证明。并没有用到索引。

not exists的执行顺序是:在表中查询,是根据索引查询的,如果存在就返回true,如果不存在就返回false,不会每条记录都去查询。

not exists查询的效率远远高与not in查询的效率。

ROWNUM的用法

oracle不支持limit,可以使用rownum分页,

select    *    from    (    select    A.*,    rownum    rn    from    ( sql的语句)A    where    rownum    >20)   

 where    rn <30

rownum不支持SQL语句中的“>、>=、=、between...and”运算符,只能用如下运算符号“<、<=、!=”,

SQL>select rownum,id,age,name from loaddata where rownum > 2;

    rownum>2,没有查询到任何记录。

    因为rownum总是从1开始的,第一条不满足去掉的话,第二条的rownum 又成了1。依此类推,所以永远没有满足条件的记录。

    可以这样理解:rownum是一个序列,是Oracle数据库从数据文件或缓冲区中读取数据的顺序。

    它取得第一条记录则rownum值为1,第二条为2。依次类推。

    当使用“>、>=、=、between...and”这些条件时,从缓冲区或数据文件中得到的第一条记录的rownum为1,不符合sql语句的条件,会被删除,接着取下条。 

    下条的rownum还会是1,又被删除,依次类推,便没有了数据。

聚合函数返回

这是聚集函数的一个特殊之处。COUNT()函数要么返回一个数字,要么返回0,而不会返回NULL; 而其它聚集函数(MAX,MIN,SUM,AVG等)对于无结果集或结果集为空值的情况下,均返回NULL。

单行函数

1、NVL(X,VALUE)

如果X为空,返回value,否则返回X

2、NVL2(x,value1,value2)

如果x非空,返回value1,否则返回value2

字符函数(常用)

ASCII(X)                                          返回字符X的ASCII码

CONCAT(X,Y)                                 连接字符串X和Y

INSTR(X,STR[,START][,N)                从X中查找str,可以指定从start开始,也可以指定从n开始

LENGTH(X)                                       返回X的长度

LOWER(X)                                        X转换成小写

UPPER(X)                                            X转换成大写

LTRIM(X[,TRIM_STR])                        把X的左边截去trim_str字符串,缺省截去空格

RTRIM(X[,TRIM_STR])                        把X的右边截去trim_str字符串,缺省截去空格

TRIM([TRIM_STR  FROM]X)                把X的两边截去trim_str字符串,缺省截去空格

REPLACE(X,old,new)                            在X中查找old,并替换成new

SUBSTR(X,start[,length])                        返回X的字串,从start处开始,截取length个字符,缺省length,默认到结尾

数字函数(常用)

1.  ROUND(X[,Y]),四舍五入。

在缺省 y 时,默认 y=0;比如:ROUND(3.56)=4。

y 是正整数,就是四舍五入到小数点后 y 位。ROUND(5.654,2)=5.65。

y 是负整数,四舍五入到小数点左边|y|位。ROUND(351.654,-2)=400。

2.  TRUNC(x[,y]),直接截取,不四舍五入。

在缺省 y 时,默认 y=0;比如:TRUNC (3.56)=3。

Y是正整数,就是四舍五入到小数点后 y 位。TRUNC (5.654,2)=5.65。

y 是负整数,四舍五入到小数点左边|y|位。TRUNC (351.654,-2)=300。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • MySQL 数据库 MySQL 教程 什么是数据库?数据库(Database)是按照数据结构来组织、存储和管理数据...
    拔萝卜_c4c8阅读 2,472评论 0 1
  • 又到周末,工作是暂告一个段落,但在E站到底特训营中的学习还在继续。今天还在受着函数的折磨,今天学习的是我最早接触的...
    我是玥阅读 1,135评论 0 0
  • # 列生成 ## 介绍 列生成算法是求解大规模整数规划问题的优化算法,其理论基础由Danzig 等于1960 年提...
    逆旅ROS阅读 3,550评论 0 0
  • 耳畔响起了林俊杰的那首歌“当你的眼睛眯着笑,当你喝可乐当你吵”是啊,当你足够优秀的时候,才有有人注意到你。而当你再...
    摘不下壳子的蜗牛阅读 3,118评论 0 2
  • 今天下午,干老师给我们上了一节手机课,我们现是下软件,现场下的哦,然后我们全都进了群,干老师的指令如下: ...
    逍遥_0455阅读 2,948评论 0 0

友情链接更多精彩内容