@3013216027
2016-01-28T13:18:42.000000Z
字数 4001
阅读 967
数据库原理复习专栏
本章介绍在服务器环境下的工作,包括其工作架构(说白了就是这个装数据的仓库是如何严格地控制数据的读取、写入)及如何与外界交互数据(具体地,如在中如何访问数据库)。
玛雅,这章太繁杂了,写不动了。如需掌握,写一发代码理解会深刻许多。
考虑设计维护数据库的初衷,是因数据需要保存而设立,不仅仅是为了想图书馆保存图书那样方便整理和查找,也是处于对数据安全性的考虑。典型的数据库应用场景均发生一个相似的情形下:
就这样,很自然地就有了三层体系结构
三层体系结构,也称三阶体系结构。
SELECT name FROM students WHERE YEAR(birthDate) = 1995 AND gender = 'M';
的语句,并负责向数据库提交,然后把结果或直接或处理后返回给端,最后便可以展示给用户看了。环境的标准结构
use employees;
,employees
中包含的所有表、视图、触发器等就是一个模式。show databases;
列出的每一项都可以认为是一个模式( 注意其中的等模式),所有这些模式加起来,就是目录。连接
CONNECT TO <服务器名> AS <连接名> AUTHORIZATION <名字和密码>
SET CONNECTION conn1
DISCONNECT conn1
MySQL
时,类似mysql -u root -p
这样的命令会自动建立相应的连接。另外,如果在本地环境下,可以在MySQL
中使用如connect employees;
来使用一个新连接连接到指定的schema(database)
,可以看到关于连接的提示。
String sql = "INSERT INTO departments_copy VALUES (?, ?)";
PreparedStatement stat = DBConnection.getConnection().prepareStatement(sql);
/* complete stat here ... */
/* then execute the statement here ... */
就使用了函数库中的如类。
直接嵌套
阻抗不匹配问题:的数据模式和其它预言的模式差别很大。
EXEC SQL
提示预处理器语句的嵌入。类似于的glBegin()
和glEnd()
。
EXEC SQL BEGIN DECLARE SECTION;
EXEC SQL END DECLARE SECTION;
void getStudio() {
EXEC SQL BEGIN DECLARE SECTION;
char studioName[50];
char studioAddr[256];
char SQLSTATE[6]; /* SQL状态结果 */
EXEC SQL END DECLARE SECTION;
EXEC SQL INSERT INTO Studio(name, address) VALUES (:studioName, :studioAddr);
上述一堆大写在预处理时会被替换成真正有效的语句。
create procedure solveA
(in name varchar(64))
begin
select netWorth from MovieExec
where cert in (select pres from Studio);
end
create function solveB
(name varchar(64), address varchar(255)) returns int
declare isStar boolean;
declare isProducer boolean;
begin
if ((name, address) in (select name, address from MovieStar)) then
isStar = true;
else
isStar = false;
end if
if ((name, address) in (select name, address from MovieExec)) then
isProducer = true;
else
isProducer = false;
end if
if (isStar and not isProducer) then
return 1;
elseif (not isStar and isProducer) then
return 2;
elseif (isStar and isProducer) then
return 3;
else
return 4;
end if
end
create procedure solveC
(in sName varchar(64), out longest varchar(64), out second_longest varchar(64))
declare notFound condition for sqlstate '02000';
declare c cursor for select name from Movies where studioName = sName order by length desc;
begin
fetch c into longest;
if notFound then
set longest = NULL;
set second_longest = NULL;
else
fetch c into second_longest;
if notFound then
set second_longest = NULL;
end if
end if
end