1.一个属性既可以是主键又可以是外键(这种情况主要出现在一个对象属于另一个对象的情况下吗?)
学生(学号,姓名)
本科生(学号,专业)
其中学号均为主键,并且学生表的学号分别又为后表的外键
2.参照完整性的进一步理解:
关系R( A,B,C) S(D,E,A) A是R的主键,A是S的外键
<注意这并不属于上面既是主键又是外键的情况>
A作为R的主键当然要有作为主键的限制,例如不能重复,不能为空之类的
A作为S的外键也要有一定的限制,例如A在S中一定要是R中有的值,或者NULL。(即符合参考完整性)
3.where字句和having的区别:
两者作用对象不同。where字句作用于基本表和试图,从中选择满足条件的元组,having短语作用于组(即GROUP BY得到的组),
从中选择满足条件的组,例:
select sno
from sc
group by sno
having count(*)>3
4.数据查询主要分为:单表查询,连接查询,嵌套查询,集合查询.
其中连接查询里面的自身连接可以注意一下; 而嵌套查询正是Structed Query Language 的含义所在。
下面看一个关于嵌套查询中exists查询的例子:
查询所有选修了1号课程的学生姓名:
select sname
from student
where EXISTS
(select *
from sc
where sno=student.sno and cno='1'
)
只要exists子句为真,就把student表中的sname放到结果集了,另外in子句是先内查询再外查询,而exists子句是内外同时查询。
同理,查询没有选修1号课程的学生姓名:
select sname
from student
where not EXISTS
(select *
from sc
where sno=student.sno and cno='1'
)
总之,只要抓住三点就行:
(1).exists子句是内外同时查询;
(2).当使用的是存在量词EXISTS:若内层查询有结果时,外层的WHERE子句返回真值 ;
当使用的是存在量词NOT EXISTS:若内层查询没有结果时,外层的WHERE子句返回真值;
(3).只有当where返回为真时,内查询才把得到的结果放到结果集中。
补充中。。。。。。。。。。。。。。。。。。