oracle学习02

  • 分组函数
  • 子查询
  • 创建和管理表
  • 数据处理
  • 约束
  • 视图
  • 其他数据库对象

1.分组函数
作用于一组数据,并对一组数据返回一个值。
min、max:可以对任意数据类型。
count:count(*)可对任意数据类型;count(expr)返回不为空的记录总数。
avg、sum:可以对数值型数据。
组函数忽略空值。
在组函数中使用 nvl 函数,可以使分组函数无法忽略空值。

分组数据- group by:在select 列表中所有未包含在组函数中的列都应该包含在group by 子句中。
包含在group by 子句中的列不必包含在select 列表中。
不能在where子句中使用组函数。
可以在having子句中使用组函数,满足having 子句中的条件分组将被显示。
可以嵌套组函数。

2、子查询
原理:子查询 (内查询) 在主查询之前一次执行完成。子查询的结果被主查询(外查询)使用 。
注意:

  • 子查询要包含在括号内。
  • 将子查询放在比较条件的右侧。
  • 单行操作符对应单行子查询,多行操作符对应多行子查询。

子查询类型:根据返回是否多行数据分为 单行自查询、多行子查询。
单行子查询用法:

  • where 中使用。
  • having 中使用。
  • 使用单行比较操作符:=、>、>=、<、<=、<>

多行子查询用法:

  • 多行比较操作符:in、any、all。
  • any是任一,all是所有。用法如:< all (多行子查询)。

3、创建和管理表
常见的数据库对象:表-基本的数据存储集合,由行和列组成、视图-从表中抽出数据集合、序列-提供有规律的数值、索引-提高查询效率、同义词-给对象起别名。

oracle数据库中的表有用户定义的表,还有数据字典–oracle server自动创建的一组表。
常见数据字典有:

  • 用户定义的表:user_tables
  • 用户定义的各种数据库对象:user_objects
  • 用户定义的表、视图、同义词和序列:user_catalog
    数据类型有:
    在这里插入图片描述
    使用子查询创建表:create table name as subquery;
    使用 ALTER TABLE 语句可以:对列进行 增、删、改、赋默认值、重命名— add(column type [default expr][,…])、drop column …、modify column type [default expr][,…])、rename column … to。

删除表:drop table name。不能回滚。
清空表:truncate table name。不能回滚。(delete from name删除数据可以回滚)。
改变对象的名称:rename … to …。表、视图、序列、同义词。

4、DML-数据操纵语言-增删改
事务是由完成若干项工作的DML语句组成的。

insert into name [(...)] values ...; 

这种语法一次只能向表中插入一条数据。
字符和日期型数据应包含在单引号中。
向表中插入空值:

  • 显式方式:在VALUES 子句中指定空值-NULL
  • 隐式方式: 在列名表中省略该列的值。

插入指定的值:SYSDATE记录当前系统的日期和时间。
创建脚本:

  • 在SQL 语句中使用 & 变量指定列值。
  • & 变量放在VALUES子句中。

从其它表中拷贝数据:insert into name select …

改:

UPDATE		table
SET		column = value [, column = value, ...]
[WHERE 		condition];

可以一次更新多条数据。
如果省略 WHERE 子句,则表中的所有数据都将被更新。
在 UPDATE 语句中使用子查询。

删:

DELETE FROM	  table
[WHERE	  condition];

如果省略 WHERE 子句,则表中的全部数据将被删除

数据库事务-commit、savepoint、rollback
事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。
数据库事务由以下的部分组成:
一个或多个DML 语句
一个 DDL(Data Definition Language – 数据定义语言) 语句
一个 DCL(Data Control Language – 数据控制语言) 语句

以第一个 DML 语句的执行作为开始
以下面的其中之一作为结束:

  • COMMIT 或 ROLLBACK 语句
  • DDL 语句(自动提交)
  • 用户会话正常结束
  • 系统异常终止

回滚到保留点

  • 使用 SAVEPOINT 语句在当前事务中创建保存点。
  • 使用 ROLLBACK TO SAVEPOINT 语句回滚到创建的保存点。

自动提交在以下情况中执行:

  • DDL 语句。
  • DCL 语句。
  • 不使用 COMMIT 或 ROLLBACK 语句提交或回滚,正常结束会话。

会话异常结束或系统异常会导致自动回滚
提交或回滚前的数据状态:

  • 改变前的数据状态是可以恢复的
  • 执行 DML 操作的用户可以通过 SELECT 语句查询之前的修正
  • 其他用户不能看到当前用户所做的改变,直到当前用户结束事务。
  • DML语句所涉及到的行被锁定, 其他用户不能操作。

数据回滚后的状态:
使用 ROLLBACK 语句可使数据变化失效:

  • 数据改变被取消。
  • 修改前的数据状态被恢复。
  • 锁被释放。

5、约束

  • NOT NULL–只能在列上
  • UNIQUE–允许出现多个空值:NULL。不允许已经存在。系统会自动创建UNIQUE 索引。
  • PRIMARY KEY–不允许空值、已经存在。系统会自动创建PRIMARY KEY索引。
  • FOREIGN KEY:不允许不存在。
  • CHECK

查看约束:数据字典,from USER_CONSTRAINTS where table_name=‘xxx’;from USER_CONS_COLUMNS where table_name=‘xxx’ --查询定义约束的列
定义约束:表级–单独定义、列级–在列定义的后面
创建约束:建表同时
修改约束:建表之后

列级:

column [CONSTRAINT constraint_name] constraint_type

表级:

column,...
  [CONSTRAINT constraint_name] constraint_type
  (column, ...)

FOREIGN KEY 约束的关键字:

  • FOREIGN KEY: 在表级指定子表中的列
  • REFERENCES: 标示在父表中的列
  • ON DELETE CASCADE(级联删除): 当父表中的列被删除时,子表中相对应的列也被删除
  • ON DELETE SET NULL(级联置空): 子表中相应的列置空

添加约束的语法

  ALTER TABLE	 table
  ADD [CONSTRAINT constraint] type (column);

注意:添加 NOT NULL 约束要使用 MODIFY 语句
删除约束

ALTER TABLE      employees
DROP CONSTRAINT  emp_manager_fk;

无效化约束

ALTER TABLE		employees
DISABLE CONSTRAINT	emp_emp_id_pk;

激活约束

ALTER TABLE		employees
ENABLE CONSTRAINT	emp_emp_id_pk;

当定义或激活UNIQUE 或 PRIMARY KEY 约束时系统会自动创建UNIQUE 或 PRIMARY KEY索引

6、视图–从表中抽出的逻辑上相关的数据集合。
一种虚表,可理解为存储起来的select语句。
创建视图:

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view
  [(alias[, alias]...)]
 AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY [CONSTRAINT constraint]];

描述视图结构:DESCRIBE name;
创建视图时在子查询中给列定义别名,在选择视图中的列时应使用别名
修改视图:使用CREATE OR REPLACE VIEW 子句修改视图
注意:含有某些元素是无法对视图进行DML的增、删、改。
屏蔽DML操作:WITH READ ONLY加在创建视图语句的尾部。
删除视图:DROP VIEW name;
Top-N 分析:

SELECT [column_list], ROWNUM  
FROM   (SELECT [column_list] 
        FROM table
        ORDER  BY Top-N_column)
WHERE  ROWNUM <=  N;

7、其它数据库对象
序列 提供有规律的数值。
定义序列:

CREATE SEQUENCE sequence
       [INCREMENT BY n]  --每次增长的数值
       [START WITH n]    --从哪个值开始
       [{MAXVALUE n | NOMAXVALUE}]
       [{MINVALUE n | NOMINVALUE}]
       [{
   
   CYCLE | NOCYCLE}]     --是否需要循环
       [{CACHE n | NOCACHE}];  --是否缓存登录

查询序列:
查询数据字典视图 USER_SEQUENCES 获取序列定义信息

SELECT	sequence_name, min_value, max_value, 
	increment_by, last_number
FROM	user_sequences;

如果指定NOCACHE 选项,则列LAST_NUMBER 显示序列中下一个有效的值。
NEXTVAL 和 CURRVAL 伪列:

  • NEXTVAL 返回序列中下一个有效的值,任何用户都可以引用
  • CURRVAL 中存放序列的当前值
  • NEXTVAL 应在 CURRVAL 之前指定 ,否则会报CURRVAL 尚未在此会话中定义的错误。

将序列值装入内存可提高访问效率
序列在下列情况下出现裂缝:

  • 回滚
  • 系统异常
  • 多个表同时使用同一序列

如果不将序列的值装入内存(NOCACHE), 可使用表 USER_SEQUENCES 查看序列当前的有效值。
修改序列:

ALTER SEQUENCE dept_deptid_seq
               INCREMENT BY 20
               MAXVALUE 999999
               NOCACHE
               NOCYCLE;

删除序列:DROP SEQUENCE name;

索引 提高查询的效率
创建索引:

  • 自动创建: 在定义 PRIMARY KEY 或 UNIQUE 约束后系统自动在相应的列上创建唯一性索引
  • 手动创建: 用户可以在其它列上创建非唯一的索引,以加速查询

在一个或多个列上创建索引:

CREATE INDEX index
ON table (column[, column]...);

以下情况可以创建索引:

  • 列中数据值分布范围很广
  • 列经常在 WHERE 子句或连接条件中出现
  • 表经常被访问而且数据量很大 ,访问的数据大概占数据总量的2%到4%

下列情况不要创建索引:

  • 表很小
  • 列不经常作为连接条件或出现在WHERE子句中
  • 查询的数据大于2%到4%
  • 表经常更新

查询索引:
可以使用数据字典视图 USER_INDEXES 和 USER_IND_COLUMNS 查看索引的信息。

SELECT	ic.index_name, ic.column_name,
	ic.column_position col_pos,ix.uniqueness
FROM	user_indexes ix, user_ind_columns ic
WHERE	ic.index_name = ix.index_name
AND	ic.table_name = 'EMPLOYEES';

删除索引:DROP INDEX name;(不可回滚)

同义词 给对象起别名
创建同义词:

CREATE [PUBLIC] SYNONYM synonym
FOR    object;

删除同义词:DROP SYNONYM name;

猜你喜欢

转载自blog.csdn.net/AnlaGodness/article/details/107516741