午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

第8章 條件查詢

 昵稱380475 2011-11-16

8 條件查詢

所謂條件查詢,就是在SELECT語句中使用WHERE子句。因為在實際工作中,我們碰到的大多數(shù)情況是按照一定的條件進(jìn)行查詢的,因此條件查詢是使用最多的查詢。

8.1 WHERE條件子句的語法結(jié)構(gòu)

帶有WHERE條件子句的SELECT語句的結(jié)構(gòu)如下:

SQL = select 字段列表 from 數(shù)據(jù)表名 where 條件表達(dá)式”

這里,條件表達(dá)式是由各種字段、常量、表達(dá)式、關(guān)系運算符、邏輯運算符和特殊的運算符組合起來的。

在條件表達(dá)式中,各個條件的條件值依數(shù)據(jù)類型的不同要用不同的方式表示:對于數(shù)值類型的條件值,直接寫上條件值即可,比如“WHERE學(xué)分=3;對于文本類型和日期類型的條件值,要用單引號括起來,比如單引號“”括起來,如“WHERE 姓名=‘黃小立’”,“WHERE入學(xué)日期=2006-9-1’”。

8.2 WHERE條件子句中的運算符

WHERE條件子句中的運算符包括關(guān)系運算符、邏輯運算符和特殊的運算符。

8.2.1 關(guān)系運算符

關(guān)系運算符用來表示兩個表達(dá)式之間的關(guān)系。WHERE條件子句中的可使用的關(guān)系運算符如表8-1所示。

8-1  比較運算符及其含義

運算符

含義

=

等于,用于測試兩個表達(dá)式是否相等

> 

大于,用于測試一個表達(dá)式是否大于另一個表達(dá)式

< 

小于,用于測試一個表達(dá)式是否大于另一個表達(dá)式

>=

大于或等于,用于測試一個表達(dá)式是否大于或等于另一個表達(dá)式

<=

小于或等于,用于測試一個表達(dá)式是否小于或等于另一個表達(dá)式

<> 

不等于,用于測試一個表達(dá)式是否不等于另一個表達(dá)式

!=

不等于(非SQL-92標(biāo)準(zhǔn)),用于測試一個表達(dá)式是否不等于另一個表達(dá)式

!<

不小于(非SQL-92標(biāo)準(zhǔn)),用于測試一個表達(dá)式是否不小于另一個表達(dá)式

!>

不大于(非SQL-92標(biāo)準(zhǔn)),用于測試一個表達(dá)式是否不大于另一個表達(dá)式

8.2.2 邏輯運算符

邏輯運算符用來表示兩個表達(dá)式之間的邏輯關(guān)系。邏輯運算符返回帶有TRUE、FALSEUNKNOWN值的Boolean數(shù)據(jù)類型。WHERE條件子句中的可使用的邏輯運算符如表8-2所示。

8-2 邏輯運算符及其含義

運算符

含義

ALL

如果一組值的比較都為TRUE,那么就為TRUE

AND

如果兩個布爾表達(dá)式都為TRUE,那么就為TRUE

ANY

如果一組值的比較中任何一個為TRUE,那么就為TRUE

BETWEEN

如果操作數(shù)在某個范圍之內(nèi),那么就為TRUE

EXISTS

如果子查詢包含一些行,那么就為TRUE

IN

如果操作數(shù)等于表達(dá)式列表中的一個,那么就為TRUE

LIKE

如果操作數(shù)與一種模式相匹配,那么就為TRUE

NOT

對任何其他布爾運算符的值取反

OR

如果兩個布爾表達(dá)式中的一個為TRUE, 那么就為TRUE

SOME

如果在一組值比較中,有些為TRUE, 那么就為TRUE

8.2.3 特殊運算符

特殊運算符用來進(jìn)行特殊的運算,比如判斷是否為空、進(jìn)行模糊查詢等。WHERE條件子句中的可使用的特殊運算符如表8-3所示。

8-3   SQL命令中搜索條件運算符的匯總

運算符

含義

%

通配符,代表任意多個字符。例如,WHERE字段名LIKE’%a%’表示所有含有字母“A”的字段數(shù)據(jù)

-

通配符,代表嚴(yán)格的一個字符。例如,WHERE字段名LIKE’__AB’表示所有4個字母的數(shù)據(jù)中以“AB”結(jié)尾的字段數(shù)據(jù)

[]

指定范圍內(nèi)的任意單個字符。例如,WHERE字段名LIKE’[BC]%’表示所有以“B”或“C”開頭的字段數(shù)據(jù)

[^]

不屬于指定范圍或集合的任何單個字符。例如,WHERE字段名LIKE[B^a]%’表示所有以“B”開頭,且第2個字母不是“a”的字段數(shù)據(jù)

BETWEEN

測試值的范圍,使用AND將開始值與結(jié)束值分開。例如,WHERE字段名BETWEEN 50 AND 100表示所有的50(含50)和100(含100)之內(nèi)的字段數(shù)據(jù)

LIKE[NOT]LIKE

字段匹配符(通常只限于字符數(shù)據(jù)類型)

IS[NOT]NULL

測試字段的數(shù)據(jù)或表達(dá)式的結(jié)果是否為空

[NOT]IN

一個字段的直是否在一組定義的值之中,匹配特定值的列表

ANY(SOME)

子查詢結(jié)果集中的一個或多個行是否滿足指定的條件

ALL

子查詢結(jié)果集的所有行是否都滿足指定的條件

[NOT]EXISTS

子查詢是否返回任何結(jié)果(不只是特定的結(jié)果)

8.3 單條件查詢

所謂單條件查詢,就是在WHERE子句中只有一個條件。下面介紹常見的幾種單條件查詢。

8.3.1 等于或不等于查詢

等于或不等于查詢,就是WHERE子句中使用表8-1的比較運算符進(jìn)行單條件查詢,此時的SQL語句結(jié)構(gòu)如下:

SQL = select 字段列表 from 數(shù)據(jù)表名 where 某字段 (等于或不等于) 條件值”

【例8-1】下面的例子是查詢“研究生管理”中的數(shù)據(jù)表“研究生”的全部男研究生記錄查詢出來并復(fù)制到Excel工作表。

在運行下面的程序之前,要確保已經(jīng)引用了ADO對象庫Microsoft Active Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 Library、Microsoft Active Data Objects 2.8 Library等)。同時,還要根據(jù)電腦實際情況,將連接字符串中的SQL Server服務(wù)器名稱進(jìn)行變更,并輸入相應(yīng)的用戶名和密碼(如果有的話)。

Public Sub 81()

   Dim cnn As New ADODB.Connection

   Dim rs As ADODB.Recordset

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

   mydata = "研究生管理"       '指定數(shù)據(jù)庫

   mytable = "研究生"      '指定數(shù)據(jù)表

   '清除工作表的所有數(shù)據(jù)

   Cells.Clear

   '建立與SQL Server服務(wù)器的連接

   cnn.ConnectionString = "Provider=SQLOLEDB;" _

        & "User ID=sa;" _

        & "password=11111;" _

        & "Data Source=THTFCOMPUTER;" _

        & "Initial Catalog=" & mydata

    cnn.Open

    '檢查全表某些字段的記錄

    SQL = " select * from " & mytable & " where 性別=''"

    Set rs = cnn.Execute(SQL)

    '復(fù)制字段名

    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

    '復(fù)制全部記錄數(shù)據(jù)

    Range("A2").CopyFromRecordset rs

    '字段設(shè)置列寬至合適的寬度

    Columns.AutoFit

    '關(guān)機(jī)記錄集以及與數(shù)據(jù)庫的連接

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

運行上面的程序,就得到如圖8-1所示的結(jié)果。

【例8-2】本例是將數(shù)據(jù)庫“研究生管理”中的數(shù)據(jù)表“成績”的全部考試成績分?jǐn)?shù)在90分以上的研究生記錄查詢出來并復(fù)制到Excel工作表。本例的程序與【例8-1】基本相同,唯一區(qū)別在于SQL語句,如下所示:

SQL = select * from & mytable & where 成績 >90

運行上面的程序,就得到如圖8-2所示的結(jié)果。

8.3.2 列表(innot in)查詢

就是判斷一個字段的值是否在一組定義的值之中,此時的SQL語句結(jié)構(gòu)如下:

SQL = select 字段列表 from 數(shù)據(jù)表名 where 某字段 in(1,值2,……)

或者:

SQL = select 字段列表 from 數(shù)據(jù)表名 where 某字段 not in (1,值2,……)

【例8-3】本例是將數(shù)據(jù)庫“研究生管理”的數(shù)據(jù)表“研究生”中,研究方向為“風(fēng)險投資”或者“項目投資”研究生記錄查詢出來并復(fù)制到Excel工作表。

Public Sub 83()

   Dim cnn As New ADODB.Connection

   Dim rs As ADODB.Recordset

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

   mydata = "研究生管理"       '指定數(shù)據(jù)庫

   mytable = "研究生"      '指定數(shù)據(jù)表

   '清除工作表的所有數(shù)據(jù)

   Cells.Clear

   '建立與SQL Server服務(wù)器的連接

   cnn.ConnectionString = "Provider=SQLOLEDB;" _

        & "User ID=sa;" _

        & "password=11111;" _

        & "Data Source=THTFCOMPUTER;" _

        & "Initial Catalog=" & mydata

    cnn.Open

    '查詢?nèi)砟承┳侄蔚挠涗?/span>

    SQL = " select * from " & mytable & " where 研究方向 in ('風(fēng)險投資','項目投資')"

    Set rs = cnn.Execute(SQL)

    '復(fù)制字段名

    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

    '復(fù)制全部記錄數(shù)據(jù)

    Range("A2").CopyFromRecordset rs

    '字段設(shè)置列寬至合適的寬度

    Columns.AutoFit

    '關(guān)機(jī)記錄集以及與數(shù)據(jù)庫的連接

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

運行上面的程序,就得到如圖8-3所示的結(jié)果。

【例8-4】本例是將數(shù)據(jù)庫“研究生管理”的數(shù)據(jù)表“研究生”中,研究方向不為“風(fēng)險投資”或者“項目投資”研究生記錄查詢出來并復(fù)制到Exce工作表。本例的程序與【例8-3】基本相同,唯一區(qū)別在于SQL語句,如下所示:

SQL=select * from & mytable & “ where 研究方向 not in (‘風(fēng)險投資’,’項目投資’)

運行上面的程序,就得到如圖8-4所示的結(jié)果。

8.3.3 介于(between)查詢

介于查詢用于完成數(shù)值型(也包括日期型字段)字段在某個數(shù)值區(qū)間內(nèi)的查詢,此時的SQL語句結(jié)構(gòu)如下:

SQL=select 字段列表 from 數(shù)據(jù)表名 where 數(shù)值型字段 between 1 and2”

或者:

SQL=select 字段列表 from 數(shù)據(jù)表名 where 日期型字段 between ‘日期1 and ‘日期2

【例8-5】本例是將數(shù)據(jù)庫“研究生管理”的數(shù)據(jù)表“成績”中,考試成績在8090之間的研究生記錄查詢出來并復(fù)制到Excel工作表。

Public Sub 85()

   Dim cnn As New ADODB.Connection

   Dim rs As ADODB.Recordset

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

   mydata = "研究生管理"       '指定數(shù)據(jù)庫

   mytable = "成績"      '指定數(shù)據(jù)表

   '清除工作表的所有數(shù)據(jù)

   Cells.Clear

   '建立與SQL Server服務(wù)器的連接

   cnn.ConnectionString = "Provider=SQLOLEDB;" _

        & "User ID=sa;" _

        & "password=11111;" _

        & "Data Source=THTFCOMPUTER;" _

        & "Initial Catalog=" & mydata

    cnn.Open

    '查詢?nèi)砟承┳侄蔚挠涗?/span>

    SQL = " select * from " & mytable & " where 成績 between 80 and 90 "

    Set rs = cnn.Execute(SQL)

    '復(fù)制字段名

    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

    '復(fù)制全部記錄數(shù)據(jù)

    Range("A2").CopyFromRecordset rs

    '字段設(shè)置列寬至合適的寬度

    Columns.AutoFit

    '關(guān)機(jī)記錄集以及與數(shù)據(jù)庫的連接

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

運行上面的程序,就得到如圖8-4所示的結(jié)果。

8.3.4 模糊(like)查詢

模糊查詢就是利用like及一些特殊運算符進(jìn)行匹配查詢。比如,要從數(shù)據(jù)表“研究生”中查詢所有姓張的研究生記錄,SQL語句如下:

SQL=select * from 研究生 where 姓名 like ‘張%’”

【例8-6】本例是將數(shù)據(jù)庫“研究生管理”的數(shù)據(jù)表“研究生”中,查詢所有姓張的研究生記錄,SQL語句如上所示,而程序的其他部分與【例8-4】完全相同。運行上面的程序,就得到如圖8-6所示的結(jié)果。

【例8-7】本例是將數(shù)據(jù)庫“研究生管理”的數(shù)據(jù)表“導(dǎo)師”中,查詢所有的職稱名稱含有“教授”字樣的導(dǎo)師記錄:

Public Sub 87()

   Dim cnn As New ADODB.Connection

   Dim rs As ADODB.Recordset

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

   mydata = "研究生管理"       '指定數(shù)據(jù)庫

   mytable = "導(dǎo)師"      '指定數(shù)據(jù)表

   '清除工作表的所有數(shù)據(jù)

   Cells.Clear

   '建立與SQL Server服務(wù)器的連接

   cnn.ConnectionString = "Provider=SQLOLEDB;" _

        & "User ID=sa;" _

        & "password=11111;" _

        & "Data Source=THTFCOMPUTER;" _

        & "Initial Catalog=" & mydata

    cnn.Open

    '查詢?nèi)砟承┳侄蔚挠涗?/span>

    SQL = " select * from " & mytable & " where 職稱 like '%教授%'"

    Set rs = cnn.Execute(SQL)

    '復(fù)制字段名

    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

    '復(fù)制全部記錄數(shù)據(jù)

    Range("A2").CopyFromRecordset rs

    '字段設(shè)置列寬至合適的寬度

    Columns.AutoFit

    '關(guān)機(jī)記錄集以及與數(shù)據(jù)庫的連接

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

注意,由于是查詢字符類型字段,因此要用單引號將條件值括起來,即:‘%教授%’。運行上面的程序,就得到如圖8-7所示的結(jié)果。

8.3.5 是否為空(is nullis not null)查詢

是否為空查詢,就是利用is nullis not null判斷某個字段的值是否為空值。此時的SQL語句結(jié)構(gòu)如下:

SQL=select 字段列表 from 數(shù)據(jù)表名 where 某字段 is nul

或者:

SQL=select 字段列表 from 數(shù)據(jù)表名 where 某字段 is not nul

【例8-8】本例是將數(shù)據(jù)庫“研究生管理”的數(shù)據(jù)表“研究生”中,研究方向為空值(意思就是目前還沒有研究方向)的研究生記錄查詢出來并復(fù)制到Excel工作表。

Public Sub 88()

   Dim cnn As New ADODB.Connection

   Dim rs As ADODB.Recordset

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

   mydata = "研究生管理"       '指定數(shù)據(jù)庫

   mytable = "研究生"      '指定數(shù)據(jù)表

   '清除工作表的所有數(shù)據(jù)

   Cells.Clear

   '建立與SQL Server服務(wù)器的連接

   cnn.ConnectionString = "Provider=SQLOLEDB;" _

        & "User ID=sa;" _

        & "password=11111;" _

        & "Data Source=THTFCOMPUTER;" _

        & "Initial Catalog=" & mydata

    cnn.Open

    '查詢?nèi)砟承┳侄蔚挠涗?/span>

    SQL = " select * from " & mytable & " where 研究方向 is null"

    Set rs = cnn.Execute(SQL)

    '復(fù)制字段名

    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

    '復(fù)制全部記錄數(shù)據(jù)

    Range("A2").CopyFromRecordset rs

    '字段設(shè)置列寬至合適的寬度

    Columns.AutoFit

    '關(guān)機(jī)記錄集以及與數(shù)據(jù)庫的連接

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

運行上面的程序,就得到如圖8-8所示的結(jié)果。

如果要查詢出已經(jīng)確定了研究方向的研究生記錄,則SQL語句如下:

SQL=select * from & mytable & wherr 研究方向 is not null

8.4 復(fù)雜條件查詢

所謂復(fù)雜條件查詢,就是在WHERE子句中使用關(guān)系運算符、邏輯運算符和特殊的運算符,構(gòu)建復(fù)雜的條件進(jìn)行查詢。

例如,要查詢所有考試成績在80分以上、課程代碼為200601004的研究生考試記錄,則SQL語句如下:

SQL = select * from 成績 where 成績> 80 and 課程代碼 =200601004

【例8-9】本例是將數(shù)據(jù)庫“研究生管理”的數(shù)據(jù)表“成績”中,查詢所有考試成績在80分以上、課程代碼為200601004的研究生考試記錄,并復(fù)制到Excel工作表。

Public Sub 89()

   Dim cnn As New ADODB.Connection

   Dim rs As ADODB.Recordset

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

   mydata = "研究生管理"       '指定數(shù)據(jù)庫

   mytable = "成績"      '指定數(shù)據(jù)表

   '清除工作表的所有數(shù)據(jù)

   Cells.Clear

   '建立與SQL Server服務(wù)器的連接

   cnn.ConnectionString = "Provider=SQLOLEDB;" _

        & "User ID=sa;" _

        & "password=11111;" _

        & "Data Source=THTFCOMPUTER;" _

        & "Initial Catalog=" & mydata

    cnn.Open

    '查詢?nèi)砟承┳侄蔚挠涗?/span>

    SQL = " select * from " & mytable & " where 成績> 80 and 課程代碼 ='200601004'"

    Set rs = cnn.Execute(SQL)

    '復(fù)制字段名

    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

    '復(fù)制全部記錄數(shù)據(jù)

    Range("A2").CopyFromRecordset rs

    '字段設(shè)置列寬至合適的寬度

    Columns.AutoFit

    '關(guān)機(jī)記錄集以及與數(shù)據(jù)庫的連接

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

運行上面的程序,就得到如圖8-9所示的結(jié)果。

【例8-10】本例是將數(shù)據(jù)庫“研究生管理”的數(shù)據(jù)表“研究生”中,查詢所有考試成績在80分以上、課程代碼為200601004、并且學(xué)號的前3位字為“A03”的研究生考試記錄,并復(fù)制到Excel工作表。本例的程序代碼與【例8-9】基本相同,唯一不同的是SQL語句,如下所示:

SQL = select * from & mytable_

     & where 成績> 80 and 課程代碼 = 200601004 and left(學(xué)號,3)=A03‘”

運行上面的程序,就得到如圖8-10所示的結(jié)果。

8.5 計算條件下的查詢

所謂計算條件下的查詢,就是在WHERE子句中使用計算公式,并將計算公式的結(jié)果作為條件值進(jìn)行查詢。

【例8-11】本例是在數(shù)據(jù)庫“研究生管理”的數(shù)據(jù)表“研究生”中,查詢所有到現(xiàn)在為止入學(xué)滿1年的研究生考試記錄,并復(fù)制到Excel工作表。

Public Sub 811()

   Dim cnn As New ADODB.Connection

   Dim rs As ADODB.Recordset

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

   mydata = "研究生管理"       '指定數(shù)據(jù)庫

   mytable = "研究生"      '指定數(shù)據(jù)表

   '清除工作表的所有數(shù)據(jù)

   Cells.Clear

   '建立與SQL Server服務(wù)器的連接

   cnn.ConnectionString = "Provider=SQLOLEDB;" _

        & "User ID=sa;" _

        & "password=11111;" _

        & "Data Source=THTFCOMPUTER;" _

        & "Initial Catalog=" & mydata

    cnn.Open

    '查詢?nèi)砟承┳侄蔚挠涗?/span>

    SQL = " select * from " & mytable & " where datediff(yy,入學(xué)日期,getdate())>=1"

    Set rs = cnn.Execute(SQL)

    '復(fù)制字段名

    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

    '復(fù)制全部記錄數(shù)據(jù)

    Range("A2").CopyFromRecordset rs

    '字段設(shè)置列寬至合適的寬度

    Columns.AutoFit

    '關(guān)機(jī)記錄集以及與數(shù)據(jù)庫的連接

    rs.Close

    cnn.Close

    Set rs = Nothing

    Set cnn = Nothing

End Sub

運行上面的程序,就得到如圖8-11所示的結(jié)果。

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多