数据库实验8-更新数据

针对stu数据库中的student、course和sc三个表实现以下查询: 

1、插入一门新课程记录

课程号:2001,课程名:C程序设计,学分:3

INSERT INTO coursefcy(cno,cname,ccredit) VALUES(2001,'C语言程序',3)

2、所有学生都选2001号课程,将选课记录插入到SC中。

INSERT INTO scfcy(sno,cno)
SELECT sno,cno
FROM studentfcy,coursefcy
WHERE cno=2004
//在coursefcy表中应存在cno=2004




NSERT  INTO sc(sno,cno)

  Select sno,’8’

  From student



INSERT  INTO sc(sno,cno)

  Select sno,cno='8'

  From studen

 

问题:1

 

 不会显示出全部数据。

问题2:

因为cno=22222不存在表couresefcy中 

3、将8号课程的学分改为4分。

UPDATE coursefcy
SET ccredit=4
where cno=2001  //cno是int类型

 

4、将所在系为‘cs’并且年龄小于20岁的学生的所在系改为‘ma

UPDATE student

SET sdept='ma'

WHERE  sdept='cs' and sage<20

UPDATE studentfcy
SET sdept='ma'
WHERE sdept='CS' and sage<20

该结果会将数据改为“ma”,但当查询MA/ma时,都会被识别 

 

5、删掉所有年龄小于20岁、并且所在系为‘cs’的学生记录。

DELETE 
FROM studentfcy
WHERE sage<20 and sdept='cs'

 

 

 

 

在第4题以后,就不存在年龄小于20的cs学生 

 

6、将刘晨所选课程的成绩都提高10分。

UPDATE scfcy
set grade=grade+10
WHERE sno IN
(
    SELECT sno 
    FROM studentfcy
    WHERE sname='王红梅'
)

SELECT cno,grade
FROM scfcy
WHERE sno=2008000000

 

 

 grade的范围不是有限制吗1-100但如果出错会发生什么????

执行该 SQL 语句后,当向表 `SC` 中插入数据时,如果 `grade` 字段的取值不在 0 到 100 的范围内,就会触发 CHECK 约束的检查并导致插入失败。

7、删除‘C程序设计’课程的选课记录。

DELETE
FROM scfcy
WHERE cno IN(
    SELECT cno
    FROM coursefcy
    WHERE cname='Course {2004}')

 

8、将年龄最小的学生的所在系去掉。

等价于删除该系所有学生?

将所在系置为NULL/NUll/null

理解题意,只是把年龄最小的学生信息中的所在系置空

UPDATE studentfcy
SET sdept=NUll
where sno IN(
    SELECT sno
    FROM studentfcy
    WHERE sage<=ALL(
        SELECT sage FROM studentfcy))
        

UPDATE studentfcy

SET sdept=null

WHERE sage=

(SELECT min(sage) FROM studentfcy )

可能会遇到错误信息为 "You can't specify target table 'studentfcy' for update in FROM clause",这是因为 MySQL 不支持在子查询中更新涉及到的数据表,而上述 SQL 中的子查询中引用了主查询的数据表 studentfcy,导致出现了这个错误。

为了避免这个错误,可以将子查询中查询结果保存到一个临时表中,然后再将这个临时表与 studentfcy 表进行关联,从而进行更新操作。

在这个 SQL 语句中,我们将原来的子查询中查询结果保存到一个名为 tmp 的临时表中,然后将这个临时表与 studentfcy 表进行关联,通过 WHERE 子句中的sno IN (...) 条件来限制要更新的学生记录。这样就可以避免上述错误。

UPDATE studentfcy
SET sdept=NUll
where sno IN(
    SELECT tmp.sno
    FROM (
        SELECT sno
        FROM studentfcy
    	  WHERE sage<=ALL(
        SELECT sage FROM studentfcy))as tmp)




UPDATE studentfcy
SET sdept=null
WHERE sage in 
(SELECT min_sage FROM 
(SELECT MIN(sage)as min_sage FROM studentfcy) as a)

 Every derived table must have its own alias(sql语句错误解决方法)

 在做多表查询,或者查询的时候产生新的表的时候会出现这个错误:Every derived table must have its own alias(每一个派生出来的表都必须有一个自己的别名)。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值