📄 sql
字号:
<TR>
<TD>
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR onclick="expandIt('elThree','0'); return false">
<TD rowSpan=2 width=5></TD>
<TD class=txleft1 height=23>
<DIV class=parent id=elThreeParent><IMG border=0 height=9
id=elThreeImg src="SQL的数据操作语句-北京交大.files/plus.gif"
width=9> <A class=item
href="http://distance.njtu.edu.cn/course/8100062/kejian/web/3-2.htm#">数据库的发展动向</A></DIV></TD></TR>
<TR>
<TD>
<DIV class=child id=elThreeChild>
<TABLE border=0 borderColor=#c0c0c0 borderColorDark=#ffffff
borderColorLight=#ffffff cellSpacing=1 width="100%">
<TBODY>
<TR>
<TD class=txleft2 onmouseout=bbar(this)
onmouseover=abar(this)><A
href="http://distance.njtu.edu.cn/course/8100062/kejian/web/8-1.htm"
target=_self>客户机/服务器的结构</A></TD></TR>
<TR>
<TD class=txleft2 onmouseout=bbar(this)
onmouseover=abar(this)><A
href="http://distance.njtu.edu.cn/course/8100062/kejian/web/8-2.htm"
target=_self>分布式数据库系统</A></TD></TR>
<TR>
<TD class=txleft2 onmouseout=bbar(this)
onmouseover=abar(this)><A class=item
href="http://distance.njtu.edu.cn/course/8100062/kejian/web/8-3.htm"
target=_self>并行数据库基础</A></TD></TR></TBODY></TABLE></DIV></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD bgColor=#cecfce height=1></TD></TR></TBODY></TABLE><!-- End of Left --></TD>
<TD vAlign=top>
<TABLE border=0 borderColor=#c0c0c0 borderColorDark=#ffffff
borderColorLight=#ffffff cellSpacing=1 width="100%">
<TBODY>
<TR bgColor=#f2f2f2 height=22 vAlign=right>
<TD class=txleft2>
<DIV align=mid><FONT color=#000000><A
href="http://distance.njtu.edu.cn/course/8100062/kejian/web/kcnr_main.htm"
target=_self>课程内容</A> >>
SQL的数据操作语句</FONT></DIV></TD></TR></TBODY></TABLE>
<TABLE align=center border=0 cellPadding=3>
<TBODY>
<TR height=10>
<TD></TD></TR>
<TR>
<TD>
<P align=left
style="LINE-HEIGHT: 200%; MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px"><FONT
size=2> SQL的数据操作功能包括SELECT,INSERT,DELETE和UPDATE四个语句,即检索和更新(包括增,删,改)两部分功能.
</FONT>
<P align=left
style="LINE-HEIGHT: 200%; MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px"><FONT
size=2><B>1.SQL查询语句</B> <BR>SQL语言的核心语句是数据库查询语句,其简单格式是: <BR>SELECT
目标列 FROM 基本表(或视图) <BR>[WHERE 条件表达式] <BR>[GROUP BY 列名1 [HAVING
内部函数表达式]] <BR>[ORDER BY 列名2 {ASC/DESC}];
<BR>语句的功能是:根据WHERE子句中的条件表达式,从基本表(或视图)中找出满足条件的元组,按SELECT子句中的目标列,选出元组中的目标列,形成结果表.如果ORDER
BY子句,则结果表要根据指定的列名2按升序或降序排序.GROUP
BY子句将列名1分组.分组的附加条件用HAVING短语给出,只有满足内部函数表达式的组才会被输出.
<BR>SQL语句对数据库的操作十分灵活方便,原因在于SELECT语句中的成分丰富多样,有许多可选形式,尤其是目标列和目标表达式,下面用例子来详细说明,例子涉及的是"学生-课程"数据库.
</FONT>
<P
style="LINE-HEIGHT: 200%; MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px"><FONT
size=2><B>(1)简单查询:</B> <BR><B>[例4.1]</B>求数学系学生的学号,姓名. <BR>SELECT
S#,SNAME FROM S WHERE SD='MA'; <BR><B>[例4.2]</B>求选修了课程的学生的学号.
<BR>SELECT DISTINCT S# FROM SC;
<BR>这里SELECT后面的DISTINCT表示要在结果中去掉重复的S#. <BR><B>[例4.3]</B>求全体学生的详细信息.
<BR>SELECT * FRON S; <BR><B>[例4.4]</B>查询经过计算的值.求学生学号和学生的出生年份.
<BR>SELECT S#,1989-AGE FROM S;
<BR>SELECT语句的后面可以是字段名,也可以是字段名和常数组成的算术表达式,还可以是字符串常数. <BR>如:SELECT
S#,'B',1998-AGE FROM S; <BR>结果是:S# <BR>S1 B 1969(AGE=29) <BR>S2 B
1968(AGE=30) <BR><B>[例4.5]</B>要求对结果进行排序(即使用ORDER BY)的查询.
<BR>求选修C1课程的学生学号和得分,结果按分数降序排列. <BR>SELECT S#,GRADE FROM SC WHERE
C#='C1' <BR>ORDER BY GRADE DESC; </FONT>
<P align=left
style="LINE-HEIGHT: 200%; MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px"><FONT
size=2><B>(2)连接查询:</B>若查询涉及两个以上的表,则称之为连接查询,连接查询功能是关系数据库最重要的查询功能之一.
<BR><B>[例4.6]</B>查找学生以及其选修课程的信息. <BR>SELECT S.*,SC.* FROM S,SC WHREE
S.S#=SC.S#
<BR>WHERE后面的条件S.S#=SC.S#称为连接条件或连接谓语,连接谓语中的字段称为连接字段.连接字段的类型必须是可比的,但不必相同,当然大多数情况下是相同类型的.连接谓语中的比较符可以是=,<,>,<=,>=,.当比较符为'='时,就是等值连接的情况.如本例,若又在目标中去掉一个相同的字段名,则为自然连接.
<BR><B>[例4.7]</B>带有其它条件的连接查询. <BR>求选修C1课程且成绩为B以上的学生及成绩. <BR>SELECT
S.S#,SNAME,SD,AGE,GRADE FROM S,SC <BR>WHERE S.S#=SC.S# AND
SC.C#='C1' <BR>AND(SC.GRADE='A' OR SC.GRADE='B');
<BR>连接谓词可以和其他谓词组合起来,形成各种复合条件.
<BR>连接查询可以是两个表的连接,也可以是两个以上表的连接(常称多表连接),也可以是一个表自身的连接. </FONT>
<P align=left
style="LINE-HEIGHT: 200%; MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px"><FONT
size=2><B>(3)嵌套查询:</B>嵌套查询亦称为子查询.嵌套查询是一个SELECT-FROM-WHERE查询块可以嵌入另一个查询块之中.在SQL中允许多层嵌套.
<BR><B>[例4.8]</B>求选修了课程'J'的学生的学号和姓名. <BR>SELECT S#,SNAME FROM S
WHERE S# IN <BR>(SELECT S# FROM SC WHERE C# IN) <BR>(SELECT C# FROM
C WHERE CNAME='J'));
<BR>子查询在上一级查询处理之前求解,即嵌套查询是从里向外处理的,这样,外层查询可以利用内层查询的结果,在[例14.8]中若最内层查询结果为C4,原查询可以等价于:
<BR>SELECT S#,SNAME FROM S WHERE S# IN <BR>(SELECT S# FRON SC WHERE
X#='C4'); <BR>若这个内层查询结果为S2,S3,S6,则原查询便为: <BR>SELECT S#,SNAME FRON S
WHERE S# IN ('S2','S3','S6');
<BR>从本例看到,在查询涉及多个关系时,用嵌套查询逐次求解,层次分明,容易理解也容易书写,具有结构化程序设计的优点.
<BR>在嵌套查询中,最常用的是谓词IN.若用户能确切知道内层查询返回的单值,则可以用比较算符. </FONT>
<P align=left
style="LINE-HEIGHT: 200%; MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px"><FONT
size=2><B>(4)视图的查询:</B>视图定义后,用户可以如对基本表那样对视图进行查询. <BR>如:SELECT S#,SA
FRON CS-S WHERE SA<20;
<BR>系统执行此查询时,首先把它转换成等价的对基本表的查询,然后执行此查询,即当查询视图表时,系统首先从数据字典中取出该视图的定义,然后把定义中的查询语句和对该视图查询语句结合起来,形成一个修正的查询语句.对上例,修正后的查询语句为:
<BR>SELECT S#,SA FROM S WHERE SD='CS' AND SA<20;
<BR>由于视图的查询实质上是对基本表的查询,因此基本表的变化可以反映到视图上,视图就如同'窗口'一样,通过视图可以看到基本表的动态变化.
</FONT>
<P align=left
style="LINE-HEIGHT: 200%; MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px"><FONT
size=2><B>2.SQL插入语句</B> <BR> 插入语句的一般格式为:
<BR>INSERT INTO 表名[(字段名[,字段名]...)] <BR>VALUES(常量[,常量]...);
<BR>INSERT INTO 表名[(字段名[,字段名]...)]; <BR>子查询; <BR>
第一种格式把一个新记录插入指定的表中,第二中格式把查询的结果插入表中,若表中有些字段在插入语句中没有出现,则在这些字段上的值取空值NULL,当然在表定义中说明了NOT
NULL的字段在插入时不能取NULL.若插入语句中没有指出字段名,则新记录必须在每个字段上均有值. </FONT>
<P align=left
style="LINE-HEIGHT: 200%; MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px"><FONT
size=2><B>[例4.9]</B>单记录插入. <BR>把一个新学生记录插入表中,其有关信息为:S10,姓名Zhang
Ming,信息系IS,18岁 <BR>INSERT INTO S VALUES('S10','Zhang Ming','IS',18)
<BR><B>[例4.10]</B>插入一个选课记录('S15','C10','A'); <BR>INSERT INTO SC
(S#,C#,G) VALUES ('S15','C10','A');
<BR>插入和删除与更新一样,都会引起破坏数据完整性的问题,如本例中S15在S表中不存在,C10在C表中也不存在,这就破坏了参照完整性.支持关系模型的系统应自动地检查数据的完整性,对破坏完整性的操作拒绝执行.所以这个新行就不能插入.
<BR><B>[例4.11]</B>多记录插入. <BR>下面语句是求一个系中学生的平均年龄,并把结果存入数据库中.
<BR>CREATE TABLE DEPTAGE(SDEPT CHAR(15),AVEAGE SMALLINT); <BR>INSERT
INTO DEPTAGE(SDEPT,AGEAVE) <BR>SELECT SD,AVG(AGE) FROM S GROUP BY
SD; </FONT>
<P align=left
style="LINE-HEIGHT: 200%; MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px"><FONT
size=2><B>3.SQL的删除语句</B> <BR>删除语句的一般格式为: <BR>DELETE FROM 表名[WHERE
谓词]; <BR>删除语句从指定表中删除满足谓词的那些记录.没有WHERE子句时表示删去全部记录,但表的定义仍在数据字典中.
</FONT>
<P align=left
style="LINE-HEIGHT: 200%; MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px"><FONT
size=2><B>[例4.12]</B>单个记录删除.例如,要把学生S9删除,可以使用下面删除语句: <BR>DELETE FROM
S WHERE S#='S9'; <BR>执行删除操作也可能破坏数据的完整性,如本例.
<BR><B>[例4.13]</B>多个记录删除.例如,要删除所有的学生选课记录,可以使用下面删除语句 <BR>DELECT FROM
SC; <BR>执行操作后,SC成为一个空表.
<BR><B>[例4.14]</B>带有子查询的删除.删除计算机科学系全体学生的选课记录. <BR>DELETE FROM SC
WHRER 'CS'= <BR>(SELECT SD FROM S WHRER S.S#=SC.S#); </FONT>
<P align=left
style="LINE-HEIGHT: 200%; MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px"><FONT
size=2><B>4.SQL的更新语句</B> <BR>(<B>1)更新语句的一般格式:</B> <BR>UPDATE 表名 SET
字段=表达式[,字段=表达式]... <BR>[WHERE 谓词];
<BR>更新语句修改指定表中满足谓词的元组,把这些元组按SET子句的表达式修改相应字段上的值. </FONT>
<P align=left
style="LINE-HEIGHT: 200%; MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px"><FONT
size=2><B>[例4.15]</B>单记录修改,如把学生S1的姓名改为'WANG PING',也可以使用以下语句:
<BR>UPDATE S SET SNAME='WANG PING' WHRER S#='S1'
<BR>[例4.16]多记录修改,如把所有的学生的年龄加2,可以使用以下语句: <BR>UPDATE S SET SA=SA+2
<BR><B>[例4.17]</B>具有子查询的更新,如把数学系全体学生的成绩置为零,可以使用如下语句: <BR>UPDATE SC
SET G='0' WHERE 'MA' <BR>(SELECT SD FROM S WHERE S.S#=SC.S#);
<BR><B>[例4.18]</B>多个表的更新
<BR>在UPDATE语句中,一次只能对一个表更新,这就会产生破坏参照完整性的问题.例如,把S2的学号该为S9. <BR>UPDATE
S SET S#='S9' WHERE S#='S2'; <BR>UPDATE SC SET S#='S9' WHERE
S#='S2';
<BR>在执行了第一个更新语句之后,数据库已处于不一致的状态,因为在SC表中某些记录(即S#='S2'的那些SC记录)的S#值在S表中不存在,这就违反了关系模型的参照完整性,只有执行了第二个更新语句之后,数据库才重新处于一致状态.因此,必须保证这两个更新语句要么都执行,要么都不执行.在DB2中引入事务(Transaction)的概念来解决这个问题,这里不在细述.
</FONT>
<P align=left
style="LINE-HEIGHT: 200%; MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px"><FONT
size=2><B>(2)视图的执行:</B>对视图修改最终要转换成对基本表的修改(修改指INSERT,UPDATE和DELETE三类操作),如
<BR>UPDATE CS-S SET SN='WANG PING' WHERE S#='S1'; <BR>将转换成对基本表S的更新:
<BR>UPDATE S SET SN='WANG PING' WHERE S#='CS' AND S#='S1';
<BR>INSERT INTO CS-S VALUES('S12','YX','CS',19); <BR>将转换成对基本表的插入:
<BR>INSERT INTO S VALUES('S12','YX','CS',19);
<BR>在关系数据库中,不是所有的视图都是可以修改的,也就是说,有些视图的修改不能唯一地有意义地转换成对基本表的修改,例如:
<BR>UPDATE S-G SET GAVG=90 WHERE S#='S1';
<BR>由于S-G中的一个元组是由SC中若干行经过求平均得到的,因此对视图S-G的更新就无法转换成对SC的更新,所以视图S-G是不可更新的.
</FONT></P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE align=center border=0 width=750 cellspace="0" cellpading="0">
<TBODY>
<TR>
<TD bgColor=#c8c8c8 height=1 width="100%"></TD></TR>
<TR height=10>
<TD></TD></TR>
<TR>
<TD align=middle height=16>北方交通大学计算机与信息技术学院基础教研室</TD></TR>
<TR>
<TD align=middle height=16>mailto: <A
href="mailto:xhl@computer.njtu.edu.cn">xhl@computer.njtu.edu.cn</A></TD></TR>
<TR>
<TD align=middle height=16>Copyright © distance.njtu.edu.cn All rights
reserved </TD></TR></TBODY></TABLE></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -