本文主要是介绍初学者使用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 ;
约束
索引
◼ 在一个基本表上最多只能建立一个聚集索引
◼ 聚集索引可以包含多个列(组合索引)
◼ 聚集索引的适用范围
◼ 很少对基表进行增删操作
◼ 很少对其中的变长列进行修改操作
这篇关于初学者使用sql时易犯的错误(持续更新)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!