初学者使用sql时易犯的错误(持续更新)

作者 : admin 本文共1509个字,预计阅读时间需要4分钟 发布时间: 2024-06-10 共2人阅读

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

约束

索引


在一个基本表上最多只能建立一个聚集索引


聚集索引可以包含多个列(组合索引)


聚集索引的适用范围


很少对基表进行增删操作


很少对其中的变长列进行修改操作

本站无任何商业行为
个人在线分享 » 初学者使用sql时易犯的错误(持续更新)
E-->