当有人提到数据库课程中的关系时,这是什么意思?
解决方法
令人惊讶的是,“关系”数据库中的“关系”并不表示一个表与另一个表的外键关系.根据维基百科
‘Relation (database)’所述,“关系是一种数据结构,包括一个标题和一组共享相同类型的无序元组.”
在sql RDBMS(如MS sql Server和Oracle)中,表格是存储关系,其中在数据字典中定义的列名称形成“标题”,行是关系的“元组”.
然后从表中查询可以返回一个不同的关系:
create table t (x number primary key,y number not null); Table created. sql> insert into t values (1,10); 1 row created. sql> insert into t values (2,20); 1 row created. sql> select x from t; X ---------- 1 2
从t中选择x,返回一个与基表相比较少的列,少元素的元组的关系.并从t中选择x,y,其中x = 1将返回与基表相比较少的元组的关系:
sql> select x,y from t where x = 1; X Y ---------- ---------- 1 10
使用内连接的示例:
sql> create table s (x number primary key,words varchar2(100) not null); Table created. sql> insert into s values (1,'Hello World!'); 1 row created. sql> insert into s values (3,'Will not show'); 1 row created. sql> select t.x,t.y,s.words 2 from t 3 inner join s 4 on t.x = s.x; X Y WORDS ---------- ---------- --------------- 1 10 Hello World!
在概念上,t.x = s.x上的t内连接经过以下步骤:
>拿取s和t的笛卡尔乘积,取每行s,并将其与每行t组合,得到一个大小为t * t或t的大小的元组,每个元组都有两个列的所有列和t很像结果:
sql>选择*从s,t;
X WORDS X Y
3 Will not show 1 10 3 Will not show 2 20 1 Hello World! 1 10 1 Hello World! 2 20
(或从sql-92语法中的s交叉连接中选择*)从包含四个元组的笛卡尔乘积(在s.x = t.x上四列)将元组还原为一个,仍然有四列:
sql> select * 2 from t 3 inner join s 4 on t.x = s.x; X Y X WORDS ---------- ---------- ---------- --------------- 1 10 1 Hello World!
并选择t.x,s.word从关系中除去一列.
请注意,以上描述了正在发生的一个概念或逻辑模型.数据库带有查询优化器,它们旨在给出结果,就好像遵循所有逻辑步骤一样,但是在物理实现工作中跳过步骤,并使用不是部分的支持物理结构(如索引)的关系模型.
视图是不存储关系的关系定义,而是根据其他关系定义关系,最终以底部的表格. (除了物化视图,预先计算并存储基于其他关系的关系.)