posts - 9,  comments - 10,  trackbacks - 0

一、什么是SQL语言?
 
   SQL是结构化查询语言的缩写(Structure Query Language),简单的说,SQL是一种关系数据库语言,它可以访问以逻辑集的形式有序地储存在数据库的数据,这些逻辑集称为表。实际上SQL是一种计算机编程语言,但它比传统的编程语言,如,BASIC,FORTRAN等简单的多。另外SQL是关系数据库语言,了解了SQL也就理解了关系数据库,因此在整个关系数据库体系中SQL是最基础、也是最重要的部分。

 其显著的优点:

1、 它是一种非过程化的交互式语言,它对数据的处理是以集合为单位的,即每次处理一个记录集而不是每次处理一个单个记录。SQL对数据提供导航,这意味着用户在高层的数据结构上工作,而不必指定数据的存取方法。

2、 SQL是一种所有用户都可以使用的语言,这些用户包括系统管员、数据库管理员,程序开发人员,应用程序员及其它许多的终端用户,SQL可在任何Oracle产品中使用,它可以用于数据库的操作。如数据查询、修改和删除,对表进行插入、修改和删除行。控制对数据库和数据对象的存取,保证数据库的一致性和完整性。

3、 SQL是所有关系数据库的公共语言。它是世界公认的标准的关系数据库语言。用户可方便地移植用SQL语言编写的程序。ORACLE支持SQL语言的执行。ORALCE在标准SQL语言的基础上新增加了许多功能,使的它功能更加强大,使用起来更加灵活。在以后的学习中,如不特殊说明,提到的SQL指ORALCE化的SQL

1.1、 SQL与SQL*PLUS、PL/SQL几个概念的区别
   SQL*PLUS:SQL*PLUS是ORACLE提供的一个用来处理ORACLE数据和生成报表的工具,主要实现二个功能
    A、 它提供给用户与ORACLE交互式的界面,在此环境下可自由、灵活、 方便的实现ORACLE的SQL对关系数据的处理活动。
    B、 输出格式化报表
   PL/SQL:从V6开始,ORACLE实现了一种过程处理语言,称为PL/SQL,它具有与大多数其它程序设计语言相似的编程结构,它是在SQL的基础上扩充形成的,可以理解为PL/SQL=SQL+过程控制、功能扩充语句。

 1.2、其它几个需明确的常用术语
   ORACLE中的对象:
    是一个有意义的事务,可在其内部存放信息,我们常谈到的对象类型中表和视图是最常见的。
    函数:是施加于数据的操作,它改变数据的特性。
    提交:使用COMMIT语句将已修改的数据保存到数据库中。在此之前对数据库的数据修改只存在各自的缓存区内。COMMIT是将在缓存区中以修改的内容写到数据库文件中。
    回滚:ROLLBACK当为了某各个对话更改数据库之后,由于某种原因不想提交此更改,ORALCE所采取的操作,这是一个把信息恢复到更改前的操作。
    保留字:被ORACLE使用的具有特殊含义的字符,不能用做变量名。
1.3、SQL语言的组成
   1、数据定义语言  create,drop,alter
   2、数据查询语言  select
   3、数据操作语言  update,insert,delete
   4、数据控制语言  grant,revoke(撤消权限)

二、SQL语言的数据类型

    CHAR             存放定长字符数据          最长2000
    VARCHAR2        存放可变长字符数据        最长4000
    NUMBER(L,D) 存放数值数据,L代表总位数 D代表小数点后位数
    DATE             日期  范围公元前4712年1月1日到公元后4712年12月31日
    NCHAR             与CHAR类似,只不过最大长度由数据库使用的字符集决定
    BLOB              二进制大对象,最大长度4GB
    LONG              存放可变字符数据,最大为2GB
    RAW               纯二进制对象,最大长度为2000字节
    VARCHAR          目前等同于CHAR
一、字符型
    char和varchar2数据类型用来存储字符、数据, 具有比二种类型的列可以存储任何一个字符。由于Oracle的空格填充值(即在字符中尾问用空格填充时的空格值)只存储在char列中,而不存varchar2列中,所以用varchar2存数要比用char存数占用的空间少,由于这个理由, 在含varchar2列的大表在进行全表扫描比在char列中存储相同数据的表上, 进行全表扫描的数据块较少,若应用程序经常需要在含字数大表中扫描时,应存在varchar2中而不存储在char列中, 这样可改善程序的性能。但在决定使用什么数据类型时,性能不是唯一决定的因素,例如,在比较字符串的值时,希望Oracle忽略掉尾部空格, 则必须把这些值存储在char列中,因而选什么数据类型,应该关心应用程序关心的语义间的不同。
   1、char
     用来存储固定长度的字符串,在建立具有char列的表时,必须说明该列长度(以字节为单位)。列的长度1-255间,default值为1。
注意:如果指定的值比较短,则用空格填充该值固定长度,则Oracle返回一个错误信息。
   若两个char型字符串比较大小时,若两值长度不同,则在较短值中插入空格。 直到值有相同的长度。比较时,只有尾部空格数不同,其它部分相同的二个值被认为相等。
   2、varchar2
     存储可变长度的字符串,建立具有varchar2列的表时,说明该列长度(以字节为单位)。最大长度1-2000之间,对每条记录,该列的每一值都可作为可变长字段来存储,例如,一个列被说明为varchar2数据类型,长度为50,若一条特定记录中类varchar2列给出10个单字节,字符,则就在该列中存储10个字符而不最50个。 两个varchar(2)列比较值时,只须在二个值须相同的字符,且还有相同的长度时才认为相等。
   3、varchar
     目前与varchar2数据类型相同,但在Oracle未来版中,varchar数据类型可能会使用不同的比较语义,所以最好用varchar2数据类型。
二、数字型
     即number用来存储0,正负,定点数长正负浮点数。用number数据类型的数字(精度最多为38位十进制数)保证能在运行Oracle的不同系统中移值。存储在number列中的数字范围。
    说明数字列的方法:
    1)column_name number
    2)column_name number(精度,小数位数)若没有指出小数的位数,则隐含为没有小数,小数的位数范围。-84<=x<=127。

注意:若给出的小数位数是负数,则实际数被舍入到小数点左边指定的位数,如,说明为(7,-2)就意味着舍入到最接近的百位数。
三、日期型
     即date数据类型,用来存储表中的日期和时间,存储的内部有年(包括世纪)、月、日、时、分和秒。对应于世纪、年、月、日、分和秒。 输入、输出日期时,标准缺省格式,DD-MON-YY。
    如:’04-JAN-98’
    如果输入一个不 当前缺省日期格式的日期,则用带有格式掩码的函数to_date。
    如,to_date(‘november,13,1992’,’month,dd,yyyy’)dd_mon_yy则yy表示20世纪中的年。
    例31-DEC-92表示1992.12.31。
    存储时间格式(24小时):HH:MM:SS,若没有输时间,则日期字中时间取缺省值:12:00:00A.M,若没有输日期,只输入了时间,则日期部分取缺省值为当月的第一天,为了输入日期的时间部分,可以使用带有指出时间部分的格式掩码的函数to_date。如:
insert into birthdays(bname,bday) values(‘annie’,to_date(‘13-nov-32 10:56am,’dd_mov_yy nn:m i am’);
    要比较一个含有时间数据的日期,而不希望比较,则可使用函数据trunc,SQL函数sysdate返回系统的时期和时间。
四、long数据类型
   用long定义的列可以存储可变长字符数据,最多特性相同,根据式作站的可用内存量可以限制long值的长度。
long数据的使用:
   在数据字典中用long数类定义的列存储定义视图的稿文,可以在select,update语句中的set子句和insert语句的values子句中使用由long定义的列。
long和logn raw数据的限制。
   long和long raw列有许多作用,但使用它们时有限制。
   1)每个表中只允许有一个long列。
   2)long列不能出现在完整性约束中。
   3)在子句where,order by,group by或connect by以及在select语句的distinct操作符中不能使用long列。
   4)在sql函数(如substr可insert)中不能引用long列。
   5)在子查询的select中或有操作符union,onion all或minus的select中不能使用long列。
   6)sql的表达式中不能使用long列。
   7)用查询创立表时(create table...as select)或用查询插入一个表或视图(insert into...select...)时不能引用long列。
   8)不能用long数据类型说明PL/SQL程序单元的变量。
   在设计包含有long或long raw数据的一些表时,把long或long raw列放入一个表中,与它们有关的数据放入另一个表中,然后用完整性约束把二个表连起来,这样设计的结果就能使sql语句只访有关的数据,避免去读整个long或long raw数据,从而提高速度。例:为了存储有关杂志的信息(包括每篇文本的稿文),可建两个表。
五、Raw和Long Raw数据类型。
   对Oracle不能解释的数据,即在不同的系统间传输它们时不能被转换的数据可以使用数据类型Raw和Long Raw。扩充这两种数据开的目的是将它们用于二进制数和字节串。
   Raw相同于Varchar2而Long Raw相同于Long Varchar,但对Raw和Long Raw数据不进行字符集转换,对于Char,Varchar2,Logn数据。
    Oracle会自动把它们从数据字符集转换到通过参数Nls_Lang由用户会话所定的字符集,这些就是它们的不同之处。
    Oracle在Raw(Logn Raw)数据与Char数据进行互相转换时,把数据看成一个能表示成每4个二进制位为一个位图的十六进制数。
    例如,输入或显示一个字节的Raw数据。
‘11001011’时,把它看作’cb’。
    Long Raw列不可被索引,Raw可以。
六、空与不空(NULL 、NOT NULL)——另一类数据类型
     空(NULL)在PL*SQL代表另一类数据类型,它们表示缺少任何值换句话是没有数据或是无信息。空值不同于零,很小的值,空白或其它任何数据,SQL*PLUS对NULL进行特殊处理。
   PL*SQL应用这一特殊数据类型是为了正确处理SQL*PLUS中的一些函数,如平均值的统计或找最大、最小值。
   空值(NULL)的使用:IS NULL 、IS NOT NULL

三、SQL*Plus的工作环境

    SQL*Plus为用户提供了很方便的界面环境,使得用户可在SQL*Plus环境中输入、编辑和运行SQL、SQL*Plus 命令和 PL/ SQL块,也可随时获得帮助信息。
   3.1 SQL*Plus程序
      ORACLE_HOME\BIN\PLUS**w.EXE或PLUS**.EXE(区别:PLUS**.EXE  DOS环境下的PLUS)
      ORACLE_HOME:95工作站 ORAWIN95  NT服务器  ORANT 
      **代表版本号,常用的有PLUS33W.EXE、PLUS80W.EXE
   3.2 SQL*Plus的进入和退出
    1、 直接运行。EXE文件
    2、 菜单 程序|ORACLE FOR WIN95|SQL*PLUS
    3、 登录  输入:用户、口令。
   登录成功后,显示成功登录信息并出现SQL提示符  SQL>
    4、 退出  输入:EXIT
   3.3 利用SQL缓冲区进行命令编辑和运行。
    1) 输入SQL语句时可多行输入,语句以‘;’作为结束时
    2) SQL*PLUS缓冲区:运行SQL*PLUS时,ORACLE在缓冲区保留最后执行的命令,在SQL提示符下,输入斜杠“/”并输入“ENTER”,这个操作可再次执行保留在缓冲区里的SQL语句。 利用系统文本编辑器,可以对缓冲区内容进行编辑,也称全屏幕编辑。命令是:Edit
    3) 很多情况下,在输入命令时会发现输入错误,需要修改,这种情况下,使用SQL*PLUS命令行编辑器将使得输入更容易些,它可以很快的修改SQL缓冲区内的SQL语句。
           提示:在使用LIST命令,可看到*号,有*号的行即可进行编辑的当前行。
                                      SQL*PLUS行编辑命令 

编辑器命令

               

(a)ppend

填加文本到当前行尾

(c)hange/old/nes/

在当前行以新的文本代替旧的文本

(c)hange/text/

从当前行删除文本

Del

删除当前行

(i)nput text

在当前行之后填加一行

(L)ist

显示在缓冲区所有的行

(L)ist N

显示缓冲区的第N


    4)SQL*PLUS提供的一个有用的命令describe 用desc(describe)命令显示一个指定表的每一个列的定义。语法:DESC <TABLENAME>

四、SQL语言的运算符
    算术 +、-、*、/、正、负。
    字符 ||(用于连接两个字符串)例:'jack is'||'a boy'等操作。
    比较  > 、< 、=、 != (或)<>、 <=、 >=、IN、BETWEEN。。。AND、LIKE
    逻辑  not(逻辑非)、and(与)、or(或)。
    集合  union(并)、intersect(交)、minus(差)。

五、创建练习用表
   5.1 CREATE 
   功能:在数据库中定义一新表
   语法:CTEATE  TABLE  <TABLE_NAME>(
         <COLUMN_NAME  DATATYPE  NULL 说明>
         )
   例:CREATE TABLE DJ_NSRJB (
       NSRSBH  VARCHAR2(15) NOT NULL,
       NSRMC   VARCHAR2(80));
   分析:由四部分组成
    1、 CREATE  通知ORACLE 创建结构
    2、 TABLE    通知ORACLE创建对象的类型,这里指表
    3、<TABLE_NAME>  表名是唯一且合法的表名
    4、 COLUMNS 创建时需指出列名、数据类型及长度定义如有NULL说明,则在类型后做非空说明
   附:数据命名规则如下(适用于其它对象):
    1)长度在1-30个字符之间。
    2)首字符必需为字母(A-Z)。
    3)数据对象不能同已存在的名字冲突。
    A、 在数据库中表名和视图名必需唯一。
    B、   在同一张表中,列名必须是唯一。
    4)在命名中不可使用ORACLE的保留字。
   5.2   ALTER
   功能一:用来向已存在表中增加列
   语法:ALTER  TABLE  <TABLE_NAME>  ADD(<COLUMN_NAME  DATATYPE  NULL 说明>)
   例:ALTER TABLE DJ_NSRJB ADD(JLX  VARCHAR2(4),HY    VARCHAR2(4));
   分析:1)关键字 ALTER TABLE。
                2) <TABLE_NAME> 所要修改的表名。
                3)关键字 ADD 表明增加列
                4)COLUMN定义略
   功能二:用来修改已存在表中的列 修改列的宽度、重新定义空值说明。
   语法:ALTER  TABLE  <TABLE_NAME>  MODIFY(<COLUMN_NAME  DATATYPE  NULL 说明>)
   例:ALTER TABLE DJ_NSRJB MODIFY(NSRSBH  VARCHAR2(15) NOT NULL);
           ALTER TABLE DJ_NSRJB MODIFY(NSRMC   VARCHAR2(120));
   分析:
         1)关键字 ALTER TABLE
         2)〈TABLE_NAME> 所要修改的表名
         3)关键字 MODIFY 表明修改列
         4)COLUMN定义略
5.3、DROP 
   功能:从数据库中删除一个现存表。
   语法:DROP  TABLE  <TABLE_NAME>
   5.4、录入练习用表中的数据
       INSERT
       语法:INSERT INTO 〈TABLENAME〉(COL1,COL2,CL3。。。)VALUES(VAL1,VAL2,VAL2。。。);
       分析:
    1)SQL关键字INSERT INTO 和VALUES
    2)变量〈TABLENAME〉必须是数据库已存在的一个表,是准备插入数据的一个表。
    3)变量(COL1,COL2,COL3。。)指表中已存在的列
    4)值表(VAL1,VAL2,VAL2。。。)由SQL把表中每个值分配给它们相对应的列名插入数据必须在三个方面与它们的列定义相匹配数据类型必须相同。数据必须在它们特定的列大小要求范围之内数值和列必须是一一对应的(第一个值与第一个列相对应,以此类推)
    提示:在向表中插入一行数据时,如果该表中定义了不为空的列,则在每一条插入语句都必须有该列的值。
    例:INSERT INTO DJ_NSRJB(NSRSBH,NSRMC,FGKS,FGR)VALUES(‘14020010010001’,‘通达器材’,‘ZG’,HYK’);
       语法二:INSERT INTO  表名1 (列1,列2,。。。) 查询语句
      分析:一次插入多行数据
    例:INSERT INTO DJ_NSRJB (NSRSBH,NSRMC) SELECT NSRSBH,NSRMC FROM DJ_NSRJBBAK;比较单行插入,用SELECT语句的值代替VALUES子句。
练习

     1、创建第一个练习表dj_nsrjb   纳税人基本信息
         NSRSBH    VARCHAR2(15)   --纳税人识别号
         NSRMC    VARCHAR2(80)    --纳税人名称
         FGKS      VARCHAR2(4)      --分管科室
         FGR       VARCHAR2(5)      --分管人
         JJLX      VARCHAR2(3)       --经济类型(注册类型)
         ZZSNSLX  VARCHAR2(1)      --增值税纳税类型
     2、向表中增加下面的列
         HY       VARCHAR2(2)      --行业
         BZRQ     DATE             --办证日期
      3、修改表中字段NSRMC到120位长度,同时加NSRSBH约束不能为空。
      4、 修改表中字段ZZSNSLX增加缺省值‘0’  小规模
      5、 创建第二个练习用表ZSJB
      6、 插入练习数据

六、数据查询语句SELECT

    功能:SELECT命令用于从ORACLE数据库中检索数据。
    语法:SELECT 〈列名〉FROM 〈表名〉WHERE〈条件〉ORDER BY 〈列名〉
    分析:SELECT (什么?) 子句,体现用户检索的信息,表中一个或多个列的名字。如果选择多个列,列名之间必须用逗号分隔开,但最后的列名后面没有逗号,即与FROM相临的列名之间没有逗号。(必须)    FROM(哪里?)子句,正确的表名(必须)WHERE〈条件〉子句,后面跟条件ORDER BY(排序)子句,排序列
    提示:查看所有的列时,SELECT 语句使用SELECT *
    6.1 简单查询,只有必须的查询子句
    1、 查询表中部分字段的值。
       例:SELECT NSRSBH,NSRMC FROM DJ_NSRJB;
    2、 查询表中的所有字段的值。
       例:SELECT * FROM DJ_NSRJB;
    3、 消除冗余行的查询
       例:SELECT  DISTINCT NSRSBH  FROM  ZS_JB; /*有几户申报*/
       例:SELECT  DISTINCT JJLX  FROM  DJ_NSRJB; /*DJ_NSRJB表中有几种注册类型的纳税户*/
    4、 用被选择列的别名来指定显示选择结果时的列名
       例:SELECT NSRMC ‘MC‘  FROM  DJ_NSRJB;在显示结果时用MC代替NSRMC
    5、 虚表DUAL的使用(选学内容)
       DUAL用于测试函数或完成快速计算,是一个小而有用的ORACLE表,ORACLE只为其提供一行一列的内容。
SQL〉DESC DUAL;
      DUMMY     CHAR(1)
      DUAL的作用:在ORACLE的许多函数即可以用于列也可以用于常量,通过DAUL可以发现某些函数只能用于常量,在下面的列子中SELECT语句没有指明是表中的哪一行,哪一列。
      例:计算POWRE(4,3)  即4的3次方
SQL〉SELECT  POWRE(4,3)FROM DUAL;
     结果显示:64
    提示:也可以把DUAL表理解成是一块随时可用内存。
    6.2 条件查询
      比较运算符
      单值测试
           YBSE 〉1000          应补税额大于1000
           YBSE 〈1000          应补税额小于1000
           YBSE 〉= 1000         应补税额大于等于1000
           YBSE 〈=1000         应补税额小于等于1000
           YBSE 〈〉1000        应补税额不等于1000
           YBSE !=1000         应补税额不等于1000
      值列表测试(对多值测试)
      应补税额在400和1500之间的包括400和1500
       YBSE BETWEEN 400 AND 1500
      应补税额小于400和大于1500
       YBSE  NOT BETWEEN 400 AND 1500
      税种在列表(‘01‘,’02‘,’03‘)中
       SZ  IN (‘01‘,’02‘,‘03)
      税种不在列表(‘01‘,’02‘,’03‘)中
       SZ  NOT  IN (‘01‘,’02‘,‘03)
     提示:
     YBSE BETWEEN  400 AND 1500  等价于  YBSE〉= 400 AND YBSE〈=1500  SZ  IN (‘01‘,’02‘,‘03)等价于 SZ=’01‘ OR SZ=’02‘ OR SZ=’03‘  
     LIKE模式匹配
      SQL*PLUS通配符_(下划线)  表示任意一字符
      %(百分号)表示一个不确定的串
    语法: LIKE  ‘查找串’
    分析:查找串可以是字母、数字、特殊字符和SQL*PLUS通配符----百分号(%)和下划线(_)的组合。百分号代表“零或任意多个字”。下划线代表“列特定位置上的任意一个字符”----- 一个且仅一个字符。除了通配符外,查找串中所有其它字符只能表示自身,查找串放在单引号内。通过NOT和LIKE的结合使用,可以查找列值不在查找串中的行。例:  NSRMC LIKE ‘%计算机%‘       纳税人名称包括计算机的   NSRMC LIKE ‘计算机%‘         纳税人名称以计算机开头    NSRMC LIKE  NOT ‘%计算机‘   纳税人名称不以计算机结尾  NSRMC LIKE ‘_计%‘            纳税人名称第二个字是‘计’字的 
      WHERE (条件)子句
       WHERE 子句:后面跟条件,条件是由一个列名,比较操作符和比较值组成。
      例:NSRSBH = ‘1343423’    纳税人识别号等于
      YBSE>1500            应补税额大于20
      由多个条件组成复合条件,条件之间用AND 、OR组合。
      例:NSRSBH= ‘1343423’  AND YBSE〉1500 
          纳税人识别号等于‘1343423’ 而且应补税额大于1500 
          SBRQ BETWEEN ‘01-JAN-99’ AND ‘31-JAN-99’ AND YBSE〉1500    一月份申报的而且应补税额大于1500
          SZ  IN  (‘01’,‘02,’03)  AND JJLX=‘110’     税种是增值税、消费税、营业税而且注册类型是国有企业的
          NSRMC LIKE ‘计算机%‘  OR  JJLX=‘110’     纳税人名称以计算机开头或注册类型是国有企业的
    6.3排序结果表:ORDER BY
    通过在SELECT语句中增加一个ORDER BY排序子句可以控制输出的显示顺序。ORDER BY按照所要求的列值条件把结果表中的行进行排序,也可以对多个列中的行进行排序,列名用逗号分开。
     ORDER BY 〈列名〉ASC(默认)    升序方式排序
     ORDER BY 〈列名〉DESC                    降序方式排序
     多列排序ORDER BY 〈COLUMN1〉,〈COLUMN2 DESC〉,〈COLUMN3〉,。。。。。
     排序规则:较高:字母
               高:  数字(按代数值大小)
               NULL最低(大型机系统中,NULL最高)
     例:ORDER BY  SZ,NSRSBH,YBSE DESC     先按税种,纳税人识别号,再按应补额从大到小。
    6.4 学会使用五个组值函数(行函数)
     SQL是一个非过程数据访问语言,它没有IF -THEN –ELSE结构,也没有直接存储和操作临时值的机制,仅仅利用标准的SELECT- FROM –WHERE操作,它不能完成像在列中求最大、最小等一些典型的数据分析工作,SQL开发人员意识到这一点,因此该用户提供了五个组值函数:
    AVG          计算列的平均值
    SUM         计算列的总合
    MIN          显示列的最小值 
    MAX        显示列的最大值
    COUNT    统计结果表中的行数
    语法:FUNCTION(列名或单值表达式)
    提示:
    1、 需要处理的列名必须在括号之间 函数(列名)
    2、 如果使用一个函数,SELECT子句中的所有列都必须带有函数(使用GROUP BY 时例外)
    3、 对于算术表达式可以使用函数
    4、 对列中包含有NULL值时,大多数函数将忽略该值。
    详解
    AVG
    语法:AVG(列名)或AVG(DISTINCT(列名))
    提示:AVG只能处理数字类型列AVG忽略所处理列中的有NULL值的行 如列名前加上DISTINCT关键字,对于列中重复的值只处理一次NULL值示例
    1,2,3,4,NULL        结果:2。5
    1,2,3,4,0 结果:2
    例:SELECT  AVG(YBSE) FROM  ZS_JB  WHERE  ZZSNSLX=‘2’;    一般纳税人平均应补税额。
    MAX  
    语法:MAX(列名)
    提示:MAX可对所有数据类型进行操作
      当列为字符类型时,返回按ASCII排序的最大值
      当列为数值类型时,返回最大代数值
      当列为日期类型时,返回列中最大的日期值
      AVG忽略所处理列中的有NULL值的行
    例:SELECT  MAX(YBSE) FROM  ZS_JB  WHERE  ZZSNSLX=‘2’ AND SZ=‘01’;    一般纳税人增值税最大的应补税额。
    MIN(略)
    SUM
    语法:SUM(列名)
    提示:SUM只能处理数字类型列
      SUM忽略所处理列中的有NULL值的行
      如列名前加上DISTINCT关键字,对于列中重复的值只处理一次
    例:SELECT  SUM(SBSE) FROM  ZS_JB  WHERE  HZLXHRQ BETWEEN ‘01-JAN-99’ AND ‘31-JAN-99’;    一月份的入库税额。
    COUNT
    1、 返回一个表示结果表行数的整数
    SELECT COUTN(*)
    因为COUNT(*)在行一级上工作,因此有NULL域的行也统计在内
    例:SELECT COUNT(*) FROM  DJ_NSRJB  WHERE JJLX=‘110’;    国有企业的纳税户登记户数。
    2、 返回列中具有不同的值的个数
    SELECT COUNT(DISTINCT(列名))   因为它是在列一级工作。因此它将不统计NULL域
    例:SELECT COUNT(DISTINCT(JJLX)) FROM  DJ_NSRJB;  现有登记户数共有几种注册类型。
    6.5 学会使用列值函数(列函数)
    函数:SQL语言提供了许多可以直接调用的函数。
    一、字符函数。 
    1、LPAD
    格式:LPAD(char1,n[char2])
    功能:在char1的左边加上char2的字符序列,直到新的字符串长为n。
    例: LPAD('A',4,'0')='000A'
    2、RPAD
    格式:RPAD(char1,n[char2])
    功能:在char1的右边加上char2的字符序列,直到新的字符串长为n。
    例: RPAD('a',4,'0')='A000'
    3、SUBSTR
    格式: SUBSTR(char,m[,n])
    功能:从char的第m个字符开始取n个字符。
    4、LTRIM
    格式:LTRIM(char [,set])
    功能:从char的左边移去属于set字符集中的字母,直到第一个不属于set中的字符为止。set 缺省为空格。
    例:LTRIM('aac','a')='c';
    LTRIM('       c')='c';
    5、RTRIM
    格式:RTRIM(char [,set])
    功能:从char的右边移去属于set字符集中的字母,直到第一个不属于set中的字符为止。
    6、LENGTH
    格式:LENGTH(char)
    功能:返回字符串char的长度。
    二、日期函数
    1、ADD_MONTHS
    格式:ADD_MONTHS(d,n);
    功能:d日期加n个月返回的日期。
    2、LAST_DAY
    格式:LAST_DAY(d);
    功能:包含日期d的月份的最后一天。
    3、MONTHS_BETWEEN
    格式:MONTHS_BETWEEN(d1,d2)
    功能:返回d1与d2之间含有多少个月。
    三、数值函数
    1、CELL
    格式:CELL(n)
    功能:返回大于或等于n的最大整数。
    例:CELL(4.5)=5
    2、FLOOR
    格式:FLOOR(n)
    功能:返回小于或等于n的最大整数。
    例:FLOOR(-3.1)=-4
    3、ROUND
    格式:ROUND(n [,m])
    功能:返回将n舍入到小数点右边m位的值。
    例:ROUND(8.99,1)=9
    4、TRUNC
    格式:TRUNC(n[,m]
    功能:返回在m位截断的n值,当m省略时,在0位截断,m为页数,小数点左边m个数字截去。
    例:TRUNC(8.99,1)=8.9
    5、TO_CHAR
    格式:TO_CHAR(n[,fmt])
        TO_CHAR(d[,fmt])
      fmt:'Mon.dd.yyyy'
      'Day.month.dd'
      'YYYY,MM,DD'
    功能:按照fmt格式将日期型转换成varchar2型。
    6、TO_DATE
    格式:TO_DATE(char[,fmt])
    功能:按照fmt指定的日期格式将char由char型转换成日期型。
    7、TO_NUMBER
    格式:TO_NUMBER[char[,fmt])
    功能:将char由char型转换成数值型。
    四、空值替换函数 NVL
    格式:NVL(expr1,expr2)
    功能:若expr1为空则返expr2;若expr1不为空则返expr2.
    五、译码函数DECODE(选学内容)
    DECODE函数是ORACLER的SQL中功能最强的函数之一。
    格式:Decode(value,if1,then1,if2,then2,...,else)
    Value代表了表中的任意列(不论何种数据类型)或一个计算所得的任何结果,如一个日期减去另一个日期,字符列的SUBSTR函数,一个数字乘以另一个数字,等等。每一行的value均被测试。如果value等于if1,DECODE函数的结果是then1,如果value等于if2,DECODE函数的结果是then2,等等,事实上可以构造尽可能多的if/then配对。如果value不等于任何一个if值,那么DECODE函数的结果是else。每一个if和then以及else还可以是一列或者是函数或计算式的结果。 
    例:Decode(page,'1','page1','2','page2','turn to 11page') 
    6.6 学会如何解决实际问题(综合练习一)

七、数据操纵语句
    数据操纵语句执行后必须执行撤消或提交。
    撤消由 rollback 命令执行,提交由 commit 命令执行
    插入、修改、删除数据:insert、update、delete。
    一、 插入:INSERT(略)
    二、 删除:DELETE
    例:delete from bonus;
            delete from bonus where ename='SMITH';
    注意:1)删除依赖于WHERE条件所指定的范围。
                 2) 一次只能对一个表执行删除操作。
                 3) DELETE并不删除表(使用DROP删除表)。
                 4) 同INSERT一样,DELETE也能引起引用完整性问题。截断可以快速删除表中所有数据,不执行行级触发器。

                     TRUNCATE table new_dept;
    三、修改:UPDATE
    例: update bonus set comm=comm+50 where sal>2000;
    用嵌入的select语句可以修改多列。
      update bonus set(hiredate,sal)=(select hiredate,sal from emp where ename=‘SMITH’ );
    用定值修改:
      update bonus set  comm=null;
注意:insert,update,delete的主要问题是,仔细地构造where子句,使它们只影响你真正想要的行,在你提交之前,一定要仔细小心,以免操作错误。同时看看结果,执行了多少行,是否是你想要的行数(rows)。


posted on 2007-06-15 09:47 老董 阅读(3997) 评论(4)  编辑  收藏 所属分类: Oracle

FeedBack:
# re: SQL语言教程
2007-06-15 09:50 | 恋恋冬季
期待举例说明......  回复  更多评论
  
# re: SQL语言教程
2007-06-15 09:55 | 老董
别急,to be continue....  回复  更多评论
  
# re: SQL语言教程
2007-06-28 16:19 | 你好
支持,很不错的哦,
也欢迎到我博客作客:
笑一笑,十年少。
http://hexun.com/klf118/default.html   回复  更多评论
  
# re: SQL语言教程
2007-07-30 15:39 | 缘木求鱼
update bonus set(hiredate,sal)=(select hiredate,sal from emp where ename=‘SMITH’ );
这句是错的吧
update不支持这种格式,要修改多列只能一列一列的赋值  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
<2007年7月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(1)

随笔分类(9)

随笔档案(9)

文章分类(3)

文章档案(3)

友情链接

  • 恋恋冬季
  • 一个很值得收藏的关于软件测试方面的blog

搜索

  •  

积分与排名

  • 积分 - 12632
  • 排名 - 2165

最新评论

阅读排行榜

评论排行榜