首页 > Linux操作系统 > Linux操作系统 > 数据库原理---精华贴
数据库概念
数据库(Database,简称DB)是长期储存在计算机内、有组织的、可共享的大量数据的集合。
R(U,D,DOM,F)
R 关系名
U 组成该关系的属性名集合
D 属性组U中属性所来自的域
DOM 属性向域的映象集合
F 属性间的数据依赖关系集合

关系数据库标准语言SQL
SQL(Structured Query Language)结构化查询语言,是关系数据库的标准语言。集数据定义语言(DDL),数据操纵语言(DML),数据控制语言(DCL)功能于一体。可以独立完成数据库生命周期中的全部活动:
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>[<表定义子句>|<视图定义子句>|<授权定义子句>]
DROP SCHEMA <模式名> <CASCADE|RESTRICT>
删除模式的同时把该模式中所有的数据库对象全部删除
如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。当该模式中没有任何下属的对象时 才能执行。
CREATE TABLE <表名>
(<列名> <数据类型>[ <列级完整性约束条件> ]
[,<列名> <数据类型>[ <列级完整性约束条件>] ] …
[,<表级完整性约束条件> ] );
如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级。
Create table "S-T".Student(......); /*模式名为 S-T*/
Create table "S-T".Cource(......);
Create table "S-T".SC(......);
ALTER TABLE <表名>
[ ADD <新列名> <数据类型> [ 完整性约束 ] ]
[ DROP <完整性约束名> ]
[ ALTER COLUMN<列名> <数据类型> ];
DROP TABLE <表名>[RESTRICT| CASCADE];
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
DROP INDEX <索引名>;
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>] …
FROM <表名或视图名>[, <表名或视图名> ] …
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
|
查 询 条 件 |
谓 词 |
|
比 较 |
=,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比较运算符 |
|
确定范围 |
BETWEEN AND,NOT BETWEEN AND |
|
确定集合 |
IN,NOT IN |
|
字符匹配 |
LIKE,NOT LIKE |
|
空 值 |
IS NULL,IS NOT NULL |
|
多重条件(逻辑运算) |
AND,OR,NOT |
一个SELECT-FROM-WHERE语句称为一个查询块
将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询
SELECT [ALL|DISTINCT]
<目标列表达式> [别名] [ ,<目标列表达式> [别名]] …
FROM <表名或视图名> [别名]
[ ,<表名或视图名> [别名]] …
[WHERE <条件表达式>]
[GROUP BY <列名1>
[HAVING <条件表达式>]]
[ORDER BY <列名2> [ASC|DESC]
INSERT
INTO <表名> [(<属性列1>[,<属性列2 >…)]
VALUES (<常量1> [,<常量2>] … )
INSERT
INTO <表名> [(<属性列1> [,<属性列2>… )]
子查询;
SELECT子句目标列必须与INTO子句匹配
UPDATE <表名>
SET <列名>=<表达式>[,<列名>=<表达式>]…
[WHERE <条件>];
DELETE
FROM <表名>
[WHERE <条件>];
CREATE VIEW
<视图名> [(<列名> [,<列名>]…)]
AS <子查询>
[WITH CHECK OPTION];
DROP VIEW <视图名>;
数据库安全性
GRANT <权限>[,<权限>]...
[ON <对象类型> <对象名>]
TO <用户>[,<用户>]...
[WITH GRANT OPTION];
REVOKE <权限>[,<权限>]...
[ON <对象类型> <对象名>]
FROM <用户>[,<用户>]...;
CREATE USER <username>
[WITH][DBA | RESOURCE | CONNECT]
CREATE ROLE <角色名>
GRANT <权限>[,<权限>]…
ON <对象类型>对象名
TO <角色>[,<角色>]…
GRANT <角色1>[,<角色2>]…
TO <角色3>[,<用户1>]…
[WITH ADMIN OPTION]
REVOKE <权限>[,<权限>]…
ON <对象类型> <对象名>
FROM <角色>[,<角色>]…
数据库完整性
例如,关系SC中一个元组表示一个学生选修的某门课程的成绩,(Sno,Cno)是主码。Sno,Cno分别参照引用Student表的主码和Course表的主码
[例3] 定义SC中的参照完整性
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno, Cno), /*在表级定义实体完整性*/
FOREIGN KEY (Sno) REFERENCES Student(Sno),
/*在表级定义参照完整性*/
FOREIGN KEY (Cno) REFERENCES Course(Cno)
/*在表级定义参照完整性*/
);
CONSTRAINT <完整性约束条件名>
[PRIMARY KEY短语
|FOREIGN KEY短语
|CHECK短语]
CREATE TRIGGER <触发器名>
{BEFORE | AFTER} <触发事件> ON <表名>
FOR EACH {ROW | STATEMENT}
[WHEN <触发条件>]
<触发动作体>
DROP TRIGGER <触发器名> ON <表名>;
关系数据理论

R ∈3NF 证: 设Y Í X Í U
对R <U,F> 的任一关系r中的任意两个元组t,s:
若t[X]=s[X],由于Y Í X,有t[y]=s[y],
所以X→Y成立,自反律得证
证:设X→Y为F所蕴含,且Z Í U。
设R<U,F> 的任一关系r中任意的两个元组t,s:
若t[XZ]=s[XZ],则有t[X]=s[X]和t[Z]=s[Z];
由X→Y,于是有t[Y]=s[Y],所以t[YZ]=s[YZ],所以
XZ→YZ为F所蕴含,增广律得证。
证:设X→Y及Y→Z为F所蕴含。
对R<U,F> 的任一关系 r中的任意两个元组 t,s:
若t[X]=s[X],由于X→Y,有 t[Y]=s[Y];
再由Y→Z,有t[Z]=s[Z],所以X→Z为F所蕴含,传递律得证。
(A2, A3)
(A2, A3)
(A1, A3)
证: 必要性显然,只证充分性。
(1)若FÍG+ ,则XF+ Í XG++ 。
(2)任取X→YÎF+ 则有 Y Í XF+ Í XG++ 。
所以X→Y Î (G+)+= G+。即F+ Í G+。
(3)同理可证G+ Í F+ ,所以F+ = G+。
证明: 构造性证明,找出F的一个最小依赖集。
(1)逐一检查F中各函数依赖FDi:X→Y,若Y=A1A2 …Ak,k > 2,
则用 { X→Aj |j=1,2,…, k} 来取代X→Y。
(2)逐一检查F中各函数依赖FDi:X→A,令G=F-{X→A},
若AÎXG+, 则从F中去掉此函数依赖。
(3)逐一取出F中各函数依赖FDi:X→A,设X=B1B2…Bm,
逐一考查Bi (i=l,2,…,m),若A Î(X-Bi )F+ ,
则以X-Bi 取代X。
数据库设计
数据项描述={数据项名,数据项含义说明,别名,
数据类型,长度,取值范围,取值含义,
与其他数据项的逻辑关系,数据项之间的联系 }
数据结构描述={数据结构名,含义说明,
组成:{数据项或数据结构}}
数据流描述={ 数据流名,说明,数据流来源,
数据流去向,组成:{数据结构},
平均流量,高峰期流量}
数据存储描述={数据存储名,说明,编号,
输入的数据流 ,输出的数据流 ,
组成:{数据结构},数据量,存取频度,存取方式}
处理过程描述={处理过程名,说明,输入:{数据流},
输出:{数据流},处理:{简要说明}}
数据库编程
BEGIN DECLARE SECTION
.........
......... (说明主变量和指示变量)
.........
END DECLARE SECTION
EXEC SQL CONNECT TO target [AS connection-name] [USER user-name];
EXEC SQL DISCONNECT [connection];
EXEC SQL SET CONNECTION connection-name | DEFAULT;
EXEC SQL DECLARE <游标名> CURSOR
FOR <SELECT语句>;
是一条说明性语句,这时DBMS并不执行SELECT指定的查询操作。
EXEC SQL OPEN <游标名>;
打开游标实际上是执行相应的SELECT语句,把所有满足查询条件的记录从指定表取到缓冲区中这时游标处于活动状态,指针指向查询结果集中第一条记录
EXEC SQL FETCH [[NEXT|PRIOR|
FIRST|LAST] FROM] <游标名>
INTO <主变量>[<指示变量>][,<主变量>[<指示变量>]]...;
指定方向推动游标指针,然后将缓冲区中的当前记录取出来送至主变量供主语言进一步处理
NEXT|PRIOR|FIRST|LAST:指定推动游标指针的方式
NEXT:向前推进一条记录
PRIOR:向回退一条记录
FIRST:推向第一条记录
LAST:推向最后一条记录
缺省值为NEXT
EXEC SQL CLOSE <游标名>;
关闭游标,释放结果集占用的缓冲区及其他资源
游标被关闭后,就不再和原来的查询结果集相联系
被关闭的游标可以再次被打开,与新的查询结果相联系
WHERE CURRENT OF <游标名>
表示修改或删除的是最近一次取出的记录,即游标指针指向的记录
EXEC SQL PREPARE <语句名> FROM <SQL语句主变量>;
EXEC SQL EXECUTE <语句名> [INTO <主变量表>] [USING < 主变量或常量>];
DECLARE
------变量、常量、游标、异常等
BEGIN
------SQL语句、PL/SQL的流程控制语句
EXCEPTION
------异常处理部分
END;
1. IF condition THEN
Sequence_of_statements;
END IF
2. IF condition THEN
Sequence_of_statements1;
ELSE
Sequence_of_statements2;
END IF;
3. 在THEN和ELSE子句中还可以再包括IF语句,即IF语句可以嵌套
1.最简单的循环语句LOOP
LOOP
Sequence_of_statements;
END LOOP;
多数数据库服务器的PL/SQL都提供EXIT、BREAK或LEAVE等循环结束语句,保证LOOP语句块能够结束。
2. WHILE-LOOP
WHILE condition LOOP
Sequence_of_statements;
END LOOP;
每次执行循环体语句之前,首先对条件进行求值
如果条件为真,则执行循环体内的语句序列。
如果条件为假,则跳过循环并把控制传递给下一个语句
3. FOR-LOOP
FOR count IN [REVERSE]bound1 … bound2 LOOP
Sequence_of_statements;
END LOOP;
CREATE Procedure 过程名([参数1,参数2,...]) AS
<PL/SQL块>;
ALTER Procedure 过程名1 RENAME TO 过程名2;
CALL/PERFORM. Procedure 过程名([参数1,参数2,...]);
DROP PROCEDURE 过程名();
对象关系数据库系统
CREATE TABLE SALES
(
ITEM_NO CHAR(20), /*商品号*/
QTY INTEGER ARRAY[12], /*整数数组,存放销售额*/
PRIMARY KEY(ITEM_NO)
);
INSERT INTO SALES(ITEM_NO,QTY)VALUES
('T-shirt2000',ARRAY[200,150,200,100,50,70,
80,200,10,20,100,200]);
SELECT ITEM_NO
FROM SALES
WHERE QTY[3]>100;
CREAT TYPE <type name>
AS <built in scalar type name> FINAL
[ <cast option>]
[ <method specification commalist>];
CREAT TYPE SHOE_SIZE_TYPE AS INTEGER FINAL;
CREAT TYPE IQ_TYPE AS INTEGER FINAL;
CREATE ROW TYPE <row_type_name>
(<component declarations>);
CREATE ROW TYPE Person_type
(pno NUMBER,
name VARCHAR2(100),
address VARCHAR2(100) );
CREATE TABLE <table_name> OF <row_type_name>;
CREATE TABLE person_extent OF Person_type
(pno PRIMARY KEY );
CREATE TYPE <type_name> AS OBJECT
(<component declarations>);
CREATE TYPE address_objtyp AS OBJECT
(street VARCHAR2(50),
city VARCHAR2(50) );
CREATE TYPE name_objtyp AS OBJECT
(first_name VARCHAR2(30),
last_name VARCHAR2(30) ) ;
CREATE TABLE people_reltab (
Id NUMBER(10),
name_obj name_objtyp,
address_obj address_objtyp);
CREATE TYPE <type_name> (
所有属性名及其类型说明,
[定义该类型的等于=和小于<函数,]
定义该类型其他函数(方法));
CREATE ROW TYPE employee_type(
name VARCHAR(35),
age INTEGER );
CREATE ROW TYPE Comp_type(
compname VARCHAR(20),
location VARCHAR(20) );
CREATE TABLE Employee OF employee_type;
CREATE TABLE Company OF Comp_type
CREATE ROW TYPE Employment_type (
employee REF (employee_type),
company REF (Comp_type) );
CREATE TABLE Employment OF Employment _type
CREATE ROW TYPE employee_type(
name VARCHAR(35),
age INTEGER,
emp_id REF(employee_type) );
CREATE TABLE Employee OF employee_type
VALUES FOR emp_id ARE SYSTEM GENERATED;
<参照属性名>[REF(<类型名>)]SCOPE IS <关系名>
CREATE TABLE address_objtab OF address_objtyp ;
CREATE TABLE people_reltab2 (
id NUMBER(4) PRIMARY KEY,
name_obj name_objtyp,
addresss_ref REF(address_objtyp) SCOPE IS address_objtab )
CREATE INDEX address_ref_idx ON people_reltab2(address_ref) ;
SELECT id
FROM people_reltab2 p
WHERE p.address_ref.city='北京' and
p.address_ref.street='牛街';
CREATE TYPE emp_type
UNDER person_type AS(
emp_id INTEGER,
salary REAL )
NOT FINAL;
CREATE TYPE person /*创建person 类型,根类型*/
(id INTEGER,
name VARCHAR(20),
birthyear INTEGER,
address VARCHAR(40))
NOT FINAL; /*NOT FINAL表示可以有子类型*/
CREATE TYPE employee /*创建person的子类型employee*/
UNDER person /*类型employee继承person的属性*/
(salary INTEGER) /* employee定义自己的属性*/
NOT FINAL;
CREATE TYPE executive /*创建employee的子类型executive*/
UNDER employee
(bonus INTEGER)
FINAL;
CREATE TYPE student /*创建person的子类型student */
UNDER person
(major VARCHAR(10),wage DECIMAL)
FINAL
CREATE TYPE department
(ID INTEGER,
manager REF(employee),
Budget INTEGER);
ALTER TYPE employee
ADD ATTRIBUTE dept REF(department);
CREATE TABLE person_table OF person
(name WITH OPTIONS NOT NULL);
CREATE TABLE employee_table OF employee
UNDER person_table;
CREATE TABLE exec_table of executive
UNDER employee_table
CREATE TABLE student_table OF student
UNDER person_table;
CREATE TABLE dept_table OF department
(manager SCOPE IS employee_table);
ALTER TABLE employee_table
ALTER COLUMN dept ADD SCOPE IS dept_table;
SELECT name,address
FROM person_table
WHERE birthyear <=1970;
SELECT name,address
FROM ONLY person_table
WHERE birthyear <=1970;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30608670/viewspace-1869408/ ,如需转载,请注明出处,否则将追究法律责任。