数据库学习笔记标准SQL语言篇:
SQL是在1974年由Boyce和Chamberlin提出的,经各公司的不断修改、扩充和完善,SQL得到了业界的认可,1986年10月美国国家标准局ANSI的数据库委员会X3H2批准了SQL作为关系数据库语言的美国标准。
SQL特点:综合统一,SQL集数据定义语言DDL、数据操作语言DML、数据控制语言DCL的功能于一体;高度非过程化,只要提出“做什么”,而无须指明“怎么做”,即无须了解存取路径;面向集合的操作方式,非关系数据模型采用的是面向记录的操作方式,操作对象是一条记录,而SQL是采用集合操作方式,操...
SQL语言篇:
SQL是在1974年由Boyce和Chamberlin提出的,经各公司的不断修改、扩充和完善,SQL得到了业界的认可,1986年10月美国国家标准局ANSI的数据库委员会X3H2批准了SQL作为关系数据库语言的美国标准。
SQL特点:综合统一,SQL集数据定义语言DDL、数据操作语言DML、数据控制语言DCL的功能于一体;高度非过程化,只要提出“做什么”,而无须指明“怎么做”,即无须了解存取路径;面向集合的操作方式,非关系数据模型采用的是面向记录的操作方式,操作对象是一条记录,而SQL是采用集合操作方式,操作对象、查找结果可以是元组的集合;以同一种语法结构提供多种使用的方式,SQL既是独立的,又是嵌入式的语言;语言简洁,易学易用。
SQL的动词
SQL功能
动词
数据查询
SELECT
数据定义
CREATE、DROP、ALTER
数据操纵
INSERT、UPDATE、DELETE
数据控制
GRANT、REVOKE
SQL数据定义语句
操作对象
操作方式
创建
删除
修改
模式
CREATE SCHEMA
DROP SCHEMA
表
CREATE TABLE
DROP TABLE
ALTER TABLE
视图
CREATE VIEW
DROP VIEW
索引
CREATE INDEX
DROP INDEX
*定义模式:CREATE SCHEMA <模式名>
AUTHORIZATION <用户名>
*删除模式:DROP <模式名>
*每一个基本表都属于一个模式,一个模式可以包含多个基本表
SQL数据查询语句
SELCET [ALL | DISTINCT] <目标表达式>[,<目标表达式>] FROM <表名或视图名> WHERE <条件表达式> GROUP BY <列名> [HAVING <条件表达式>] ORDER BY <列名> [ASC|DESC]
查询指定列:SELECT Sno FROM Student;
查询全部列:SELECT * FROM Student
查询经过计算的值:SELECT 2004-Sage FROM
消除取值重复的行:SELECT DISTINCT Sno FROM Student
查询满足条件的元组:SELECT * FROM Student WHERE Sno=’000000’
字符匹配:SELECT * FROM Student WHERE Sname LIKE ‘刘%’(’刘_ _’)
ORDER BY子句:SELECT * FROM Student ORDER BY Sno DESC
GROUP BY 子句:SELECT * FROM Student GROUP BY Cno HAVING COUNT(*)>3
多表查询、嵌套查询、合并查询(union、union all、intersect、minus)
常用的查询条件
查询条件
谓词
比较
=、>、<、>=、<=、!=、<>、!>、!<
确定范围
BETWEEN AND、NOT BETWEEN AND
确定集合
IN、NOT IN
字符匹配
LIKE、NOT LIKE
空值
IS NULL、IS NOT NULL
多重条件
AND、OR、NOT
聚集数
函数名
意义
COUNT([DISTINCT | ALL] *)
统计元组的个数
COUNT([DISTINCT | ALL] <列名>)
统计一列中值的个数
SUM([DISTINCT | ALL] <列名>)
计算一列中值的总和(列必须是数值型的)
AVG([DISTINCT | ALL] <列名>)
计算一列中值的平均数(列必须是数值型)
MAX([DISTINCT | ALL] <列名>)
求一列中值的最大值
MIN([DISTINCT | ALL] <列名>)
求一列中值的最小值
数据更新
插入一个元组:INSERT INTO Student (Sno,Sname) VALUES (‘0000’,’陈同学’)
插入子查询:INSERT INTO Student(Sno,Sname)SELECT Sno,Sname FROM Course
修改某一元组的值:UPDATE Student SET Sage=22 WHERE Sno=’0000’
删除数据:DELECT FROM Student WHERE Sno=’0000’
视图操作
建立视图:CREATE VIEW IS_Student AS SELCET Sno,Sname,Sage FROM Student WHERE Sdept=’IS’ WITH CHECK OPTION
授权与回收
GRANT <权限>[,<权限>] ON <对象类型> <对象名> [,<对象类型><对象名>] TO <用户>[,<用户>] [WITH GRANT OPTION]
GRANT SELCET ON TABLE Student TO U1
GRANT ALL PRIVILEGES ON TABLE Student TO U2 WITH GRANT OPTION
REVOKE <权限>[,<权限>] ON <对象类型> <对象名> [,<对象类型><对象名>] FROM <用户>[,<用户>] [CASCADE | RESTRICT]
REVOKE SELCET ON TABLE Student FROM U1
REVOKE ALL PRIVILEGES ON TABLE Student FROM U2 CASCADE
数据库角色是被命名的一组与数据库操作相关的权限,简单来讲,角色是权限的集合。所以可以为一组具有相同权限的用户创建一个角色,使用角色来管理数据库权限可以简化授权的过程。
*修改表的时候,如果是修改内容,就要先DROP原先内容再ADD新的内容。
完整性约束命名子句:
CONSTRAINT C1 CHECK FOREIGN KEY (Sno) REFERENCES DEPT(Deptno),
CONSTRAINT C2 CHECK (S+K<=300)
触发器
定义触发器:
CREATE TRIGGER <触发器名>
{BEFORE | AFTER} <触发事件> ON <表名>
FOR EACH {ROW | STATEMENT}
[WHEN <触发条件>]
<触发动作体>
注:触发器名在同一模式下,必须是唯一的,并且和表名必须在同一模式下;
表名是触发器的目标表,即数据发生变化时所触发的表;
触发事件可以是插入、删除、更新,也可以是这几个的组合;
触发器类型,触发器按照所触发动作的间隔尺寸可分为行级触发器和语句级触发器(FOR EACH ROW或者FOR EACH STATEMENT);
触发条件,触发器被激活时,只有当触发条件为真时触发动作体才执行;
触发动作体,既可以是一个匿名的PL/SQL过程块,也可以是对已创建的存储过程的调用。
eg
CREATE TRIGGER Insert_Or_Update
BEFORE INSERT OR UPDATE ON Teacher
FOR EACH ROW
AS BEGIN
IF(new.Job=’教授’)AND(new.Sal<4000) THEN
New.Sal=4000;
END IF;
END;
数据库篇
数据库设计是指对于一个给定的应用环境,构造(设计)优化的数据库逻辑模式和物理结构,并据此建立数据库及其应用系统,使之能够有效的存储和管理数据,满足各种用户的应用需求,包括信息管理要求和数据操作要求。
数据库设计的目标是为用户和各种应用系统提供一个信息基础设施和高效率的运行环境;其中高效率的运行环境包括:数据库数据的存取效率、数据库存储空间的利用率、数据库系统运行管理的效率等都是高的。
数据库设计的基本步骤:需求分析>概念结构设计>逻辑结构设计>物理结构设计>数据库实施>数据库运行和维护
需求分析:通过详细调查现实世界要处理的对象,充分了解原系统工作概况,明确用户各种需求,然后确立系统的功能。调查重点是“数据”和“处理”。主要有以下几个步骤:
调查相关客户对系统的需求情况>熟悉系统功能>确定新系统边界>数据字典的设计(数据项、数据结构、数据流、数据存储、处理过程)
注:1.需求分析阶段的一个重要而困难的任务是手机将来应用所涉及的数据,设计人员应充分考虑到可能的扩充和改变,使设计易于更改,系统易于扩充。2.必须强调用户的参与,不能凭空想象。
概念结构设计:将需求分析得到的用户需求抽象为信息结构即概念模型的过程,具体有以下几种:
1. 自顶向下:先定义全局概念结构的框架,然后逐步细化;
2. 自底向上:先定义各局部应用的概念结构,然后将它们集成起来,得到全局概念结构;
3. 逐步扩张:先定义最重要的核心概念结构,然后向外扩充,直至总体概念结构;
4. 混合策略:将自顶向下和自底向上结合起来。
概念结构是对现实世界的一种抽象,一般有三种抽象:分类;聚集;概括。其中,分类是定义某一类概念作为现实世界中一组对象的类型;聚集是定义某一类型的组成成分;概括是定义类型之间的一种子集联系。抽象完之后就逐一设计E-R图,最后拼接所有E-R图。
逻辑结构设计:主要是E-R图向关系模式的转换。
物理结构设计:为一个给定的逻辑数据模型选取一个最适合应用要求的物理结构的过程。通常分为两步:确定数据库的物理结构(主要是存取方法和结构)>对物理结构进行评价(重点是时间和空间效率;通常关系数据库物理设计的内容主要包括:为关系模式选择存取方法,设计关系、索引等数据库文件的物理存储结构。
常用的存取方法有三类:1.索引方法;2.聚簇方法;3.HASH方法。
1. 索引方法:a.如果一个(或一组)属性经常在查询条件中出现,则考虑在这个(或这组)属性上建立索引(或组合索引);b.如果一个属性经常作为最大值和最小值等聚集函数的参数,则考虑在这个属性上建立索引;c.如果一个(或一组)属性经常在连接操作的连接条件中出现,则考虑在这个(或这组)属性上建立索引。
2. 聚簇方法:为了提高某个属性(或属性组)的查询速度,把这个或这些属性(称为聚簇码)上具有相同值的元组集中存放在连续的物理块称为聚簇。一个关系只能加入一个聚簇。
3. HASH方法:如果一个关系的属性主要出现在等值连接条件中或主要出现在相等比较选择条件中,而且满足a.一个关系的大小可预知,而且不变;b.如果关系的大小动态改变,而且数据库管理系统提供了动态HASH存取方法;这两个条件之一,就可以选择HASH存取方法。
确定数据库物理结构主要是指确定数据的存放位置和存储结构,包括:确定关系、索引、聚簇、日志、备份等的存储安排和存储结构,确定系统配置等。
数据库的实施和维护:包括两项重要的工作,一项是数据的载入,另一项是应用程序的编码和调试。
SQL*PLUS语言篇
SQL*PLUS是与oracle进行交互的客户端工具,在SQL*PLUS中可以运行SQL*PLUS命令和SQL*PLUS语句。
使用SQL*PLUS命令连接数据库:sqlplus “sys/240659415cyt sysdba”
sqlplus sys/nolog 然后 SQL>connect sys/240659415cyt as sysdba
SQL>startup nomount---------启动实例不加载数据库
SQL>startup mount----------启动实例也加在数据库
SQL>shutdown immediate------以立即方式关闭数据库
SQL>shutdown-----------------以正常方式关闭数据库
SQL>shutdown abort----------直接关闭数据库
*SQL>help 命令名-----------查找出命令的用法------------------
SQL>conn system/240659415cyt---------切换用户
SQL>passw---------修改用户密码
SQL>show user-------------显示当前用户
SQL>exit---------------断开连接并退出
SQL>start 路径名+文件名.sql-----------------执行此文件的sql语句
SQL>edit路径名+文件名.sql--------------打开编辑文件
SQL>spool 路径名+文件名----------建立文件
SQL>spool off------------停止
SQL>select * from emp where ename=’&name’----其中&表示可以替代变量
SQL>set linesize 80----------------设置显示一行的字符数,默认为80
SQL>set pagesize 5---------------设置一页的行数,用于分页
SQL>create user xiaoming identified by m123;-------------------创建用户,一般是dba才做的
SQL>password 用户名---------------------系统用户用于修改用户的密码,普通用户不行
SQL>grant connect to xiaoming--------------将连接数据库的角色赋予xiaoming
SQL>grant resource to xiaoming-------------将创建表的角色赋予xiaoming
*如果是对象权限用with grant option,如果是系统权限用with admin option;
相关授权和收回跟上面SQL语言篇相似
SQL>create profile lock_account limit failed_login_attempts 3 password_lock_time 2红色部分是一定要的,lock_account为创建profile的名称,3为最多输入密码的次数,2是锁定的时间。这个一般是dba才能做的。
SQL>alter user xiaoming profile lock_account;--------将配置文件lock_account付给xiaoming
SQL>altert user xiaoming account unlock--------------给用户xiaoming解锁,只有dba可以使用
SQL>create profile aaa limit password_life_time 10 password_grace_time 2;-----表名10天内要修改一次密码,宽限2天;实际上也就是12天。
SQL>create profile password_history limit password_life_time 10 password_grace_time 2 password_reuse_time 10-----------------用户修改密码的时候不能使用以前的密码。password_reuse_time表明可以重用是在10天以后。
SQL>drop profile password_history [cascade]-----删除password_history这个配置文件
SQL>desc 表名----------------查看表结构
SQL>alter table student modify(xm varchar2(30));------将表的字符长度变了
SQL>rename student to stu-----将表student改名为stu
*char类型的数据查询速度比其他字符型的快很多,最大有2000个字符。
*varchar2类型是可变长的,有4000个字符。
*clob是字符型的大对象,有4g大。
*number范围-10的38次方到10的38次方,可以表示整数和小数number(5,2)5表示有效位数,2表示小数点后位数。
*date包含年月日和时分秒,格式是’01-5月-1997’要日月年,并且要加’月’字,这是默认的。可以改日期的格式,SQL>alter session set nls_date_format=’yyyy-mm-dd’
*blob类型可以用来存放图片,声音;有4g之大;一般不把图片和声音存放进去,除非考虑到安全性问题,不然数据库直接存放文件路径。
SQL>savepoint a;---------设置工作点
SQL>rollback to a;----------恢复到a点,在此期间做的操作都作废
SQL>truncate table student------------------删除所有记录,表结构还在,不写日志,无法找回删除记录
注:不要经常使用select * 这样的查询速度并不快;
SQL>set timing on;-------------显示查询时间
*nvl(comm,0)-------如果comm为空值,则用0表示,如果不是就用comm
注:查询条件不允许用分组函数,可以考虑用子查询;在分组查询时,一定是group by 然后再having,最后才order by
Oracle分页查询:一共有三种
1. 根据ROWID来分:select * from emp where rowid in (select rid from (select rownum rn,rid from(select rowid rid,cid from emp order by cid desc) where rownum<10000) where rn>9980) order by cid desc;
2. 按照ROWNUM来分:select * from (select t.* ,rownum rn from (select * from emp order by cid desc) t where rownum<10000) where rn>9980;
3. 按照分析函数来分:select * from (select t.*,row_number() over(order by cid desc) rk from emp t ) where rk<10000 and rk>9980;----*
用jdbc连接数据库:
ClassforName(“oracle.jdbc.driver.OracleDriver”);
/*加载驱动,注意需要在Libraries
加载ojdbc14.jar包*/
Connection conn=DriverManager.getConnection(“jdbc:oracle:thin:@hostAddress:1521:ORCL”,”scott”,”12”);
//创建连接
Statement sm=conn.createStatement();
//创建statement实例,用于执行静态的SQL语句
//还有PreparedStatement和CallableStatement两种执行动态SQL语句的功能
ResultSet rs=sm.executeQuery(“select * from emp”);
//获取查询结果
While(rs.next())
{
System.out.println(rs.getString(1));
}
rs.close();
//关闭连接
sm.close();
conn.close();
使用jdbc_odbc连接数据库:
首先要配置数据源;打开控制面板>管理工具>ODBC数据源,接着就点击oracle数据源,
然后按照步骤配置。
ClassforName(“sun.jdbc.odbc.JdbcOdbcDriver”);
//加载驱动
Connection conn=DriverManager.getConnection(“jdbc:odbc:testcyt”,”scott”,”123456cyt”);//连接
Statement sm=conn.createStatement();
ResultSet rs=sm.executeQuery(“select * from emp”);
While()
{
System.out.println(rs.getString(1));
}
rs.close();
sm.close();
conn.close();
用to_date()函数插入固定格式日期的命令:
SQL>insert into student(date) values (to_date(‘1988-12-12’,’yyyy-mm-dd’));
设置保存点的时候,期间如果使用SQL>commit;则保存点被删除
设置只读事务:SQL>set transaction read only;---设置只读事物之后,就看不到新的事物发生
所导致的结果,便于统计。
sql函数的使用:
1. 字符函数:lower(char)、upper(char)、length(char)、substr(char,m,n)、
replace(char,search_string,replace_string)
SQL>select lower(ename) from emp;
SQL>select * from emp where length(ename)=5;
SQL>select substr(ename,1,3) from emp;----从第一个起取3个
SQL>select upper(substr(ename,1,1)) || lower(substr (ename,2,length(ename)-1)) from emp
SQL>select replace(ename,’A’,’a’) from emp;-------用a替换A
2. 常用的数字函数:rouns(n,[m])执行四舍五入、trunc(n,[m])用于截取数字,如果m是正数,则截取到小数点的m位后、mod(m,n)、floor(n)返回小于或者等于n的最大整数、ceil(n)返回大于或者等于n的最小整数
SQL>select round(sal) from emp where ename='FORD'------四舍五入到整数
SQL>select round(sal,1) from emp where ename='FORD'-----四舍五入到小数后一位
SQL>select trunc(sal,1) from emp where ename=’FORD’-----截取到小数点后一位
SQL>select trunk(sal,-1) from emp where ename=’FORD’---截取到小数点前一位
SQL>select floor(sal) from emp where ename=’FORD’----------向下取整
SQL>select ceil(sal) from emp where ename=’FORD’----------向上取整
SQL>select mod(10,2) from dual------------------------10模2
在做oracle测试的时候可以用dual表
其他函数:abs(n)返回n的绝对值、acos(n)返回数字的反余弦、asin(n)返回数字的反正弦、atan(n)返回数字的反正切、cos(n)、exp(n)返回e的n次幂、log(m,n)返回对数值、
power(m,n)返回m的n次幂;
3. 日期函数:sysdate:返回系统时间、add_months(d,n):加月份d为月份,n为所加月数
last_day(d):返回指定日期所在月份的最后一天
SQL>select * from emp where sysdate>add_months(hiredate,8);------入职大于八个月
SQL>select * from emp where last_day(hiredate)-2=hiredate;--------每月倒数第三天入职
4. 转换函数:to_char(m,n);to_date(m,n)
SQL>select ename,to_char(hiredate,’yyyy-mm-dd hh24:mi:ss’)---------显示时分秒
SQL>select ename,to_char(sal,’L99,999.99’) from emp;--------显示人民币---L显示本地货币符号,C显示国际货币符号,$显示$符号
5. 系统函数:sys_context有七个参数terninal:当前会话客户所对应的终端的标示符
language:语言
db_name:当前数据库名称
nls_date_format:当前会话客户所在对应的日期格式
session_user:当前会话客户所对应的数据库用户名
current_schema:当前会话客户所对应的默认方案名
host:返回数据库所在主机的名称
SQL>select sys_context(‘USERENV’,参数名) from dual;
注:用户和方案是一一对应的,方案里面存放着用户所用的所有数据对象
数据库管理:
导出自己的表:exp userid=scott/123456cyt@ORCL tables=(emp,dept) file=d:\e1.dmp;
导出其他方案的表:如果用户要导出其他方案的表,则需要dba权限或者exp_full_database权限;
exp userid =system/240659415cyt@ORCL tables=(scott.emp) file=d:\e2.dmp;
导出表结构:exp userid=scott/123456cyt@ORCL tables=(emp) file=d:\e3.dmp rows=n
使用直接导出方式:exp userid= scott/123456cyt@ORCL tables=(emp) file=d:\e4.dmp direct=y
要导入导出的时候,必须到oracle的bin目录下执行。
导出方案:exp scott/123@ORCL owner=scott file=d:\scott.dmp
导出其他方案:exp system/123@ORCL owner=(system,scott) file=d:\system.dmp
导出数据库:exp userid=system/123@ORCL full=y inctype=complete file=d:\e5.dmp
导入表:imp userid=scott/123@ORCL tables=(emp) file=d:\e1.dmp
导入表到其他用户:imp userid=system/123@ORCL tables=(emp) file=d:\e2.dmp touser=scott
导入表结构:imp userid=scott/123@ORCL tables=(emp) file=d:\e3.dmp rows=n
导入数据:imp userid=scott/123@ORCL tables=(emp) file=d:\e4.dmp ignore=y------对象已经存在就可以只导入数据
导入方案:imp userid=scott/1234@ORCL file=d:\e6.dmp
导入其他方案:imp userid=system/123@ORCL file=d:\e7.dmp fromuser=system touser=scott
导入数据库:imp userid=system/123 full=y file=d:\e8.dmp
sys用户是数据字典的所有者,而其他用户只能在数据字典上执行查询
数据字典的组成:包括数据字典基表和数据字典视图,其中基表存储数据库的基本信息,普通用户不能直接访问数据字典的基表;数据字典视图是基于数据字典基表所建立的视图,普通用户可以通过查询数据字典视图取得系统信息;数据字典视图主要包括user_xxx、all_xxx、dba_xxx三种类型
SQL>select table_name from user_tables------查询当前用户所有的表
SQL>select table_name from all_tables----查询当前用户所能够访问的表
SQL>select table_name from dba_tables---查询所有方案的表,但用户必须拥有dba权限或者select any table 权限
在建立用户时,oracle会把用户的信息存放到数据字典中,当给用户授权或角色时,oracle会将权限和角色的信息存放到数据字典中,
通过查询dba_users可以显示所有数据库用户的详细信息;
通过查询数据字典视图dba_sys_privs,可以显示用户所具有的系统权限;
通过查询数据字典视图dba_tab_privs可以显示用户具有的对象权限;
通过查询数据字典dba_col_privs,可以显示用户所具有的列权限;
通过查询数据库字典视图dba_role_privs可以显示用户所具有的角色
通过查询数据字典视图role_sys_privs,可以显示角色所包含的系统权限
通过查询数据字典视图role_tab_privs,可以显示角色包含的对象权限
//查询oracle中所有系统权限,一般是要有dba权限:
select * from system_privilege_map order by name;
//查询oracle中所有的角色:
select * from dba_roles;
//查询oracle中所有的对象权限:
select distinct privilege from dba_tab_privs;
//查询数据库的表空间
select tablespace_name from dba_tablespaces;
//显示当前用户可以访问的所有数据字典视图:
select * from dict where comments like ‘%grant%’
//显示当前数据库的全称:
select * from global_name;
动态性能视图用于记录当前例程的活动信息,当启动oracle server时,系统会建立动态性能视图,当oracle server停止时,系统会删除动态性能视图。Oracle的所有动态性能视图都是以v_$开始的,并且oracle为每个动态性能视图都提供了相应的同义词,并且其同义词是以v$开始的;动态性能视图的所有者是sys,一般情况下,由dba或是特权用户来查询动态性能视图。(实际应用比较少)
管理表空间和数据文件:
表空间是数据库的逻辑组成部分,从物理上讲,数据库数据存放在数据文件中,从逻辑上讲,数据库则是存放在表空间中,表空间由一个或是多个数据文件组成。
Oracle中的逻辑结构包括表空间、段、区、块:数据库由表空间构成,而表空间又是由段构成,而段又是由区构成,而区又是由oracle块构成的这样一种结构,可以提高数据库的效率。
表空间用于从逻辑上组织数据库的数据,数据库逻辑上是由一个或是多个表空间组成的。通过表空间可以达到以下作用:
1. 控制数据库占用的磁盘空间
2. dba可以将不同数据类型部署到不同的位置,这样有利于提高i/o性能,同时利于备份和恢复等管理操作。
建立表空间:一般是由特权用户或是dba来执行
create tablespace data01 datafile ‘d:\test\data01.dbf’ size 20m uniform size 128k
执行此命令后,会建立名称为data01的表空间,并为该表空间建立名称为data01.dbf的数据文件,区的大小为128k
使用表空间:
create table student(SNO number(4),Sname varchar2(10)) tablespace data01;
改变表空间状态:当在进行系统维护或是数据维护时,可能需要改变表空间状态,一般情况先,有特权用户或是dba来操作;
1. 使表空间脱机:alter tablespace 表空间名 offline;
2. 使表空间联机:alter tablespace 表空间名 online;
3. 只读表空间:alter tablespace 表空间名 read only;
4. 可读写表空间:alter tablespace 表空间名 read write;
知道表空间名,显示该表空间包括的所有表:
select * from all_tables where tablespace_name=’表空间名’;
知道表名,查看该表属于哪个表空间:
select tablespace_name,table_name from user_tables where table_name=’emp’;
删除表空间:一般是由特权用户或是dba来操作,如果是其他用户,需要有drop tablespace权限
drop tablespace ‘表空间名’including contents and datafiles;------这样就包含删除该表空间的所有数据对象;
扩展表空间:有三种方法
1. 增加数据文件:alter tablespace 表空间名 add datafile ‘d:\test\cc.dbf’ size 20m;
2. 增加数据文件的大小:alter tablespace 表空间名 ‘d:\test\cc.dbf’ resize 20m;
3. 设置文件的自动增长:alter database datafile ‘d:\test\cc.dbf’ autoextend on next 10m maxsize 500m;
移动数据文件:步骤如下
1. 确定数据文件所在的表空间:select tablespace_name from dba_data_files where file_name=’d:\cc.dbf’;
2. 是表空间脱机:确保数据文件的一致性,将表空间转为offline状态
alter tablespace cc offline;
3. 使用命令移动数据文件到指定的目标位置:
host move d:\cc.dbf c:\cc.dbf;------将数据移动到c盘目录下
4. 执行alter tablespace命令:在物理上移动了数据后,还必须执行alter tablespace命令对数据文件进行逻辑修改:alter tablespace cc rename datafile ‘d:\cc.dbf’to ‘c:\cc.dbf’;
5. 使表空间联机:alter tablespace cc online;
完整性约束:
数据完整性确保数据库数据遵从一定的商业和逻辑规则,在oracle中,数据完整性可以使用约束、触发器、应用程序(过程,函数)三种方法来实现;因为约束易于维护并由最好的性能,所以作为维护数据完整性的首选。
约束包括:not null;unique;primary key;foreign key;check。
可以用alter table命令为表增加约束,但注意增加not null约束时,需要使用modify选项
索引:
创建索引:
单列索引-----create index 索引名 on 表名(列名)
复合索引-----create index 索引名 on 表名(先查的列名,后查的列名)
索引一般是在大表中才建立的;在where子句或者连接条件经常用的列上建立;索引一般不要超过四层;
索引缺点:
1. 建立索引,系统要占用大约为表的1.2被的硬盘和内存空间来保存索引
2. 更新数据时,系统必须要有额外的时间来同时对索引进行更新,不恰当的索引会降低系统的性能,因为大量索引在进行增删改的时候比没有索引的要花费更多的系统时间。
显示表的所有索引:
通过查询数据字典视图dba_indexes和user_indexes,可以显示索引信息。其中dba_indexs用于显示数据库所有的索引信息,而user_indexs用于显示当前用户的索引信息。
select index_name,index_type from user_indexs where table_name=’表名’;
通过查询数据字典视图user_ind_columns,可以显示索引对应的列信息
select table_name,column_name from user_ind_columns where index_name=’索引名’;
管理权限和角色:
1. 什么是系统权限、系统权限有哪些、如何赋予系统权限
2. 什么是对象权限、对象权限有哪些、如何赋予对象权限
如果要执行某种特定的数据库操作,则必须为其授予系统权限;如果用户要访问其他方案的对象,则必须为其授予对象权限。为了简化权限的管理,引入了角色的概念。
系统权限是指执行特定类型的sql命令的权利,它用于控制用户可以执行的一个或是一组数据库操作;
授权:grant 系统权限 to 用户 with admin option;
回收权限:revoke 系统权限 from 用户;
系统权限不是级联回收的
对象权限是指访问其他方案对象的权利,用户可以直接访问自己的方案的对象,但要访问别的方案对象时,必须有对象的权限。
授权:grant 权限 on 表名 to 用户 with grant option
grant 权限 on 表名(列名)to 用户 with grant option ----授予列权限
收回权限:revoke 权限 on 表名 from 用户
对象权限是级联回收的
角色:是指相关权限的命令集合。分为预定义角色和自定义角色
常用预定义角色:connect,resource,dba;其中dba角色没有开启和关闭数据库的权限
自定义角色:
建立角色(不验证):
create role 角色名 not identified
建立角色(数据库验证)采用这个方式,当激活角色时,需要提供口令:
create role 角色名 identified by 123;
角色授权:跟之前的授权一样;
分配角色给用户:一般分配角色是由dba来完成的,如果以其他用户身份分配,则要求用户有grant any role的系统权限。
grant 角色名 to 用户 with admin option;
删除角色:一般都是dba来执行的,除非其他用户有drop any role的权限
drop role 角色名;
PL/SQL编程:
pl/sql(procedural language/sql)是oracle在标准的sql语言上的扩展。
1. 过程、函数、触发器是用pl/sql编写的
2. 过程、函数、触发器是存放在oracle中的
3. pl/sql是非常强大的数据库过程语言
4. 用pl/sql编写的过程、函数可以在java程序中调用
优点:
1. 提高应用程序的运行性能
2. 模块化的设计思想
3. 减少网络传输量
4. 安全性好
缺点:
1. 移植性并不好
创建存储过程:
create procedure 过程名 is
begin
--执行部分
insert into emp values(‘asdfa’,123);
end;
查看错误信息:show error;
调用过程:exec 过程名(参数值1,参数值2);------call过程名(参数值1,参数值2);
编写规范:
1. 注释:单行注释--;多行注释/*-------*/
2. 标示符号得命名规范:
a. 当定义变量时,用v_作为前缀
b. 当定义常量时,用c_最为前缀
c. 当定义游标时,用_cursor作为后缀
d. 当定义例外时,用e_最为前缀
块的结构:
declare
/* 定义部分--------定义常量、变量、游标、例外、复杂的数据类型---可选*/
begin
/*执行部分--------要执行的pl/sql语句和sql语句-----必选*/
exception
/*例外处理部分---------处理运行的各种错误-----可选*/
end;
在pl/sql程序中包括有
标量(scalar)-常用类型
1. 定义一个变长字符串:v_ename varchar2(10);
2. 定义一个小数:v_sal number(6,2);
3. 定义一个小数并给一个初始值为5.4:v_sal2 number(6,2):=5.4;
4. 定义一个日期类型的数据:v_hiredate date;
5. 定义一个布尔变量,不能为空,初始值为false:v_valid boolean not null default false;
pl/sql块为变量赋值不同于其他的编程语言,需要在等号前加冒号(:=);
标量----使用%type 例如:v_ename emp.ename%type; 表示v_ename 类型和表的一样
复合变量(composite)
1. pl/sql记录:类似高级语言中的结构体
declare
type emp_record_type is record(name emp.ename%type,salary emp.sal%type,title emp.job%type);
cyt_record emp_record_type --定义一个类型为emp_record_type的变量
2. pl/sql表:相当于高级语言中的数组,但下标可以为负数
declare
type emp_record_type is table of emp.ename%type index by binary_integer;
cyt_record emp_record_type;
其中emp.ename%type index by binary_integer表示定义一个emp.ename%type类型的以整数为下标的数组;
3. 嵌套表----*
4. varray-----*
参照变量:指用于存放数值指针的变量,通过使用参照变量,可以使得应用程序共享相同的对象,从而降低占用的空间,在编写pl/sql程序时,可以使用游标变量(ref cursor)和对象类型变量(ref obj_type)两种参照变量类型
游标变量:当定义游标时不需要指定相应的select 语句,但当使用游标时需要指定select语句,这样一个游标就与一个select语句结合
declare
--定义游标类型
type cyt_emp_cursor is ref cursor;
--定义一个游标变量
cyt_cursor cyt_emp_cursor;
--定义变量
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
open cyt_cursor for select ename,sal from emp where deptno=&no;
-- 循环取出
loop
fetch cyt_cursor into v_ename,v_sal;
exit when cyt_cursor%notfound;
dbms_output.put_line('名字:'||v_ename||'工资:'||v_sal);
end loop;
end;
有定义部分和执行部分:
declare
v_ename varchar2(5);
v_sal number(7,2);
begin
select ename,sal into v_ename,v_sal from emp where empno=&no;
dbms_output.put_line('雇员名:'||v_ename||v_sal);
end;
有定义部分、执行部分和例外部分:
declare
v_ename varchar2(5);
v_sal number(7,2);
begin
select ename,sal into v_ename,v_sal from emp where empno=&no;
dbms_output.put_line('雇员名:'||v_ename||'薪水'||v_sal);
exception
when no_data_found then
dbms_output.put_line('输入有误!');
end;
过程:用于执行特定的操作。当建立过程时,既可以指定输入参数,也可以指定输出参数;通过在过程中使用输入参数,可以将数据传递到执行部分;通过使用输出参数,可以将执行部分的数据传递到应用环境。
函数:用于返回特定的数据,当建立函数时,在函数头部必须包含return子句,而在函数体内必须包含return语句返回的数据。
create or replace function cyt_fun1(cytName varchar2) return number is mysal number(7,2);
begin
select sal into mysal from emp where ename=cytName;
return mysal;
end;
SQL> var abc number;
SQL> call cyt_fun1('SCOTT') into:abc;
包:用于在逻辑上组合过程和函数,它由包规范和包体两部分组成。
创建包:
create package cyt_pac1 is
procedure cyt_pro4(cytName varchar2,newSal number);
function cyt_fun1(cytName varchar2) return number;
end;
创建包体:
create package body cyt_pac1 is
procedure cyt_pro4(cytName varchar2,newSal number) is
begin
update emp set sal=newSal where ename=cytName;
end;
function cyt_fun1(cytName varchar2) return number is
mysal number(7,2);
begin
select sal into mysal from emp where ename=cytName;
return mysal;
end;
end;
触发器:是指隐含的执行的存储过程。可维护数据库的安全性和一致性。
pl/sql进阶:
使用各种if语句;使用循环语句;使用控制语句
pl/sql提供了三种条件分支语句:
if------then ; if----then---else ; if---elsif
本文档为【数据库学习笔记】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。