保定万博苹果店电话:第7章无条件查询

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 17:22:24

第7章无条件查询

所谓无条件查询,就是在查询时不使用WHERE子句设置任何条件。例如,查询数据表中的全部记录、查询某些字段的全部记录数据、查询不重复记录、查询前n条记录等。

7.1 范例数据库设计及使用

7.1.1 范例数据库设计

为了更好地掌握利用SELECT查询数据库数据的方法,从本章开始,所有的范例数据均是以一个数据库“研究生管理”为例,其包含有5个数据表:“院系”、“导师”、“研究生”、“课程”和“成绩”等,它们的字段设计分别如表7-1、表7-2、表7-3、表7-4和表7-5所示,所使用的范例数据分别如图7-1~图7-5所示。

这里注意,导师编号、编辑编号和学号的前3位数据就是院系编号。

表7-1  “院系”数据表字段设计

字段

数据类型

字段长度

是否允许为空

院系编号

文本型Char

3

否,主键

院系名

文本型Char

12

电话

文本型Char

8

表7-2  “导师”数据表字段设计

字段

数据类型

字段长度

是否允许为空

导师编号

文本型Char

6

否,主键

姓名

文本型Char

8

性别

文本型Char

2

职称

文本型Char

6

院系编号

文本型Char

3

表7-3  “研究生”数据表字段设计

字段

数据类型

字段长度

是否允许为空

学号

文本型Char

10

否,主键

姓名

文本型Char

8

性别

文本型Char

2

入学日期

日期/时间 Datetime

 

班级

文本型Char

10

研究方向

文本型VarChar

20

导师编号

文本型Char

6

表7-4  “课程”数据表字段设计

字段

数据类型

字段长度

是否允许为空

课程代码

文本型Char

10

否,主键

课程名称

文本型Char

20

课程名称

文本型Char

4

学时

整型 smallint

2

学分

整型 tinyint

1

授课教师

文本型Char

6

表7-5  “成绩”数据表字段设计

字段

数据类型

字段长度

是否允许为空

学号

文本型Char

10

课程代码

文本型Char

10

成绩

整型 smallint

2

学期

文本型Char

20

7.1.2 附加范例数据库到你的SQLServer服务器上

为了方便读者学习,在本书的光盘中收录了数据库“研究生管理”及其5个数据表的范例数据,只要将光盘的数据库附加到SQL Server服务器上就可以了。具体步骤如下;

1)单击Windows的【开始】→【程序】→【Microsoft SQL Server】→【企业管理器】命令,打开SQLServer的企业管理器窗口,选择“数据库”节点,如图7-6所示。

2)单击【操作】→【所有任务】→【附加数据库】命令,如图7-7所示,打开【附加数据库】对话框,如图7-8所示。

3)在“要附加数据库的MDF文件”栏中输入数据库文件的详细路径和名称,然后单击【验证】按钮,就得到如图7-9所示的情形,然后单击【确定】按钮,即可将数据库附加到SQL Server服务器上。

也可以将光盘的实例数据库文件复制到电脑中,然后单击【附加数据库】对话框上的按钮,打开【浏览现有的文件】对话框,如图7-10所示,从保存实例数据库文件的文件夹里选择该文件,单击【确定】按钮即可。

7.2 查询表中所有记录

查询表中所有记录的方法有两种:一种是使用ADO的Connection对象的Excute方法或Recordset对象的Open方法下面的SQL语句:

SQL = “select *from 数据表名

set rs = cnn.Execute(SQL)

或者 rs.Open SQL,cnn,adopenKeyset,adLockOptimistic

这里的星号(*)表示表中的所有字段。

另一种方法是直接执行查询表的命令,如下所示:

Set rs = cnn.Execute(数据表名)

或者rs.Open数据表名,cnn,adOpenKeyset,adLockOptimistic

【例7-1】下面的例子是数据库“研究生管理”中的数据表“导师”的全部记录复制到Excel工作表。

在运行下面的程序之前,要确保已经引用了ADO对象库MicrosoftActive Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 Library、Microsoft Active Data Objects 2.8 Library等)。同时,还要根据电脑实际情况,将连接字符串中的SQL Server服务器名称进行变更,并输入相应的用户名和密码(如果有的话)。

Public Sub 例7—1()

  Dim cnn As New ADODB.Connection

  Dim rs As New ADODB.Recordset

  Dim SQL As String, mydata As String, mytable As String

  mydata = "研究生管理"      '指定要修改的数据库

  mytable = "导师"            '指定数据表

   '清除工作表的所有数据

  Cells.Clear

   '建立与SQL Server数据库服务器上指定数据库的连接

  cnn.ConnectionString = "Provider=SQLOLEDB;" _

       & "User ID=sa;" _

       & "password=11111;" _

       & "Data Source=THTFCOMPUTER;" _

        & "Initial Catalog=" &mydata

   cnn.Open

    '查询全表记录

   SQL = "select * from" & mytable

   Set rs = cnn.Execute(SQL)

    '复制字段名

   For i = 0 To rs.Fields.Count - 1

       Cells(1, i + 1) = rs.Fields(i).Name

       Cells(1, i + 1).Font.Bold = True

   Next i

    '复制全部记录数据

   Range("A2").CopyFromRecordset rs

    '字段设置列宽至合适的宽度

   Columns.AutoFit

    '关机记录集以及与数据库的连接

   rs.Close

   cnn.Close

   Set rs = Nothing

   Set cnn = Nothing

   Set ws = Nothing

End Sub

运行上面的程序,就得到如图7-11所示的结果。

7.3 查询表中所有记录的指定字段

查询表中某些字段的所有记录,要使用下面的SQL语句:

SQL = “select 字段1,字段2,……from 数据表名”

这里,各个字段名之间用逗号隔开。

【例7-2】下面的例子是查询“研究生管理”中的数据表“导师”的全部导师的姓名、性别和职称数据查询出来,并复制到Excel工作表。

在运行下面的程序之前,要确保已经引用了ADO对象库MicrosoftActive Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 Library、Microsoft Active Data Objects 2.8 Library等)。同时,还要根据电脑实际情况,将连接字符串中的SQL Server服务器名称进行变更,并输入相应的用户名和密码(如果有的话)。

Public Sub 例7—2()

  Dim cnn As New ADODB.Connection

  Dim rs As New ADODB.Recordset

  Dim SQL As String, mydata As String, mytable As String

  mydata = "研究生管理"      '指定要修改的数据库

  mytable = "导师"            '指定数据表

   '清除工作表的所有数据

  Cells.Clear

   '建立与SQL Server数据库服务器上指定数据库的连接

  cnn.ConnectionString = "Provider=SQLOLEDB;" _

       & "User ID=sa;" _

       & "password=11111;" _

       & "Data Source=THTFCOMPUTER;" _

       & "Initial Catalog=" & mydata

   cnn.Open

    '查询全表某些字段的记录

   SQL = "select 姓名,性别,职称 from" & mytable

   Set rs = cnn.Execute(SQL)

    '复制字段名

   For i = 0 To rs.Fields.Count - 1

       Cells(1, i + 1) = rs.Fields(i).Name

       Cells(1, i + 1).Font.Bold = True

   Next i

    '复制全部记录数据

   Range("A2").CopyFromRecordset rs

    '字段设置列宽至合适的宽度

   Columns.AutoFit

    '关机记录集以及与数据库的连接

   rs.Close

   cnn.Close

   Set rs = Nothing

   Set cnn = Nothing

   Set ws = Nothing

End Sub

运行上面的程序,就得到如图7-12所示的结果。

7.4 查询结果不显示重复记录

在一个数据表中,有可能有一些重复记录,比如在“成绩表”中,每个研究生可能选修了几门课程,而某个课程也可能被几个研究生选修。如果我们要想在“成绩表”中查询本学期研究生共选修了哪些课程,那么就需要将不重复的课程筛选出来。此时,在SQL语句中要使用DISTINCT关键词,而SQL语句的结构如下:

SQL = “selectDISTINCT 字段1,字段2,……from 数据表名”

【例7-3】下面的例子是查询“研究生管理”中的数据表“成绩”中的所有课程编号记录(不包括重复记录),并复制到Excel工作表。

在运行下面的程序之前,要确保已经引用了ADO对象库MicrosoftActive Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 Library、Microsoft Active Data Objects 2.8 Library等)。同时,还要根据电脑实际情况,将连接字符串中的SQL Server服务器名称进行变更,并输入相应的用户名和密码(如果有的话)。

Public Sub 例7—3()

  Dim cnn As New ADODB.Connection

  Dim rs As New ADODB.Recordset

  Dim SQL As String, mydata As String, mytable As String

  mydata = "研究生管理"      '指定要修改的数据库

  mytable = "成绩"            '指定数据表

   '清除工作表的所有数据

  Cells.Clear

   '建立与SQL Server数据库服务器上指定数据库的连接

  cnn.ConnectionString = "Provider=SQLOLEDB;" _

       & "User ID=sa;" _

       & "password=11111;" _

       & "Data Source=THTFCOMPUTER;" _

       & "Initial Catalog=" & mydata

   cnn.Open

    '查询全表某些字段的记录

    SQL = "select distinct 课程代码 from" & mytable

   Set rs = cnn.Execute(SQL)

    '复制字段名

   Range("A1") = rs.fielse(0).Name

   Range("A1").Font.Bold = True

    '复制全部记录数据

   Range("A2").CopyFromRecordset rs

    '字段设置列宽至合适的宽度

   Columns.AutoFit

    '关机记录集以及与数据库的连接

   rs.Close

   cnn.Close

   Set rs = Nothing

   Set cnn = Nothing

   Set ws = Nothing

End Sub

运行上面的程序,就可以得到如图7-13所示的结果。

从图7-13可以看出本学期共开设了哪些调和。由于在“成绩”表中只是课程代码,为了获取课程名称,需要使用多表查询的方法从“课程”数据表中获取“成绩”表中课程代码所对应的课程名称,具体方法可参阅第14章的有关内容。

7.5 查询前n条记录

如果要查询数据表中的前n条记录,那么就需要在SQL语句中使用TOP关键词,此时的SQL语句结构如下所示:

SQL = “select TOPn 字段1,字段2……from 数据表名”

【例7-4】下面的例子是查询“研究生管理”中的数据表“成绩”中的前5行记录,并复制到Excel工作表。

在运行下面的程序之前,要确保已经引用了ADO对象库MicrosoftActive Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 Library、Microsoft Active Data Objects 2.8 Library等)。同时,还要根据电脑实际情况,将连接字符串中的SQL Server服务器名称进行变更,并输入相应的用户名和密码(如果有的话)。

Public Sub 例7—4()

  Dim cnn As New ADODB.Connection

  Dim rs As New ADODB.Recordset

  Dim SQL As String, mydata As String, mytable As String

   mydata = "研究生管理"       '指定要修改的数据库

  mytable = "成绩"            '指定数据表

   '清除工作表的所有数据

  Cells.Clear

   '建立与SQL Server数据库的连接

  cnn.ConnectionString = "Provider=SQLOLEDB;" _

       & "User ID=sa;" _

       & "password=11111;" _

       & "Data Source=THTFCOMPUTER;" _

       & "Initial Catalog=" & mydata

   cnn.Open

    '查询全表某些字段的记录

   SQL = "select top 5 from" & mytable

   Set rs = cnn.Execute(SQL)

    '复制字段名

   For i = 0 To rs.Fields.Count - 1

       Cells(1, i + 1) = rs.Fields(i).Name

       Cells(1, i + 1).Font.Bold = True

   Next i

    '复制全部记录数据

   Range("A2").CopyFromRecordset rs

    '字段设置列宽至合适的宽度

   Columns.AutoFit

    '关机记录集以及与数据库的连接

   rs.Close

   cnn.Close

   Set rs = Nothing

   Set cnn = Nothing

   Set ws = Nothing

End Sub

运行上面的程序,就得到如图7-14所示的结果。

7.6 查询前百分数n的记录

如果要查询数据表中的前百分数n的记录,那么就需要在SQL语句中使用PERCENT关键词,此时的SQL语句结构如下所示。

SQL = “select TOPn PERCENT 字段1,字段2,……from 数据表名”

【例7-5】下面的例子是查询“研究生管理”中的数据表“成绩”中的前30%的数据记录,并复制到Excel工作表。

在运行下面的程序之前,要确保已经引用了ADO对象库MicrosoftActive Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 Library、Microsoft Active Data Objects 2.8 Library等)。同时,还要根据电脑实际情况,将连接字符串中的SQL Server服务器名称进行变更,并输入相应的用户名和密码(如果有的话)。

Public Sub 例7—5()

  Dim cnn As New ADODB.Connection

  Dim rs As New ADODB.Recordset

  Dim SQL As String, mydata As String, mytable As String

  mydata = "研究生管理"      '指定要修改的数据库

  mytable = "成绩"            '指定数据表

   '清除工作表的所有数据

  Cells.Clear

   '建立与SQL Server数据库的连接

  cnn.ConnectionString = "Provider=SQLOLEDB;" _

       & "User ID=sa;" _

        & "password=11111;" _

       & "Data Source=THTFCOMPUTER;" _

       & "Initial Catalog=" & mydata

   cnn.Open

    '查询全表某些字段的记录

   SQL = "select top 30 from" & mytable

   Set rs = cnn.Execute(SQL)

    '复制字段名

   For i = 0 To rs.Fields.Count - 1

        Cells(1, i + 1) = rs.Fields(i).Name

       Cells(1, i + 1).Font.Bold = True

   Next i

    '复制全部记录数据

   Range("A2").CopyFromRecordset rs

    '字段设置列宽至合适的宽度

   Columns.AutoFit

    '关机记录集以及与数据库的连接

   rs.Close

   cnn.Close

   Set rs = Nothing

    Setcnn = Nothing

End Sub

运行上面的程序,就得到如图7-15所示的结果。

7.7 将表达式作为查询字段进行查询

在查询SQL语句中,我们还可以使用表达式作为查询字段进行查询,这里的表达式可以是由各种运算符和函数构成。这样,我们就可以进行更加复杂的查询,获取需要的各种数据。

为了使表达式返回值的意义清楚,我们可以使用AS为表达式的结果命名一个别名,即“表达式 AS 别名”。

将表达式作为查询字段进行SQL语句结构如下:

SQL = “select 表达式1 as 别名1,表达式2 as 别名2,字段1,字段2,……from 数据表名”

这里的表达式与数据表的原字段顺序排列可以是任意的。

【例7-6】下面的例子是查询“研究生管理”中的数据表“研究生”中的各个研究生的入学年份和月份,并复制到Excel工作表。

在运行下面的程序之前,要确保已经引用了ADO对象库MicrosoftActive Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 Library、Microsoft Active Data Objects 2.8 Library等)。同时,还要根据电脑实际情况,将连接字符串中的SQL Server服务器名称进行变更,并输入相应的用户名和密码(如果有的话)。

Public Sub 例7—6()

  Dim cnn As New ADODB.Connection

  Dim rs As New ADODB.Recordset

  Dim SQL As String, mydata As String, mytable As String

  mydata = "研究生管理"      '指定要修改的数据库

  mytable = "研究生"            '指定数据表

   '清除工作表的所有数据

  Cells.Clear

   '建立与SQL Server数据库的连接

  cnn.ConnectionString = "Provider=SQLOLEDB;" _

       & "User ID=sa;" _

       & "password=11111;" _

       & "Data Source=THTFCOMPUTER;" _

       & "Initial Catalog=" & mydata

   cnn.Open

    '查询全表某些字段的记录

   SQL = "select 姓名,性别,year(入学日期) as 入学年份," _

       & "month(入学日期) as 入学月份from" & mytable

   Set rs = cnn.Execute(SQL)

    '复制字段名

   For i = 0 To rs.Fields.Count - 1

       Cells(1, i + 1) = rs.Fields(i).Name

       Cells(1, i + 1).Font.Bold = True

   Next i

    '复制全部记录数据

   Range("A2").CopyFromRecordset rs

    '字段设置列宽至合适的宽度

   Columns.AutoFit

    '关机记录集以及与数据库的连接

   rs.Close

   cnn.Close

   Set rs = Nothing

   Set cnn = Nothing

End Sub

运行上面的程序,就得到如图7-16所示的结果。

7.8 将查询结果以别名输出

除了可以为表达式命名别名外,我们还可以对数据表的原字段命名别名,即输出结果不是原字段名,而是一个新的名称,此时的SQL语句的结构如下:

SQL = “select 字段1 as 别名1,字段2 as 别名2,字段3 as 别名3,……from 数据表名”

【例7-7】下面的例子是查询“研究生管理”中的数据表“研究生”中的各个研究生的姓名、性别、班级等名称以“Name”、“Sex”、“Class”名称输出复制到Excel工作表。

在运行下面的程序之前,要确保已经引用了ADO对象库MicrosoftActive Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 Library、Microsoft Active Data Objects 2.8 Library等)。同时,还要根据电脑实际情况,将连接字符串中的SQL Server服务器名称进行变更,并输入相应的用户名和密码(如果有的话)。

Public Sub 例7—7()

  Dim cnn As New ADODB.Connection

  Dim rs As New ADODB.Recordset

  Dim SQL As String, mydata As String, mytable As String

  mydata = "研究生管理"      '指定要修改的数据库

  mytable = "研究生"            '指定数据表

   '清除工作表的所有数据

  Cells.Clear

   '建立与SQL Server数据库的连接

  cnn.ConnectionString = "Provider=SQLOLEDB;" _

       & "User ID=sa;" _

       & "password=11111;" _

       & "Data Source=THTFCOMPUTER;" _

       & "Initial Catalog=" & mydata

   cnn.Open

    '查询全表某些字段的记录

   SQL = "select 姓名 as Name,性别 as Sex,班级 as Classno from" & mytable

   Set rs = cnn.Execute(SQL)

    '复制字段名

   For i = 0 To rs.Fields.Count - 1

       Cells(1, i + 1) = rs.Fields(i).Name

       Cells(1, i + 1).Font.Bold = True

   Next i

    '复制全部记录数据

   Range("A2").CopyFromRecordset rs

    '字段设置列宽至合适的宽度

   Columns.AutoFit

    '关机记录集以及与数据库的连接

   rs.Close

   cnn.Close

   Set rs = Nothing

   Set cnn = Nothing

End Sub

运行上面的程序,就得到如图7-17所示的结果。

7.9 将字段合并并以别名查询输出

我们可以在SELECT语句中利用加号(+)将某些字段进行合并,形成一个新字段,并以一个别名输出,此时的SQL语句的结构如下:

SQL = “select字段1+字段2+……as 别名 from 数据表名”

【例7-8】下面的例子是查询“研究生管理”中的数据表“导师”中,将导师的姓名和职称组成一个新列,并以一个别名“全称”输出复制到Excel工作表。

在运行下面的程序之前,要确保已经引用了ADO对象库MicrosoftActive Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 Library、Microsoft Active Data Objects 2.8 Library等)。同时,还要根据电脑实际情况,将连接字符串中的SQL Server服务器名称进行变更,并输入相应的用户名和密码(如果有的话)。

Public Sub 例7—8()

  Dim cnn As New ADODB.Connection

  Dim rs As New ADODB.Recordset

  Dim SQL As String, mydata As String, mytable As String

  mydata = "研究生管理"      '指定要修改的数据库

  mytable = "导师"            '指定数据表

   '清除工作表的所有数据

  Cells.Clear

   '建立与SQL Server数据库的连接

  cnn.ConnectionString = "Provider=SQLOLEDB;" _

       & "User ID=sa;" _

       & "password=11111;" _

       & "Data Source=THTFCOMPUTER;" _

       & "Initial Catalog=" & mydata

   cnn.Open

    '查询全表某些字段并合并为一个记录

   SQL = "select 姓名 + 职称 as 全称 from" & mytable

   Set rs = cnn.Execute(SQL)

    '复制字段名

   For i = 0 To rs.Fields.Count - 1

       Cells(1, i + 1) = rs.Fields(i).Name

       Cells(1, i + 1).Font.Bold = True

   Next i

    '复制全部记录数据

    Range("A2").CopyFromRecordset rs

    '字段设置列宽至合适的宽度

   Columns.AutoFit

    '关机记录集以及与数据库的连接

   rs.Close

   cnn.Close

   Set rs = Nothing

   Set cnn = Nothing

End Sub

运行上面的程序,就得到如图7-18所示的结果。

7.10 合并查询

我们可以使用UNION子句将多个SQL命令连接起来生成单个SQL无法做到的结果集合。此时的SQL语句的结构如下:

SQL = “第1个SELECT语句 UNION第2个SELECT语句”

需要注意的是:

1)使用UNION连接的SELECT必须有相同的输出表达式,即对应栏目应具有相同的数据类型和字段长度。

2)仅最后一个SELECT可以带ORDER BY及INTO子句。

3)UNION不能连接嵌套的SELECT语句。

【例7-9】下面的例子是查询所有的导师和研究生的姓名和性别,并输出复制到Excel工作表。

Public Sub 例7—9()

  Dim cnn As New ADODB.Connection

  Dim rs As New ADODB.Recordset

  Dim SQL As String

   '建立与SQL Server数据库的连接

  cnn.ConnectionString = "Provider=SQLOLEDB;" _

       & "User ID=sa;" _

       & "password=11111;" _

       & "Data Source=THTFCOMPUTER;" _

       & "Initial Catalog=研究生管理"

   cnn.Open

    '查询数据

   SQL = "select 姓名,性别 from 导师 " _

       & " union " _

       & " select 姓名,性别 from 研究生"

   Set rs = cnn.Execute(SQL)

    '复制查询出的数据

   Cells.Clear

   Range("A1:B1") = Array("姓名","性别")

   Range("A1:B1").Font.Bold = True

   Range("A2").CopyFromRecordset rs

    '字段设置列宽至合适的宽度

   Columns.AutoFit

    '关机记录集以及与数据库的连接

   rs.Close

   cnn.Close

   Set rs = Nothing

   Set cnn = Nothing

End Sub

运行上面的程序,就得到如图7-19所示的结果。