SQL数据库注意事项,持续更新

1.没选数据库。。。

在这里插入图片描述
这个问题我遇到好几次了,每次打开软件都忘记选择自己要操作的数据库,导致半天愣在那里,到处找指令怎么用。。。
指令操作要对应选择要操作的数据库!!!

2.数据重复。。。

刚遇到一个题目,子查询的时候有太多重复的cno,导致语句没有反应——根据我之前自制语言的经验,我估计,子查询获得的集合中的数据必须都是独一无二的,不然抛出异常,导致外面的语句失效!!!

--删除没有人选的课程的记录。
DELETE FROM course WHERE cno not in(SELECT cno FROM sc)   --incorrect
DELETE FROM course WHERE cno not in(SELECT DISTINCT cno FROM sc)  --correct

3.当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式。。。

子查询中的选择项只能是一个!!!

--显示VB课程的第2名到第4名的学生的学号、姓名、成绩。
SELECT top 3
		sc.sno,sname,grade FROM student 
		JOIN sc on student.sno = sc.sno
		JOIN course on course.cno = sc.cno
		WHERE cname = 'VB基础' and grade not in (
			
			SELECT top 1 
				sc.sno,sname,grade FROM student   --incorrect
				grade FROM student    				--correct
				JOIN sc on student.sno = sc.sno
				JOIN course on course.cno = sc.cno
				WHERE cname = 'VB基础'
				ORDER BY grade DESC
		
		) 
		ORDER BY grade DESC

4.列名无效

这往往是写错了单词,,,,

5.Where中不能使用聚合函数时!

学会使用 → \rightarrow HAVING
当不能用Where实现约束条件时,先用GROUP BY进行分组,然后用HAVING子句!

比如AVG这样的函数不能在WHERE中使用,但是可以在HAVING中使用!!!

6.删除不了的问题

选中某行但是删除不了,说找不到之类的!

比如这样一个题目:建立一个触发器,当删除student中某个学生记录时,同时删除sc中该学生的记录!

--1、建立一个触发器T_delsc,当删除STUDENT表中的某条记录时,
--也删除SC表中与其相关联的记录。


----删除已有的触发器
IF EXISTS( SELECT name FROM SYSOBJECTS WHERE name='T_delsc')
	DROP TRIGGER T_delsc
GO

--创建新的触发器
CREATE TRIGGER T_delsc
	ON student
	FOR DELETE
	AS
	BEGIN
		DECLARE @NO char(8)						--定义中间变量
		SELECT @NO=sno FROM DELETED				--在DELETED中查询要删除的学号
		DELETE sc WHERE sno = @NO				--删除该学号的所有记录
	END
GO
----直接在student删除一条记录时,因为会删除sc中的多条记录,这多条记录的学号一样,SQL Server不知道要删除哪条,所以删除操作被SQL Server阻止!!!
----解决方式是设置sno为student的主键!!!

执行完是成功的,但是手动去删除student中一条记录时就删不了——原因就是student表中的sno没有设置成主键!

猜你喜欢

转载自blog.csdn.net/weixin_41374099/article/details/105630845