SQL 语句:结构化查询语言: Structured Query Language
oracle数据库有三级结构:
关系模式,称为“基本表”
存储模式(内模式)称为 “存储文件”
子模式 称为视图(view)元组称为行(row),属性称为列(column)
oracle 体系
“实例”(instance),数据库文件,
用户进程(user process)和服务器进程(server process)
其它文件,如:参数文件(parameter file),密码文件和归档日志文件(archived log file)
物理结构文件是指数据库文件:由 数据文件,控制文件和重做日志文件组成。
Instance:实例
包括内存区(SGA)和后台进程。启动实例就是启动这些进程和内存。
一个实例对应一个数据库,一个数据库可以有多个实例。
三种连接方式:
连接是指用户进程与数据库服务器之间的通讯途径,一个连接可以有多个会话。
过程是: 用户进程 连接 服务器进程 再连接 数据库实例
1、Host-Based方式:服务器和客户端在同一台主机上,用户直接连接数据库服务器。
2、C/S方式:客户端通过网络远程管理数库服务器。
3、三层访问方式:用户先访问应用服务器,由应用服务器连接数据库服务器。
SGA 内存结构
共享池:
共享SQL或者PL/SQL代码,由库高速缓存和数据字典高速缓存组成。
重做日志高速缓冲区:
当用户执行了INSERT,UPDATE,DELETE等操作后,数据发生了变化,
这些变化了的数据写入数据库高速缓存之前会先写入重做日志缓冲区,
同时变化之前的数据也放入重做日志高速缓存,
这样在数据恢复时,oralce就知道那些需要前滚,那些需要后滚。
大池(large pool)和Java池-------可选的内存区
大池 :在共享服务器环境下,oracle在共享池中分配额外的空间用于存储用户进程和服务器进程之间的会话信息,但是用户进程区域UGA的大部分将在大池中分配,这样就减轻了共享池的负担。在大规模的输入和输出及备份过程也需要大池作为缓存空间。
流池(streaming pool)------------流内存,数据共享,可以通过参数动态调整。
SGA PGA UGA
PGA:进程全局区,存储了服务器进程或单独的后台进程的数据信息和控制信息。它随着服务器进程的创建而被分配内存,随着进程的终止而释放内存。与SGA不同,它不是一个共享区域,而是服务器进程专有的区域,在专有的服务器(与共享服务器相对的概念)配置中包括如下组件:排序区,会话信息,游标状态,堆栈区。
UGA:用户全局区,它是共享服务器模式下的概念,指用户的会话状态,这部分内存会话总可以访问,UGA存储在每个共享服务器都可以访问SGA中,这样任何服务器都可以使用用户会话的数据和其它信息。而在专有服务器模式下,永华会话状态不需要共享,用户进程和服务器进程是一一对应的关系,所以,UGA总是在PGA中分配。
后台进程:
系统监控进程(SMON):数据库实例恢复。分三步:前滚----打开数据库-----回滚未提交的事物。
进程监控进程(PMON):在进程失败获知连接异常发生时该进程负责一些清理工作。
回滚没有提交的事务,释放进程占用的SGA资源,监视其它oracle进程,监视其它oracle的后台进程,向oracle TNS监听器注册刚启动的实例。
数据库写进程(DBWR):脏数据是指用户更改了的但没有提交的数据库中的数据,因为数据库的数据文件与数据库高速缓存中的数据不一致,称为脏数据。写进程的作用就是把脏数据在特定的条件下写入到数据文件中。
为什么不直接提交脏数据呢?为了减少I/O次数。当脏数据达到一定数量或条件时才一次性提交脏数据。
归档日志进程(ARCH):它是可选进程,不是在实例启动时自动启动,作用是把写满的重做日志文件的数据写入到一个归档日志中,这个归档日志用作介质故障时的数据库恢复。
校验点进程:校验点是一个事件。
SQL语句的介绍
按照功能可以分为五类:
数据查询语句:如select
数据操作语句(DML):
如 INSERT 向表中添加纪录,UPDATE更新表中的数据,通常和WHERE条件语句一起使用。
DELETE语句删除表中的数据。
数据定义语句(DDL):
CREATE :创建数据库对象,如:表、索引、视图等。
ALTER: 改变系统参数,如改变SGA的大小等
DROP:删除一个对象,如删除一个表,索引或者序列号
RENAME:重命名一个对象。
TRUNCATE:截断一个表
事务控制语句
COMMIT:用于提交由DML语句操作的事务。
ROLLBACK: 用于回滚DML语句改变不了的数据。
数据控制语句(DCL):
GRANT: 用于授予用户访问某对象的特权
REVOKE:用于回收用户访问某对象的特权
空值(NULL)与空值处理函数:
空值是特殊的值,不能说它不存在,也不能说它为零。空值表示一类没有定义的值,具有不确定性。当然对于控制的运算也具有特殊性,因为不确定性的值是无法和一类具有确定性的值进行逻辑或算数运算的,oracle提供了一类空值处理函数,通过这些函数实现空值(NULL)的运算。
分组函数:
AVG和SUM函数
MAX和MIN函数,可以操作的字符类型有数字型,字符型和日期型
COUNT函数 返回经过计算得到的返回的行数,包括空行和重复的行
GROUP BY 句子
HAVING 子句:在分组函数中,不能使用WHERE子句限制分组函数,所以Oracle设计了HAVING 子句对分组函数的某些限制。
分组函数的嵌套使用
简单查询之SELECT语句的用法
SELECT * | {[DISTINCT] column | expression [alias] , .......} FROM talbe;
| 表示或的关系,[] 表示可选
SELECT 选择一个列或多个列
*选择表中所有的列
DISTINCT去掉列种重复的值
Column | expression选择列的名字或表达式
Alias为指定的列设置不同的标题
FROM table 指定要选择的列所在的表,即对那个表进行数据检索
SQL> SELECT * FROM SCOTT.EMP; 查询SCOTT用户中EMP表中所用的数据
SQL> SELECT deptno,loc from scott.dept 查询这个表中deptno, loc 这两列
SQL>SELECT * FROM dept WHERE is NULL 查询这个表中为空值的行
别名机制:
在使用SELECT语句时,SQL*PLUS 使用选择的列名作为列标题,并且采用大写的方式,由于表中的列名是数据库开发人员或程序员设计的,是为了编程的需要。但是这样的列标题可能不具备描述性质而难以理解,Oracle提供了列别名更改列标题的显示方式。
创建Oracle数据库方式
1、使用DBCA(数据库配置助手)
2、使用CREATE DATABASE 指令
3、在安装数据库软件时创建数据库
临时表:
临时表是特殊的表,它只对当前用户的当前会话有效,创建临时表的目的就是使得某些操作的效率更高,临时表中的数据只对当前的会话的用户有效,是当前会话的私有数据,当前会话只操作自己的数据,没有数据锁的争用,这极大提高了历史表操作的效率。
对表中的数据可以进行:维护列,修改列,删除列
删除表和截断表的区别:是否保留表结构。
oracle 数据字典
数据字典是在数据库的创建过程中创建的,它是由oracle数据库服务器管理,存储在系统表空间中,它是一个集合,这个集合由只读表和视图组成,提供所有和数据库相关的信息。数据字典由两大类组成。
基表:基表无法读取,必须通过数据字典视图才转化为可读的表。
数据字典视图:是可读的数据字典,也是DBA经常使用的数据字典。它由以下两种对象组成:
静态数据字典表:它基于基表而创建,容易阅读,通过使用一个名为catalog.sql脚本文件创建。如 user_tables,dba_objects等
动态性能视图:它在数据库运行期间存在,它读取内存或控制文件的内容,提供了数据的动态性能信息。如:v$logfil, v$database , v$instance 等等。
三种主要的静态数据字典表:dba_XXX , all_XXX , user_xx
查询该用户所拥有的数据库对象信息:
user_tables , user_indexes (索引), user_views(视图)
动态性能视图以V$开头,它只存在于运行的数据库中,它是一组虚表。
V$instance , V$database , V$controlfile , V$log , V$logfil
视图的概念:
视图是一个虚表,不占用存储空间,不存储数据,数据字典中只有视图的定义,视图可以通过DML语言操作,但是有一定的限制,因为操作视图最终还是操作创建视图的底层表。
如:我们为每一个部门创建一个视图,这样不同的部门只要使用视图就可以完成查询,而不再使用多表连接和WHERE条件语句来限制查询的部门。
例子:create or replace view research_view
(“employee_name”,”job”,”hiredate”,”salary”,”dep_name”)
as
select e.ename,e.job,e.hiredate,e.sal , d.dname
from dept d,emp e
where e.deptno = d.deptno
and d.deptno = 20
with read only;
使用视图的WITH子句:with read only 子句
删除视图:drop view emp_view;
验证是否删除成功:select 语句
事务的概念:
事务的由来:银行取款的例子
如果用户A要给用户B从银行转账10000元,此时我们考虑ATM机的行为,把ATM机的行为作为一个事务。ATM机的实施步骤如下:
从用户A的账号减少1万元
从用户B的账户增加一万元。
上述两个步骤必须都成功执行,如果两个步骤任何一个出现了问题,我们说ATM机没有正确的完成这次转账行为。谁也不希望在自己的账户上白白丢失一万元。此时ATM机的两个执行步骤是不可分割的行为,要么执行成功,要么不执行(回滚所有更改的数据),ATM机的两个操作在逻辑上就可以看作是一个完整的事务。
事务是一组逻辑工作单元,它有一条或多条SQL语句组成。一个事务可以在操作的数据库对象上执行一个或多个操作,事务可以作为程序的部分功能而执行。
事务开始于一条可执行的SQL语句,继续执行事务主体,然后结束以下的一种情况发生:
1、显示提交COMMIT:当事务遇到COMMIT指令时,将结束事务并永久保存所有更改的数据到数据库文件中。
2、显示回滚ROLLBACK:当事务遇到这个指令时,也结束事务的执行,但是此时它回滚所有更改的数据到其原始值,即取消所有更改。
3、DDL语句:一旦用户在使用数据定义语言时,如CREATE、DROP等,则之前的所有DML语言操作都作为事务的一部分而提交,此时称为隐式提交。
4、正常结束程序,如果oracle 数据库应用程序正常结束,如使用 SQL*PLUS工具更改了数据,而正常退出该工具程序,则oralce自动提交事务。
5、非正常结束程序:当程序崩溃或意外中止时,所有数据更改都被回滚,类似于显示回滚操作的结果,这里是隐式回滚的,因为没有用户参与。