DDL(数据定义)
DROP 子句 用于删除指定的列名, ◼ 若选择RESTRICT ,则删除的基本表不能被其他表的约 束所引用(如 CHECK , FOREIGN KEY 等约束),不 能有视图,不能有触发器,不能有存储过程或函数等。 假如存在这些依靠该表的对象,则此表不能被删除。 ◼ 若选择 CASCADE ,则该表的删除没有限制条件。在删 除基本表的同时,相关的依靠对象,比方视图等都将被 一起删除。 ◼ 一样平常在缺省情况下默以为 RESTRICT , 与具体实现有关 DML(数据操纵)
一。插入
INSERT INTO < 表名 > [(< 属性列 1>[,< 属性列 2 > … )] VALUES (< 常量 1> [ , < 常量 2>] … ); ◼ INTO 子句 ◼ 指定要插入数据的表名及属性列 ◼ 属性列的顺序可以与表定义中的顺序不一致 ◼ 没有指定属性列 :表示要插入的是一条完整的元组, 且属性列属性与表定义中的顺序一致 ◼ 指定部分属性列:插入的元组在别的属性列上取空 值大概是默认值 ◼ VALUES 子句 ◼ 提供的值必须与 INTO 子句匹配:个数、顺序和值的 类型 【例】在门生表中插入一个门生元组,其学号为 101215 ,姓名为李斌,男, 19 岁,是盘算机系 的门生。 INSERT INTO Student VALUES( ‘ 101215 ’ , ‘ 李斌’ , ‘男’ ,19, ‘盘算机’ ); INSERT INTO Student ( Sno, Sname, Sdept, Sage, Ssex ) VALUES( ‘ 101215 ’ , ‘ 李斌’ , ‘盘算机’ ,19, ‘男’ ); 将子查询效果插入指定表中 INSERT INTO < 表名 >[(< 列名 1>[,< 列名 2>, ])] <SELECT 语句 >; /* 子查询 */ ; ◼ INTO 子句 ◼ 指定要插入数据的表名及属性列 ◼ 属性列的顺序可与表定义中的顺序不一致 ◼ 没有指定属性列,则表示插入一条完整的元组 ◼ 指定部分属性列,则在别的属性列上取空值 ◼ 子查询 ◼ SELECT 子句目标列必须与 INTO 子句匹配:个数、 顺序和值的类型 【例】盘算盘算机系每个门生的平均结果,并生存 在 CS-AVG 表中。 1. 天生门生的平均结果表CS-AVG 2. 在CS-AVG中插入盘算机系门生的平均结果 CREATE TABLE CS-AVG ( Sno CHAR(6)NOT NULL , Grade NUMBER(4,1)); INSERT INTO CS-AVG (Sno, Grade) SELECT Sno, AVG(Grade) FROM SC WHERE Sno IN ( SELECT Sno FROM Student WHERE Sdept=‘CS’) GROUP BY Sno ; 二。更新与删除
TRUNCATE TABLE ◼ 语句格式 TRUNCATE TABLE table_name ◼ 功能 ◼ 删除表中全部行(与不带 WHERE 子句的 DELETE 语 句相同),但不记载单个行删除操纵 ◼ 比 DELETE 速度快,利用的系统和事件日记资源少 ◼ DELETE 语句每次删除一行,并在事件日记中为所删除的每行 记载一项。 ◼ TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除 数据,而且只在事件日记中记载页的释放。 ◼ 操纵不能回滚, 但 DELETE 可以回滚 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与having的区别
- 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 ; 带有 ANY 或 ALL 谓词的子查询 > ANY 大于子查询效果中的某个值 > ALL 大于子查询效果中的全部值 = ANY 即是子查询效果中的某个值 =ALL 即是子查询效果中的全部值(通常没有实际意义) != (或 <> ) ANY 不即是子查询效果中的某个值 != (或 <> ) ALL 不即是子查询效果中的任何一个值 ANY 和 ALL 谓词偶然可以用聚集函数来实现 ◼ 用聚集函数实现子查询通常比直接用 ANY 或 ALL 查询效 率要高,由于前者通常可以或许减少比较次数。 【例】查询其他系中比 CS 系 任意一个 门生年龄小的 门生姓名和年龄 ◼ 用 ANY 谓词实现 SELECT Sname, Sage FROM Student WHERE Sage < ANY ( SELECT Sage FROM Student WHERE Sdept= 'CS') AND Sdept <> 'CS' ; ◼ 用聚集函数实现 SELECT Sname, Sage FROM Student WHERE Sage < ( SELECT MAX(Sage) FROM Student WHERE Sdept= 'CS') AND Sdept <> 'CS' ; 带有 EXISTS 谓词的子查询 ◼ 带有 EXISTS 谓词的子查询不返回任何数据,只产生逻 辑真值“ true ”或逻辑假值“ false ”。 ◼ 若内层查询效果 非空 ,则返回 真值 ◼ 若内层查询效果为空,则返回假值 ◼ 由 EXISTS 引出的子查询,其目标列表达式通常用 * , 因 为带 EXISTS 的子查询只返回真值或假值,给出列名无 实际意义 【例】查询全部选修了1号课程的门生姓名。 ◼ 思路分析:在 Student 中依次取每个元组的 Sno值,用此 值去检查 SC 关系;若 SC 中存在如许的元组,其 Sno 值 即是此 Student.Sno 值,且Cno= ‘ 1 ’ ,则取此 Student.Sname 送入效果关系 用嵌套查询 SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE Sno=Student.Sno AND Cno= ' 1 ') ; ◼ 全部 带 IN 谓词、比较运算符、 ANY 和 ALL 谓词的子查询 都能用带 EXISTS 谓词的子查询等价更换。 ◼ 带有 EXISTS 谓词的相关子查询只关心内层查询是否有 返回值,不必要查具体值,效率不低于相关子查询。 用 EXISTS/NOT EXISTS 实现全称量词 ◼ SQL 语言中没有全称量词 任取 ( For all ) ◼ 可以把带有全称量词的谓词转换为等价的带有存在量词 的谓词: (任取 x)P ≡ 非 (存在 x( 非 P)) 【 例 】查询选修了全部课程的门生姓名。 SELECT Sname FROM Student WHERE NOT EXISTS #如许的课不存在 (SELECT * FROM Course WHERE NOT EXISTS #这门课他没选 (SELECT * FROM SC WHERE Sno= Student.Sno AND Cno= Course.Cno)) ; 用 EXISTS/NOT EXISTS 实现逻辑蕴函 ◼ SQL 语言中没有蕴函 (Implication) 逻辑运算 【例】查询至少选修了门生95001选修的全部课程的 门生的学号 解题思路: ◼ 用逻辑蕴函表达:查询学号为x的门生,对全部的课程y, 只要95001门生选修了课程y,则x也选修了y ◼ 变换后语义: 对于门生 x ,不存在如许的课程 y ,门生 95001选修了 y ,而门生 x 没有选 。 SELECT DISTINCT Sno FROM SC SCX WHERE NOT EXISTS (SELECT * FROM SC SCY WHERE SCY.Sno = '95001' AND NOT EXISTS (SELECT * FROM SC SCZ WHERE SCZ .Sno= SCX. Sno AND SCZ .Cno= SCY .Cno)) ;#一个表涉及多次查询时最好起别名,而且as是可以省略的 七。集合查询
并操纵 ◼ 语法形式 < 查询块 > UNION [ALL] < 查询块 >; ◼ 两个查询效果的属性列个数相同,对应项的数据 类型必须可以或许通过隐式转换相互兼容。 ◼ 利用 UNION 归并多个效果集时,系统会 自动去掉 重复元组 。 ◼ 利用 UNION ALL 操纵符,可以保留重复元组 UNION 效果会合的列名与 UNION 运算中第一个 SELECT 语句的效果会合的列名相同, 其他的 SELECT 语句的效果集列名将被忽略。 差操纵 ◼ 标准 SQL 中没有提供集合差操纵,但可用其他方 法间接实现。 【例】查询门生姓名与西席姓名的差集。 实际上是 查询学校中未与西席同名的门生姓名 。 SELECT DISTINCT Sname FROM Student WHERE Sname NOT IN (SELECT Tname FROM Teacher); #另一种方式 SELECT Sname FROM Student EXCEPT SELECT Tname FROM Teacher; 对集合操纵效果的排序 ◼ 在实行集合操纵时,默认按照末了效果表中第一 列数据的升序方式排列记载。 ◼ 各 SELECT 子句不能含有 ORDER BY 子句,但是可 以将 ORDER BY 子句放在末了的 SELECT 语句后面, 以便对末了的效果表排序。 ◼ ORDER BY 子句只能用于对终极查询效果排序, 不能对中间效果排序。 ◼ 任何情况下, ORDER BY 子句只能出现在末了。 ◼ 对集合操纵效果排序时, ORDER BY 子句中最好 用数字指定排序的列属性,以免出错 错误写法 SELECT * FROM Student WHERE Sdept= 'CS' ORDER BY Sno UNION SELECT * FROM Student WHERE Sage<=19 ORDER BY Sno ; 正确写法 SELECT * FROM Student WHERE Sdept= 'CS' UNION SELECT * FROM Student WHERE Sage<=19 ORDER BY 1 ; 基于派生表的查询 ◼ 子查询出现在 FROM 子句中,这时子查询天生的 临时派生表( Derived Table )成为主查询的查询 对象 【例】找出每个门生超过他自己选修课程平均结果 的课程号。 SELECT Sno, Cno FROM SC, ( SELECT Sno, Avg(Grade) avg_grade FROM SC GROUP BY Sno ) AS Avg_sc WHERE SC.Sno = Avg_sc.Sno and SC.Grade >=Avg_sc.avg_grade;
视图
一。创建视图
◼ 语句格式 CREATE VIEW < 视图名 > [(< 列名 1> [,< 列名 2>] … )] AS < SELECT 语句 > [WITH CHECK OPTION] ; ◼ DBMS 实行 CREATE VIEW 语句时只是把视图的 定义存入数据字典,并不实行此中的 SELECT 语句。 在对视图举行操纵时才按照视图定义天生数据, 供用户利用。 ◼ SELECT 语句 表示子查询,视图的属性列和数据 都是由该子查询决定的。 ◼ 选项 [(< 列名 1>[, < 列名 2>] )] 用来定义视图的 列名。 ◼ 组成视图的属性列名可以 全部省略 或 全部指定 ◼ 省略 : 由 SELECT 查询效果的目标列名组成 ◼ 以下情况必须明确指定视图的全部列名 : (1) 目标列中包罗聚集函数或表达式 (2) 视图中包罗出现在多个表中的相同列名 (3) 必要在视图中为某个列启用新的更合适的名字 ◼ 建立带表达式的视图 【例】按系建立门生平均年龄的视图。 CREATE VIEW D-Sage (Sdept, Avgage) AS SELECT Sdept, AVG(Sage) FROM Student GROUP BY Sdept; ◼ 因在 SELECT 目标表中有聚集函数 AVG ,视图定义中 必 须含有列名选项 。 ◼ 视图的列名与 SELECT 后的列名相对应,即使有与基本 表相同的列名也不能省略。 ◼ 建立基于多个基表的视图 【例】建立盘算机系选修了 C2 课的门生姓名和结果 的视图。 CREATE VIEW CS_SC( Sno, Sname, Grade ) AS SELECT Student.Sno , Sname, Grade FROM Student, SC WHERE Sdept=' 盘算机 ' AND Student.Sno=SC.Sno AND SC.Cno='C2' ; 以 SELECT * 方式创建的视图可扩充性差,应尽可能制止 . 二。 DBMS实现视图查询的方法
◼ 实体化视图( View Materialization ) 1. 有效性检查:检查所查询的视图是否存在 2. 实行视图定义,将视图临时实体化,天生临 时表 3. 查询视图转换为查询临时表 4. 查询完毕删除被实体化的视图 ( 临时表 ) ◼ 视图消解法( View Resolution ) 1. 举行有效性检查,检查查询的表、视图等是 否存在;假如存在,则从数据字典中取出视 图的定义; 2. 把视图定义中的子查询与用户的查询联合起 来,转换成等价的对基本表的查询; 3. 实行 修正 后的查询。 【例】查询专业系,要修业生平均年龄小于 21 岁。 CREATE VIEW D-Sage (Sdept, Avgage) AS SELECT Sdept, AVG(Sage) FROM Student GROUP BY Sdept; SELECT Sdept FROM D-Sage WHERE Avgage<21; SELECT Sdept FROM Student GROUP BY Sdept HAVING AVG(Sage)<21; 转化为 对基本表的查询 ◼ 视图消解法的局限性 ◼ 有些情况下,视图消解法不能天生正确查询。 ◼ 接纳视图消解法的DBMS会限制这类查询。 ◼ 对于简朴视图,视图消解是总能举行的。 ◼ 实体化视图的方法 ◼ 无限制 三。视图更新
1,若视图的字段来自聚集函数或含有GROUP BY子句、含有DISTINCT短语,则此视图不允许更新
【例】通过视图 D-Sage 插入盘算机系门生的平均 年龄( ' 盘算机 ' , 21 )。 INSERT INTO D-Sage VALUES (' 盘算机 ',21); 以上插入语句无法实行,由于视图 D-Sage 为不可 更新视图。 CREATE VIEW D-Sage (Sdept, Avgage) AS SELECT Sdept, AVG(Sage) FROM Student GROUP BY Sdept; 2,若视图由两个以上基本表导出不允许更新
【例】通过视图 CS_SC 删除门生刘豁亮的信息。 DELETE FROM CS_SC WHERE Sname=' 刘豁亮 '; 以上语句无法实行,由于不能转化为对基本表的操纵, 删除操纵的语义不明确。 CREATE VIEW CS_SC( Sno, Sname, Grade ) AS SELECT Student.Sno , Sname, Grade FROM Student, SC WHERE Sdept=' 盘算机 ' AND Student.Sno=SC.Sno AND SC.Cno='C2' ; 3,若视图定义中有嵌套查询,而且内层查询的FROM子句中涉及的表也是导出该视图的基本表,则此视图不允许更新。
注:
◼ 仅在一个表上取其行列值且其列中 包罗了候选键 , 如许所形成的视图都是可更新的,这类视图称为 “ 行列子集视图 ” 。 ◼ 除行列子集视图外的视图的更新都会受到限制 约束
索引
◼ 在一个基本表上最多只能建立一个聚集索引 ◼ 聚集索引可以包罗多个列(组合索引) ◼ 聚集索引的适用范围 ◼ 很少对基表举行增删操纵 ◼ 很少对此中的变长列举行修改操纵
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |