﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-向前走的螃蟹-随笔分类-SQLServer</title><link>http://www.blogjava.net/hhhaaawwwkkk/category/34780.html</link><description>学习笔记 努力奋斗 </description><language>zh-cn</language><lastBuildDate>Sat, 19 Sep 2009 09:31:33 GMT</lastBuildDate><pubDate>Sat, 19 Sep 2009 09:31:33 GMT</pubDate><ttl>60</ttl><item><title>SQL Server创建存储过程(转)</title><link>http://www.blogjava.net/hhhaaawwwkkk/archive/2009/09/19/295646.html</link><dc:creator>向前走的螃蟹</dc:creator><author>向前走的螃蟹</author><pubDate>Sat, 19 Sep 2009 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/hhhaaawwwkkk/archive/2009/09/19/295646.html</guid><wfw:comment>http://www.blogjava.net/hhhaaawwwkkk/comments/295646.html</wfw:comment><comments>http://www.blogjava.net/hhhaaawwwkkk/archive/2009/09/19/295646.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hhhaaawwwkkk/comments/commentRss/295646.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hhhaaawwwkkk/services/trackbacks/295646.html</trackback:ping><description><![CDATA[<p>什么是存储过程？</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 存储过程（procedure）类似于C语言中的函数</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用来执行管理任务或应用复杂的业务规则</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 存储过程可以带参数，也可以返回结果</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 存储过程可以包含数据操纵语句、变量、逻辑 控制语句等</p>
<p>&nbsp;</p>
<p>存储过程的优点</p>
<p>(1)执行速度快。</p>
<p>存储过程创建是就已经通过语法检查和性能优化，在执行时无需每次编译。</p>
<p>存储在数据库服务器，性能高。</p>
<p>(2)允许模块化设计。</p>
<p>只需创建存储过程一次并将其存储在数据库中，以后即可在程序中调用该过程任意次。存储过程可由在数据库编程方面有专长的人员创建，并可独立于程序源代码而单独修改 。</p>
<p>(3)提高系统安全性。</p>
<p>&nbsp;&nbsp;&nbsp; 可将存储过程作为用户存取数据的管道。可以限制用户对数据表的存取权限，建立特定的存储过程供用户使用，完成对数据的访问。</p>
<p>&nbsp;&nbsp;&nbsp; 存储过程的定义文本可以被加密，使用户不能查看其内容。</p>
<p>(4)减少网络流量：</p>
<p>一个需要数百行Transact-SQL代码的操作由一条执行过程代码的单独语句就可实现，而不需要在网络中发送数百行代码。</p>
<p>&nbsp;</p>
<p>存储过程的分类 </p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 系统存储过程</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由系统定义，存放在master数据库中</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类似C语言中的系统函数</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 系统存储过程的名称都以&#8220;sp_&#8221;开头或&#8221;xp_&#8221;开头</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用户自定义存储过程</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由用户在自己的数据库中创建的存储过程</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类似C语言中的用户自定义函数</p>
<p>&nbsp;</p>
<p>常用的系统存储过程 </p>
<p>系统存储过程<br />
&nbsp;说明<br />
&nbsp;<br />
sp_databases<br />
&nbsp;列出服务器上的所有数据库。<br />
&nbsp;<br />
sp_helpdb<br />
&nbsp;报告有关指定数据库或所有数据库的信息<br />
&nbsp;<br />
sp_renamedb<br />
&nbsp;更改数据库的名称<br />
&nbsp;<br />
sp_tables<br />
&nbsp;返回当前环境下可查询的对象的列表<br />
&nbsp;<br />
sp_columns<br />
&nbsp;回某个表列的信息<br />
&nbsp;<br />
sp_help<br />
&nbsp;查看某个表的所有信息<br />
&nbsp;<br />
sp_helpconstraint<br />
&nbsp;查看某个表的约束<br />
&nbsp;<br />
sp_helpindex<br />
&nbsp;查看某个表的索引<br />
&nbsp;<br />
sp_stored_procedures<br />
&nbsp;列出当前环境中的所有存储过程。<br />
&nbsp;<br />
sp_password<br />
&nbsp;添加或修改登录帐户的密码。<br />
&nbsp;<br />
sp_helptext<br />
&nbsp;显示默认值、未加密的存储过程、用户定义的存储过程、触发器或视图的实际文本。<br />
&nbsp;</p>
<p>&nbsp;</p>
<p>EXEC sp_databases /*列出当前系统中的数据库*/</p>
<p>EXEC&nbsp; sp_renamedb 'Northwind','Northwind1' /*修改数据库的名称(单用户访问, 最简单的办法就是执行SQL语句时关掉企业管理器)*/</p>
<p>USE stuDB </p>
<p>GO</p>
<p>EXEC sp_tables /*当前数据库中查询的对象的列表*/</p>
<p>EXEC sp_columns stuInfo /*返回某个表列的信息*/ </p>
<p>EXEC sp_help stuInfo /*查看表stuInfo的信息*/</p>
<p>EXEC sp_helpconstraint stuInfo /*查看表stuInfo的约束*/</p>
<p>EXEC sp_helpindex stuMarks /*查看表stuMarks的索引*/</p>
<p>EXEC sp_helptext 'view_stuInfo_stuMarks' /*查看视图的语句文本*/</p>
<p>EXEC sp_stored_procedures&nbsp; /*查看当前数据库中的存储过程*/</p>
<p>&nbsp;</p>
<p>常用的扩展存储过程</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 常用的扩展存储过程：xp_cmdshell </p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以执行DOS命令下的一些的操作 </p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以文本行方式返回任何输出 </p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用语法：</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EXEC xp_cmdshell DOS命令 [NO_OUTPUT]</p>
<p>USE master</p>
<p>GO</p>
<p>EXEC xp_cmdshell 'mkdir d:\bank', NO_OUTPUT /*创建文件夹D:\bank*/</p>
<p>IF EXISTS(SELECT * FROM sysdatabases</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE name='bankDB')</p>
<p>&nbsp;&nbsp; DROP DATABASE bankDB</p>
<p>GO</p>
<p>CREATE DATABASE bankDB</p>
<p>&nbsp;(</p>
<p>&nbsp; &#8230;</p>
<p>)</p>
<p>GO</p>
<p>EXEC xp_cmdshell 'dir D:\bank\' --查看文件 /*查看文件夹D:\bank*/</p>
<p>&nbsp;</p>
<p>如何创建存储过程？</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义存储过程的语法</p>
<p>&nbsp;&nbsp;&nbsp; CREATE&nbsp; PROC[EDURE]&nbsp; 存储过程名 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @参数1&nbsp; 数据类型 = 默认值,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;&#8230; ,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @参数n&nbsp; 数据类型 OUTPUT</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AS</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL语句</p>
<p>&nbsp;&nbsp;&nbsp; GO</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 和C语言的函数一样，参数可选</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参数分为输入参数、输出参数 </p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输入参数允许有默认值</p>
<p>&nbsp;</p>
<p>创建不带参数的存储过程 </p>
<p>CREATE PROCEDURE proc_stu /* proc_stu为存储过程的名称*/</p>
<p>&nbsp; AS</p>
<p>&nbsp;&nbsp;&nbsp; DECLARE @writtenAvg float,@labAvg float /* 笔试平均分和机试平均分变量 */</p>
<p>&nbsp;&nbsp;&nbsp; SELECT @writtenAvg=AVG(writtenExam),</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @labAvg=AVG(labExam)&nbsp; FROM stuMarks</p>
<p>&nbsp;&nbsp;&nbsp; print '笔试平均分：'+convert(varchar(5),@writtenAvg)&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; print '机试平均分：'+convert(varchar(5),@labAvg)</p>
<p>&nbsp;&nbsp;&nbsp; IF (@writtenAvg&gt;70 AND @labAvg&gt;70)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print '本班考试成绩：优秀' /* 显示考试成绩的等级 */</p>
<p>&nbsp;&nbsp;&nbsp; ELSE</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print '本班考试成绩：较差'</p>
<p>&nbsp;&nbsp;&nbsp; print '--------------------------------------------------'</p>
<p>&nbsp;&nbsp;&nbsp; print '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参加本次考试没有通过的学员：'</p>
<p>&nbsp;&nbsp;&nbsp; SELECT stuName,stuInfo.stuNo,writtenExam,labExam /* 显示未通过的学员 */</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM&nbsp; stuInfo&nbsp; INNER JOIN stuMarks ON&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stuInfo.stuNo=stuMarks.stuNo</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE writtenExam&lt;60 OR labExam&lt;60 </p>
<p>GO</p>
<p>&nbsp;</p>
<p>调用存储过程</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EXECUTE（执行）语句用来调用存储过程</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用的语法</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EXEC&nbsp; 过程名&nbsp; [参数]</p>
<p>&nbsp;</p>
<p>创建带参数的存储过程</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 存储过程的参数分两种：</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输入参数</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出参数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输入参数：</p>
<p>&nbsp;&nbsp;&nbsp; 用于向存储过程传入值，类似C语言的按值传递;</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出参数：</p>
<p>&nbsp;&nbsp;&nbsp; 用于在调用存储过程后，</p>
<p>&nbsp;&nbsp;&nbsp; 返回结果，类似C语言的</p>
<p>&nbsp;&nbsp;&nbsp; 按引用传递;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;</p>
<p>带输入参数的存储过程</p>
<p>问题：</p>
<p>修改上例：由于每次考试的难易程度不一样，每次 笔试和机试的及格线可能随时变化（不再是60分），这导致考试的评判结果也相应变化。</p>
<p>&nbsp;</p>
<p>分析：</p>
<p>在述存储过程添加2个输入参数：</p>
<p>@writtenPass&nbsp;&nbsp; 笔试及格线 </p>
<p>@labPass&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 机试及格线 </p>
<p>CREATE PROCEDURE proc_stu </p>
<p>&nbsp; @writtenPass int = 60,&nbsp; /*输入参数：笔试及格线*/</p>
<p>&nbsp; @labPass int = 60&nbsp;&nbsp; /*输入参数：机试及格线*/</p>
<p>&nbsp; AS</p>
<p>&nbsp;&nbsp;&nbsp; print '--------------------------------------------------' </p>
<p>&nbsp;&nbsp;&nbsp; print '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参加本次考试没有通过的学员：'</p>
<p>&nbsp;&nbsp;&nbsp; SELECT stuName,stuInfo.stuNo,writtenExam, /*查询没有通过考试的学员*/</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; labExam&nbsp; FROM&nbsp; stuInfo</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INNER JOIN stuMarks ON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stuInfo.stuNo=stuMarks.stuNo</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE writtenExam&lt;@writtenPass </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OR labExam&lt;@labPass </p>
<p>GO</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用带参数的存储过程</p>
<p>&nbsp;&nbsp;&nbsp; 假定本次考试机试偏难，机试的及格线定为55分，笔试及格线定为60分</p>
<p>EXEC proc_stu 60,55&nbsp; </p>
<p>--或这样调用：</p>
<p>EXEC proc_stu @labPass=55,@writtenPass=60</p>
<p>&nbsp;</p>
<p>带输出参数的存储过程 </p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果希望调用存储过程后，返回一个或多个值，这时就需要使用输出（OUTPUT）参数了 </p>
<p>问题：</p>
<p>修改上例，返回未通过考试的学员人数。</p>
<p>CREATE PROCEDURE proc_stu </p>
<p>&nbsp; @notpassSum int OUTPUT, /*输出（返回）参数：表示没有通过的人数*/</p>
<p>&nbsp; @writtenPass int=60,&nbsp;&nbsp; /*推荐将默认参数放在最后*/</p>
<p>&nbsp; @labPass int=60&nbsp; </p>
<p>&nbsp; AS</p>
<p>&nbsp;&nbsp;&nbsp; &#8230;&#8230;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; SELECT stuName,stuInfo.stuNo,writtenExam, /*统计并返回没有通过考试的学员人数*/</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; labExam FROM&nbsp; stuInfo&nbsp;&nbsp; INNER JOIN stuMarks</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ON stuInfo.stuNo=stuMarks.stuNo</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE writtenExam&lt;@writtenPass</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OR labExam&lt;@labPass </p>
<p>&nbsp;&nbsp;&nbsp; SELECT @notpassSum=COUNT(stuNo) </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM stuMarks&nbsp; WHERE writtenExam&lt;@writtenPass </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OR labExam&lt;@labPass </p>
<p>GO</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用带输出参数的存储过程</p>
<p>/*---调用存储过程----*/</p>
<p>DECLARE @sum int /*调用时必须带OUTPUT关键字 ，返回结果将存放在变量@sum中*/</p>
<p>EXEC proc_stu @sum OUTPUT ,64&nbsp; </p>
<p>print '--------------------------------------------------'</p>
<p>IF @sum&gt;=3 /*后续语句引用返回结果*/</p>
<p>&nbsp; print '未通过人数：'+convert(varchar(5),@sum)+ '人, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 超过60%,及格分数线还应下调'</p>
<p>ELSE</p>
<p>&nbsp; print '未通过人数：'+convert(varchar(5),@sum)+ '人,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 已控制在60%以下，及格分数线适中'</p>
<p>GO </p>
<p>注意：调用时也必须跟随关键字OUTPUT，否则SQL Server将视为输入参数。</p>
<p>&nbsp;</p>
<p>处理存储过程中的错误 </p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以使用PRINT语句显示错误信息，但这 些信息是临时的，只能显示给用户 </p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RAISERROR 显示用户定义的错误信息时</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可指定严重级别，</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置系统变量@@ERROR</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 记录所发生的错误等</p>
<p>q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RAISERROR语句的用法如下： </p>
<p>RAISERROR (msg_id | msg_str,severity,</p>
<p>&nbsp;&nbsp; state WITH option[,...n]]) </p>
<p>&#8226;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg_id：在sysmessages系统表中指定用户定义错误信息</p>
<p>&#8226;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg_str：用户定义的特定信息，最长255个字符</p>
<p>&#8226;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; severity：定义严重性级别。用户可使用的级别为0&#8211;18级</p>
<p>&#8226;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; state：表示错误的状态，1至127之间的值</p>
<p>&#8226;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; option：指示是否将错误记录到服务器错误日志中 </p>
<p>RAISERROR 语句每个参数的详细讲解，可以查阅SQL帮助!</p>
<p>问题：</p>
<p>完善上例，当用户调用存储过程时，传入的及格线参数不</p>
<p>在0～100之间时，将弹出错误警告，终止存储过程的执行。 </p>
<p>CREATE PROCEDURE proc_stu </p>
<p>&nbsp; @notpassSum int OUTPUT, --输出参数</p>
<p>&nbsp; @writtenPass int=60,&nbsp; --默认参数放后</p>
<p>&nbsp; @labPass int=60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --默认参数放后</p>
<p>&nbsp; AS</p>
<p>&nbsp;&nbsp;&nbsp; IF (NOT @writtenPass BETWEEN 0 AND 100) </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OR (NOT @labPass BETWEEN 0 AND 100)</p>
<p>/*引发系统错误，指定错误的严重级别16，调用状态为1（默认）,并影响@@ERROR系统变量的值 */</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEGIN </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RAISERROR (&#8216;及格线错误，请指定0－100之间的分 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数，统计中断退出',16,1)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN&nbsp; ---立即返回，退出存储过程</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END</p>
<p>&nbsp;&nbsp;&nbsp; &#8230;..其他语句同上例，略</p>
<p>GO </p>
<p>/*---调用存储过程，测试RAISERROR语句----*/</p>
<p>DECLARE @sum int,&nbsp; @t int</p>
<p>EXEC proc_stu @sum OUTPUT ,604&nbsp;&nbsp; /*笔试及格线误输入604分*/</p>
<p>SET @t=@@ERROR </p>
<p>print&nbsp; '错误号：'+convert(varchar(5),@t )</p>
<p>IF @t&lt;&gt;0&nbsp; /*如果执行了RAISERROR，系统全局@@ERROR将不等于0，表示出现错误*/</p>
<p>&nbsp;&nbsp; RETURN&nbsp; --退出批处理，后续语句不再执行</p>
<p>print '--------------------------------------------------'</p>
<p>IF @sum&gt;=3</p>
<p>&nbsp; print '未通过人数：'+convert(varchar(5),@sum)+ '人,超过60%,及格分数线还应下调'</p>
<p>ELSE</p>
<p>&nbsp; print '未通过人数：'+convert(varchar(5),@sum)+ '人,已控制在60%以下，及格分数线适中'</p>
<p>GO</p>
<p>&nbsp;</p>
<p>好，我们来做个总结：</p>
<p>&#8226;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 存储过程是一组预编译的SQL语句，它可以包含数据操纵语句、变量、逻辑控制语句等 </p>
<p>&#8226;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 存储过程允许带参数，参数分为：</p>
<p>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输入参数</p>
<p>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出参数</p>
<p>&nbsp;&nbsp; 其中，输入参数可以有默认值。</p>
<p>&#8226;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输入参数：可以在调用时向存储过程传递参数，此类参数可用来向存储过程中传入值 </p>
<p>&#8226;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出参数从存储过程中返回（输出）值，后面跟随OUTPUT关键字</p>
<p>&#8226;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RAISERROR语句用来向用户报告错误</p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/lenotang/archive/2008/11/18/3329593.aspx</p>
<img src ="http://www.blogjava.net/hhhaaawwwkkk/aggbug/295646.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hhhaaawwwkkk/" target="_blank">向前走的螃蟹</a> 2009-09-19 10:38 <a href="http://www.blogjava.net/hhhaaawwwkkk/archive/2009/09/19/295646.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server 2005 插入varchar类型的中文出现乱码</title><link>http://www.blogjava.net/hhhaaawwwkkk/archive/2009/06/23/283832.html</link><dc:creator>向前走的螃蟹</dc:creator><author>向前走的螃蟹</author><pubDate>Tue, 23 Jun 2009 13:44:00 GMT</pubDate><guid>http://www.blogjava.net/hhhaaawwwkkk/archive/2009/06/23/283832.html</guid><wfw:comment>http://www.blogjava.net/hhhaaawwwkkk/comments/283832.html</wfw:comment><comments>http://www.blogjava.net/hhhaaawwwkkk/archive/2009/06/23/283832.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hhhaaawwwkkk/comments/commentRss/283832.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hhhaaawwwkkk/services/trackbacks/283832.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>1：安装时不要选 Hide advice configuration&nbsp; options。然后再 Collation designator and order&nbsp; 中选择 Chinese_PRC </p>
<p>2：在建表时指明某个字段的语言</p>
<p>方法 COLLATE Chinese_PRC_CS_AS_WS</p>
<p>示例：</p>
<p>create table test<br />
(<br />
a varchar(255) COLLATE Chinese_PRC_CS_AS_WS NULL, <br />
b varchar(255) COLLATE sql_latin1_general_cp1_ci_as NULL <br />
)<br />
<br />
insert test values('中文','中文')</p>
<p>插入后 字段 a 为 中文 ，b 为 ??<br />
<br />
3：修改数据库的排序方法为Chinese_PRC_CI_AS；将Varchar类型设置为nvarchar类型；<br />
<br />
</p>
<img src ="http://www.blogjava.net/hhhaaawwwkkk/aggbug/283832.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hhhaaawwwkkk/" target="_blank">向前走的螃蟹</a> 2009-06-23 21:44 <a href="http://www.blogjava.net/hhhaaawwwkkk/archive/2009/06/23/283832.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL中CASE条件表达式</title><link>http://www.blogjava.net/hhhaaawwwkkk/archive/2008/11/13/240328.html</link><dc:creator>向前走的螃蟹</dc:creator><author>向前走的螃蟹</author><pubDate>Thu, 13 Nov 2008 07:35:00 GMT</pubDate><guid>http://www.blogjava.net/hhhaaawwwkkk/archive/2008/11/13/240328.html</guid><wfw:comment>http://www.blogjava.net/hhhaaawwwkkk/comments/240328.html</wfw:comment><comments>http://www.blogjava.net/hhhaaawwwkkk/archive/2008/11/13/240328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hhhaaawwwkkk/comments/commentRss/240328.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hhhaaawwwkkk/services/trackbacks/240328.html</trackback:ping><description><![CDATA[<p><acronym class="ACRONYM">SQL</acronym> <tt class="TOKEN">CASE</tt> 表达式是一种通用的条件表达式，类似于其它语言中的 if/else 语句。 </p>
<pre class="SYNOPSIS">CASE WHEN <tt class="REPLACEABLE"><em>condition</em></tt> THEN <tt class="REPLACEABLE"><em>result</em></tt>
[<span class="OPTIONAL">WHEN ...</span>]
[<span class="OPTIONAL">ELSE <tt class="REPLACEABLE"><em>result</em></tt></span>]
END</pre>
<p><tt class="TOKEN">CASE</tt> 子句可以用于任何表达式可以有效存在的地方。 <tt class="REPLACEABLE"><em>condition</em></tt> 是一个返回<tt class="TYPE">boolean</tt> 的表达式。 如果结果为真，那么 <tt class="TOKEN">CASE</tt> 表达式的结果就是符合条件的 <tt class="REPLACEABLE"><em>result</em></tt>。 如果结果为假，那么以相同方式搜寻任何随后的 <tt class="TOKEN">WHEN</tt> 子句。 如果没有 <tt class="TOKEN">WHEN</tt> <tt class="REPLACEABLE"><em>condition</em></tt> 为真，那么 case 表达式的结果就是在 <tt class="TOKEN">ELSE</tt> 子句里的值。 如果省略了 <tt class="TOKEN">ELSE</tt> 子句而且没有匹配的条件， 结果为 NULL。 </p>
<p>例子： </p>
<pre class="SCREEN">SELECT * FROM test;
a
---
1
2
3
SELECT a,
CASE WHEN a=1 THEN 'one'
WHEN a=2 THEN 'two'
ELSE 'other'
END
FROM test;
a | case
---+-------
1 | one
2 | two
3 | other</pre>
<p>&nbsp;</p>
<p>所有 <tt class="REPLACEABLE"><em>result</em></tt> 表达式的数据的类型都必须可以转换成单一的输出类型。&nbsp; </p>
<p>下面这个<span class="QUOTE">"简单的"</span> <tt class="TOKEN">CASE</tt> 表达式是上面的通用形式的一个特殊的变种。 </p>
<pre class="SYNOPSIS">CASE <tt class="REPLACEABLE"><em>expression</em></tt>
WHEN <tt class="REPLACEABLE"><em>value</em></tt> THEN <tt class="REPLACEABLE"><em>result</em></tt>
[<span class="OPTIONAL">WHEN ...</span>]
[<span class="OPTIONAL">ELSE <tt class="REPLACEABLE"><em>result</em></tt></span>]
END</pre>
<p>先计算 <tt class="REPLACEABLE"><em>expression</em></tt> 的值， 然后与所有在<tt class="TOKEN">WHEN</tt> 子句里声明的 <tt class="REPLACEABLE"><em>value</em></tt> 对比，直到找到一个相等的。 如果没有找到匹配的，则返回在 <tt class="TOKEN">ELSE</tt> 子句里的 <tt class="REPLACEABLE"><em>result</em></tt> （或者 NULL）。 这个类似于 C 里的 <code class="FUNCTION">switch</code> 语句。 </p>
<p>上面的例子可以用简单 <tt class="TOKEN">CASE</tt> 语法来写： </p>
<pre class="SCREEN">SELECT a,
CASE a WHEN 1 THEN 'one'
WHEN 2 THEN 'two'
ELSE 'other'
END
FROM test;
a | case
---+-------
1 | one
2 | two
3 | other</pre>
<p>&nbsp;</p>
<p><tt class="TOKEN">CASE</tt> 表达式并不计算任何对于判断结果并不需要的子表达式。 比如，下面是一个可以避免被零除的方法： </p>
<pre class="PROGRAMLISTING">SELECT ... WHERE CASE WHEN x &lt;&gt; 0 THEN y/x &gt; 1.5 ELSE false END;</pre>
<pre class="PROGRAMLISTING">
<p><font face="Courier New">例1：一道SQL语句面试题<br />
表内容：<br />
2005-05-09 胜<br />
2005-05-09 胜<br />
2005-05-09 负<br />
2005-05-09 负<br />
2005-05-10 胜<br />
2005-05-10 负<br />
2005-05-10 负<br />
<br />
如果要生成下列结果, 该如何写sql语句?<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  胜 负<br />
2005-05-09  2  2<br />
2005-05-10  1  2<br />
----------------------------------------------------------<br />
create table #tmp(rq varchar(10),shengfu nchar(1))<br />
<br />
insert into #tmp values('2005-05-09','胜')<br />
insert into #tmp values('2005-05-09','胜')<br />
insert into #tmp values('2005-05-09','负')<br />
insert into #tmp values('2005-05-09','负')<br />
insert into #tmp values('2005-05-10','胜')<br />
insert into #tmp values('2005-05-10','负')<br />
insert into #tmp values('2005-05-10','负')</font></p>
<p><font face="Courier New"><span style="color: #008000"><font face="Courier New">select rq, sum(case when shengfu='胜' then 1 else 0 end)'胜',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum(case when shengfu='负' then 1 else 0 end)'负' <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from #tmp group by rq<br />
</font></span>----------------------------------------------------------<br />
<br />
<br />
<br />
<br />
<br />
<br />
例2：表中有A B C三列,用SQL语句实现：当A列大于B列时选择A列否则选择B列，当B列大于C列时选择B列否则选择C列。<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<span style="color: #008000">select (case when a&gt;b then a else b end ),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(case when b&gt;c then b esle c end)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from table_name</span><br />
</font></p>
----------------------------------------------------------</pre>
<pre class="PROGRAMLISTING">例3：有一张表，里面有3个字段：语文，数学，英语。其中有3条记录分别表示语文70分，数学80分，英语58分，请用一条sql语句查询出这三条记录并按以下条件显示出来（并写出您的思路）：&nbsp;&nbsp;<br />
&nbsp;&nbsp; 大于或等于80表示优秀，大于或等于60表示及格，小于60分表示不及格。&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示格式：&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 语文&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数学&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 英语&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 及格&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 优秀&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不及格&nbsp;&nbsp;&nbsp;&nbsp;<br />
----------------------------------------------------------<br />
<span style="color: #008000">select<br />
&nbsp;&nbsp;&nbsp;&nbsp;(case when 语文&gt;=80 then '优秀'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when 语文&gt;=60 then '及格'<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; else '不及格' end) as 语文,<br />
&nbsp;&nbsp;&nbsp;&nbsp;(case when 数学&gt;=80 then '优秀'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when 数学&gt;=60 then '及格'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else '不及格' end) as 数学,<br />
&nbsp;&nbsp;&nbsp;&nbsp;(case when 英语&gt;=80 then '优秀'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; when 英语&gt;=60 then '及格'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  else '不及格' end) as 英语,<br />
from table<br />
</span>----------------------------------------------------------------</pre>
<img src ="http://www.blogjava.net/hhhaaawwwkkk/aggbug/240328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hhhaaawwwkkk/" target="_blank">向前走的螃蟹</a> 2008-11-13 15:35 <a href="http://www.blogjava.net/hhhaaawwwkkk/archive/2008/11/13/240328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL小教程【转】</title><link>http://www.blogjava.net/hhhaaawwwkkk/archive/2008/11/12/240040.html</link><dc:creator>向前走的螃蟹</dc:creator><author>向前走的螃蟹</author><pubDate>Wed, 12 Nov 2008 03:22:00 GMT</pubDate><guid>http://www.blogjava.net/hhhaaawwwkkk/archive/2008/11/12/240040.html</guid><wfw:comment>http://www.blogjava.net/hhhaaawwwkkk/comments/240040.html</wfw:comment><comments>http://www.blogjava.net/hhhaaawwwkkk/archive/2008/11/12/240040.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hhhaaawwwkkk/comments/commentRss/240040.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hhhaaawwwkkk/services/trackbacks/240040.html</trackback:ping><description><![CDATA[<span style="color: red"><strong>一、SQL语言简介</strong> </span><br />
SQL是结构化查询语言(Structured Query Language)的缩写。这种语言允许我们对数据库进行复杂的查询。同时也提供了创建数据库的方法。SQL语言的使用范围非常广泛。许多数据库产品都支持SQL语言，这意味着如果我们学会了SQL语言，我们可以把这种知识运用到MS Access 或SQL Server, Oracle, DB2以及非常多的其它数据库中。<br />
&nbsp;<br />
SQL语言运用在关系型数据库中。一个关系型数据库把数据<a class="article" href="http://www.enet.com.cn/solution/" target="_blank">存储</a>在表（也称关系）中。每个数据库的主要组成就是一组表。每个表又由一组记录组成－－每条记录在表中有相同的结构，包含固定数量的具有一定类型的字段。<br />
&nbsp;<br />
下面我们来看一个实际的数据库中的表。该表的表名为cia，包含250多条记录，每个记录代表一个国家。表由5个字段组成，字段的值有的是字符串类型，有的是数字类型。 <br />
<br />
name region area population gdp <br />
---- ------ ------ ---------- ----------- <br />
Yemen Middle East 527970 14728474 23400000000 <br />
Zaire Africa 2345410 44060636 18800000000 <br />
Zambia Africa 752610 9445723 7900000000 <br />
Zimbabwe Africa 390580 11139961 17400000000 <br />
<br />
下面我们可以用一些SQL语句来查询这个表中我们该兴趣的数据。 <br />
<br />
1. 中国的GDP是多少？ <br />
<br />
查询用的SQL语句为： <br />
select gdp from cia <br />
where name='china' <br />
<br />
查询结果为： <br />
4800000000000 <br />
<br />
2. 给出每个地区的国家数和人口总数。并且按地区的人口数从多到少排序。 <br />
<br />
<br />
查询用的SQL语句为： <br />
<br />
SELECT region, COUNT(name), SUM(population) <br />
FROM cia <br />
GROUP BY region <br />
ORDER BY 3 DESC <br />
<br />
查询结果为： <br />
region COUNT(name) SUM(population) <br />
------ ----------- --------------- <br />
Asia 14 2963031109 <br />
Africa 59 793382933 <br />
Europe 43 580590872 <br />
.... <br />
<br />
怎么样，对SQL语言有了基本的了解了吧，同时对数据库，表，记录，字段等一系列在SQL语言中常用的 <br />
感念也有大概的认识吧。如果不是很清楚也没关系，在接下来的内容中我们从SQL语言中最简单 <br />
的内容逐步给大家作介绍，并提供丰富的练习让大家实际操作。<br />
<br />
<strong style="color: red">二、最基本的SELECT 命令</strong><br />
select命令或语句用来获取一个或多个表中的记录信息，一般配合where子句使用，来取得满足某些条件的记录，如果没有where子句，将返回所有记录。一般的使用方式如下： <br />
<br />
SELECT attribute-list <br />
FROM table-name <br />
WHERE condition <br />
<br />
attribute-list：返回内容的列表，每个内容用逗号分开。这里的内容可以为字段，包含字段的表达式或更复杂的子查询。 <br />
<br />
table-name：表名，更复杂时可以为子查询。 <br />
<br />
condition：条件表达式，用来筛选满足该条件的记录。 <br />
<br />
在本节中我们使用下表作为试验之用： <br />
<br />
bbc(name, region, area, population, gdp) <br />
表名为bbc，该表有５个字段（columns），又称为属性（attributes） . <br />
name ：国家名 <br />
region:　国家所在的地区 <br />
area: 面积 <br />
population ：人口 <br />
gdp：国民生产总值 <br />
<br />
SQL实例： <br />
1、选出所有国家名，地区和人口 <br />
SELECT name, region, population FROM bbc <br />
<br />
<br />
2、给出France的人口数 <br />
SELECT population FROM bbc <br />
WHERE name = 'France' <br />
<br />
3、哪些国家的名称以字符D开始？ <br />
SELECT name FROM bbc <br />
WHERE name LIKE 'D%' <br />
<br />
4、 国土大国（面积大于五百万平方公里）的国名和人口密度 <br />
SELECT name, population/area FROM bbc <br />
WHERE area &gt; 5000000 <br />
<br />
5、给出一些小（面积小于2000平方公里）而富有(国民生产总值大于50亿)的国家 <br />
SELECT name , region <br />
FROM bbc <br />
WHERE area &lt; 2000 <br />
AND gdp &gt; 5000000000<br />
<br />
<span style="color: red"><strong>三、SELECT命令中的GROUP BY 和 HAVING 子句 </strong></span><br />
在介绍GROUP BY 和 HAVING 子句前，我们必需先讲讲sql语言中一种特殊的函数：聚合函数，例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。 <br />
<br />
SELECT SUM(population) FROM bbc <br />
<br />
这里的SUM作用在所有返回记录的population字段上，结果就是该查询只返回一个结果，即所有国家的总人口数。 <br />
<br />
<br />
通过使用GROUP BY 子句，可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。 <br />
当你指定 GROUP BY region 时， 属于同一个region（地区）的一组数据将只能返回一行值． <br />
也就是说，表中所有除region（地区）外的字段，只能通过 SUM, COUNT等聚合函数运算后返回一个值． <br />
<br />
HAVING子句可以让我们筛选成组后的各组数据． <br />
WHERE子句在聚合前先筛选记录．也就是说作用在GROUP BY 子句和HAVING子句前． <br />
而 HAVING子句在聚合后对组记录进行筛选。 <br />
<br />
让我们还是通过具体的实例来理解GROUP BY 和 HAVING 子句，还采用第三节介绍的bbc表。 <br />
<br />
SQL实例： <br />
<br />
1、显示每个地区的总人口数和总面积． <br />
SELECT region, SUM(population), SUM(area) <br />
FROM bbc <br />
GROUP BY region <br />
<br />
先以region把返回记录分成多个组，这就是GROUP BY的字面含义。分完组后，然后用聚合函数对每组中的不同字段（一或多条记录）作运算。 <br />
<br />
2、 显示每个地区的总人口数和总面积．仅显示那些面积超过1000000的地区。 <br />
<br />
SELECT region, SUM(population), SUM(area) <br />
FROM bbc <br />
GROUP BY region <br />
HAVING SUM(area)&gt;1000000 <br />
<br />
在这里，我们不能用where来筛选超过1000000的地区，因为表中不存在这样一条记录。 <br />
相反，HAVING子句可以让我们筛选成组后的各组数据．<br />
<br />
<span style="color: red"><strong>四、嵌套SELECT语句</strong></span><br />
嵌套SELECT语句也叫子查询，形如： <br />
<br />
SELECT name FROM bbc WHERE region = <br />
(SELECT region FROM bbc WHERE name = 'Brazil') <br />
<br />
一个 SELECT 语句的查询结果可以作为另一个语句的输入值。 <br />
上面的SQL语句作用为获得和'Brazil'（巴西）同属一个地区的所有国家。 <br />
<br />
子查询不但可以出现在Where子句中，也可以出现在from子句中，作为一个临时表使用，也可以出现在select list中，作为一个字段值来返回。本节我们仅介绍的Where子句中的子查询。 <br />
<br />
在Where子句中使用子查询，有一个在实际使用中容易犯的错在这里说明一下。 <br />
<br />
通常，就像上面的例子一样，嵌套的语句总是和一个值进行比较。语句 (SELECT region FROM bbc WHERE name = 'Brazil') 应该仅返回一个地区，即 'Americas'. 但如果我们在表中再插入一条地区为欧洲，国家名称为Brazil的记录，那会发生什么情况？ <br />
<br />
这将会导致语句的运行时错误．因为这个SQL语句的语法是正确的，所以数据库引擎就开始执行，但当执行到外部的语句时就出错了。因为这时的外部语句就像好像是 SELECT name FROM bbc WHERE region = ('Americas', 'Europe')，这个语句当然报错了。 <br />
<br />
那么有没有办法解决这个问题呢，当然有。有一些SQL查询条件允许对列表值（即多个值）进行操作。 <br />
例如"IN" 操作符，可以测试某个值是否在一个列表中。 <br />
<br />
下面的语句就可以安全的执行而不出错，不管表中有多少条包含Brazils的记录 <br />
<br />
SELECT name FROM bbc WHERE region IN <br />
(SELECT region FROM bbc WHERE name = 'Brazil') <br />
<br />
OK， <br />
<br />
让我们再看看一些具体的实例， <br />
<br />
1、给出人口多于Russia（俄国）的国家名称 <br />
SELECT name FROM bbc <br />
WHERE population&gt; <br />
(SELECT population FROM bbc <br />
WHERE name='Russia') <br />
<br />
2、给出'India'（印度）, 'Iran'（伊朗）所在地区的所有国家的所有信息<br />
SELECT * FROM bbc <br />
WHERE region IN <br />
(SELECT region FROM bbc <br />
WHERE name IN ('India','Iran')) <br />
<br />
3、给出人均GDP超过'United Kingdom'（英国）的欧洲国家． <br />
<br />
SELECT name FROM bbc <br />
WHERE region='Europe' AND gdp/population &gt; <br />
(SELECT gdp/population FROM bbc <br />
WHERE name='United Kingdom')<br />
<br />
为了从两个或多个表中选出数据，我们一般使用表连接来实现这个功能。 <br />
<br />
<span style="color: red"><strong>五、SELECT语句中的表连接(join) </strong></span><br />
从这里介绍join（连接）的概念. 为此我们准备了两个试验用表： album（专辑表） 和 track（曲目表）. <br />
<br />
专辑表：包含200首来自Amazon的音乐CD的概要信息。 <br />
album(asin, title, artist, price, release, label, rank) <br />
<br />
曲目表：每张专辑中的曲目（因为是音乐CD，所以也可叫歌曲）的详细信息。 <br />
track(album, dsk, posn, song) <br />
<br />
SQL短语 FROM album JOIN track ON album.asin=track.album 表示连接album和track表。其中，album.asin表示专辑的惟一标识号，track.album表示曲目表中和专辑关联的专辑号。 <br />
连接后，得到一个临时表，该临时表中每条记录包含的字段由两部分组成，除了专辑表中的对应字段album(title, artist ...)，还包含曲目表的所有字段track(album, disk, posn and song)。 <br />
<br />
有了这张临时表，很多查询就容易实现了。 <br />
<br />
看看一些具体的实例， <br />
<br />
1、列出歌名为'Alison'的专辑名称和作者 <br />
<br />
SELECT title, artist <br />
FROM album JOIN track <br />
ON (album.asin=track.album) <br />
WHERE song = 'Alison' <br />
<br />
显然，歌名、专辑名称和作者分别在两个表中，必需使用表连接来完成这个查询。 <br />
<br />
<br />
2、哪个artist录制了歌曲'Exodus' <br />
<br />
SELECT artist <br />
FROM album JOIN track ON (asin=album) <br />
WHERE song = 'Exodus' <br />
<br />
用作连接的两个字段asin，album因为在两个表中都是惟一的，所以不一定要加表名作为前缀。 <br />
但为了方便理解，建议使用前缀，形如：album.asin=track.album <br />
<br />
3、列出曲目表中所有属于'Blur'专辑的歌曲 <br />
<br />
SELECT song <br />
FROM album JOIN track ON (asin=album) <br />
WHERE title = 'Blur' <br />
<br />
如果我们把　album JOIN track ON (asin=album)　看成一个临时表的话，join的概念就很好理解了。<br />
<br />
上节我们介绍了表连接，更确切的说是inner joins內连接． <br />
內连接仅选出两张表中互相匹配的记录．因此，这会导致有时我们需要的记录没有包含进来。 <br />
为更好的理解这个概念，我们介绍两个表作演示。苏格兰议会中的政党表(party)和议员表(msp)。 <br />
<br />
party(Code,Name,Leader) <br />
Code: 政党代码 <br />
Name: 政党名称 <br />
Leader: 政党领袖 <br />
<br />
msp(Name,Party,Constituency) <br />
Name: 议员名 <br />
Party: 议员所在政党代码 <br />
Constituency: 选区 <br />
<br />
<span style="color: red"><strong>六、SELECT语句中的左连接、右连接和全连接</strong></span><br />
在介绍左连接、右连接和全连接前，有一个数据库中重要的概念要介绍一下，即空值(NULL)。 <br />
<br />
有时表中，更确切的说是某些字段值，可能会出现空值, 这是因为这个数据不知道是什么值或根本就不存在。 <br />
空值不等同于字符串中的空格，也不是数字类型的0。因此，判断某个字段值是否为空值时不能使用=,&lt;&gt;这些 <br />
判断符。必需有专用的短语：IS NULL 来选出有空值字段的记录，同理，可用 IS NOT NULL 选出不包含空值的记录。 <br />
<br />
例如：下面的语句选出了没有领导者的政党。（不要奇怪，苏格兰议会中确实存在这样的政党） <br />
<br />
SELECT code, name FROM party <br />
WHERE leader IS NULL <br />
<br />
又如：一个议员被开除出党，看看他是谁。(即该议员的政党为空值) <br />
<br />
SELECT name FROM msp <br />
WHERE party IS NULL <br />
<br />
好了，让我们言归正传，看看什么叫左连接、右连接和全连接。 <br />
<br />
A left join（左连接）包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。 <br />
同理，也存在着相同道理的 right join（右连接），即包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录。而full join(全连接)顾名思义，左右表中所有记录都会选出来。 <br />
<br />
讲到这里，有人可能要问，到底什么叫：包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。 <br />
Ok,我们来看一个实例： <br />
<br />
SELECT msp.name, party.name FROM msp JOIN party ON party=code <br />
<br />
这个是我们上一节所学的Join(注意：也叫inner join)，这个语句的本意是列出所有议员的名字和他所属政党。 <br />
你可以在　http://sqlzoo.cn/4.htm 亲自执行一下该语句，看看结果是什么。 <br />
<br />
很遗憾，我们发现该查询的结果少了两个议员：Canavan MSP, Dennis。为什么，因为这两个议员不属于任和政党，即他们的政党字段(Party)为空值。那么为什么不属于任何政党就查不出来了？这是因为空值在作怪。因为议员表中政党字段(Party)的空值在政党表中找不到对应的记录作匹配，即FROM msp JOIN party ON party=code　没有把该记录连接起来，而是过滤出去了。在该短语中，msp在Join的左边，所有称为左表。party在Join的右边，所有称为右表。 <br />
<br />
Ok,现在再看看这句话，&#8220;包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录&#8221;，意思应该很明白了吧。执行下面这个语句，那两个没有政党的议员就漏不了了。 <br />
<br />
SELECT msp.name, party.name FROM msp LEFT JOIN party ON party=code <br />
<br />
关于右连接,看看这个查询就明白了： <br />
<br />
SELECT msp.name, party.name FROM msp RIGHT JOIN party ON msp.party=party.code <br />
<br />
这个查询的结果列出所有的议员和政党，包含没有议员的政党，但不包含没有政党的议员。 <br />
<br />
那么既要包含没有议员的政党，又要包含没有政党的议员该怎么办呢，对了，全连接(full join)。 <br />
<br />
SELECT msp.name, party.name FROM msp FULL JOIN party ON msp.party=party.code<br />
<br />
<span style="color: red"><strong>七、SELECT语句中的自连接<br />
</strong></span>到目前为止，我们连接的都是两张不同的表，那么能不能对一张表进行自我连接呢？答案是肯定的。有没有必要对一张表进行自我连接呢？答案也是肯定的。 <br />
<br />
表的别名： <br />
一张表可以自我连接。进行自连接时我们需要一个机制来区分一个表的两个实例。 <br />
在FROM clause（子句）中我们可以给这个表取不同的别名， 然后在语句的其它需要使用到该别名的地方 <br />
用dot（点）来连接该别名和字段名。 <br />
<br />
我们在这里同样给出两个表来对自连接进行解释。 <br />
爱丁堡公交线路， <br />
<br />
车站表： <br />
stops(id, name) <br />
<br />
公交线路表： <br />
route(num, company, pos, stop) <br />
<br />
1、对公交线路表route进行自连接。 <br />
<br />
SELECT * FROM route R1, route R2 <br />
WHERE R1.num=R2.num AND R1.company=R2.company <br />
<br />
我们route表用字段(num, company)来进行自连接． 结果是什么意思呢？你可以知道每条公交线路的任意两个可联通的车站。 <br />
<br />
2、用stop字段来对route（公交线路表）进行自连接。 <br />
<br />
SELECT * FROM route R1, route R2 <br />
WHERE R1.stop=R2.stop; <br />
<br />
查询的结果就是共用同一车站的所有公交线。这个结果对换乘是不是很有意义呢。 <br />
<br />
从这两个例子我们可以看出，自连接的语法结构很简单，但语意结果往往不是那么容易理解。就我们这里所列出的两个表，如果运用得当，能解决很多实际问题， <br />
例如，任意两个站点之间如何换乘。 <br />
<br />
SELECT R1.company, R1.num <br />
FROM route R1, route R2, stops S1, stops S2 <br />
WHERE R1.num=R2.num AND R1.company=R2.company <br />
AND R1.stop=S1.id AND R2.stop=S2.id <br />
AND S1.name='Craiglockhart' <br />
AND S2.name='Tollcross'
<img src ="http://www.blogjava.net/hhhaaawwwkkk/aggbug/240040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hhhaaawwwkkk/" target="_blank">向前走的螃蟹</a> 2008-11-12 11:22 <a href="http://www.blogjava.net/hhhaaawwwkkk/archive/2008/11/12/240040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库技术【Link】</title><link>http://www.blogjava.net/hhhaaawwwkkk/archive/2008/11/12/239997.html</link><dc:creator>向前走的螃蟹</dc:creator><author>向前走的螃蟹</author><pubDate>Wed, 12 Nov 2008 01:50:00 GMT</pubDate><guid>http://www.blogjava.net/hhhaaawwwkkk/archive/2008/11/12/239997.html</guid><wfw:comment>http://www.blogjava.net/hhhaaawwwkkk/comments/239997.html</wfw:comment><comments>http://www.blogjava.net/hhhaaawwwkkk/archive/2008/11/12/239997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hhhaaawwwkkk/comments/commentRss/239997.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hhhaaawwwkkk/services/trackbacks/239997.html</trackback:ping><description><![CDATA[SQL语句大全：<br />
<a href="http://www.pgsqldb.org/pgsqldoc-7.1c/sql-language.html">http://www.pgsqldb.org/pgsqldoc-7.1c/sql-language.html</a><br />
<br />
SQL Server优化：<br />
<a href="http://msdn2.microsoft.com/zh-cn/library/ms172984.aspx">http://msdn2.microsoft.com/zh-cn/library/ms172984.aspx</a><br />
<br />
数据库技术：<br />
<a href="http://kwklover.cnblogs.com/favorite/6741.html">http://kwklover.cnblogs.com/favorite/6741.html</a> <br />
<img src ="http://www.blogjava.net/hhhaaawwwkkk/aggbug/239997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hhhaaawwwkkk/" target="_blank">向前走的螃蟹</a> 2008-11-12 09:50 <a href="http://www.blogjava.net/hhhaaawwwkkk/archive/2008/11/12/239997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL语句整理[第三章]（学习笔记）</title><link>http://www.blogjava.net/hhhaaawwwkkk/archive/2008/09/27/231249.html</link><dc:creator>向前走的螃蟹</dc:creator><author>向前走的螃蟹</author><pubDate>Sat, 27 Sep 2008 02:43:00 GMT</pubDate><guid>http://www.blogjava.net/hhhaaawwwkkk/archive/2008/09/27/231249.html</guid><wfw:comment>http://www.blogjava.net/hhhaaawwwkkk/comments/231249.html</wfw:comment><comments>http://www.blogjava.net/hhhaaawwwkkk/archive/2008/09/27/231249.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hhhaaawwwkkk/comments/commentRss/231249.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hhhaaawwwkkk/services/trackbacks/231249.html</trackback:ping><description><![CDATA[<strong>一、表连接<br />
</strong>cross&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回连接类型左右两侧的表中的所有行的所有组合。<br />
inner&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回连接类型左侧表和右侧表有相同值的所有行。<br />
left&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回左侧表中的所有行，以及与左侧表相匹配的右侧表中的值，如没有匹配的返回NULL。<br />
right&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回右侧表中的所有行，以及与右侧表相匹配的左侧表中的值，如没有匹配的返回NULL。<br />
full&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回左右两侧表的所有行。<br />
<br />
<span style="font-size: 12pt">1.下例是内连接的例子。该实例返回PUBS数据库的出版商及作者均在同一城市的出版商及作者信息。<br />
USE pubs<br />
方法一(内连接)：<br />
SELECT p.pub_id,p.pub_name,p.state,p.city,(a.au_fname+' '+a.au_lname) AS authorName <br />
FROM publishers p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INNER JOIN authors a ON p.city = a.city<br />
<br />
方法二(where子句)：<br />
SELECT p.pub_id,p.pub_name,p.state,p.city,(a.au_fname+' '+a.au_lname) AS authorName <br />
FROM publishers p,&nbsp;authors a&nbsp; WHERE&nbsp; p.city = a.city<br />
<br />
结果：<br />
p.pub_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;p.pub_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.state&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.city&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; authorName<br />
1389&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Algodata Infosystems&nbsp;&nbsp; &nbsp; &nbsp;CA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Berkeley&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Cheryl Carson&nbsp;<br />
1389&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;Algodata Infosystems&nbsp;&nbsp; &nbsp; &nbsp;CA&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Berkeley&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Abraham Bennet&nbsp;<br />
<br />
2.下例是左联接的事例<br />
USE pubs<br />
SELECT p.pub_id,p.pub_name,p.state,p.city,(a.au_fname+' '+a.au_lname) <br />
AS authorName FROM publishers p&nbsp;&nbsp;&nbsp;LEFT JOIN authors a ON p.city = a.city<br />
<br />
结果：<br />
p.pub_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.pub_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.state&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.city&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;authorName<br />
0736&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;New Moon Books&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;MA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Boston&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL<br />
0877&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Binnet &amp; Hardley&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;DC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Washington&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL<br />
1389&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Algodata Infosystems&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Berkeley&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cheryl Carson<br />
1389&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Algodata Infosystems&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Berkeley&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Abraham Bennet<br />
1622&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Five Lakes Publishing&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;IL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Chicago&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL<br />
1756&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ramona Publishers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dallas&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL<br />
9901&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GGG&amp;G&nbsp;NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; M黱&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL<br />
9952&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Scootney Books&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; NY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;New York&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;NULL<br />
9999&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Lucerne Publishing&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Paris&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL<br />
<br />
3.下例是右联接的事例<br />
USE pubs<br />
SELECT p.pub_id,p.pub_name,p.state,p.city,(a.au_fname+' '+a.au_lname) <br />
AS authorName FROM publishers p&nbsp;&nbsp;&nbsp;RIGHT JOIN authors a ON p.city = a.city<br />
<br />
4.一下查询为外联接<br />
USE pubs<br />
SELECT (a.au_fname+' '+a.au_lname) AS authorName ,p.pub_name <br />
FROM&nbsp; authors a&nbsp;&nbsp;FULL OUTER&nbsp;JOIN publishers p ON p.city = a.city <br />
ORDER&nbsp; BY p.pub_name ASC,a.au_lname,a.au_fname ASC<br />
<br />
二、向表中插入数据<br />
USE northwind<br />
INSERT INTO Shippers (CompanyName,phone )<br />
Values (N'Snowflake Shpping' , N'(523)333-4443')<br />
<br />
三、修改表中的数据<br />
USE PUBS<br />
UPDATE titles SET price = price*2 WHERE pub_id IN <br />
(SELECT pub_id FROM publishers WHERE pub_name = 'New Moon Books')<br />
<br />
四、删除表中的数据<br />
DELETE salesWHERE title_id IN (SELECT title_id FROM titles WHERE type = 'business')<br />
<br />
五、创建视图<br />
USE pubs<br />
IF EXISTS (SELECT TABLE_NAME&nbsp; FROM INFORMATION_SCHEMA. VIEWS <br />
WHERE　TABLE_NAME&nbsp;＝'CA_VIEW')DROP VIEW CA View GO<br />
CREATE VIEW CA_VIEW&nbsp; AS&nbsp;<br />
SLECTE au_lname,au_fname,city,state FROM authors <br />
WHERE state = 'CA' WITH CHECK OPTION<br />
<br />
<br />
</span>
 <img src ="http://www.blogjava.net/hhhaaawwwkkk/aggbug/231249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hhhaaawwwkkk/" target="_blank">向前走的螃蟹</a> 2008-09-27 10:43 <a href="http://www.blogjava.net/hhhaaawwwkkk/archive/2008/09/27/231249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL语句整理[第二章]（学习笔记）</title><link>http://www.blogjava.net/hhhaaawwwkkk/archive/2008/09/25/231109.html</link><dc:creator>向前走的螃蟹</dc:creator><author>向前走的螃蟹</author><pubDate>Thu, 25 Sep 2008 07:31:00 GMT</pubDate><guid>http://www.blogjava.net/hhhaaawwwkkk/archive/2008/09/25/231109.html</guid><wfw:comment>http://www.blogjava.net/hhhaaawwwkkk/comments/231109.html</wfw:comment><comments>http://www.blogjava.net/hhhaaawwwkkk/archive/2008/09/25/231109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hhhaaawwwkkk/comments/commentRss/231109.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hhhaaawwwkkk/services/trackbacks/231109.html</trackback:ping><description><![CDATA[<p><span style="font-size: 10pt"><span style="font-size: 12pt">&nbsp;废话少说用例子来说话。</span><br />
<span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">1.create database sqltest&nbsp;&nbsp;&nbsp;&nbsp;//创建数据库；<br />
<br />
2.create table students (sno numeric(6,0)not null,sname varchar(8)not null,age numeric(3,0),<br />
sex char(2),bplace varchar(20),primary key(sno))&nbsp;&nbsp;<br />
&nbsp;//创建表students；<br />
<br />
3.create table courses (cno char(4)not null,cname varchar(10)not null,credit int)<br />
//创建表courses；<br />
<br />
4.alter table courses add primary key (cno)&nbsp;&nbsp;<br />
//为courses表的cno字段添加主键约束；<br />
<br />
5.create table enrools(sno numeric(6,0)not null,cno char(4)not null,grade int,primary key(sno,cno),<br />
foreign key(sno)references students(sno),foreign key(cno) references courses(cno))&nbsp;&nbsp;&nbsp;<br />
//创建表enrools，并添加主外键约束；<br />
<br />
6.select sno,sname,age into girl from students where sex='女'&nbsp;&nbsp;&nbsp;<br />
//根据Student表创建gril表，字段为3个；<br />
<br />
7.create view faculty as select sno,age,sname from students&nbsp;&nbsp;&nbsp;<br />
//根据Student表创建视图；<br />
<br />
8.create view grade_table as select sname,cname,grade from students,enrools,courses where students.sno=enrools.sno and courses.cno=enrools.cno&nbsp;&nbsp;&nbsp;<br />
//从Student、enrools、courses 表中产生一视图，包括sname、cname、grade；<br />
<br />
9.drop view grade_table&nbsp;&nbsp;&nbsp;&nbsp;<br />
//删除视图；<br />
<br />
10.select cno,cname from courses where credit=3&nbsp;&nbsp;<br />
//在表courses中找出3个学分的cno,cname；<br />
<br />
11.select * from students where age &gt;22&nbsp;&nbsp;&nbsp;&nbsp;<br />
//在Student表中找出age大于22的学生状况；<br />
<br />
12.select&nbsp;sname,age from students where sex='男' and bplace='北京'&nbsp;&nbsp;<br />
<em>//在Student表中找出北京籍男生的sname，age；</em><br />
<br />
13.select sno,sname,age from students age between 20 and 23 order by age&nbsp;&nbsp;&nbsp;<br />
&nbsp;//找出年龄在20~23之间的学生的sno,sname,age；<br />
<br />
14.select sname,sex from students where age&lt;23 and bplace in('北京','上海')&nbsp;&nbsp;&nbsp;<br />
&nbsp;//找出年龄小与23北京上海的学生的sname，sex；<br />
<br />
15.select * from students where sname like '张%'&nbsp;&nbsp;&nbsp;<br />
&nbsp;//找出姓张同学的状况；<br />
<br />
16.select sname from&nbsp;students where&nbsp; sno=(select sno from enrools where&nbsp; grade=95)&nbsp;&nbsp;&nbsp;<br />
&nbsp;//找出学分为95分的同学姓名，只限查找一条记录（子查询）；<br />
<br />
17.select sname from students where sno=any(select sno from enrools where grade&gt;90)<br />
或者select sname from students where sno in(select sno from enrools where grade&gt;90)&nbsp;&nbsp;&nbsp;&nbsp;<br />
//找出学分为90分的同学姓名，查找多条记录（子查询）；<br />
<br />
18.select sname,cno,grade from students,enrools where students.sno=enrools.sno&nbsp;&nbsp;&nbsp;<br />
//查找全部学生的姓名，课程号，成绩；（连接查询）；</span></span></span></span><span style="font-size: 10pt"><span style="font-size: 14pt"><span style="font-size: 12pt"><br />
</span></span><br />
</span><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">19.select sname,bplace,grade from student,enrools where bplace in ('北京','上海') and grade&gt;90 and students.sno=enrools.sno<br />
//找出籍贯是北京或上海，成绩在90分以上的学生sname，bpalce，grade；<br />
<br />
20.select&nbsp;min(age) from students&nbsp;&nbsp;&nbsp;&nbsp;<br />
//找出年龄最小的学生；<br />
<br />
21.select count(*) from students where age&lt;=22&nbsp;&nbsp;&nbsp;<br />
&nbsp;//找出年龄小于等于22的学生人数；<br />
<br />
22.select avg(grade),courses=count(*) from enrools group by son&nbsp;&nbsp;&nbsp;<br />
<em>&nbsp;</em>//找出学生的平均成绩和课程门数；<br />
<br />
23.select sname from students where age&gt;(select avg(age) from students)&nbsp;&nbsp;&nbsp;&nbsp;<br />
<em>//找出年龄大于平均年龄的学生名字</em>；<br />
<br />
24.select con,&nbsp;avg(grade), students=count(*)&nbsp; from enrools group by con ,having count(*)&gt;=3&nbsp;&nbsp;&nbsp;&nbsp;<br />
//找出个课程的平均成绩，按课程号分组，且只选择课程号超过3个的成绩；（<span style="background: rgb(255,255,255); color: rgb(0,0,0); font-family: '宋体'; mso-spacerun: 'yes'">GROUP&nbsp;BY子句把一个表按某一指定列（或一些列）上的值相等的原则分组，然后再对每组。<span style="background: rgb(255,255,255); color: rgb(0,0,0); font-family: '宋体'; mso-spacerun: 'yes'"><span style="background: rgb(255,255,255); color: rgb(0,0,0); font-family: '宋体'; mso-spacerun: 'yes'"><span style="background: rgb(255,255,255); color: rgb(0,0,0); font-family: '宋体'; mso-spacerun: 'yes'"><span style="background: rgb(255,255,255); color: rgb(0,0,0); font-family: '宋体'; mso-spacerun: 'yes'">GROUP&nbsp;BY&nbsp;子句总是跟在&nbsp;Where&nbsp;子句后面，当&nbsp;Where&nbsp;子句缺省时，它跟在&nbsp;FROM&nbsp;子句后面</span>。<span style="background: rgb(255,255,255); color: rgb(0,0,0); font-family: '宋体'; mso-spacerun: 'yes'">HAVING&nbsp;子句常用于在计算出聚集之后对行的查询进行控制。</span></span></span></span></span>）<br />
<br />
25.select sname,sno from students where not exists (select * from enrools where students.sno=enrools.sno)&nbsp;&nbsp;&nbsp;&nbsp;<br />
//查询没有任何课程学生的学号和姓名（</span><span style="font-size: 10pt"><span style="background: rgb(255,255,255); color: rgb(0,0,0); font-family: '宋体'; mso-spacerun: 'yes'"><span style="background: rgb(255,255,255); color: rgb(0,0,0); font-family: '宋体'; mso-spacerun: 'yes'">当一个子查询涉及到一个来自外部查询<span style="background: rgb(255,255,255); color: rgb(0,0,0); font-family: '宋体'; mso-spacerun: 'yes'">的列时，称为相关子查询correlated Subquery&nbsp;。相关子查询要用到存在测试谓词<span style="background: rgb(255,255,255); color: rgb(0,0,0); font-family: '宋体'; mso-spacerun: 'yes'">EXISTS&nbsp;和&nbsp;NOT&nbsp;EXISTS&nbsp;及&nbsp;ALL&nbsp;、&nbsp;ANY&nbsp;（&nbsp;SOME&nbsp;）等。</span></span></span>）;<br />
</span><br />
26.select * from students where bplace='北京' natural join (select * from enrools where grade&gt;=80)&nbsp;<br />
//查询籍贯是北京，成绩在80分以上的学生信息；<br />
<br />
27.inster into students values&nbsp;(009901,'张三',23,'男','北京')&nbsp;&nbsp;&nbsp;&nbsp;<br />
//插入学生信息；<br />
<br />
28.inster into teachers (tno,tname) select distinct sno,sname from students,enrools where students.sno=enrools .sno and grade&gt;90&nbsp;&nbsp;&nbsp;<br />
&nbsp;//&nbsp;把成绩大于90的同学加入到教师的表中，留校。<br />
<br />
29.update students set age=age+1&nbsp;&nbsp;<br />
//所有学生年龄加1；<br />
<br />
30.update enrolls set grade=0 where con='c1' and '张三'=(select sname from students where students.sno=enrools.sno)&nbsp;&nbsp;&nbsp;<br />
&nbsp;//把张三的成绩改为0；<br />
<br />
31.delete from students where age&gt;30&nbsp;&nbsp;&nbsp;<br />
&nbsp;//删除年龄大于30的学生资料；<br />
</span></span></span></p>
<p><span style="font-size: 10pt"><!--endfragment--><br />
<br />
</span></p>
<p class="p0" style="margin-top: 0pt; font-size: 12pt; margin-bottom: 0pt"><strong></strong><br />
<br />
<br />
<br />
<span style="font-size: 10pt">&nbsp;</span></p>
 <img src ="http://www.blogjava.net/hhhaaawwwkkk/aggbug/231109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hhhaaawwwkkk/" target="_blank">向前走的螃蟹</a> 2008-09-25 15:31 <a href="http://www.blogjava.net/hhhaaawwwkkk/archive/2008/09/25/231109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL语句整理[第一章]（学习笔记）</title><link>http://www.blogjava.net/hhhaaawwwkkk/archive/2008/09/23/230666.html</link><dc:creator>向前走的螃蟹</dc:creator><author>向前走的螃蟹</author><pubDate>Tue, 23 Sep 2008 06:58:00 GMT</pubDate><guid>http://www.blogjava.net/hhhaaawwwkkk/archive/2008/09/23/230666.html</guid><wfw:comment>http://www.blogjava.net/hhhaaawwwkkk/comments/230666.html</wfw:comment><comments>http://www.blogjava.net/hhhaaawwwkkk/archive/2008/09/23/230666.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/hhhaaawwwkkk/comments/commentRss/230666.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hhhaaawwwkkk/services/trackbacks/230666.html</trackback:ping><description><![CDATA[<strong>一、对数据库的基本操作<br />
<br />
</strong>1.创建数据库：create database database-name；<br />
例：create database sales&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ON<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(NAME=sales_dat,FILENAME="c:\mssql\data\saledat.mdf",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SIZE=10,MAXSIZE=50,FIELGROWTH=5)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG&nbsp;ON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(NAME=sales_log,FILENAME="c:\mssql\data\salelog.ldf",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SIZE=10mb,MAXSIZE=50MB,FIELGROWTH=5MB) <br />
<br />
2.修改数据库：alter database database-name；<br />
例：alter database sales<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add file(name=sales_dat_2,filename='c:\mssql\data\salesdat1.ndf',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size=5mb,maxsize=100mb,filegrowth=5mb)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;modify file(name=sales_dat,size=5mb) <span style="font-size: 10pt">【注：add file是向数据库添加文件；modify是扩展空间大小】<br />
<br />
</span>3.压缩数据库：dbcc shrinkdatabase(database-name,target-percent)；<br />
例：sp_dboption sales,'single user',true<span style="font-size: 10pt">【注：压缩前必须把用户设置为单用户】</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbcc shrinkdatabase(sales,25)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 10pt">【注：减小数据库大小到原来的25%】</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sp_dboption sales,'single user',fales&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 10pt">【注：将数据库再设置为多用户模式】<br />
<br />
</span>4.删除数据库：drop database database-name；<br />
例：drop database sales<br />
<br />
<br />
二、对数据库表基本操作<br />
<br />
1.创数据库建表：create table table-name(col_name1 column_properties,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col_name2 column_properties,...)<br />
例：create table orders(OrderNo char(4) not null,OrderDate datetime not null,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SalesExecCode char(4) not null)<br />
<br />
2.添加和删除列：alter table table_name(add column_name column_porperties)|(drop column column_name)<br />
例：alter table employee add department char(20) null<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alter table employee drop column department<span style="font-size: 10pt">【注：增加删除时不能加（）否则错误】<br />
<br />
</span>3.删除数据库表：drop table table_name<br />
例：drop table orders<br />
<br />
4.使用约束强制执行数据完整性：<br />
&nbsp;&nbsp;&nbsp;&nbsp;约束类型：(1)primary key约束：指定表中哪一列将充当主键。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例：create table student(studID identity(100,5) primary key,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name varchar(20) not null,&nbsp;telNo varchar(20))<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2)foreing key约束：定义列值与另一个表的primary key相匹配的列。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例：create table studmark(examlID int not null,marks int not null,studID int not null,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;primary key(examlID),foreign key(studID) references student)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(3)unique约束：以确保列中不输入重复值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例：alter table student add constraint unq_telNo unique(TelNo)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(4)check约束：根据指定值测试列中的输入值。每次在更新数据时都要测试。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例：alter table student add check(sex in&nbsp;('m','f'))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alter table student add check(age like('[0-9][0-9]'))<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(5)default约束：用于用户在没有提供列值时，提供一个自动添加的列值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例：alter table studmarks add constraint df_examid default(101) for examid<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 10pt">【注：不能在timestamp和有identity属性列中定义default约束】<br />
</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(6)去除约束<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例：alter table studmarks drop constraint df_examid<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alter table table_name(表名)drop PRIMARY KEY CASCADE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alter table table_name(表名)drop constraint pk_name(主键名)CASCADE<br />
<img src ="http://www.blogjava.net/hhhaaawwwkkk/aggbug/230666.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hhhaaawwwkkk/" target="_blank">向前走的螃蟹</a> 2008-09-23 14:58 <a href="http://www.blogjava.net/hhhaaawwwkkk/archive/2008/09/23/230666.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>