回 帖 发 新 帖 刷新版面

主题:[原创]Visual FoxPro中SQL命令详解及实例

原文仅14页,下面是最后两页的内容。因为前12的板式比较复杂不方便在论坛上贴出来。
下面是第13和第14页的内容:

大家如果觉得好就帮我顶一下。当然最好是到CSDN(没别的意思)去下载,帮我整点下载率。

下面是CSDN的下载地址:http://download.csdn.net/source/1805666
索要原文件请加我QQ或是发邮件给我。QQ:910438476 邮箱:100blank@gmail.com

合并查询
使用union 可以将多个select查询的结果在列上面合并起来。合并多个查询时应注意以下几点:
union仅用于外查询,不能使用union合并子查询。
两个select命令的查询结果中的列数必须相同,且相对应的列必须有相同的数据类型。
只有最后的select命令中可以包含<order by子句>,除非所有的Select命令中相对应的列都指定了相同的新列名,否则只能用编号指出排序所依据的列。
示例_合并查询
1、将“课程”和“学生”两表合并,并按第1列排序。
Select 课程号 As [ID],课程名 As [Name] From '课程' ;
Union ;
Select 学号,姓名 From '学生' Order By 1
2、将“课程”和“学生”两表合并,并按新生成的ID列排序。
Select 课程号 As [ID],课程名 As [Name] From '课程' ;
Union ;
Select 学号 As [ID],姓名 As [Name] From '学生' Order By ID
嵌套查询
在VFP中,可以在<where子句>中包含子查询,使用子查询必须有如下限制:
子查询必须用圆括号括起来。
子查询的<select子句>(即返回列)只能有一个返回列。
只能在主查询中使用union合并查询和<order by子句>,而不能在子查询中使用它们。
子查询中的<where子句>可引用主查询中的字段,这称为外部引用。
子查询主要有以下几种形式:
where <exp> [not] in (<select子查询>),判断<exp>是否包含在<select子查询>所返回的结果中。
where <exp> <比较操作符> 〖any | all〗 (<select子查询>),将<exp>与<select子查询>所返回的结果中的某一值(any)或所有值(all)的进行比较。
where [not] exists (<select子查询>),特殊<in子查询>,效率比较低。使用此子查询时,子查询的<select子句>中可以使用星号(*)指定返回列,其作用是判断外查询的结果是否存在于子查询的结果集中。
示例_嵌套查询
1、查询所有与“朱小兰”同性别的所有学生的成绩。
Select 学生.姓名, 课程.课程名, 成绩.成绩 ;
    From '学生' ;
        Inner Join '成绩' On 学生.学号=成绩.学号 ;
        Inner Join '课程' On 成绩.课程号=课程.课程号;
    Where 学生.性别 = (Select 性别 From 学生 Where 姓名=='朱小兰')
2、查询所有学习了“张小艳”所学习的课程的学生的成绩。
Select 学生.姓名, 课程.课程名, 成绩.成绩 ;
    From '学生' ;
        Inner Join '成绩' On 学生.学号=成绩.学号 ;
        Inner Join '课程' On 成绩.课程号=课程.课程号;
    Where 课程.课程号 In ;
    (Select 课程号 ;
        From 成绩 ;
            Inner Join 学生 On 学生.学号=成绩.学号 ; 
        Where 姓名=='张小艳')
将查询的结果插入其它表
insert into <表名> [(<列名> [,…])] <select命令>
在VFP中,可以在Insert命令中包含Select命令。使用此命令时,应注意以下几点:
确保<select命令>的返回结果列数、对应列的数据类型和宽度(如果目标列的宽度不够,可能造数据丢失)与目标列相同。
在<select命令>中不能使用into、to等关键字。
示例_将查询结果插入其它表
1、在“new学生信息”数据库中创建一个“及格学生成绩”表,并将“学生信息”数据库中所有及格的学生数据添加到“及格学生成绩”表中。
Insert Into 学生信息1!及格学生成绩 (姓名,课程名,成绩);
    Select 学生.姓名, 课程.课程名, 成绩.成绩 ;
        From 学生信息!学生 ;
            Inner Join 学生信息!成绩 On 学生.学号=成绩.学号 
            Inner Join 学生信息!课程 On 成绩.课程号=课程.课程号 
        Where 成绩.成绩>=60

Insert Into 学生信息1!及格学生成绩 ;
    Select 学生.姓名, 课程.课程名, 成绩.成绩 ;
        From 学生信息!学生 ;
            Inner Join 学生信息!成绩 On 学生.学号=成绩.学号 
            Inner Join 学生信息!课程 On 成绩.课程号=课程.课程号 
        Where 成绩.成绩>=60
实际应用举例
1、删除数据库中朱小兰的信息。
Delete From '成绩' Where 学号 In (Select 学号 From '学生' Where 姓名=="朱小兰")
Delete From '学生' Where 姓名=="朱小兰"
【说明】:
此处共用了两条命令,在第一条的Delete命令的Where子句中用到了子查询。
2、查询所有课程中,成绩位于前3名(允许相同成绩存在)的学生的信息。
Select Top 3 成绩 ;
    From 成绩 ;
    Group By 成绩 ;
    Order By 成绩 Desc ;
    Into Table 'tempTable' Database '学生信息'

Select 学生.姓名, 课程.课程名, 成绩.成绩 ;
    From '学生' ;
        Inner Join '成绩' On 学生.学号=成绩.学号 ;
        Inner Join '课程' On 成绩.课程号=课程.课程号;
    Where 成绩.成绩 In ;
        (Select 成绩 ;
        From 'tempTable') ;
    Order By 成绩.成绩 Desc

DROP TABLE 'tempTable'
【说明】:
此处共用了三条命令和一个临时表。这三条命令的作用分别为:
将成绩进行分组统计,找到最高的3个分数,分别是:91,89,80,然后将这3个分数存储到临时表(TempTable)中(此临时表不存在,系统会自动创建)。
查询所有成绩与临时表(TempTable)中每个成绩相等的学生的信息,即成绩位于前3名的学生的信息。查询结果中有四个学生,第3名为两个考80分的同学并列。
删除临时表。
如果想要查询某一科或总成绩或平均成绩,请在第一条命令中指定,此处不再缀述。
3、把李丹的数据库成绩修改为91.5。
Update '成绩' Set 成绩=91 ;
    Where Alltrim(Str(学号))+"/"+Alltrim(Str(课程号)) In ;
        (Select Alltrim(Str(学生.学号))+"/"+Alltrim(Str(课程.课程号)) ;
            From '学生' ;
                Inner Join '成绩' On 学生.学号=成绩.学号 ;
                Inner Join '课程' On 成绩.课程号=课程.课程号;
            Where 课程.课程名=="数学" And 学生.姓名=="朱小兰")
【说明】:
此处仅用了一条命令,但这条命令十分的复杂(数据库设计中,一般数据库的性能和存储空间的最小化是不可兼得的。如本文档中数据库的设计主要是考虑存储空间,而非性能。)需要说明的有以下几点:
在VFP9中,Where子句只能有一个子查询,但可以有多层。
由于子查询只能返回一列值,所以如果需要判断子查询中的多个列,可以将多个列合并。如此例。

回复列表 (共1个回复)

沙发

怎么没看到我的下载键接,我是新手,不知道怎么上传文件。不过可以到下面的键接下载:http://download.csdn.net/source/1805666
请告诉我怎么上传文件。

我来回复

您尚未登录,请登录后再回复。点此登录或注册