`
tomrose
  • 浏览: 144531 次
  • 来自: ...
社区版块
存档分类
最新评论

pl sql的基本操作(转载)

阅读更多

 

1 SQL*Plus环境
--------------------------------------
show all 显示所有SQL*Plus的命令名字
list or l 显示缓冲区的内容
list 4 显示当前SQL命令的第4行,并把第4行作为当前行。
change or c 用新的内容替换原来在一行中第一次出现内容,例如:SQL>c/(...)/('analyst')/
input or i 增加一行或多行
append or a 在一行后追加内容
del 删除当前行 删除SQL缓冲区中的当前行
run 显示并运行SQL缓冲区中的命令
/ 运行SQL缓冲区中的命令
edit 把SQL缓冲区中的命令写到操作系统下的文本文件,
并调用操作系统提供的编辑器执行修改。
set linesize 80 设置行的大小为80个字符宽度
set pagesize 100 设置页的大小为100行
ttitle 'smaple ttitle' 设置页头标
btitle 'smaple btitle' 设置页脚标
spool /home/zxin10/myresult.log 设置sqlplus的输出到文件中
spool off(out) 停止输出文件
column column_name format a18 wrap heading ’smaple-column-title’
格式化列输出,每列宽度18个字符,超过18个自动换行,列标题换成'column-title'
CLEAR COLUMNS 将所有列的显示属性设为缺省值.


2 异常exception
--------------------------------------
no_data_found
表示select没有查询到满足条件的数据行。
others
表示Oracle预定义错误范围之外的任何错误,Oracle用这个"others"捕捉所有 未知的错误。可以使用sqlcode函数,sqlerrm函数在错误处理模块中显示错误 代码和错误信息。而且,others处理必须是一个块的最后一个错误处理,否则, others处理的优先级比较高,权利比较大,它会捕捉所有错误,包括预定义的Oracle 错误和非预定义的Oracle错误。
too_many_rows
Oracle的隐式游标,一次只能检索一行数据,使用隐式游标时,异常处理机制如果检测 到游标返回的数据是多行数据,它就抛出too_many_rows类型的异常。
dup_val_on_index
在某个索引上,出现重复值。
value_error
在某个目标字段中,放入的数据长度或者数据范围,超出目标字段定义的长度或者范围 ,如,把'8613905180088'这个字符串插入userid字段中,而userid定义为varchar2(10), 就会出现这种异常。

Exception Raised when ...
ACCESS_INTO_NULL
Your program attempts to assign values to the attributes of an uninitialized
(atomically null) object.

CASE_NOT_FOUND
None of the choices in the WHEN clauses of a CASE statement is selected, and
there is no ELSE clause.

COLLECTION_IS_NULL
Your program attempts to apply collection methods other than EXISTS to an
uninitialized (atomically null) nested table or varray, or the program attempts
to assign values to the elements of an uninitialized nested table or varray.

CURSOR_ALREADY_OPEN
Your program attempts to open an already open cursor. A cursor must be closed
before it can be reopened. A cursor FOR loop automatically opens the cursor to
which it refers. So, your program cannot open that cursor inside the loop.

DUP_VAL_ON_INDEX
Your program attempts to store duplicate values in a database column that is
constrained by a unique index.

INVALID_CURSOR
Your program attempts an illegal cursor operation such as closing an unopened cursor.

INVALID_NUMBER
In a SQL statement, the conversion of a character string into a number fails
because the string does not represent a valid number. (In procedural statements,
VALUE_ERROR is raised.) This exception is also raised when the LIMIT-clause
expression in a bulk FETCH statement does not evaluate to a positive number.

LOGIN_DENIED
Your program attempts to log on to Oracle with an invalid username and/or password.

NO_DATA_FOUND
A SELECT INTO statement returns no rows, or your program references a deleted element
in a nested table or an uninitialized element in an index-by table. SQL aggregate
functions such as AVG and SUM always return a value or a null. So, a SELECT INTO
statement that calls an aggregate function never raises NO_DATA_FOUND. The FETCH
statement is expected to return no rows eventually, so when that happens, no
exception is raised.

NOT_LOGGED_ON
Your program issues a database call without being connected to Oracle.

PROGRAM_ERROR
PL/SQL has an internal problem.

ROWTYPE_MISMATCH
The host cursor variable and PL/SQL cursor variable involved in an assignment have
incompatible return types. For example, when an open host cursor variable is passed
to a stored subprogram, the return types of the actual and formal parameters must
be compatible.

SELF_IS_NULL
Your program attempts to call a MEMBER method on a null instance. That is, the
built-in parameter SELF (which is always the first parameter passed to a MEMBER
method) is null.

STORAGE_ERROR
PL/SQL runs out of memory or memory has been corrupted.

SUBs cript_BEYOND_COUNT
Your program references a nested table or varray element using an index number
larger than the number of elements in the collection.

SUBs cript_OUTSIDE_LIMIT
Your program references a nested table or varray element using an index number
(-1 for example) that is outside the legal range.

SYS_INVALID_ROWID
The conversion of a character string into a universal rowid fails because the
character string does not represent a valid rowid.

TIMEOUT_ON_RESOURCE
A time-out occurs while Oracle is waiting for a resource.

TOO_MANY_ROWS
A SELECT INTO statement returns more than one row.

VALUE_ERROR
An arithmetic, conversion, truncation, or size-constraint error occurs. For example,
when your program selects a column value into a character variable, if the value is
longer than the declared length of the variable, PL/SQL aborts the assignment and raises
VALUE_ERROR. In procedural statements, VALUE_ERROR is raised if the conversion of a
character string into a number fails. (In SQL statements, INVALID_NUMBER is raised.)

ZERO_DIVIDE
Your program attempts to divide a number by zero.


3 连接查询
----------------------------------------
假设两个表s1cardinf,s1prefer
s1cardinf内容:
allindex
1
2
3

s1prefer内容:
allindex
2
3
4

select a.allindex,b.allindex
from s1cardinf a , s1prefer b
where a.allindex = b.allindex ;
结果:
allindex,allindex
2 2
3 3

select a.allindex,b.allindex
from s1cardinf a , s1prefer b
where a.allindex (+) = b.allindex ;
结果:
allindex,allindex
2 2
3 3
null 4

select a.allindex,b.allindex
from s1cardinf a , s1prefer b
where a.allindex = b.allindex (+) ;
结果:
allindex,allindex
1 null
2 2
3 3

 

 

 

数据操作语句:

插入:INSERT INTO TABLE(字段1,字段2....)VALUES(值1,值2....)
 一次插入只插入一行。字符和日期值需要单引号扩起。
 插入空值:
  方法一:隐示插入,插入时省略列名系统就会默认省略的列为NULL。
  方法二:显示插入,在插入时指定列的值为空。

 注:(1)值的个数不能少于列名的个数。
     (2)注意非空属性的列,不能插入空值。
WITH CHECK OPTION 视图约束。 
UID 当前数据库用户ID
  
在插入日期的时候最好用TO_DATE来控制输入格式。

可以创建一个脚本用 &变量名 的形式来用一个插入语句实现多行的插入(在值列表里用 &变量名)。

插入中的子查询:将另一个表中的内容都插入被插入的表中。
insert into sales_reps(id,name,salary)
select employee_id,last_name,salary from employees where employee_id>100;
可以在子查询中做运算后插入到被插入表中。
不要使用VALUES子句。
在子查询中的列数必须匹配 INSERT 语句中的列数。

 


删除

DELERT FROM TABLE WHERE 条件;
删除所有符合 WHERE 条件的行。

基于子查询的删除。

注意及联删除。

 


更新:
UPDATE TABLE SET 列名1=值1,列名2=值2.....WHERE 条件;
如果更新错误,要用ROLLBACK回滚。

利用子查询更新另外表中的数据,在 SET 后和 WHERE 后都可以利用子查询语句。

更新的时候要注意参照完整性约束。
子表的外键字段值必须是父表主键字段值的真子集。


 DEFAULT+‘’  默认值
在创建表的时候用,在第三个参数的位置上。
例:
CREATE TABLE A

 C1 CHAR(10) DEFAULT
  .
  .
  . 
) 
在修改的时候,如果先给DEFAULT赋值的话,
可以直接用 列名=DEFAULT,使列名回复为默认值。

 

 


MERGE语句

提供了对表根据条件进行插入或者更新的能力。
如果行存在则执行UPDATE,如果不存在则执行INSERT。

避免了单独的修改。
提高了性能,更便于使用。
对于数据库应用很有益。

语法:别名AL
MERGE INTO table_name(目的表) table_alias USING (table/view/sub_query)//数据来源(可以用子查询)  alias(别名)
on(连接条件)
WHEN MATCHED THEN UPDATE SET(关键字) (修改目的表)
目的表AL.col1=原表AL.col_var1
目的表AL.col2=原表AL.col2_var2
WHEN NOT MATCHEN THEN(关键字)
INSERT (目的表AL.COL_LIST)
VALUES(原表AL.COL_VARS);(插入原表)

create table newtable_name(新表) as select * from oldtable_name(原表) where 1=0;
 将原表中的结构复制到新表中,但具体的数据项不进行复制。

 

事务(transaction):由被逻辑组织在一起的多个DML语句的构成。
COMMIT:提交。
ROLLBACK:回滚。
SAVEPOINT:存储点,只在事务执行过程中有效,事务结束即被释放。

事务的组成:
一组相同改变特性的DML语句;
一个DDL:数据定义语句;
一个DCL:权限控制语句;


建立存储点:
例:SAVEPOINT A;
   .
 .
 .
ROLLBACK TO A;

 

事务的开始:
开始于第一个DML SQL语句执行时开始

结束的时候是在:
*、一个COMMIT或ROLLBACK被执行的时候。
*、一个DDL或DCL语句被执行(自动提交)注意*&*!(隐式)
*、用户退出SQLPLUS(隐式) 
*、系统崩溃(隐式)

语句级回滚:

ORACLE 服务器执行隐式的存储点。

 

 

 创建和管理表

对象:

表(TABLE)基本的存储单位,由行和列组成。

表名和列名(使用规则):
必须是字母开头;
必须是1-30的字符长度;
只能包括A-Z,a-z,0-9,_,$,#;
在同一个用户下不能头重名的对象;
不能是ORACLE的保留字;

创建需求
必须有:
 CREATE TABLE 权限;
 足够的存储空间;
语法:
CREATE TABLE [SCHEMA(方案).]TABLE
(COL DATATYPE [DEFAULT默认值][]);

当前用户所有的表
select table_name from user_tables;

当前用户所有的对象:
desc user_objects

当前用户对象的别名:
select * from cat;

字段类型:
 VARCHAR(size)   变长字符串类型
 CHAR(size) 定长字符串类型
 NUMBER(p,s)p位整数,s位小数  
 DATE 
 DATETIME 秒级最多可以到小数点后的9位
 TIMESTAMP 带有小数秒的日期
  TIMESTAMP WITH TIME ZONE 带时区的类型
  TIMESTAMP WITH LOCAL TIME ZONE 带时区的并会进行时区转换的类型(同一时间在不        同地区看到的时间)

 INTERVAL YEAR TO MONTH 按年和月的间隔存储的类型
  INTERVAL ‘123-2’ TEAR(3) TO MONTH
    
 INTERVAL DAY TO SECOND 按天、小时、分和秒的间隔存储的类型
  INTERVAL 
 LONG 变长的长字符串类型
 CLOB 字符类型 4GIGABYTES 
 RAW  二进制类型与CHAR对应
 LONG RAW 二进制类型与LONG对应
 BLOB
 BFILE 以文件的形式存储在操作系统中
 ROWID 表中行的唯一地址(行地址)

方案:一个用户所有对象的命名集合。

如果想访问其他用户或方案的表要加上用户或方案作为前缀。

必须指明:
 表名称;
 列名,列类型和长度;
用户表:
 被用户创建和维护的一些表;
 包括了用户自己的信息;
数据字典表:
 被ORACLE数据库创建和维护的一些表;
 包括了数据库的信息;

CTAS(子查询建表):

CREATE TABLE table_name
[(col,coltype,..)]
as subquery(子查询);

创建的表的列的数目匹配子查询的列的数目。
使用子查询的列的名字和默认值定义表。
注:
*、被创建表的字段名要遵循如果没有字段别名和子查询中没设置别名的话,使用子查询中的列名;
   如果有别名,使用别名;如果有字段列表([(col,coltype,..)]),在被创建的表中使用字段列表;
*、有字段列表与子查询的列要匹配。
*、当没有字段列表的时候,而在子查询中有表达式的时候一定要在表达式后要加上别名。 
*、只会把属性当中的非空属性复制过来,其他的比如约束条件、关联...都不会复制过来。

使用ALTER TABLE 语句可以:

*、在表中增加一个新列

语法:ALTER TABLE table add (col datatype [default],...,....);
新增加的字段一定是放在表的最后。

*、修改表字段的类型和长度

ALTER TABLE table modify (col datatype [default],...,....);
对默认值的修改只会影响到新插入的行。
如果字段下有值的话,类型的修改成功率很小(要修改数据类型,要修改的列必须为空,即没有数据项)。
CHAR类型不能修改长度。

*、删除表字段

ALTER TABLE table DROP COLUMN (COLUMN_NAME_LIST);

9I2版可以修改列名 

*、SET UNUSED 设置字段为不可用。

原理:清楚掉字典信息(撤消存储空间),不可恢复。
可以使用 SET UNUSED 选项标记一列或者多列不可用。
使用DROP SET UNUSED 选项删除被被标记为不可用的列。

语法:
ALTER TABLE table SET UNUSED (COLlist多个) 或者  ALTER TABLE table SET UNUSED COLUMN col单个;
 
ALTER TABLE table DROP UNUSED COLUMNS;

删除表:

删除关联:drop table table_name cascade;

改对象名:
 RENAME 对象原名 TO 要改的对象名;
注:
    必须是对象的所有者才能进行改名的操作。

 

截取:
不能回滚;
删除表中所有数据;
释放存储空间;
语法: 
TRUNCATE TABLE 表名称;

DELETE 也可以删除所有行,但:
可以回滚。
不释放存储空间。

 


给表加注释:COMMENT
comment on table table_name is '注释内容';

 

 


约束条件:
如果经常用到约束条件的话,最好自己命名。
当定义约束的时候可以将定义的语句作为CREATE TABLE 中的参数的一部分来完成。

表级别约束定义:
CONSTRAINT 约束名 约束条件(字段名)

约束在表上强制了规则。
如果有参照的花,约束防止表的删除。
ORACLE支持的约束条件:
NOT NULL 非空
         特点:唯一一个只能在列级定义的约束条件。                                                                           
UNIQUE 唯一
  允许有空值(空值不做比较);
 特点:当创建约束的时候,系统会自动创建对应其的索引。
PRIMARY KEY 主键
   特点:当创建约束的时候,系统会自动创建对应其的索引。
  在一个表中只允许一个主键。  
FOREIGN KEY 外键 
 外键参照的一定是主表的主键或唯一键;
 保证子表外键字段的值一定是主表中的被参照字段值的真子集;
 当主表字段被参照的时候,其值不允许被直接删除。
CONSTRAINT 约束名 FOREIGN KEY (外键字段名) REFERENCES 主表名(主表字段名);

 如果在字段列表中定义外键就可以不写 FOREIGN KEY 关键字。
 如下格式:CONSTRAINT 约束名 REFERENCES 主表名(主表字段名);


ON DELETE CASCADE  当主表的行被删除的时候,要删除子表中参照主表的行。
ALTER TABLE TABLE_NAME DROP (PK) CASCADE CONSTRAINTS;把作为主键的字段也同时删除了。

ON DELETE SET NULL 当主表的行被删除的时候,转换子表中的参照值为空。

CHECK

定义一个每行都必须满足的条件。
CREATE TABLE table_name
(
  ....
salary number(10,2),
CONSTRAINT 约束名 CHECK(SALARY>0),
  .... 
);

约束的使用:

约束的命名:给约束命名或者ORACLE服务器将使用SYS_Cn的格式为约束命名。

创建时期:

在创建表的同时或者在建表之后。

定义级别:

可以在表级定义或列级定义。

在数据字典中可以查看约束。


使用ALTER TABLE 语句:

*、添加或者删除约束条件,但是不能修改约束条件。
 就算列名上已经有约束条件,还可以继续添加约束条件的。
添加: ALTER TABLE table_name ADD [CONSTRAINT ] 约束名 约束条件(column);
删除: ALTER TABLE table_name drop constraint 约束名; 
 ALTER TABLE table_name PRIMARY KEY CASCADE;删除主键的时候,不用约束名。
*、启动或禁用约束条件
 ALTER TABLE table_name Disable constraint 约束名; 禁用
 ALTER TABLE table_name ENABLE constraint 约束名; 启用
            
*、通过MODIFY添加 NOT NULL 约束条件(因为NOT NULL为列级约束,只能用MODIFY添加)。
ALTER TABLE table_name MODIFY(col type NOT NULL);

查看约束条件:
//desc user_constraints
OWNER 拥有者;
CONSTRAINT_NAME 约束名称
CONSTRAINT_TYPE 约束类型
 
SEARCH_CONDITION  check的条件
 

select constraint_name, constraint_type,search_condition,status
from user_constraint where table_name='b';

                                         
视图 (VIEW) 一个或多个表的数据集的逻辑表示(虚表,不存储数据)。
视图不能提高查询的性能。
分类:
 简单
  数目:一个
  函数:不包含
  分组数据:不包含
  可以做DML操作
 复杂
  数目:一个或多个
  函数:包含
  分组数据:包含
  不一定能做DML操作

视图也可以用DESC描述。
 
创建视图:

CREATE [or replace(修改视图)] [force/noforce] VIEW view_name(col coltype ,.......)
as
subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY[CONSTRAINT constraint]];

USER_VIEWS 关于视图的字典

修改视图:

CREATE OR REPLACE 原视图名 (字段列表)
AS 子查询;


包含:
GROUP BY
DISTINCT
ROWNUM
不能对视图进行删除操作;

包含:
GROUP BY
DISTINCT
ROWNUM
通过表达式定义的列
不能对视图进行修改操作;

包含:
GROUP BY
DISTINCT
ROWNUM
通过表达式定义的列
在视图中没有包含基表中的 NOT NULL 列
不能对视图进行插入操作;

使用视图的原因;

为了限制对数据的访问;
为了使复杂的查询变得简单;
提供了数据的独立性;
提供了对相同数据的不同显示;

 

使用WITH CHECK OPTION 子句创建视图

创建视图时通过 WITH CHECK OPTION 子句确保执行的DML语句不会引起数据不出现在视图上。
在对视图做DML操作的时候,一定要符合WHERE子句中的条件。
CREATE OR REPLACE VIEW empvu20 as select * from employees
where check option constraint [empvu20_ck];

 

WITH READ ONLY
不可以进行DML操作;

删除视图:

DROP VIEW view_name;


行内视图:
是一个在SQL语句中使用的带有别名的子查询,该子查询放在FROM之后;
  

TOP-N:
select [col_list],rownum rank(排名)
from (select [col_list] from table_name order by top-n_col)
where rownum<=n;

序列(SEPUENCE)产生的顺序数字,单向递增或单向递减,且步长相同。

索引(INDEX)用于提高查询性能。

同义词(SYNONYM)对象的别名。
create public synonym e for hr.employees;

user_synonyms;

创建同义词要有权限,访问的时候也需要权限。

 

 

序列:

自动产生的唯一值;
一个共享的对象;
典型的用法是作为主键的值;
insert into 给主键提供值。
替代了应用的代码;
通过将序列CACHE(预先生成一部分序列号,放入到内存中)到内存中,可以加速对序列的访问。

CREATE SEQUENCE sequence_name
  [increment by n]//步长
  [start with n]//起始点
  [maxvalue n/nomaxvalue]//递增
  [minvalue n/nominvalue]//递减
  [cycle/nocycle]//循环
  [cache n/nocache];//n为预先生成序列号的个数,默认为20。

查询序列:
user_sequences
last_number 序列将要产生的下一个号是多少;

select sequence_name,min_value,max_value,increment_by last_number from user_sequences;

伪列:NEXTVAL 引用下一个可用的序列值,不同的用户每次引用都会获得一个唯一的值。
      CURRVAL 得到当前的值(刚被领走的号)。
在CURRVAL执行前必须先通过NEXTVAL得到一个初始的值。

序列名.NEXTVAL/CURRVAL
  
序列发生间隙是正常的,保证唯一即可。


序列的修改:
   ALTER SEQUENCE sequence_name 
   increment by
  maxvalue
  cycle    
  cache;

start with 不能修改。

删除序列:

drop  SEQUENCE sequence_name;

 


索引:

一个方案中的对象;
被ORACLE服务器用来加速对表的查询;
通过使用快速路径访问方法快速定位数据;
与表独立存放;
被ORACLE服务器使用和维护。

一定是 WHERE 条件的才有可能使用索引。


手动创建索引:
CREATE INDEX index_name on table_name (col_name);

考虑创建索引的情况:
*、包含了大量不同值的列;
*、包含了大量空值的列;
*、一个或者多个列经常被一起出现在 WHERE 条件中或者作为连接的条件出现;
*、表的数据量很大,而且对表的查询经常是得到表中数据的2%到4%(少量数据).


不应该创建索引的情况:
*、一个很小的表;
*、列很少被用于查询的条件;
*、表上的大多数查询是得到大量数据的;
*、表中的数据经常发生变动;
*、要被索引的列被作为条件表达式的一部分。


查看:
user_indexes得到索引的定义和唯一性。

user_ind_columns 得到索引的名称,表名和列名。
select ic.index_name,ic.column_name,ic.column_position,
 ic.uniquenes
from user_indexes ix,user_ind_columns ic
where ic.index_name=ix.index_name and ic.table_name='table_name';

删除索引:
DROP INDEX index_name;
为了删除索引,必须拥有索引或者拥有DROP ANY INDEX 权限。 

 

控制用户的访问

数据库的安全性

系统安全性:
 系统权限(system privilege),获得访问数据库的能力。
  超过一百个
  创建新用户:
   CREATE USER user_name IDENTIFIED BY password;
  删除用户
  删除表
 授予权限:
  GRANT priv_list TO user/public/role(角色);
  grant create session ,create table,create sequence to user_name;   
  在授予建砣ㄏ薜耐币灿Ω酶秤璐娲⒖占洹?BR> 分配配额:ALTER  USER user_name QUOTA nM ON space_name;

数据安全性:
 对象权限(object privilege),获得维护数据库的能力。
 
 每种对象的权限都不相同。
 对象的所有者拥有对象的所有权限。
 对象的所有者可以将自己的对象权限赋予其他人。   

 GRANT object_priv_list [(col_list)]
 ON owner.object TO user/role/public
 [WITH GRANT OPTION];--将权限授予用户的同时,该用户也拥有了授予其他用户对象权限的功能。
 (及联授予)会导致及联移除。

 移除权限:
 REVOKE priv_list/all  ON object FROM user;
 
方案:数据库对象的集合,包括表、视图、序列.....。


角色:
 CREATE ROLE role_name;
 GRANT priv_list TO role_name;
 GRANT role_name TO user_list/role_list;

修改口令:
方法 (1)ALTER USER user_name IDENTIFIED BY password;
 (2)password + 回车
 
USER_SYS_PRIVS 当前用户的系统权限。
USER_ROLE_PRIVS 当前用户的角色权限。
USER_tab_privs_made 用户对象被授予的他人的信息。

 


使用集合操作

UNION

select employee_id,job_id from employees
union
select employee_id,job_id from job_history;

两个表的并集,但不显示重复行。
执行的时候要先排序再剔重,所以结果集是有序的。

union all

也是两个表的并集,而且显示重复行。
语法同上。

intersect

select employee_id,job_id from employees
intersect
select employee_id,job_id from job_history;


minus

select employee_id,job_id from employees
minus
select employee_id,job_id from job_history;

e-j=e-e与j的交集;
j-e=j-j与e的交集;

注:
在select 列表中的表达式必须有同样的数目和类型。

 匹配 SELECT 语句
 select employee_id,job_id,salary from employees
 union
 select employee_id,job_id,0      from job_history; 

括号可以用拉修改序列的执行顺序。

ORDER BY 子句:
 只能在整个集合的最后出现;
 可以按照第一个 SELECT 语句中的列名,别名或者位置号排序。  

 

 


GROUP BY 子句的增强

CUBE 操作符的 GROUP BY

在 GROUP BY 子句中使用 ROLLUP 或者 CUBE 来产生分组小计;


ROLLUP 分组产生包括规则的分组结果和小计的结果的组合;
GROUP BY [ROLLUP](col_name_list)
ROLLUP:
a       ab abc

  abc
 ab ab
a a a
all all all

CUBE 分组产生包括 ROLLUP 产生的结果和交叉分组小计。
cube:

a ab abc

a ab abc
all a ab
 b ac
 all bc
  a
  b
  c
  all

GROUPING 函数
参数一定是在CUBE或ROLLUP里进行分组排序的字段或表达式之一。

通过1或0来判断结果集中的空值是由于本身列的值是空的,还是由于使用CUBE或ROLLUP产生的空值。
1 代表是由于分组产生的空值,没有参与分组。
0 代表是由于列本身产生的空值,参与了分组,但分组中没有包含它。

GROUPING SETS

可以使用 GROUPING SETS 在同一个语句中定义多个组集。

只需要访问一次基表。
不需要写很复杂的UNION语句。
GROUPING SETS 子句中组合的元素越多,语句的执行性能就越好。

group by GROUPING SETS((abc),(ab),(bc),(a),(b))


组合列:

是一个列的组合,在分组计算时被作为一个单元处理。

 


高级子查询

成对子查询:
行内视图的性能比成对子查询的性能高。

相关子查询:
主查询的字段在子查询里做条件(特征)。
主查询先执行,取出第一条数据,把该数据传入子查询做比较,返回查询结果给主查询,主查询根据这个结果再做查询
依次类推
直到主查询中没有可查询列为止。

 

EXISTS操作符

EXISTS 操作符测试子查询的结果是否存在;
返回 TRUE 或 FALSE
查询机制:


如果一个子查询找到了结果:

在内部子查询中不在继续执行
条件被设为TRUE

如果一个子查询没有找到结果:
条件被设为FALSE

select col_list from table_name tab_alias

where exists (select 'x' from table_name where col=tab_alias.col);
用的是相关子查询

NO EXISTS操作符

和NOT IN 相对应,速度要快,性能好。

UPDATE 中的相关子查询

update emp e
set department_name in(select d.department_name from departments d where e.department_id=d.department_id);

delete 中的相关子查询

 

 

 

 

 

 

分享到:
评论

相关推荐

    一个对数据库的操作工具PL/SQLpl/sqL工具

    一个对数据库的操作工具PL/SQL,能够对ORACLE\SQL进行很好的帮助操作!

    精通Oracle 10g SQL和PL SQL.pdf

    《精通Oracle 10g SQL和PL/SQL》SQL是关系数据库的基本操作语言,它是应用程序与数据库进行交互操作的接口。PL/SQL是Oracle特有的编程语言,它不仅具有过程编程语言的基本特征(循环、条件、分支等),而且还具有...

    PL/SQL经典介绍

    第一章 PL-SQL一览 第二章 PL-SQL基础 第三章 PL-SQL数据类型 第四章 PL-SQL的控制结构 第五章 PL-SQL集合与记录(1) 第六章 PL-SQL集合与记录(2) 第七章 PL-SQL与Oracle间交互 第八章 控制PL-SQL错误 第九章 ...

    Oracle 11g SQL和PL SQL从入门到精通〖送源代码〗

    本书是专门为Oracle应用开发人员提供的SQL和PL/SQL编程指南。通过学习本书,读者不仅可以掌握Oracle常用工具Oracle Universal Installer、Net Comfiguration Assistant、SQL Developer、SQL*Plus的作用及使用方法,...

    Oracle PL SQL程序设计 上 第五版(代码示例)

    《oracle pl/sql程序设计(第5版)》基于oracle数据库11g,从pl/sql编程、pl/sql程序结构、pl/sql程序数据、pl/sql中的sql、pl/sql应用构建、高级pl/sql主题6个方面详细系统地讨论了pl/sql以及如何有效地使用它。...

    PL/SQL 基本语句

    PL\SQL 基本语句。对于刚刚接触oracle的技术员来说非常有用

    基本SQL语句及PL/SQL语句

    SQL基本语句和PL/SQL语句,很多实例,让你一目了然

    Oracle PL SQL 程序设计第五版(chapters27and28+源码)

    《Oracle PL/SQL程序设计(第5版)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何有效地使用它。...

    Oracle PL SQL

    本书共有17章,涵盖的主要内容有:走进Oracle、认识PL/SQL、数据表的基本操作、表中数据的基本操作、数据的基本查询、查询中函数的使用、数据表的高级查询、索引及视图的使用、数据类型、流程控制、游标、存储过程和...

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(二)

     本书是专门为oracle应用开发人员提供的sql和pl/sql编程指南。通过学习本书,读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的作用及使用方法...

    pl/sql例题代码pl/sql例题代码pl/sql例题代码

    pl/sql例题代码pl/sql例题代码pl/sql例题代码

    Oracle 8i PL SQL高级程序设计

    书中全面介绍了PL/SQL语言的包、触发器、动态SQL、外部例程、对象、集合等基本概念,而且还集中讨论了Oracle8i提供的最新功能。这些新的特性包括如何使用内置包,优化策略,以及PL/SQL程序的调试技术等。 本书从以下...

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(一)

     除了为读者提供编写sql语句和开发pl/sql块的方法外,本书还为应用开发人员提供了一些常用的pl/sql系统包。通过使用这些pl/sql系统包,应用开发人员可以开发出功能更强大的数据库应用程序。本书不仅适合sql和pl/sql...

    oracle笔记pl_sql基本语法记录类型01

    oracle笔记pl_sql基本语法记录类型01,有具体的代码案例!

    pl/sql developer11.0

    pl/sql developer11.0下载 pl/sql developer11.0下载 pl/sql developer11.0下载

    Oralce数据库SQL和pl_sql实例教程

    Oralce数据库SQL和pl_sql实例教程Oralce数据库SQL和pl_sql实例教程Oralce数据库SQL和pl_sql实例教程

    pl/sql develpment 8 下载

    pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl...

    oracle pl sql 实例精解 源代码

    oracle pl sql 实例精解 oracle pl sql 实例精解 oracle pl sql 实例精解

    PL/SQL Developer 10

    plsqldev1001 oracle use tool

Global site tag (gtag.js) - Google Analytics