初学者使用sql时易犯的错误(持续更新)
DDL(数据定义)
DROP
子句
用于删除指定的列名,
◼
若选择RESTRICT
,则删除的基本表不能被其他表的约
束所引用(如
CHECK
,
FOREIGN KEY
等约束),不
能有视图,不能有触发器,不能有存储过程或函数等。
如果存在这些依赖该表的对象,则此表不能被删除。
◼
若选择
CASCADE
,则该表的删除没有限制条件。在删
除基本表的同时,相关的依赖对象,例如视图等都将被
一起删除。
◼
一般在缺省情况下默认为
RESTRICT
,
与具体实现有关
DML(数据操作)
DQL(数据查询)
一。注意
DISTINCT
短语的作用范围是所有目标列
错误的写法
SELECT DISTINCT Cno
,
DISTINCT Grade
FROM SC;
正确的写法
SELECT DISTINCT Cno
,
Grade
FROM SC;
二。空值查询:“
IS NULL
”
不能用 “
= NULL
”
代替
三。使用
GROUP BY
子句分组查询
◼
细化聚集函数的作用对象
◼
未对查询结果分组,聚集函数将作用于整个查询结果
◼
对查询结果分组后,聚集函数将分别作用于每个组
◼
分组方法
◼
按指定的一列或多列值分组,
值相等的为一组
◼
使用
GROUP BY
子句后,
SELECT
子句的列名列
表中只能出现分组属性和聚集函数
◼
GROUP BY
子句的作用对象是查询的中间结果表
【例】求各个课程号及相应的选课人数。
SELECT Cno
,
COUNT(*)
—
COUNT(Sno)
FROM SC
GROUP BY Cno
;
【例】查询选修了
3
门以上课程的学生学号
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) >3
;
查询有
3
门以上课程是
90
分以上的学生的学
号及(
90
分以上的)课程数
SELECT Sno, COUNT(*)
FROM SC
WHERE Grade>=90
GROUP BY Sno
HAVING COUNT(*)>=3;
四。
WHERE
子句允许你指定过滤条件,这些条件基于表中的单个行。你不能在WHERE
子句中使用聚合函数(如SUM()
,AVG()
,COUNT()
, 等)来过滤分组。GROUP BY
子句通常与聚合函数一起使用,以计算每个组的汇总值。你不能在GROUP BY
子句中指定单个行的条件,但可以在HAVING
子句中这样做,HAVING
子句允许你基于聚合函数的结果来过滤分组。
五。连接查询
连接条件中各
连接字段
的类型必须是
可比的
,但不必是
相同的
六。嵌套查询
子查询的限制
◼
不能使用
ORDER BY
子句
嵌套查询的分类与求解方法
◼
不相关子查询
◼
子查询的查询条件不依赖于父查询
◼
由里向外逐层处理。每个子查询在上一级查询处理之前
求解,子查询的结果用于建立其父查询的查找条件。
◼
相关子查询
◼
子查询的查询条件依赖于父查询
◼
先取外层查询中表的第一个元组,根据它与内层查询相
关的属性值处理内层查询,若
WHERE
子句返回值为真,
则取此元组放入结果表;然后再取外层表的下一个元组;
重复这一过程,直至外层表全部检查完为止
【例】找出每个学生所选修课程成绩超过该门课
程平均成绩的课程号。
SELECT Sno, Cno
/*
外层查询
/
父查询
*/
FROM SC x
WHERE Grade >=(SELECT AVG(Grade)
FROM SC y
WHERE y.Cno=x.Cno);
/*
内层查询
/
子查询
*/
子查询不能在比较符之前
◼
错误
的例子
SELECT Sno, Sname, Sdept
FROM Student
WHERE ( SELECT Sdept
FROM Student
WHERE Sname= ‘
刘晨 ’
)
= Sdept
;
约束
索引
◼
在一个基本表上最多只能建立一个聚集索引
◼
聚集索引可以包含多个列(组合索引)
◼
聚集索引的适用范围
◼
很少对基表进行增删操作
◼
很少对其中的变长列进行修改操作