对于教学数据库的三个基本表S(S#,SNAME,AGE,SEX)SC(S#,C#,GRADE)C(C#,CNAME,TEACHER)试用SQL的查询语句表达下列查询:3.2.1检索年龄小于17岁的女学生的学号和姓名select s#,sname from Swhere age<17 and sex=F;3.2.2检索男生所学课程的课程号和课程名select c#,cname from Cwhere c# in (select distinct c#from SCwhere s# in (select s# from S where sex=M))3.2.3检索男生所学课程的任课老师的工号和姓名select t#,tname from Twhere t# in(select distinct t#from Cwhere c# in(select distinct c#from SCwhere s# in(select s#from Swhere sex=1)));3.2.4检索至少选修两门课程的学生的学号select s#from SCgroup by s#.having count(c#)>=2;3.2.5检索至少有学号为S2和S4所学的课程和课程名select c#,cnamefrom Cwhere c# in((select c#from sc where s#='S2')intersect(select c# from sc where s#='S4') );3.2.6检索‘WANG'同学不学的课程号select c# from cexcept(select distinct c#from scwhere s# =(select s# from s where sname='WANG'));3.2.7检索全部学生都选修的课程号和课程名select c#,cnamefrom cwhere not exists(select s#from swhere # not in (select c# from sc where #=# ));3.2.8检索选修课程包含'LIU'老师所授课程的全部课程的学生的学号和姓名select s#,snamefrom swhere not exists((select c#from cwhere t#=(select t#from twhere tname='LIU')) except(select c# from sc where #=#) );设有两个基本表R(A,B,C)和S(A,B,C),试用SQL查询语句表达下列关系代数表达式:① R∪S ② R∩S ③ R-S ④ R×S ⑤π(R) A,Bπ(S)B,C⑥π(σ(R×S)⑦π(R ⑧ R÷π(S) S) 1,63=43C1,2, 3=3 解:① (SELECT * FROM R)UNION(SELECT * FROM S);② (SELECT * FROM R)INTERSECT(SELECT * FROM S);③ (SELECT * FROM R)MINUS(SELECT * FROM S);④ SELECT *FROM R, S;⑤ SELECT , ,FROM R, SWHERE =;⑥ SELECT ,FROM R, SWHERE =;⑦ SELECT R.* (R.*表示R中全部属性)FROM R, SWHERE =;⑧ R÷π(S)的元组表达式如下:C{ t |(?u)(?v)(?w)(R(u)∧ S(v)∧ R(w)∧ w[1]=u[1] ∧w[2]=u[2] ∧ w[3]=v[3] ∧ t[1]=u[1] ∧ t[2]=u[2])}据此,可写出SELECT语句:SELECT A, BFROM R RXWHERE NOT EXISTS( SELECT *FROM SWHERE NOT EXISTS( SELECT *FROM R RYWHERE = AND = AND =);试叙述SQL语言的关系代数特点和元组演算特点。
答:SQL的关系代数特点如下:①有关系代数运算的并、交、差、自然联接等运算符;② FROM子句体现了笛卡尔积操作,WHERE子句体现了选择操作,SELECT子句体现了投影操作。
SQL的元组演算特点如下:① FROM子句中的基本表名应视为“元组变量”,属性名应视为“元组分量”;②有存在量词EXISTS符号。
试用SQL更新语句表达对题教学数据库中关系S、SC、C的更新操作:①往关系C中插一个课程元组('C8','VC++','T6')。
②检索所授每门课程平均成绩均大于80分的教师姓名,并把检索到的值送往另一个已存在的表FACULTY(TNAME)。
③在SC中删除尚无成绩的选课元组。
④把选修LIU老师课程的女同学选课元组全部删去。
⑤把MATHS课不及格的成绩全改为60分。
⑥把低于所有课程总平均成绩的女同学成绩提高5%。
⑦在表SC中修改C4课程的成绩,若成绩小于等于70分时提高5%,若成绩大于70 分时提高4%(用两种方法实现,一种方法是用两个UPDATE语句实现,另一种方法是用带CASE操作的一个UPDATE语句实现)。
⑧在表SC中,当某个成绩低于全部课程的平均成绩时,提高5%。
解:① INSERT INTO CVALUES('C8','VC++','T6');② INSERT INTO FACULTY(TNAME)SELECT DISTINCT TEACHERFROM (SELECT TEACHER, #, AVG(GRADE)FROM S, SCWHERE #=#GROUP BY TEACHER, #)AS RESULT(TEACHER, C#, AVG_GRADE) AS XWHERE 80<=ALL(SELECT AVG_GRADEFROM RESULT AS YWHERE =;③ DELETE FROM SCWHERE GRADE IS NULL;④ DELETE FROM SCWHERE S# IN(SELECT S# FROM S WHERE SEX='F') AND C# IN(SELECT C# FROM C WHERE TEACHER='LIU'); UPDATE SC⑤.SET GRADE=60WHERE GRADE<60AND C# IN(SELECT C# FROM C WHERE CNAME='MATHS');⑥ UPDATE SCSET GRADE=GRADE*WHERE S# IN(SELECT S# FROM S WHERE SEX='F') AND GRADE<(SELECT AVG(GRADE) FROM SC);⑦用两个UPDATE语句实现:UPDATE SCSET GRADE=GRADE*WHERE C#='C4' AND GRADE>70;UPDATE SCSET GRADE=GRADE*WHERE C#='C4' AND GRADE<=70;(这两个UPDATE语句的顺序不能颠倒。
)用一个UPDATE语句实现:UPDATE SCSET GRADE=GRADE*CASEWHEN GRADE>70 THENELSEENDWHERE C#='C4';⑧ UPDATE SCSET GRADE=GRADE*WHERE GRADE<(SELECT AVG(GRADE)FROM SC);设数据库中有三个关系:职工表 EMP(E#,ENAME,AGE,SEX,ECITY),其属性分别表示职工工号、姓名、年龄、性别和籍贯。
工作表 WORKS(E#,C#,SALARY),其属性分别表示职工工号、工作的公司编号和工资。
公司表 COMP(C#,CNAME,CITY),其属性分别表示公司编号、公司名称和公司所在城市。
试用SQL语句写出下列操作:①用CREATE TABLE语句创建上述三个表,需指出主键和外键。
②检索超过50岁的男职工的工号和姓名。
③假设每个职工只能在一个公司工作,检索工资超过1000元的男性职工工号和姓名。
④假设每个职工可在多个公司工作,检索在编号为C4和C8公司兼职的职工工号和姓名。
⑤检索在“联华公司”工作、工资超过1000元的男性职工的工号和姓名。
检索每个职工的兼职公司数目和工资,假设每个职工可在多个公司工作⑥.总数.显示(E#,NUM,SUM_SALARY),分别表示工号、公司数目和工资总数。
⑦工号为E6的职工在多个公司工作,试检索至少在E6职工兼职的所有公司工作的职工工号。
⑧检索联华公司中低于本公司平均工资的职工工号和姓名。
⑨在每一公司中为50岁以上职工加薪100元(若职工为多个公司工作,可重复加)。
⑩在EMP表和WORKS表中删除年龄大于60岁的职工有关元组。
解:① CREATE TABLE EMP( E# CHAR(4) NOT NULL,ENAME CHAR(8) NOT NULL,AGE SMALLINT,SEX CHAR(1),ECITY CHAR(20),PRIMARY KEY(E#));CREATE TABLE COMP( C# CHAR(4) NOT NULL,CNAME CHAR(20) NOT NULL,CITY CHAR(20),PRIMARY KEY(C#));CREATE TABLE WORKS( E# CHAR(4) NOT NULL,C# CHAR(4) NOT NULL,SALARY SMALLINT,PRIMARY KEY(E#, C#),FOREIGN KEY(E#) REFERENCES EMP(E#),FOREIGN KEY(C#) REFERENCES COMP(C#));② SELECT E#, ENAMEFROM EMPWHERE AGE>50 AND SEX='M';③ SELECT #, ENAMEFROM EMP, WORKSWHERE #=# AND SALARY>1000;④ SELECT #,FROM EMP A, WORKS B, WORKS CWHERE #=# AND #=#AND #='C4' AND #='C8';⑤ SELECT #,FROM EMP A, WORKS B, COMP CWHERE #=# AND #=#AND CNAME='联华公司' AND SALARY>1000AND SEX='M';⑥ SELECT E#, COUNT(C#) AS NUM, SUM(SALARY) AS SUM_SALARY FROM WORKS;GROUP BY E#.⑦ SELECT #FROM WORKS XWHERE NOT EXISTS(SELECT *FROM WORKS YWHERE E#='E6'AND NOT EXISTS(SELECT *FROM WORKS ZWHERE #=#AND #=#));⑧ SELECT #,FROM EMP A, WORKS B, COMP CWHERE #=# AND #=#AND CNAME='联华公司'AND SALARY<(SELECT AVG(SALARY)FROM WORKS, COMPWHERE #=#AND CNAME='联华公司');⑨ UPDATE WORKSSET SALARY=SALARY+100WHERE E# IN (SELECT E# FROM EMP WHERE AGE>50);⑩ DELETE FROM WORKSWHERE E# IN (SELECT E# FROM EMP WHERE AGE>60);DELETE FROM EMP;WHERE AGE>60。