Loading... # Ch3. 关系数据库标准语言SQL ## 3.1 SQL的特点 1. 综合统一:SQL集**数据定义语言** *(DDL)*、**数据操纵语言** *(DML)*、**数据控制语言** *(DCL)*于一体 2. 高度非过程化:只需要提出做什么,而不是怎么做;存储路径的选择以及SQL语句的操作过程由系统自动完成 3. 面向集合的操作方式:不仅操作对象、查找结果可以是元组的集合,而且一次插入、删除、更新的操作也可以是元组的集合 4. 同一种语法结构提供两种使用方法:既是自含式语言,又是嵌入式语言 5. 语言简洁、易学易用 ## 3.2 在 ``DROP TABLE`` 时,``RESTRICT`` 和 ``CASCADE`` 的区别 ``RESTRICT`` 表示表的删除是有条件的,要删除的基本表不能被其他表的约束所引用,不能有视图、触发器、存储过程和函数等 ``CASCADE`` 表示表的删除没有条件,在删除表的同时也会删除相关的依赖对象 ## 3.3 由两个关系 $S(A,B,C,D)$和$T(C,D,E,F)$,写出等价的SQL表达式 ### 3.3.1 $\sigma_{A=10}(S)$ ```sql SELECT * FROM S WHERE A=10 ``` ### 3.3.2 $\prod_{A,B}(S)$ ```sql SELECT A, B FROM S ``` ### 3.3.3 $S \Join T$ ```sql SELECT A, B, S.C, S.D, E, F FROM S, T WHERE S.C=T.C AND S.D=T.D ``` ### 3.3.4 $S \Join_{S.C=T.C} T$ ```sql SELECT A, B, S.C, S.D, E, F FROM S,T WHERE S.C=T.C ``` ### 3.3.5 $S \Join_{A<E} T$ ```sql SELECT A, B, S.C, S.D, E, F FROM S,T WHERE A<E ``` ### 3.3.6 $\prod_{C,D}(S) \times T$ ```sql SELECT S1.C, S1.D, T.C, T.D, E, F FROM T, ( SELECT C, D FROM S ) AS S1 ``` ## 3.4 什么是基本表,视图;两者的区别和联系是什么 **基本表**是本身独立存在的表,在SQL中一个关系就对应一个基本表 **视图**是一个或多个基本表导出的表,是一个**虚表** ## 3.5 视图的优点 1. 能简化用户的操作 2. 使用户能以多种角度看待同一数据 3. 对重构数据库提供了一定程度的逻辑独立性 4. 能够对机密数据提供安全保护 ## 3.6 哪类视图可以更新,哪些不能? 基本表中行列子集视图一般是可更新的 若视图的属性来自聚集函数、表达式,则不可更新 ## 练习 ### Prac.1 设有一个SPJ数据库,包括S、P、J、及SPJ4种关系模式 - $S(SNO,SNAME,STATUS,CITY)$ *供应商表(供应商代码,供应商姓名,供应商状态、供应商所在城市)* - $P(PNO,PNAME,COLOR,WEIGHT)$ *零件表(零件代码,零件名,颜色,重量)* - $J(JNO,JNAME,CITY)$ *工程项目(工程项目代码,工程项目名,工程项目所在城市)* - $SPJ(SNO,PNO,JNO,QTY)$ *供应情况表(供应商代码,零件代码,工程项目代码、供应数量)* #### Task.1 通过SQL建立4张表 ```sql -- S(SNO,SNAME,STATUS,CITY) CREATE TABLE S( SNO CHAR(3), SNAME CHAR(10), STATUS CHAR(2), CITY CHAR(10) ); -- P(PNO,PNAME,COLOR,WEIGHT) CREATE TABLE P( PNO CHAR(3), PNAME CHAR(10), COLOR CHAR(4), WEIGHT INT ); -- J(JNO,JNAME,CITY) CREATE TABLE J( JNO CHAR(3), JNAME CHAR(10), CITY CHAR(10) ) -- SPJ(SNO,PNO,JNO,QTY) CREATE TABLE SPJ( SNO CHAR(3), PNO CHAR(3), JNO CHAR(3), QTY INT ); ``` #### Task.2 根据要求编写查询SQL语句 ##### 求供应商J1零件的供应商号码SNO ```sql SELECT SNO FROM SPJ WHERE JNO='J1'; ``` ##### 求供应商工程J1零件P1的供应商号码SNO ```sql SELECT SNO FROM SPJ WHERE JNO='J1' AND PNO='P1'; ``` ##### 求供应商J1零件未红色的供应商号码SNO ```sql SELECT SNO FROM SPJ WHERE JNO='J1' AND PNO IN ( SELECT PNO FROM P WHERE COLOR='RED' ); ``` ##### 求没有使用天津供应商生产的红色零件的工程号JNO ```sql SELECT JNO FROM J WHERE NOT EXISTS ( SELECT * FROM SPJ WHERE SPJ.JNO=J.JNO AND SNO IN ( SELECT SNO FROM S WHERE CITY='TIANJIN' ) AND PNO IN ( SELECT PNO FROM P WHERE COLOR='RED' ) ); ``` ##### 求至少用了供应商S1所提供的全部零件的工程号JNO 该查询可以抽象为:要求这样的工程 $x$,使 $(\forall y) p \to q$ 为真,即: 对于所有的零件 $y$,满足逻辑蕴涵 $p \to q$: - $p$ 表示谓词:供应商S1供应了零件 $y$ - $q$ 表示为谓词:工程 $x$ 选用了零件 $y$ 只要“供应商S1供应了零件$y$为真”,则工程 $x$ 选用了零件 $y$ 为真 可以转化为等价形式 $$ \begin{aligned} (\forall y) p \to q & \equiv \neg(\exists y(\neg (p \to q))) \\ & \equiv \neg(\exists y(\neg (\neg p \lor q))) \\ & \equiv \neg \exists(p \land \neg q) \end{aligned} $$ 即:不存在这样的零件$y$,供应商S1供应了$y$,而工程$x$没有选用$y$ ```sql SELECT DISTINCT JNO FROM SPJ Z WHERE NOT EXISTS ( SELECT * FROM SPJ X WHERE SNO='S1' AND NOT EXISTS ( SELECT * FROM SPJ Y WHERE Y.PNO=X.PNO AND Y.JNO=Z.JNO ) ); ``` 最后修改:2020 年 11 月 01 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏