第三章
主要内容笔记
1. SQL数据库的体系结构,SQL的组成
2. SQL的数据定义
SQL模式、基本表和索引的创建和撤销
3. SQL的数据查询
SELECT语句的句法
SELECT语句的三种形式及各种限定
基本表的联结操作
SQL3中的递归查询
4. SQL的数据更新
插入、删除和修改语句
5. 视图
视图的创建和撤销
对视图更新操作的限制
6. 嵌入式SQL
预处理方式
使用规定
实用技术
卷游标
动态SQL语句
值得注意的例题
1. 检索至少选修课程号为C2和C4的学生的学号*
SELECT X.S#
FROM SC X, SC Y
WHERE X,S# = Y.S# AND X.C# = 'C2' AND Y.C# = 'C4';
i.e. 要用定义两个一样的表来检索
2. 检索学习全部课程的学生姓名*
SELECT SNAME FROM S
WHERE NOT EXISTS (
/ / SELECT * FROM C
/ / WHERE NOT EXISTS(
/ / / / SELECT * FROM SC
/ / / / WHERE SC.S# = S.S# AND SC.C# = C.C#) );
i.e.必须用双重否定:有一位学生 {SNAME FROM S}
/ / [找不到]{NOT EXISTS}一门课程 { * FROM C}
/ / [不在] {NOT EXISTS}学生的课表中 (* FROM SC WHERE SC.S#=S.S# AND SC.C#=C.C#;}
3. 与2.类似:
检索所学课程包含学生S3所学课程的学号
SELECT DISTINCT S# FROM SC X
WHERE NOT EXISTS (
/ / SELECT * FROM SC Y
/ / WHERE Y.S# = ‘S3’ AND NOT EXISTS(
/ / / / SELECT * FROM SC Z
/ / / / WHERE Z.S# = X.S# AND Z.C# = Y.C#) );
i.e.与2.结构一样,不同之处在于把“找不到一门课程”变成了“找不到S3的一门课程”
/ / 即{SELECT * FROM SC WHERE S#=S3}
4. 图示形式
a. 检索所学课程号为C2 或 C4 的学生学号
b. 检索所学课程号为C2 和 C4 的学生学号
c. 检索所学课程包含S3所学课程的学号
5. 集合成员的算术比较
a. IN 等价于 =SOME
b. NOT IN 等价于 <>ALL
6. 基本表的连接操作
-
连接类型、连接条件
-
i.e.内连接:等值/条件连接,不等/不满足条件删去 ; 外连接:不等/不满足条件保留
-
举例
i.e.NATURAL\ON\USING 的区别:
- NATURAL 所有的公共属性连接,只出现一次
- ON 选择属性可是公共/非公共,作等值连接,不会删去等值属性,均会保留
- USING 部分公共属性,cue到的公共属性只出现一次(没被cue到的均会保留)
7. 递归查询
8. 数据插入
9. 数据修改
10. 嵌入式SQL C语言*
- 例1:在基本表SC中检索某学生(学号由共享变量givesno给出)的学习成绩信息(S#, C#, SCORE), 如下查询的一个C函数:
- 例2
i.e. - WHERE CURRENT OF scx 等价于 游标scx所指的元组;SET SCORE=70之后,还要g=70,是因为二者不是同步的;
- C语言:while(1){…}; if(g<70)… [不用{}!!!] else{…}; %s 输出char;%d 输出int整数;\n表示换行
11. 动态SQL语句的使用技术
- 动态SQL预备/执行语句
- 举例
Q1:’?‘可以这么用吗?
Q2:que什么玩意?dynprog又是什么玩意? A:为动态语句命的名儿。
Q3:SQL语句可以用char*query来定义???nb。
我终于可以去吃饭了。T^T
重要内容分析
-
SELECT语句的来历
针对下列在关系代数中最常用的式子,SQL设计SELECT-FROM-WHERE 句型
SELECT A1…,AN
FROM R1,…,RN
WHERE F -
SELECT语句中出现的基本表名=基本表中的元组变量;列名=元组分量
-
SELECT语句的语义
- 无分组的子句(GROUP BY…),无聚合操作(SUM(…),COUNT(),AVE()…):那么是执行投影操作;
- 无分组子句,使用了聚合操作:那么语义是对查询结果执行聚合操作
- 使用了分组子句和聚合操作(有前者必有后者):语义是对查询结果的每一组做聚合操作
- SELECT语句中使用分组子句先决条件是有聚合操作;但执行聚合操作不一定要用分组子句(当聚合值FROM之后一个);当聚合值FROM有多个必须使用分组子句