国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
SQL在Excel中的應用方法

iamlaosong文

Excel中使用SQL的主要目的是連接數(shù)據(jù)庫(或Excel工作表)導入數(shù)據(jù)或者對這些數(shù)據(jù)進行統(tǒng)計匯總,要達到這個目的,需要好好學習SQL語句的使用。本文主要說明在Excel中如何使用SQL,至于SQL語句本身就不多作介紹了。

一、簡單的查詢


1、建立查詢

數(shù)據(jù)選項卡—現(xiàn)有連接—瀏覽更多 或者 按快捷鍵Alt+D+D+D

選擇要查詢的Excel文件和文件中的的工作表,就可以將相應工作表的數(shù)據(jù)取過來。表現(xiàn)形式可以是表,也可以是數(shù)據(jù)透視表等。

2、SQL查詢語句

如果是挑選部分列數(shù)據(jù),就需要用SQL語句(取所有數(shù)據(jù)也可以用SQL語句)。

  •   建立查詢時,選擇工作表后不要點擊“確定”按鈕,而是先點擊“屬性”按鈕,彈出窗口中選擇“定義”選項卡,在命令文本框中輸入SQL查詢語句(原來的工作表名稱,表示所有數(shù)據(jù),可以認為是取所有數(shù)據(jù)的SQL的一種特殊寫法):

Select 字段列表 from [工作表名$]

--其中字段列表就是需要選擇的字段,數(shù)據(jù)源用工作表名稱加“$“再用中括號括起來,例如:

select prov_name, city_name, xs_mc, xs_code from [Sheet1$]

select * from [Sheet1$]   -- 取所有數(shù)據(jù)

  • 偶然發(fā)現(xiàn),字段名不能用no,估計是保留字,如需要,用中括號括起來,例如:

select [no],prov_name,city_name, xs_mc, xs_code from [Sheet1$]

字段名中含有特殊字符的也要用中括號括起來,如/ ?空格 等

Excel查詢沒有偽表概念,對于表達式的計算直接用select既可,例如

Select 23+45    -- 返回68

Select date()    -- 返回當前日期

3、修改查詢語句

  •  方法:點擊右鍵—彈出菜單—表格—編輯查詢

通過修改SQL語句可以變更所取的數(shù)據(jù),也可以將建立查詢時的簡單SQL語句改成復雜的SQL語句。

  • 字段名更換:如果想換個字段名,用“as 新字段名”既可,例如:

select prov_name as 省, city_name as 城市, xs_mc as 縣市, xs_code as 編碼 from [Sheet1$]

  • 非正常表格:數(shù)據(jù)區(qū)域(含字段名)不在第一行

需要在工作表名稱后面指定數(shù)據(jù)范圍,例如:

select prov_name, city_name, xs_mc, xs_code from [Sheet1$B2:G2000]

或者,將數(shù)據(jù)塊定義為一個名稱,假設定義為mydata,SQL語句如下:

select prov_name, city_name, xs_mc, xs_code from mydata

注意:使用名稱時沒有$符號,也沒有方括號了。

  • 數(shù)據(jù)更新:數(shù)據(jù)源發(fā)生變化,需要更新數(shù)據(jù),方法:點擊右鍵—彈出菜單—刷新
  • 意外:如果打開Excel文件后彈出不是選擇工作表的窗口而是一個“數(shù)據(jù)連接屬性”窗口,可以關閉這個窗口,然后將Excel應用極小化再極大化方式消除,或者在彈出選擇文件的窗口時,退回上一級文件夾,刪除那個Queries文件夾,就行了。

4、外部數(shù)據(jù)屬性

修改SQL語句后,如顯示格式不是預想的那樣,需要去掉“外部數(shù)據(jù)屬性”中“保留列屬性”前面的勾選。方法:點擊右鍵—彈出菜單—表格—外部數(shù)據(jù)屬性,彈出窗口如下:

二、復雜的查詢


1、多表聯(lián)合

  • 相同結構的多個表合并到一起,用union連接SQL語句,例如:

Select * from  [財務部$] union all Select * from [市場部$]

Union是去重復的,即相同的記錄保留一個(類似distinct),Union all則是直接相加兩個結果,不去重復。

  • 增加一個部門字段可以將查詢結果中的區(qū)分開來,以便知道數(shù)據(jù)來自哪個表。Union的三個一致,即:字段的數(shù)量、類型和順序。例如:

Select “財務部” as 部門,* from  [財務部$] union all Select “市場部” as 部門,* from [市場部$]

  • 多表聯(lián)合查詢

Select * from  [部門$]  bm,  [員工$]  yg where bm.部門編碼=yg.部門編碼

  • 跨工作簿查詢

如果數(shù)據(jù)不僅來自不同的工作表,還來自不同的文件,一樣可以用union聯(lián)合,例如:

Select “分公司1” as 公司, “財務部” as 部門, * from [F:\SQL之Excel應用\分公司1.xlsx].[財務部$] union all

Select “分公司1” as 公司, “市場部” as 部門, * from [F:\SQL之Excel應用\分公司1.xlsx].[市場部$] union all

Select “分公司2” as 公司, “財務部” as 部門, * from [F:\SQL之Excel應用\分公司2.xlsx].[財務部$] union all

Select “分公司2” as 公司, “市場部” as 部門, * from [F:\SQL之Excel應用\分公司2.xlsx].[市場部$]

因為SQL中已經(jīng)指定了文件名和表名,所以建立連接時連接誰并不重要,這種情況下,建立連接的時候就連接自己,然后再改寫SQL語句。

2、子查詢和多表連接

所謂子查詢就是將一個查詢結果作為數(shù)據(jù)源放在主查詢語句中,多表連接則是將兩個有關聯(lián)的表通過關鍵字段連接在一起查詢,這都是SQL知識,不再贅述,需要注意的是,不同的數(shù)據(jù)庫系統(tǒng)SQL都有些微小的差別,Excel中的SQL也有其自己的一些特點,關于多表查詢的寫法,見本文附錄。

3、常用運算符

  • 有條件的查詢
條件是where引導的,用and、or等連接,例如:
select prov_name, city_name, xs_mc, xs_codefrom [Sheet1$] where prov_name=’安徽’ or prov_name=’江蘇’
 --雖然字符串可以用雙引號,但建議用單引號,因為oracle 、SQL server都是用單引號。
  • 常用運算符:in、not in、between … and …、is null、is not null、&(連字符)、like、not like,注意:null和任何字段運算的結果都是null。
  • 通配符:%(所有字符或無字符)、_(單個字符)、[](區(qū)間,如[1-9]、[!a-f]、[1,3,5]),例如:

select * from[Sheet1$] where Email like ‘[h-m]%’   --h-m開頭的電子郵件

select * from[Sheet1$] where xs_code like '%[!1,3,5]' –和not like '%[1,3,5]'效果相同

select * from[Sheet1$] where 戶籍&’-’&工作地 like '%合肥%'  --中間加個“-”防止誤差

  • 篩選查詢結果:

Distinct 去重復、top n 取前n條記錄

  • 聚合函數(shù):
count、sum、min、max、avg  排序:order by、分組:group by、分組后篩選:having
  • SQL中關鍵字的執(zhí)行順序:
from=1 where=2 group by=3 having=4  select=5 order by=6,因為select在后面,所以其其前面幾個關鍵字后面不能用字段別名,不過,表的別名是可以用的,因為from排在第一。另外,order by在最后,所以可以用字段別名。

4、常用函數(shù)

除了聚合函數(shù),還有很多其他函數(shù),這些函數(shù)有的是所有數(shù)據(jù)庫系統(tǒng)都有的,有的是數(shù)據(jù)庫系統(tǒng)特有的。Excel中工作表中使用的函數(shù)基本都能在SQL中使用,例如:

  • 數(shù)學:abs、int、fix、round、mod、rnd、……
  • 文本:left、right、mid、len、instr、string、replace、format、……
  • 條件:iif、switch、choose、……
  • 日期:date/now、year/month/day、weekday、dateserial、……

有些函數(shù)用法和工作表中略有不同,如date可以取當前日期,但是不能合成日期,合成日期用dateserial(這個函數(shù)只能在SQL中使用)

5、交叉查詢

交叉查詢產生一個透視表,相當于一個矩形二維表,這是Excel特有的查詢,格式如下:

Transform 聚合函數(shù) select 行標簽 from [數(shù)據(jù)表$] groupby 行標簽 pivot 列標簽,例如:

Transform sum(工資) select 部門名稱 from [員工$] group by 部門名稱 pivot 職務

這個語句產生的結果與數(shù)據(jù)透視表差不多,相當于一個語句產生一個數(shù)據(jù)透視表,當然這個透視表是固定的,和語句對應的。其中的select語句,相當于數(shù)據(jù)透視表的行字段,其中的聚合函數(shù)的參數(shù)相當于拖到數(shù)據(jù)透視表數(shù)據(jù)區(qū)域的值字段,使用的聚合函數(shù)即值字段的匯總方式。其中的 pivot字段相當于數(shù)據(jù)透視表的列字段,后面的IN (value1[, value2[, ...]])],相當列字段中的項的排序和篩選,擺弄過數(shù)據(jù)透視表,將transform/pivot語句與數(shù)據(jù)透視表對照,可以輕松掌握這個MS JET新增SQL語句??匆幌滦Ч?/p>

列標簽篩選

Transform sum(工資) select 部門名稱 from [員工$] group by 部門名稱 pivot 職務 in (‘主管’, ‘經(jīng)理’)

多個行標簽

Transform sum(工資) select職務,性別from [員工$] group by職務,性別pivot 部門名稱

如需要添加總計,則需要先構造一個子查詢結果,這個結果由正常的查詢和統(tǒng)計查詢聯(lián)合在一起,再以這個結果作為數(shù)據(jù)源,構成上面的二維表。例如:

Transform sum(工資) select 部門名稱 from (

Select 部門名稱,職務,工資 from [員工$]  union all

Select 部門名稱,’總計’,sum(工資) from [員工$] group by部門名稱

 ) group by 部門名稱 pivot 職務 in  (‘主管’, ‘經(jīng)理,’職員’,’總計’ )

6、文本型數(shù)字

SQL查詢時字段類型是由前8行數(shù)據(jù)決定的(這個數(shù)字是Excel定的),如果前8行都是數(shù)值型,后面有文本型數(shù)字,則查詢結果中這些數(shù)字變成為空;前8行是文本型,后面是數(shù)值型則不影響,似乎查詢結果偏向文本。如果前8行中類型不一致,有數(shù)值型,也有文本型數(shù)字,可以通過在連接字符串中加入IMEX=1則后面有文本型字符也沒關系,但是,如果前8行都是數(shù)值型,加了這個也不管用,因為前8行已經(jīng)決定是數(shù)值型了。加IMEX位置如下:

Provider=Microsoft.ACE.OLEDB.12.0;UserID=Admin;Data Source=C:\Documents and Settings\Administrator\桌面\tb_city_zd.xls;Mode=ShareDeny Write;Extended Properties="HDR=YES;IMEX=1";Jet OLEDB:System database="";JetOLEDB:Registry Path="";Jet OLEDB:Engine Type=35;Jet OLEDB:DatabaseLocking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global BulkTransactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:CreateSystem Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't CopyLocale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;JetOLEDB:SFP=False;Jet OLEDB:Support Complex Data=False

7、刪除無用的數(shù)據(jù)源

隨著我們建立的查詢越來越多,打開現(xiàn)有連接時會出現(xiàn)很多我們原來建立的連接,這些連接是Windows自動保存以便于我們再次使用的,如要刪除,可進入“我的文檔”下面的“我的數(shù)據(jù)源”文件夾,刪除這些無用的數(shù)據(jù)源或者直接刪除“我的數(shù)據(jù)源”文件夾。

刪除這些連接不會影響原來建立的那些查詢。

8、Microsoft Query工具

可以利用MQ工具建立查詢,對于不熟悉SQL語言的可以用這個調試SQL語句。MQ向導會提供可視化工具,一步一步引導我們得到所需的數(shù)據(jù)。查詢生成后,可以點擊“SQL”按鈕進一步修改SQL語句。

  • 打開方法:數(shù)據(jù)選項卡—自其它來源—來自MicrosoftQuery工具—Excel files,選擇文件后確定,進入工具。

如果不能選擇xlsx文件,是因為數(shù)據(jù)源版本驅動太低,進入控制面板--管理工具—數(shù)據(jù)源(ODBC),點擊配置,數(shù)據(jù)庫版本選擇Excel 12.0版本(office2007以上);如果找不到12.012.0以上版本,就刪除原來的數(shù)據(jù)源Excel files,重新添加一個,注意要選擇帶有xlsx的驅動程序。

office版本和版本號:office97 : 8.0、office2000 : 9.0、officeXP(2002) : 10.0、office2003 : 11.0、office2007: 12.0、office2010 : 14.0、office2013: 15.0

選擇文件并確定后,如果提示“數(shù)據(jù)源中沒有包含可見的表格”,點擊確定,在隨后彈出的向導窗口中點擊“選項”按鈕,勾選“系統(tǒng)表”,確定后就可以看到表了,如下圖:

  • MQ工具通過可視化工具生成所需的SQL查詢語句,如添加條件、分組等等。點擊“SQL”按鈕查看生成的語句,可以看到文件名和表名都是用單引號括起來,和中括號效果一樣。
  • MQ工具不僅可以編寫SQL查詢語句,也可以寫insert、delete、update等SQL語句,例如:

Insert into [員工$] (姓名,性別,工資) values (‘宋定才’,’男’,5000)

三、VBA中使用SQL語句


1、連接數(shù)據(jù)庫的工具ADO

  • ADO是個類,有三個工具:connection(連接)、command(命令)和recordset(記錄集)
  • 使用前先引用,進入VBE,點擊菜單“工具”下面的“引用”,勾選最高版本的ADO,然后就可以用new在VBA過程中創(chuàng)建對象了。引用窗口如下圖:

2、連接Access數(shù)據(jù)庫

  • 連接字符串:連接數(shù)據(jù)庫的關鍵是連接串的寫法,可以參考建立查詢時系統(tǒng)自動生成的連接串,方法是:數(shù)據(jù)選項卡—自Access,在彈出窗口選擇數(shù)據(jù)文件和表后,點擊屬性,彈出窗口中點擊定義選項卡,其中的連接字符串就是連接access的字符串,內容如下:

Provider=Microsoft.ACE.OLEDB.12.0;Password="";UserID=Admin;Data Source=D:\Lc\link.mdb;Mode=Share Deny Write;ExtendedProperties="";Jet OLEDB:System database="";JetOLEDB:Registry Path="";Jet OLEDB:Database Password="";JetOLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global PartialBulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New DatabasePassword="";Jet OLEDB:Create System Database=False;Jet OLEDB:EncryptDatabase=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:CompactWithout Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support ComplexData=False

  • 根據(jù)上面的連接串可以寫出下面的VBA代碼。連接串中大部分是默認值,VBA代碼中可以不寫,例如,下面的代碼是連接access數(shù)據(jù)庫:

  1. ' 更新工作表數(shù)據(jù),無返回數(shù)據(jù)  
  2. Subado_test1()  
  3.     Dim cnn As ADODB.Connection  
  4.      
  5.     ' 新建一個連接對象  
  6.     Set cnn = New ADODB.Connection  
  7.     '建立連接  
  8.     With cnn  
  9.         .Provider ="Microsoft.ACE.OLEDB.12.0"  
  10.         '當前文件的路徑可以用ThisWorkbook.Path  
  11.         .Open ThisWorkbook.Path & "\員工.accdb"  
  12.     End With  
  13.     '使用SQL語句操作數(shù)據(jù)庫  
  14.     Dim sql As String  
  15.     sql = "update 職工 set 年齡=20 where 姓名='張麗'"  
  16.     cnn.Execute sql   ' 執(zhí)行SQL命令,無需返回值  
  17.     cnn.Close         ' 關閉連接  
  18.     Set cnn = Nothing ' 釋放對象  
  19.      
  20.     MsgBox "操作成功!"  
  21. End Sub  

  • 查詢表,有返回記錄,注意下面例子中定義和連接的不同寫法:

  1. ' 查詢數(shù)據(jù)庫表數(shù)據(jù)  
  2. Subado_test2()  
  3.     Dim cnn As New ADODB.Connection  
  4.      
  5.     '建立連接,當前文件的路徑可以用ThisWorkbook.Path  
  6.     cnn.Open "Provider =Microsoft.ACE.OLEDB.12.0; Data Source = " & ThisWorkbook.Path &"\員工.accdb"  
  7.     '使用SQL語句操作數(shù)據(jù)庫  
  8.     Dim sqls As String  
  9.     Dim rst As New ADODB.Recordset  
  10.     sqls = "select * from 職工"  
  11.     Set rst = cnn.Execute(sqls)  ' 執(zhí)行SQL命令  
  12.      
  13.     '用循環(huán)獲取字段名  
  14.     Dim i As Integer  
  15.     For i = 0 To rst.fields.Count-1  
  16.         Cells(1, i + 1) = rst.Fields(i).name  
  17.     Next i  
  18.     '保存查詢記錄  
  19.     Range("a2").CopyFromRecordset rst  
  20.      
  21.     rst.Close         ' 關閉記錄集  
  22.     Set rst = Nothing  ' 釋放對象  
  23.     cnn.Close         ' 關閉連接  
  24.     Set cnn = Nothing  ' 釋放對象  
  25.      
  26.     MsgBox "操作成功!"  
  27. End Sub  

  • 將工作表中的數(shù)據(jù)保存到數(shù)據(jù)庫表中方法是更新記錄集,再調用記錄集update方法,例如:

  1. ' 將工作表數(shù)據(jù)保存到數(shù)據(jù)庫  
  2. Subado_test3()  
  3.     Dim cnn As ADODB.Connection  
  4.     Dim rst As ADODB.Recordset  
  5.     Dim sqls, mytable As String  
  6.     Dim i, j, n As Integer  
  7.      
  8.     '建立連接,當前文件的路徑可以用ThisWorkbook.Path  
  9.     Set cnn = New ADODB.Connection  
  10.     cnn.Open "Provider =Microsoft.ACE.OLEDB.12.0; Data Source = " & ThisWorkbook.Path &"\員工.accdb"  
  11.     mytable = "職工"  
  12.     n =Range("a1").End(xlDown).Row   '當前工作表有效行數(shù)  
  13.     '使用SQL語句操作數(shù)據(jù)庫  
  14.     For i = 2 To n  
  15.         sqls = "select * from " &mytable & " where 編號='" & Cells(i, 1).Value & "'"  
  16.         Set rst = New ADODB.Recordset  
  17.         '用記錄集對象執(zhí)行SQL語句  
  18.         rst.Open sqls, cnn, adOpenKeyset,adLockOptimistic  
  19.         If rst.RecordCount = 0 Then rst.AddNew   '找不到,增加一條空記錄  
  20.         For j = 1 To rst.Fields.Count  
  21.             rst.Fields(j - 1) = Cells(i,j).Value  
  22.         Next j  
  23.         rst.Update  
  24.     Next i  
  25.      
  26.     rst.Close         ' 關閉記錄集  
  27.     Set rst = Nothing ' 釋放對象  
  28.     cnn.Close         ' 關閉連接  
  29.     Set cnn = Nothing ' 釋放對象  
  30.      
  31.     MsgBox "操作成功!"  
  32. End Sub  


3、連接Excel工作表

  • 連接Excel,注意連接串(增加一個ExtendedProperties=excel 12.0)和SQL語句的寫法:

  1. ' 連接Excel工作表  
  2. Subado_test4()  
  3.     Dim cnn As ADODB.Connection  
  4.     Dim rst As ADODB.Recordset  
  5.     Dim sqls As String  
  6.      
  7.     '建立連接,注意連接串和SQL語句的寫法  
  8.     Set cnn = New ADODB.Connection  
  9.     With cnn  
  10.         .Provider ="Microsoft.ACE.OLEDB.12.0;Extended Properties=excel 12.0"  
  11.         .Open ThisWorkbook.Path &"\tb_city_zd.xls"  
  12.     End With  
  13.     '使用SQL語句操作數(shù)據(jù)庫  
  14.     sqls = "select * from [sheet1$]"  
  15.     Set rst = cnn.Execute(sqls)  
  16.     Sheets("sheet6").Range("A1").CopyFromRecordsetrst  
  17.      
  18.     rst.Close         ' 關閉記錄集  
  19.     Set rst = Nothing ' 釋放對象  
  20.     cnn.Close         ' 關閉連接  
  21.     Set cnn = Nothing ' 釋放對象  
  22.      
  23.     MsgBox "操作成功!"  
  24. End Sub  


  • 同時連接Excel和Access數(shù)據(jù)庫,主要看連接串和SQL語句的寫法:

  1. ' 連接Excel工作表和Access數(shù)據(jù)庫  
  2. Sub ado_test5()  
  3.    Dim cnn As ADODB.Connection  
  4.    Dim rst As ADODB.Recordset  
  5.    Dim sqls As String  
  6.       
  7.    '建立連接,注意連接串和SQL語句的寫法  
  8.    Set cnn = New ADODB.Connection  
  9.    With cnn  
  10.         .Provider ="Microsoft.ACE.OLEDB.12.0;Extended Properties=excel 12.0"  
  11.        .Open ThisWorkbook.FullName  
  12.    End With  
  13.    '使用SQL語句操作數(shù)據(jù)庫  
  14.    sqls = "select a.部門,count(*) from [部門$A:A] a left join [database = " & _  
  15.         ThisWorkbook.Path & "\員工.accdb].職工 b on a.部門=b.部門 group bya.部門"  
  16.    Set rst = cnn.Execute(sqls)  
  17.    Sheets("部門").Range("b2").CopyFromRecordset rst  
  18.      
  19.    rst.Close         ' 關閉記錄集  
  20.    Set rst = Nothing ' 釋放對象  
  21.    cnn.Close         ' 關閉連接  
  22.    Set cnn = Nothing ' 釋放對象  
  23.      
  24.    MsgBox "操作成功!"  
  25. End Sub  


4、注意事項

  • 關于ADO控件,有兩種創(chuàng)建方式,一種是如前述的那樣,先加引用,然后在代碼中就可以定義這種類型的對象,再通過New的方式建立對象。另一種方式直接創(chuàng)建,代碼如下:

Dim cnnAs Object, rst As Object

Set cnn =CreateObject("ADODB.Connection")

Set rst =CreateObject("ADODB.Recordset")

其實這種方法更實用,因為加引用必須是熟悉系統(tǒng)的人才能操作,如果將寫好的程序給一般人使用,難道每次你還指導他去加引用?

  • 執(zhí)行SQL語句有三種方式,一種是用connection,即上面的cnn.Execute,這種方式比較適合無返回記錄的語句,即DML語句。如果執(zhí)行有返回記錄的SQL語句,也可以取到記錄,只是RecordCount總是反饋-1。這種情況下可以根據(jù)rst.eof判斷有無查詢結果,如果rst.eof= true就表示查詢結果為空。另一種方式是用RecordSet,即上面的rst.Open,這個適合有返回記錄的語句,即select語句,因為這種方式能夠返回記錄數(shù)RecordCount。當然還有第三種方式,就是用command,這個比較適合執(zhí)行存儲過程,因為這種方式可以傳遞參數(shù)。三種方式command方式功能最強,用起來也最麻煩,connection最弱,用起來也最簡單。
  • 取值除了前面說的CopyFromRecordset,還可以用循環(huán)的方式逐個取值,例如:

  1. For i=1 to rst. RecordCount  
  2.     For j= 1 To rst.fields.Count  
  3.         Cells(i+1, j) =rst.Fields(j-1).Value  
  4.     Next j  
  5.     rst.MoveNext  
  6. Next i  

  • ADO也可也連接其他數(shù)據(jù)庫,只是連接串不同,其它操作一樣,例如Oracle,連接語句如下:

    cnn.Open "Provider=msdaora;DataSource=dl580;User Id=username;Password=userpasswd;"

其中dl580是Oracle客戶端配置的連接名稱,后面是Oracle用戶名和密碼。


附錄:SQL多表查詢語句的寫法


1、嵌套查詢

嵌套查詢是將一個SELECT語句包含在另一個SELECT語句的WHERE子句中,也稱為子查詢。子查詢(內層查詢)的結果用作建立其父查詢(外層查詢)的條件,因此,子查詢的結果必須有確定的值。利用嵌套查詢可以將幾個簡單查詢組成一個復雜查詢,從而增強SQL的查詢能力。


1、查詢“張三”選修的課程和成績

select 學號,課程,成績 from [課程$] where 學號 = (select 學號 from [學生$] where 姓名 ="張三")

2、查詢“張三”選修的語文課和成績

select 學號,課程,成績 from [課程$] where 學號 = (select 學號 from [學生$] where 姓名 ="張三" and 課程="語文")

3、查詢所有考試學生的成績

select * FROM [課程$] where 成績 not in (select distinct 學號 from [學生$])

2、合并查詢

合并查詢想必大家都知道了,數(shù)據(jù)透視表多表查詢,一般都使用的是合并查詢,它合并的是兩個或兩個以上查詢的結果。參加合并查詢的列數(shù)要相同,對應列的數(shù)據(jù)類型必須兼容,各語句中對應的結果集列出現(xiàn)的順序必須相同。

與連接查詢相比,聯(lián)合查詢增加記錄的行數(shù),連接查詢則是增加記錄的列數(shù)。聯(lián)合查詢語句如下:

select * from [] union [all]

其中ALL選項保留結果集中的重復記錄,默認時系統(tǒng)自動刪除記錄。如,依據(jù)學號查詢語文和物理成績:

select 學號,成績, 課程 from [課程$] where 課程= "語文" union   select 學號, 成績,課程 from [課程$] where 課程= "物理"

3、多表查詢

多表查詢亦稱連接查詢,它同時涉及兩個或兩個以上的公共字段或語義相同的字段,也就是說數(shù)據(jù)表是通過表的列(字段)來體現(xiàn)的。是數(shù)據(jù)透視表中最重要的的一種查詢。連接操作的目的就是通過加在連接字段的條件將多個表連接在一起,以便在多個表中查詢數(shù)據(jù)。


多表查詢,需要有相同的兩個表的聯(lián)接條件,該條件放在WHERE子句中,格式為:

select <目標列>from <表明1>,<表名2> where <表名1>.<字段名1>=<表名2>.<字段名2>

1、依據(jù)學號條件查詢學生的各門成績:

select * from [學生$],[課程$] where [學生$].學號=[課程$].學號

為了簡化輸入,在SELECT 命令中允許使用表的別名。為此,可以在FROM 子句中定義一個臨時別名,以便查詢使用。其格式如下:

SELECT <目標列> FROM <表名1><別名1>,<表名2><別名2>WHERE <別名1><字段名1>=<別名2>.<字段名2>

2、依據(jù)學號條件查詢學生的各門成績大于85分

select kc.學號,姓名,課程,成績 from  [學生$] xs , [課程$]  kc where xs.學號 = kc.學號 and 成績 >85

在數(shù)據(jù)透視表中對多表查詢,還可以使用另一種連接格式,就是內連接查詢,也叫等值連接查詢。它是組合兩個(或多個以上)表,最常使用的方法。其語句如下:

SELECT <目標列> FROM <表名1> inner join <表名2> on <表名1>.<字段名1>=<表名2>.<字段名2>

3、依據(jù)學號條件查詢學生的各門成績大于85分

select kc.學號,姓名,課程,成績 from [學生$]xs inner join [課程$] kc on xs.學號=kc.學號 

4、外連接查詢

在內連接查詢中,只有在兩表中同時匹配的行才才能在結果集中選出,而在外連接中可以只限制一個表,而不限制另一個表,其所有的行都都出現(xiàn)在結果集中。外連接分為左外連接,右外連接和全部鏈接。

左連接是對連接條件中左邊的表不加限制;右連接是對右邊的表不加限制;全部連接是對兩個表都不加限制。其語法如下:

select <選擇列數(shù)> from <表名1> <[ lift ︳right ︳full][outer]> jion <表名2> on <表名1>.<列名>=<表名2>.<列名>


1、以[學生$]中記錄為準,[課程$]中不存在的學號也可以列出:

select kc.學號,姓名,課程,成績 from [學生$]xs left join [課程$] kc on xs.學號=kc.學號 

2、以[課程$]中記錄為準,[學生$]中不存在的學號也可以列出:

select kc.學號,姓名,課程,成績 from [學生$]xs right join [課程$] kc on xs.學號=kc.學號 


本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
數(shù)據(jù)庫應用課程設計
《SQLServer2005數(shù)據(jù)庫案例教程》第4章查詢語句的使用
《數(shù)據(jù)庫及其應用》試題
數(shù)據(jù)庫模型設計,第一范式、第二范式、第三范式_t13外部數(shù)據(jù)主題
SQL練習題
第二章
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服