用好SQL Server命令必需的“三熟”
赵玉勇
SQL Server使用过程中,最难应用的是命令,虽然命令不多,但命令格式多种多样,真要用好一条命令有效地解决一个问题确并不容易,只要做到下面的“三熟”,任何数据库处理任务其实都显得不那么难了。何谓三熟呢?下面通过一个数据库的实例来说明一下什么是三熟。
一熟:熟悉表及其要素
所谓一熟,指熟悉要操作的数据库及其表。所谓知己知彼,百战不殆,同样,在练习数据库命令时要熟悉自己要操作的对象,即各种表,这个表的名字,表的各列及列的名字,列对应的数据类型,只有将这些内容都熟悉了,才可能保证后面用到命令时与真实的情况对应,使抽象的命令变得动态生动起来。
数据库的三张表
"600")this.height="600";" border="0" />

示例表格共有三张,共同组成学生成绩数据库couser,三张表分别是Student学生表、S_Course选课表和Course课程表,这三张表的表结构分别见表1-1、表1-2和表1-3。

对于上面的三张表,以第一张为例,首先要弄明白其名称,也就是在数据库查询命令中要查的名称是student,这是在命令中很重要的一个选项,只有找到表名,才可能谈后面对表的操作,在命名上,要分清中文英文。另外,它由七列组成,每一列有不同的数据类型,这些也是后面对它查询等动做操作时必须注意的,还有一点值得注意,在这张表的列中,其名称我们用的是汉字,这在命令中要找第一列时,只要找到“学号”就可以了。
例如:查询计算机系的女生的学号与姓名。
要做这个查询动做,首先需要熟悉这张表的名字是student;另外,还需要弄明白其最后组成表的列数及其名称,即2列,也即学号与姓名;还有最后一点,如何表达女生,这还需进一步理解这个表的“性别”列,因为男为1,女则用0表示,所以女生自然而然的就有了,即:性别=0。查询命令也就有了:
Select 学号,姓名
From student
Where 性别=0
上面的命令非常简单,因为只涉及一张表与一个简单的条件,但多张表的熟悉也是在一张表基础之上的,所以用好SQL Server的命令,首先一点是熟悉表,对各张表的要素烂熟于胸,这是对它们操作的基础,也是用好命令的基础。

二熟:熟悉任务要求
只对表与其要素熟悉还不够,还要进一步明确相应处理任务或问题的要求,只有对要求熟悉,才能有的放矢。首要问题找到一个主要表,也就是包含最终要输出的列的表,但往往一张表在有些问题处理中不够,把握如下原则:如果一表可解决那最好,如果一表不能够解决,还要通过表间相同的列找到辅助表,这些要求有的在任务中明确提出了,有的则是暗含在条件中。在熟悉上面表的过程中,还要将要求一个个理顺,保证在命令中将各个项目灵活地运用上。
示例:将计算机系,全体学生的成绩设置为60分。
此例中,首先要明确要操作的主要表一定是和“成绩”相关的,三个表中只有选课表s_course中有“成绩”一项,所以这个表就是主表,主要的任务就在这里面,但这样只将原题中的一个要求去除了,还有计算机系如何表达的问题,因为主表即s_course中压根就没有系的问题,所以只能再找到一个辅助表,即学生表student,这里面有“所在系”,如何将“所在系”同“成绩”建立联系,也即两个表之间的联系,在两个表中都有的列是“学号”,所以“学号”就是突破口。现在,任务中的所有要求都理顺了,现在只要在命令中将上面的要求都体现出来就可以了,命令如下:
update s_course
set 成绩=60
where 学号 in
( select 学号
from student
where 所在系='计算机')
当然,除了涉及两个表,有时可能会更多,也就是涉及多个表,例如下面的示例。
示例: 查询“陈晨”所选修的全部课程名称。
这个任务中,最终选择的是“课程名称”,所以主表是course,但course中是没有学生姓名的,所以没法查学生陈晨,怎么办呢,只有找有“姓名”的,即student,但这个表却不能直接与course建立联系,所以第二步首先需要一个中转的表s_course来完成信息的中转,使任务中最终找到姓名一项,这里只有通过“课程号”来建立s_course与course联系,最通过s_course与student**有的学号建立联系,通过这两次中转,终于可以完成这项“伟大”的任务了。命令如下:
select 课程名称
from course
where 课程号in
( select 课程号
from s_course
where 学号in
(select 学号
from student
where 姓名='陈晨')
)

三熟:熟悉命令格式
最后还有一项必须熟悉,才能更好地应用命令,即各个命令的格式,有了上面的两熟,可以保证对于问题的精准了解,这种了解最终要让SQL Server能够使用,还需要命令,命令最致命的一点是其格式,死板的格式,要弄清楚这个格式中可变与不可变的部分,要弄明白这个格式对于任务各要素即二熟中提到的各要素的对应关系,只有做到这一点,才能灵活有效地使用命令,达到遇问题不慌乱,遇错误耐心解决,最终实现将问题解决。
示例:查询至少选修两门及两门以上课程的学生姓名、性别。

此任务的实现,首先按前两熟中找出相应的要素来,主表是有“姓名”,“学号”的表student,但只有些表显然不行,因为这个表中没有课程信息,所以不可能只通过它就能查出选修课程的学生来,选课信息在另外一个表s_course中,而这两个表要建立联系,必需通过“学号”来完成。使用的过程中,上述要素要很好地应用在select命令中,要和它的格式紧密相联。在命令中,由于要用到另外一个表中的聚合信息,所以在子条件中要用到having来完成这一任务,而在主条件中只要用where就可以了,具体命令如下:
SELECT 姓名, 性别
FROM   student
WHERE 学号 IN
(SELECT 学号 FROM s_course
GROUP BY 学号 H**ING COUNT(学号)>=2)
示例:查询“C语言”课程获最高分的学生姓名、性别、所在系。
select 姓名,性别,所在系
from student
where 学号in
( select 学号
from s_course
where 成绩in
(select max(成绩) as 最高分
from s_course
where 课程号in
(select 课程号
from course
where 课程名称='c语言'
)
)
)
小结
SQL Server中的命令有许多,变化的形式也多种多样,但只要掌握上面的“三熟”,应该可以很好地处理相应的任务,通过一熟,使操作者对操作对象即各个表有了一个透彻的了解,这种了解除了解各个列外,还要了解表的内容,这样,对于后面的任务执行的结果就有了相应的期待,不至于命令执行了不知道结果究竟对不对。二熟可以使操作者明了当前究竟要干什么,通过与一熟结合,可以更好地将自然语言描述的任务分割成SQL语言的各要素。而三熟则是将上面的各要素利用命令的相对固定的格式组合起来,命令是死的,命令又是活的,格式虽然多种多样,最重要的是把握格式中可变与不变的东西,在应用中灵活掌握,使处理结果更有效。

发表于: 2010-06-04 16:56 赵玉勇 阅读(803) 评论(0) 收藏 好文推荐

本博客所有内容,若无特殊声明,皆为博主原创作品,未经博主授权,任何人不得复制、转载、摘编等任何方式进行使用和传播。

作者该类其他博文:

发表评论(网友发言只代表个人观点,不代表本网站观点或立场。)

您尚未登录,请先【登录或注册

公告


多少IT事,尽付笑谈中crack

关于我

<2020年1月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

最近来访

留言簿(0)

文章分类

文章档案


最新评论

PC怎么可能过时,不过是厂商的宣传重点转到手机上去了。PC的功能和应用不是手机能代替的,有固定的市场和用户群,不会过时。
不过台式机倒是开始显出颓势,笔记本增速很快。笔记本成为主流倒是可能的。--【匿名用户】:E-works热心网友
没那么快淘汰吧--cirque
看起来像是给马云写的软文--为网游而呼吁
追求真相,这是互联网进步的意义。感谢赵老师分享!--柠檬草的味道
看来小小的输入法竞争还是激烈的。
谢谢博主分享,关注中~~--传奇
本人讨厌网络实名制久矣!--玛门
谢谢分享,关注中~~--蔡荣

阅读排行榜

评论排行榜