1. 程式人生 > >常用SQL語句例項(含過濾及刪除重複資料、匯入匯出資料等)

常用SQL語句例項(含過濾及刪除重複資料、匯入匯出資料等)

本文整理一些常用的SQL語句例項(如過濾重複資料、刪除重複資料、匯入匯出資料等),收藏備用,不斷更新中……。歡迎訪問作者網站獲取最新版:http://hi.wonsoft.cn

-------------------------------第一部份 高階技巧-------------------------------------------

一、過濾重複資料

1、完全重複的記錄

  1. /* 功能:指定欄位完全重複 */
  2. select distinct 欄位1,欄位2,欄位3 from 資料表

2、部分關鍵欄位重複的記錄

  1. /*資料結構:角色檔案(角色編碼,角色,角色分類編碼)
  2. 功  能:取出指定欄位(角色分類編碼)為關鍵字的無重複資料,重複的取第一條
  3. 說  明:重複記錄取最後一條,只需要把min改成max即可
  4. */
  5. select * from 角色檔案 t where 角色編碼 in (select min(角色編碼)  from 角色檔案 t1 group by t1.角色分類編碼)

二、刪除重複記錄

資料庫的使用過程中由於程式方面的問題有時候會碰到重複資料,重複資料導致了資料庫部分設定不能正確設定,本例舉出刪除它的辦法。

方法1:

  1. declare @max integer,@id integer
  2. declare cur_rows cursor local for select 主欄位,count(*) from 表名 group by 主欄位 having count(*) > 1
  3. open cur_rows
  4. fetch cur_rows into @id,@max
  5. while @@fetch_status=0
  6. begin
  7. select @max = @max -1
  8. set rowcount @max
  9. delete from 表名 where 主欄位 = @id
  10. fetch cur_rows into @id,@max
  11. end
  12. close cur_rows
  13. set rowcount 0

方法2:

有兩個意義上的重複記錄,一是完全重複的記錄,也即所有欄位均重複的記錄,二是部分關鍵欄位重複的記錄,比如Name欄位重複,而其他欄位不一定重複或都重複可以忽略。

1、對於第一種重複,比較容易解決,使用

  1. select distinct * from tableName

就可以得到無重複記錄的結果集。

如果該表需要刪除重複的記錄(重複記錄保留1條),可以按以下方法刪除

  1. select distinct * into #Tmp from tableName
  2. drop table tableName
  3. select * into tableName from #Tmp
  4. drop table #Tmp 

發生這種重複的原因是表設計不周產生的,增加唯一索引列即可解決。

2、這類重複問題通常要求保留重複記錄中的第一條記錄,操作方法如下

假設有重複的欄位為Name,Address,要求得到這兩個欄位唯一的結果集

  1. select identity(int,1,1) as autoID, * into #Tmp from tableName
  2. select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
  3. select * from #Tmp where autoID in(select autoID from #tmp2) 

三、匯入匯出語句大全:

  1. SELECT * FROM OpenDataSource( ’Microsoft.Jet.OLEDB.4.0’,  
  2. ’Data Source="c:/test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0’)...xactions  
  3. /*動態檔名  
  4. declare @fn varchar(20),@s varchar(1000)  
  5. set @fn = ’c:/test.xls’  
  6. set @s =’’’Microsoft.Jet.OLEDB.4.0’’,  
  7. ’’Data Source="’[email protected]+’";User ID=Admin;Password=;Extended properties=Excel 5.0’’’  
  8. set @s = ’SELECT * FROM OpenDataSource (’[email protected]+’)...sheet1$’  
  9. exec(@s)  
  10. */  
  11. SELECT cast(cast(科目編號 as numeric(10,2)) as nvarchar(255))+’ ’ 轉換後的別名  
  12. FROM OpenDataSource( ’Microsoft.Jet.OLEDB.4.0’,  
  13. ’Data Source="c:/test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0’)...xactions  
  14. /********************** EXCEL導到遠端SQL  
  15. insert OPENDATASOURCE(  
  16. ’SQLOLEDB’,  
  17. ’Data Source=遠端ip;User ID=sa;Password=密碼’  
  18. ).庫名.dbo.表名 (列名1,列名2)  
  19. SELECT 列名1,列名2  
  20. FROM OpenDataSource( ’Microsoft.Jet.OLEDB.4.0’,  
  21. ’Data Source="c:/test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0’)...xactions  
  22. /** 匯入文字檔案  
  23. EXEC master..xp_cmdshell ’bcp dbname..tablename in c:/DT.txt -c -Sservername -Usa -Ppassword’  
  24. /** 匯出文字檔案  
  25. EXEC master..xp_cmdshell ’bcp dbname..tablename out c:/DT.txt -c -Sservername -Usa -Ppassword’  
  26. 或  
  27. EXEC master..xp_cmdshell ’bcp "Select * from dbname..tablename" queryout c:/DT.txt -c -Sservername -Usa -Ppassword’  
  28. 匯出到TXT文字,用逗號分開  
  29. exec master..xp_cmdshell ’bcp "庫名..表名" out "d:/tt.txt" -c -t ,-U sa -P password’  
  30. BULK INSERT 庫名..表名  
  31. FROM ’c:/test.txt’  
  32. WITH (  
  33. FIELDTERMINATOR = ’;’,  
  34. ROWTERMINATOR = ’/n’  
  35. )  
  36. --/* dBase IV檔案  
  37. select * from   
  38. OPENROWSET(’MICROSOFT.JET.OLEDB.4.0’  
  39. ,’dBase IV;HDR=NO;IMEX=2;DATABASE=C:/’,’select * from [客戶資料4.dbf]’)  
  40. --*/  
  41. --/* dBase III檔案  
  42. select * from   
  43. OPENROWSET(’MICROSOFT.JET.OLEDB.4.0’  
  44. ,’dBase III;HDR=NO;IMEX=2;DATABASE=C:/’,’select * from [客戶資料3.dbf]’)  
  45. --*/  
  46. --/* FoxPro 資料庫  
  47. select * from openrowset(’MSDASQL’,  
  48. ’Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:/’,  
  49. ’select * from [aa.DBF]’)  
  50. --*/  
  51. /**************匯入DBF檔案****************/  
  52. select * from openrowset(’MSDASQL’,  
  53. ’Driver=Microsoft Visual FoxPro Driver;  
  54. SourceDB=e:/VFP98/data;  
  55. SourceType=DBF’,  
  56. ’select * from customer where country != "USA" order by country’)  
  57. go  
  58. /***************** 匯出到DBF ***************/  
  59. 如果要匯出資料到已經生成結構(即現存的)FOXPRO表中,可以直接用下面的SQL語句  
  60. insert into openrowset(’MSDASQL’,  
  61. ’Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:/’,  
  62. ’select * from [aa.DBF]’)  
  63. select * from 表  
  64. 說明:  
  65. SourceDB=c:/ 指定foxpro表所在的資料夾  
  66. aa.DBF 指定foxpro表的檔名.  
  67. /*************匯出到Access********************/  
  68. insert into openrowset(’Microsoft.Jet.OLEDB.4.0’,   
  69. ’x:/A.mdb’;’admin’;’’,A表) select * from 資料庫名..B表  
  70. /*************匯入Access********************/  
  71. insert into B表 selet * from openrowset(’Microsoft.Jet.OLEDB.4.0’,   
  72. ’x:/A.mdb’;’admin’;’’,A表)  
  73. /*檔名為引數*/
  74. declare @fname varchar(20)  
  75. set @fname = ’d:/test.mdb’  
  76. exec(’SELECT a.* FROM opendatasource(’’Microsoft.Jet.OLEDB.4.0’’,  
  77. ’’’[email protected]+’’’;’’admin’’;’’’’, topics) as a ’)  
  78. SELECT *   
  79. FROM OpenDataSource( ’Microsoft.Jet.OLEDB.4.0’,  
  80. ’Data Source="f:/northwind.mdb";Jet OLEDB:Database Password=123;User ID=Admin;Password=;’) --產品  
  81. /********************** 匯入 xml 檔案********************/
  82. DECLARE @idoc int  
  83. DECLARE @doc varchar(1000)  
  84. --sample XML document  
  85. SET @doc =’  
  86. <root>  
  87. <Customer cid= "C1" name="Janine" city="Issaquah">  
  88. <Order oid="O1" date="1/20/1996" amount="3.5" />  
  89. <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied  
  90. </Order>  
  91. </Customer>  
  92. <Customer cid="C2" name="Ursula" city="Oelde" >  
  93. <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue   
  94. white red">  
  95. <Urgency>Important</Urgency>  
  96. Happy Customer.  
  97. </Order>  
  98. <Order oid="O4" date="1/20/1996" amount="10000"/>  
  99. </Customer>  
  100. </root>  
  101. ’  
  102. -- Create an internal representation of the XML document.  
  103. EXEC sp_xml_preparedocument @idoc OUTPUT, @doc  
  104. -- Execute a SELECT statement using OPENXML rowset provider.  
  105. SELECT *  
  106. FROM OPENXML (@idoc, ’/root/Customer/Order’, 1)  
  107. WITH (oid char(5),   
  108. amount float,   
  109. comment ntext ’text()’)  
  110. EXEC sp_xml_removedocument @idoc  
  111. /**********************Excel導到Txt****************************************/  
  112. '想用  
  113. select * into opendatasource(...) from opendatasource(...)  
  114. /*實現將一個Excel檔案內容匯入到一個文字檔案  
  115. 假設Excel中有兩列,第一列為姓名,第二列為很行帳號(16位)  
  116. 且銀行帳號匯出到文字檔案後分兩部分,前8位和後8位分開。  */
  117. /*鄒健:  
  118. 如果要用你上面的語句插入的話,文字檔案必須存在,而且有一行:姓名,銀行賬號1,銀行賬號2  然後就可以用下面的語句進行插入  
  119. 注意檔名和目錄根據你的實際情況進行修改.  */
  120. insert into  
  121. opendatasource(’MICROSOFT.JET.OLEDB.4.0’  
  122. ,’Text;HDR=Yes;DATABASE=C:/’  
  123. )...[aa#txt]  
  124. --,aa#txt)  
  125. --*/  
  126. select 姓名,銀行賬號1=left(銀行賬號,8),銀行賬號2=right(銀行賬號,8)   
  127. from   
  128. opendatasource(’MICROSOFT.JET.OLEDB.4.0’  
  129. ,’Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:/a.xls’  
  130. --,Sheet1$)  
  131. )...[Sheet1$]  
  132. 如果你想直接插入並生成文字檔案,就要用bcp  
  133. declare @sql varchar(8000),@tbname varchar(50)  
  134. --首先將excel表內容匯入到一個全域性臨時表  
  135. select @tbname=’[##temp’+cast(newid() as varchar(40))+’]’  
  136. ,@sql=’select 姓名,銀行賬號1=left(銀行賬號,8),銀行賬號2=right(銀行賬號,8)   
  137. into ’[email protected]+’ from   
  138. opendatasource(’’MICROSOFT.JET.OLEDB.4.0’’  
  139. ,’’Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:/a.xls’’  
  140. )...[Sheet1$]’  
  141. exec(@sql)  
  142. --然後用bcp從全域性臨時表匯出到文字檔案  
  143. set @sql=’bcp "’[email protected]+’" out "c:/aa.txt" /S"(local)" /P"" /c’  
  144. exec master..xp_cmdshell @sql  
  145. --刪除臨時表  
  146. exec(’drop table ’[email protected])  
  147. /********************導整個資料庫*********************************************/  
  148. /*用bcp實現的儲存過程  */
  149. /*  
  150. 實現資料匯入/匯出的儲存過程  
  151. 根據不同的引數,可以實現匯入/匯出整個資料庫/單個表  
  152. 呼叫示例:  
  153. --匯出呼叫示例  
  154. ----匯出單個表  
  155. exec file2table ’zj’,’’,’’,’xzkh_sa..地區資料’,’c:/zj.txt’,1  
  156. ----匯出整個資料庫  
  157. exec file2table ’zj’,’’,’’,’xzkh_sa’,’C:/docman’,1  
  158. --匯入呼叫示例  
  159. ----匯入單個表  
  160. exec file2table ’zj’,’’,’’,’xzkh_sa..地區資料’,’c:/zj.txt’,0  
  161. ----匯入整個資料庫  
  162. exec file2table ’zj’,’’,’’,’xzkh_sa’,’C:/docman’,0  
  163. */  
  164. if exists(select 1 from sysobjects where name=’File2Table’ and objectproperty(id,’IsProcedure’)=1)  
  165. drop procedure File2Table  
  166. go  
  167. create procedure File2Table  
  168. @servername varchar(200) --伺服器名  
  169. ,@username varchar(200) --使用者名稱,如果用NT驗證方式,則為空’’  
  170. ,@password varchar(200) --密碼  
  171. ,@tbname varchar(500) --資料庫.dbo.表名,如果不指定:.dbo.表名,則匯出資料庫的所有使用者表  
  172. ,@filename varchar(1000) --匯入/匯出路徑/檔名,如果@tbname引數指明是匯出整個資料庫,則這引數是檔案存放路徑,檔名自動用表名.txt  
  173. ,@isout bit --1為匯出,0為匯入  
  174. as  
  175. declare @sql varchar(8000)  
  176. if @tbname like ’%.%.%’ --如果指定了表名,則直接匯出單個表  
  177. begin  
  178. set @sql=’bcp ’[email protected]  
  179. +case when @isout=1 then ’ out ’ else ’ in ’ end  
  180. +’ "’[email protected]+’" /w’  
  181. +’ /S ’[email protected]  
  182. +case when isnull(@username,’’)=’’ then ’’ else ’ /U ’[email protected] end  
  183. +’ /P ’+isnull(@password,’’)  
  184. exec master..xp_cmdshell @sql
  185. end  
  186. else  
  187. begin --匯出整個資料庫,定義遊標,取出所有的使用者表  
  188. declare @m_tbname varchar(250)  
  189. if right(@filename,1)<>’/’ set @[email protected]+’/’  
  190. set @m_tbname=’declare #tb cursor for select name from ’[email protected]+’..sysobjects where xtype=’’U’’’  
  191. exec(@m_tbname)  
  192. open #tb  
  193. fetch next from #tb into @m_tbname  
  194. while @@fetch_status=0  
  195. begin  
  196. set @sql=’bcp ’[email protected]+’..’

    相關推薦

    常用SQL語句例項過濾刪除重複資料匯入匯出資料

    本文整理一些常用的SQL語句例項(如過濾重複資料、刪除重複資料、匯入匯出資料等),收藏備用,不斷更新中……。歡迎訪問作者網站獲取最新版:http://hi.wonsoft.cn -------------------------------第一部份 高階技巧-------

    Oracle系統表整理+常用SQL語句收集轉載

    原文:https://www.cnblogs.com/jiangxinnju/p/5840420.html-- DBA/ALL/USER/V_$/GV_$/SESSION/INDEX開頭的絕大部分都是檢視 -- DBA_TABLES意為DBA擁有的或可以訪問的所有的關係表。 -- ALL_TABLES意

    Qt5佈局管理例項程式碼簡介

    一、例項效果                                                       (a)“基本資訊頁面”                                                        (b)"

    MyBatis常用sql語句編寫基於MySQL資料庫

    建立一張表t_user用於作示例: CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID', `

    testNG簡易教程安裝,註解,配置檔案,測試報告

    一、eclipse安裝TestNG外掛 1.線上安裝 點選eclipse頂部選單欄Help-->Install New SoftWare,再點選Add按鈕,Name:testNG,Location:http://beust.com/eclipse,等幾分鐘後出現tes

    python3繪圖示例4基於matplotlib:箱線圖散點圖

    scatter 繪圖 utf-8 show pre otto 2個 figure plot #!/usr/bin/env python# -*- coding:utf-8 -*-from matplotlib.pyplot import *x=[1,2,3,4]y=[5,4

    oracle11g 使用資料匯入/匯出資料expdp/impdp

    目標:使用oracle資料泵,將A電腦上的資料庫databaseA匯出後,再匯入到B電腦上的資料庫databaseB中。 A電腦上的操作(expdp資料匯出): 執行cmd; 登入資料庫,輸入

    50個常用sql語句資料

    Code: 50個常用SQL語句 Student(S#,Sname,Sage,Ssex) 學生表 S#學號,主鍵 Course(C#,Cname,T#) 課程表 C#課程號,主鍵 SC(S#,C#,score) 成績表 Teacher(T#,Tn

    MySQL常用操作2MySQL用戶管理常用sql語句 MySQL數據庫備份恢復

    MySQL用戶管理 MySQL用戶管理創建一個普通用戶並且授權1.grant all on *.* to 'user1' identified by 'passwd';grant all on *.* to 'user1' iden

    mysql用戶管理常用sql語句數據庫的備份

    mark ffffff sock 來源 rpm -ivh grant lease -i 安裝 一、mysql用戶管理 1、創建用戶(認用戶root,權限最高)grant all on . to ‘user1‘@‘localhost‘ identified by ‘passw

    常用SQL語句oracle1

    查詢表結構 - select COLUMN_NAME,DATA_TYPE,DATA_LENGTH from user_tab_cols where table_name='TEST'; - desc 表名; 新增列 ALTER TABLE tab

    MySQLMariaDB常用SQL語句詳解

    DDL(Data Definition Language)資料定義語言 這些語句定義了不同的資料段、 資料庫、表、列、索引等資料庫物件的定義。常用的語句關鍵字主要包括 create、drop、alter 等。 資料庫管理 --刪除資料庫 drop database if

    Mysql使用者管理常用SQL語句Mysql的備份與恢復

    12月6日任務 13.4 mysql使用者管理 13.5 常用sql語句 13.6 mysql資料庫備份恢復   MySQL使用者管理 建立使用者 指定具體ip # 這裡指定了具體的ip # *.*:第一個*表示任意的資料庫,第二

    常用SQL命令彙總-增刪改單表查詢

    一、資料庫及表的建立 資料庫操作: 1、顯示所有資料庫:Show databases; 2、建立資料庫:Create database 資料庫名; 3、刪除資料庫:Drop database 資料庫名; 表操作: CREATE TABLE 表名(  屬性名 資料表

    SQL Server 數據庫備份還原常用SQL語句註意

    設置 由於 避免 base 上線 新的 clas 斷開 無效 1.備份數據庫 backup database db_name to disk=‘d:\db_name.bak‘ with format --通過使用with format可以做到覆蓋任何現有的備

    【嘔心總結】python如何與mysql實現互動常用sql語句

    9 月初,我對 python 爬蟲 燃起興趣,但爬取到的資料多通道實時同步讀寫用檔案並不方便,於是開始用起mysql。這篇筆記,我將整理近一個月的實戰中最常用到的 mysql 語句,同時也將涉及到如何在python3中與 mysql 實現資料交換。 關於工具/庫,特別說明下: 1、我安裝了 mysql ,並直

    1.4 資料庫和常用SQL語句正文——MySQL資料庫命令和SQL語句

    前面我們已經講述了,登入時,我們使用mysql –u root –p命令進行,此時如果設定了密碼,則需要輸入密碼。 輸入密碼後即進入MySQL的操作介面,此時,命令列窗體左側顯示“mysql>”表示此時可接受mysql命令。 (1)列出全部資料庫命令 我們使用“show databases;”命令列

    常用SQL語句

    char password 所有 gen 登錄 刪除表 一個 mysqldump pda --1. 用戶 --登錄 mysql -u用戶名 -p[密碼] --修改密碼 mysqladmin -u用戶名 -p[密碼] pa

    MySQL階段二——sql語句基礎2

    mysql數據查詢操作 01.創建數據表 (02-05練習) (連接查詢練習使用) 02.單表查詢 03.分組統計 04.嵌套查詢 05.集合查詢 06.連接查詢 07.連接查詢與集合查詢的不同 數據查詢操作01.創建數據表 1)創建Student表 (2)創建Course表

    MySQL階段二——sql語句基礎3

    mysqlOutfile 註意: Insert詳解 delete和update相關 視圖 01.視圖創建 02.視圖相關定義 03.視圖創建詳解 04.刪除視圖 05.視圖查詢 06.更新視圖 07.視圖的執行過程 觸發器 01.定義觸發器 02.操作觸發器 03.註意 Outfile將