\documentclass[全部作业]{subfiles} \input{mysubpreamble} \begin{document} \setcounter{chapter}{1} \chapter{第二周作业} \begin{enumerate} \item 以下四个整数哪个不在Int类型的范围内? \begin{tasks}[](4) \task \fbox{$2^{31}$} \task $2^{31}-1$ \task $-2^{31}$ \task $-2^{31}+1$ \end{tasks} \item 以下四个整数哪个不在Unsigned Int类型的范围内? \begin{tasks}[](4) \task $2^{31}$ \task $2^{31}-1$ \task \fbox{$2^{32}$} \task $2^{32}-1$ \end{tasks} \item 对于默认的Decimal与Double类型,分别输入1234.56与9876.54后,将其字段类型分别修改为Decimal(5,1)与Double(5,1),最终显示的内容为 \begin{tasks}[](4) \task 1235.0、9877.0 \task 1234.6、9876.5 \task \fbox{1235.0、9876.5} \task 1235.6、9876.0 \end{tasks} \begin{verification} \begin{minted}{sql} drop table if exists test1; create table if not exists test1(decimal_ decimal, double_ double); \end{minted} \includegraphics[width=0.6\linewidth]{imgs/2024-09-27-08-44-19.png} \begin{minted}{sql} insert into test1 values (1234.56, 9876.54); \end{minted} \includegraphics[width=0.6\linewidth]{imgs/2024-09-27-08-47-00.png} \begin{minted}{sql} alter table test1 modify column decimal_ decimal(5, 1); alter table test1 modify column double_ double(5, 1); \end{minted} \includegraphics[width=0.6\linewidth]{imgs/2024-09-27-08-51-00.png} \end{verification} \item 对于两种类型,分别设置为ENUM(‘a’, ‘b’, ‘c’)与SET(‘a’, ‘b’, ‘c’),之后均输入数据’a’、’a,c’、’a,d’,最终显示的内容为 \begin{tasks}[](2) \task (‘a’)、(‘a’) \task (‘a’)、(‘a’, ‘a,c’) \task \fbox{(‘a’)、(‘a’, ‘a,c’, ‘a’)} \task (‘a’, ‘a,c’)、(‘a’, ‘a,c’, ‘a’) \end{tasks} \begin{verification} \begin{minted}{sql} DROP TABLE if EXISTS test2; CREATE TABLE if NOT EXISTS test2( enum_ enum('a', 'b', 'c'), set_ set('a', 'b', 'c') ); INSERT INTO test2 VALUES ('a', 'a'); INSERT INTO test2 VALUES ('a,c', 'a,c'); INSERT INTO test2 VALUES ('a,d', 'a,d'); \end{minted} \includegraphics[width=0.6\linewidth]{imgs/2024-09-27-09-09-53.png} \end{verification} \item 假设表A中有3个数据,其NAME项分别为\mycircle{1}‘Li Ming’, \mycircle{2}‘Fang Li’, \mycircle{3}‘Tang Li Zhi’, 对于命令SELECT NAME FROM A WHERE NAME LIKE ‘\%Li’, 其返回内容为 \begin{tasks}[](4) \task \mycircle{1} \task \fbox{\mycircle{2}} \task \mycircle{3} \task \mycircle{1}\mycircle{2}\mycircle{3} \end{tasks} \begin{verification} \begin{minted}{sql} DROP TABLE if EXISTS test3; CREATE TABLE IF NOT EXISTS test3(name varchar(255)); INSERT INTO test3 VALUES ('Li Ming'), ('Fang Li'), ('Tang Li Zhi'); SELECT NAME FROM test3 WHERE NAME like '%Li'; \end{minted} \includegraphics[width=0.3\linewidth]{imgs/2024-09-27-09-24-05.png} \end{verification} \item 对于以下4个查询,有哪些语句返回值为NULL \begin{enumerate}[label=\mycircle{\arabic{enumii}}] \item SELECT (!NULL) \item SELECT (NULL \&\& 1) \item SELECT (NULL || 1) \item SELECT (NULL XOR 1) \end{enumerate} \begin{tasks}[](4) \task \mycircle{1}\mycircle{4} \task \mycircle{2}\mycircle{3} \task \fbox{\mycircle{1}\mycircle{2}\mycircle{4}} \task \mycircle{1}\mycircle{2}\mycircle{3}\mycircle{4} \end{tasks} \item 以下哪条删除记录正确的 \begin{tasks}[](2) \task \fbox{delete from emp where name='dony';} \task delete * from emp where name='dony'; \task drop from emp where name='dony'; \task drop * from emp where name='dony'; \end{tasks} \questionandanswer[]{ 上机题: 写出向员工表(employee)插入如下记录的sql: 姓名:李四 员工编号:19 入职日期:2022-9-22 离职日期:无 职位名称:出纳员 分支机构编号:1 部门编号:2 上级领导编号:4 }{} \begin{minted}{sql} insert into employee (LAST_NAME, FIRST_NAME, EMP_ID, START_DATE, END_DATE, TITLE, ASSIGNED_BRANCH_ID, DEPT_ID, SUPERIOR_EMP_ID) values ("李", "四", 19, "2022-9-22", null, "出纳员", 1, 2, 4); \end{minted} \questionandanswer[]{ 上机题: 写出向上一条记录职位修改为’出纳主任’的sql }{} \begin{minted}{sql} update employee set TITLE = "出纳主任" where EMP_ID = 19; \end{minted} \questionandanswer[]{ 上机题: 写出删除交易记录表(acc\_transaction)中交易时间(TXN\_DATE)在2012-01-01之前的交易记录的SQL }{} \begin{minted}{sql} delete from acc_transaction where TXN_DATE < "2012-01-01"; \end{minted} \questionandanswer[]{ 上机题: officer 单位联系人信息表中用到了哪几种基本数据类型,这几种数据类型的特性是什么? }{ int, date, varchar。 \begin{itemize} \item int的特性是用来存储整数,一般占用4个字节,可以存储从 -$2^{31}$ 到 $2^{31}-1$ 的整数值; \item date的特性是用来存储日期,可以进行日期相关的运算; \item varchar的特性是用来存储可变长度的字符串,其参数用来指定最大长度。 \end{itemize} } \questionandanswer[]{ 日期时间类型中,DATETIME和TIMESTAMP的最大值是一样的,并且这两个类型值都与时区有关。上述说法是否正确,请指正。 }{ 不正确。最大值不同,datetime的最大值为9999-12-31 23:59:59,timestamp的最大值是2037-12-31 23:59:59;且datetime一般是无时区的,而timestamp一般是有时区的。 } \questionandanswer[2.7]{ 请考虑图 \ref{fig:2-18} 的银行数据库。假设支行名称和客户ID分别能够唯一标识支行(branch)和客户(customer),但贷款(loan)和账户(account)可以与多位客户相关联。 }{} \begin{figure}[H] \begin{minted}[frame=single]{text} branch(branch_name, branch_city, assets) customer (ID, customer_name, customer_street, customer_city) loan (loan_number, branch_name, amount) borrower (ID, loan_number) account (account_number, branch_name, balance) depositor (ID, account_number) \end{minted} \caption{银行数据库}\label{fig:2-18} \end{figure} \begin{enumerate} \questionandanswer[]{ 每个关系适当的主码属性是什么? }{} { \begin{minted}{text} branch 的主码为 branch_name customer 的主码为 ID loan 的主码为 (loan_number, branch_name) borrower 的主码为 (ID, loan_number) account 的主码为 (account_number, branch_name) depositor 的主码为 (ID, account_number) \end{minted} } \questionandanswer[]{ 确定每个关系适当的外码属性。 }{} { \begin{minted}[fontsize=\small]{text} branch 无外码 customer 无外码 loan 的外码为 loan_number -> borrower.loan_number, branch_name -> branch.branch_name borrower 的外码为 ID -> customer.ID, loan_number -> loan.loan_number account 的外码为 account_number -> depositor.account_number, branch_name -> branch.branch_name depositor 的外码为 ID -> customer.ID, account_number -> account.account_number \end{minted} } \end{enumerate} \questionandanswer[2.10]{ 请讨论命令式、函数式与声明式语言的相对优点。 }{ \begin{itemize} \item 命令式语言的优点是可定制化强,由于每一步计算都可以修改,所以可以自己实现某些复杂功能; \item 函数式语言的优点是不会产生副作用,即不会意外更改数据库的内容,比较便于实现原子操作; \item 声明式语言的优点是上手容易,只需要把所需的信息准确描述出来,就可以获取到信息。 \end{itemize} } \questionandanswer[6.5]{ 关系代数的\textbf{除法算子}“$\div$”定义如下:令$r(R)$和$r(S)$代表关系,且$S \subseteq R$;也就是说,模式$S$的每个属性也在模式$R$中。给定一个元组$t$,令$t[S]$代表元组$t$在$S$中属性上的投影。那么,$r \div s$是在$R-S$模式上的一个关系(也就是说,该模式包含所有在模式$R$中但不在模式$S$中的属性)。元组$t$在$r \div s$中的充分必要条件是满足以下两个条件: \begin{itemize} \item $t$在$\Pi_{R-S}(r)$中。 \item 对于$s$中的每个元组$t_s$,在$r$中存在一个元组$t_r$同时满足如下条件: \begin{enumerate} \item $t_r[S] = t_s[S]$。 \item $t_r[R-S] = t$。 \end{enumerate} \end{itemize} 给定上述定义: }{} \begin{enumerate} \questionandanswer[]{ 请使用除法算子写出一个关系代数表达式,来找出选修过全部计算机科学课程的所有学生的ID。(提示:在进行除法运算之前,将 takes 投影到只有ID和course\_id,并用选择表达式来生成全部计算机科学课程的course\_id集合。) }{ $$ \begin{aligned} &a \leftarrow \Pi_{(ID, course\_id)}takes\\ &ids \leftarrow \Pi_{course\_id} (\sigma_{dept\_name="\text{Comp. Sci.}"}(course\_dept)) \\ &a \div ids \\ \end{aligned} $$ } \questionandanswer[]{ 请展示如何在不使用除法的情况下用关系代数编写上述查询。(通过这样做,你也展示了如何使用其他的关系代数运算来定义除法运算。) }{ $$ \begin{aligned} &a \leftarrow \Pi_{(ID, course\_id)}takes\\ &ids \leftarrow \Pi_{course\_id} (\sigma_{dept\_name="\text{Comp. Sci.}"}(course\_dept)) \\ &\Pi_{ID} (\sigma_{course\_id \in ids}(a)) \\ \end{aligned} $$ } \end{enumerate} \questionandanswer[6.12]{ 对于大学模式,请用关系代数编写如下查询: }{} \begin{figure} \centering \includegraphics[width=0.5\linewidth]{imgs/2024-09-25-21-03-29.png} \caption{由图6-15的E-R图中的实体集导出的模式}\label{fig:6-16} \end{figure} \begin{figure} \centering \includegraphics[width=0.7\linewidth]{imgs/2024-09-25-21-04-08.png} \caption{由图6-15的E-R图中的联系集导出的模式}\label{fig:6-17} \end{figure} \begin{enumerate} \questionandanswer[]{ 请找出物理系中每位教师的ID和姓名。 }{ $\Pi_{(ID, name)} (\sigma_{dept\_name="\text{Physics}"}( instructor \bowtie inst\_dept))$ } \questionandanswer[]{ 请找出位于“Watson”教学楼的系里的每位教师的ID和姓名。 }{ $\Pi_{(ID, name)} (\sigma_{building="\text{Watson}"}(department\_name) \bowtie inst\_dept \bowtie instructor)$ } \questionandanswer[]{ 请找出至少选修过“Comp. Sci.”系的一门课程的每名学生的ID和姓名。 }{ $\Pi_{(ID, name)} (\sigma_{dept\_name="\text{Comp. Sci.}"}(course\_dept) \bowtie takes \bowtie student)$ } \questionandanswer[]{ 请找出在2018年至少上过一个课程段的每名学生的ID和姓名。 }{ $\Pi_{(ID, name)} (\sigma_{year="\text{2018}"}(sec\_course) \bowtie takes \bowtie student)$ } \questionandanswer[]{ 请找出在2018年未上过任何一个课程段的每名学生的ID和姓名。 }{ $\Pi_{(ID, name)}(student) - \Pi_{(ID, name)} (\sigma_{year="\text{2018}"}(sec\_course) \bowtie takes \bowtie student)$ } \end{enumerate} \end{enumerate} \end{document}