SQL 語句收集

說明:複製表(只複製結構,源表名:a,新表名:b)
SQL: select * into b from a where 1<>1;

說明:拷貝表(拷貝數據,源表名:a,目標表名:b)
SQL: insert into b(a, b, c) select d, e, f from b;

說明:顯示文章、提交人和最後回覆時間
SQL: select a.title, a.username, b.adddate
     from table a,(
          select max(adddate) adddate
          from table where table.title=a.title) b

說明:外連接查詢(表名1:a,表名2:b)
SQL: select a.a, a.b, a.c, b.c, b.d, b.f
     from a LEFT OUT JOIN b ON a.a = b.c;

說明:日程安排提前五分鐘提醒
SQL: select *
     from 日程安排
     where datediff(’’minute’’, f開始時間, getdate())>5

說明:兩張關聯表,刪除主表中已經在副表中沒有的信息
SQL: delete from info
     where not exists(
           select *
           from infobz
           where info.infid=infobz.infid );


1.按姓氏筆畫排序:
Select * From TableName order By CustomerName Collate Chinese_PRC_Stroke_ci_as

2.分頁SQL語句
select * from(select (row_number() OVER (ORDER BY tab.ID Desc)) as rownum,tab.* from 表名 As tab) As t where rownum between 起始位置 And 結束位置

3.獲取當前數據庫中的所有用戶表
select * from sysobjects where xtype='U' and category=0

4.獲取某一個表的所有字段
select name from syscolumns where id=object_id('表名')

5.查看與某一個表相關的視圖、存儲過程、函數
select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%表名%'

6.查看當前數據庫中所有存儲過程
select name as 存儲過程名稱 from sysobjects where xtype='P'

7.查詢用戶創建的所有數據庫
select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa')
或者
select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01

8.查詢某一個表的字段和數據類型
select column_name,data_type from information_schema.columns
where table_name = '表名'

9.使用事務
在使用一些對數據庫表的臨時的SQL語句操作時,可以採用SQL SERVER事務處理,防止對數據操作後發現誤操作問題
開始事務
Begin tran
  Insert Into TableName Values(…)
SQL語句操作不正常,則回滾事務。
回滾事務
Rollback tran
SQL語句操作正常,則提交事務,數據提交至數據庫。
提交事務
Commit tran
10. 按全文匹配方式查詢
字段名 LIKE N'%[^a-zA-Z0-9]China[^a-zA-Z0-9]%'
or 字段名 LIKE N'%[^a-zA-Z0-9]China'
or 字段名 LIKE N'China[^a-zA-Z0-9]%'
or 字段名 LIKE N'China

11.計算執行SQL語句查詢時間
declare @d datetime
set @d=getdate()
select * from SYS_ColumnProperties select [語句執行花費時間(毫秒)]=datediff(ms,@d,getdate())

12、說明:幾個高級查詢運算詞
A: UNION 運算符
UNION 運算符通過組合其他兩個結果表(例如 TABLE1 和 TABLE2)並消去表中任何重複行而派生出一個結果表。當 ALL 隨 UNION 一起使用時(即 UNION ALL),不消除重複行。兩種情況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。
B: EXCEPT 運算符
EXCEPT 運算符通過包括所有在 TABLE1 中但不在 TABLE2 中的行並消除所有重複行而派生出一個結果表。當 ALL 隨 EXCEPT 一起使用時 (EXCEPT ALL),不消除重複行。
C: INTERSECT 運算符
INTERSECT 運算符通過只包括 TABLE1 和 TABLE2 中都有的行並消除所有重複行而派生出一個結果表。當 ALL 隨 INTERSECT 一起使用時 (INTERSECT ALL),不消除重複行。


計算一個庫裏各個表的記錄總數:
select b.name,a.rowcnt from sysindexes a,sysobjects b
where a.id=b.id and a.indid<2 and b.xtype='u'

--統計數據庫裏每個表的詳細情況
   EXEC sp_MSforeachtable @command1="sp_spaceused '?'"

   --獲得每個表的記錄數和容量:
   EXEC sp_MSforeachtable @command1="print '?'",
        @command2="sp_spaceused '?'",
        @command3= "Select count(*) FROM ? "



DECLARE @dt datetime
SET @dt=GETDATE()

DECLARE @number int
SET @number=3

--1.指定日期該年的第一天或最後一天
--A. 年的第一天
Select CONVERT(char(5),@dt,120)+'1-1'

--B. 年的最後一天
Select CONVERT(char(5),@dt,120)+'12-31'


--2.指定日期所在季度的第一天或最後一天
--A. 季度的第一天
Select CONVERT(datetime,
    CONVERT(char(8),
        DATEADD(Month,
            DATEPART(Quarter,@dt)*3-Month(@dt)-2,
            @dt),
        120)+'1')

--B. 季度的最後一天(CASE判斷法)
Select CONVERT(datetime,
    CONVERT(char(8),
        DATEADD(Month,
            DATEPART(Quarter,@dt)*3-Month(@dt),
            @dt),
        120)
    +CASE WHEN DATEPART(Quarter,@dt) in(1,4)
        THEN '31'ELSE '30' END)

--C. 季度的最後一天(直接推算法)
Select DATEADD(Day,-1,
    CONVERT(char(8),
        DATEADD(Month,
            1+DATEPART(Quarter,@dt)*3-Month(@dt),
            @dt),
        120)+'1')


--3.指定日期所在月份的第一天或最後一天
--A. 月的第一天
Select CONVERT(datetime,CONVERT(char(8),@dt,120)+'1')

--B. 月的最後一天
Select DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1,@dt),120)+'1')

--C. 月的最後一天(容易使用的錯誤方法)
Select DATEADD(Month,1,DATEADD(Day,-DAY(@dt),@dt))


--4.指定日期所在周的任意一天
Select DATEADD(Day,@number-DATEPART(Weekday,@dt),@dt)


--5.指定日期所在周的任意星期幾
--A.  星期天做爲一週的第1天
Select DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-1)%7,@dt)

--B.  星期一做爲一週的第1天
Select DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-2)%7-1,@dt)



1 :普通SQL語句可以用exec執行

Select * from tableName
exec('select * from tableName')
exec sp_executesql N'select * from tableName' -- 請注意字符串前一定要加N

2:字段名,表名,數據庫名之類作爲變量時,必須用動態SQL

declare @fname varchar(20)
set @fname = 'FiledName'
Select @fname from tableName -- 錯誤,不會提示錯誤,但結果爲固定值FiledName,並非所要。
exec('select ' + @fname + ' from tableName') -- 請注意 加號前後的 單引號的邊上加空格

當然將字符串改成變量的形式也可
declare @fname varchar(20)
set @fname = 'FiledName' --設置字段名

declare @s varchar(1000)
set @s = 'select ' + @fname + ' from tableName'
exec(@s) -- 成功
exec sp_executesql @s -- 此句會報錯

declare @s Nvarchar(1000) -- 注意此處改爲nvarchar(1000)
set @s = 'select ' + @fname + ' from tableName'
exec(@s) -- 成功
exec sp_executesql @s -- 此句正確

3. 輸出參數
declare @num int, @sqls nvarchar(4000)
set @sqls='select count(*) from tableName'
exec(@sqls)

--如何將exec執行結果放入變量中?

declare @num int, @sqls nvarchar(4000)
set @sqls='select @a=count(*) from tableName '
exec sp_executesql @sqls,N'@a int output',@num output
select @num


1 :普通SQL語句可以用Exec執行      例:      Select * from tableName
                Exec('select * from tableName')
                Exec sp_executesql N'select * from tableName'    -- 請注意字符串前一定要加N

2:字段名,表名,數據庫名之類作爲變量時,必須用動態SQL

    錯誤:       declare @fname varchar(20)
                set @fname = 'FiledName'
                Select @fname from tableName              -- 錯誤,不會提示錯誤,但結果爲固定值FiledName,並非所要。
    正確:      Exec('select ' + @fname + ' from tableName')     -- 請注意加號前後的單引號的邊上加空格

    當然將字符串改成變量的形式也可
                declare @fname varchar(20)
                set @fname = 'FiledName' --設置字段名

                declare @s varchar(1000)
                set @s = 'select ' + @fname + ' from tableName'
                Exec(@s)                -- 成功
                exec sp_executesql @s   -- 此句會報錯

              --注:@s參數必須爲ntext或nchar或nvarchar類型,必須將declare @s varchar(1000) 改爲declare @s Nvarchar(1000)



               如下:
                declare @s Nvarchar(1000) -- 注意此處改爲nvarchar(1000)

                set @fname = 'FiledName' --設置字段名
                set @s = 'select ' + @fname + ' from tableName'
                Exec(@s)                -- 成功    
                exec sp_executesql @s   -- 此句正確

3. 輸入或輸出參數

      (1)輸入參數:
          declare @QueryString nvarchar(1000) --動態查詢語句變量(注:必須爲ntext或nchar哐nvarchar類型,不能是varchar類型)
          declare @paramstring nvarchar(200) --設置動態語句中的參數的字符串(注:必須爲ntext或nchar哐nvarchar類型,不能是varchar類型)
          declare @input_id int--定義需傳入動態語句的參數的值

          set @QueryString='select * from tablename  where id=@id'  --id爲字段名,@id爲要傳入的參數
          set @paramstring='@id int' --設置動態語句中參數的定義的字符串
          set @input_id =1  --設置需傳入動態語句的參數的值爲1
          exec sp_executesql @querystring,@paramstring,@id=@input_id  
          若有多個參數:
          declare @QueryString nvarchar(1000) --動態查詢語句變量(注:必須爲ntext或nchar哐nvarchar類型,不能是varchar類型)
          declare @paramstring nvarchar(200) --設置動態語句中的參數的字符串(注:必須爲ntext或nchar哐nvarchar類型,不能是varchar類型)
          declare @input_id int--定義需傳入動態語句的參數的值,參數1
          declare @input_name varchar(20)--定義需傳入動態語句的參數的值,參數2

          set @QueryString='select * from tablename  where id=@id and name=@name'   --id與name爲字段名,@id與@name爲要傳入的參數
          set @paramstring='@id int,@name varchar(20)' --設置動態語句中參數的定義的字符串,多個參數用","隔開
          set @input_id =1  --設置需傳入動態語句的參數的值爲1
          set @input_name='張三'   --設置需傳入動態語句的參數的值爲"張三"
          exec sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name --請注意參數的順序
     (2)輸出參數
             declare @num int, @sqls nvarchar(4000)
            set @sqls='select count(*) from tableName'
            exec(@sqls)
        --如何將exec執行結果放入變量中?          
        declare @QueryString nvarchar(1000) --動態查詢語名變量(注:必須爲ntext或nchar哐nvarchar類型,不能是varchar類型)
        declare @paramstring nvarchar(200) --設置動態語句中的參數的字符串(注:必須爲ntext或nchar哐nvarchar類型,不能是varchar類型)
        declare @output_result int--查詢結果賦給@output_result

        set @QueryString='select @totalcount=count(*) from tablename' --@totalcount 爲輸出結果參數
        set @paramstring='@totalcount int output' --設置動態語句中參數的定義的字符串,多個參數用","隔開
        exec sp_executesql @querystring,@paramstring,@totalcount=@output_result output
        select @output_result
        當然,輸入與輸出參數可以一起使用,大家可以自己去試一試。
        另外,動態語句查詢的結果集要輸出的話,我只想到以下用臨時表的方法,不知各位有沒有更好的方法.
        IF object_id('[tempdb].[dbo].#tmp') IS NOT NULL --判斷臨時表#tmp是否存在,存在則刪除
            drop table #tmp
        select * into #tmp from tablename where 1=2 --創建臨時表#tmp,其結構與tablename相同

        declare @QueryString nvarchar(1000) --動態查詢語名變量(注:必須爲ntext或nchar哐nvarchar類型,不能是varchar類型)
        set @QueryString='select * from tablename '
        insert into #tmp(field1,field2,...) exec(@querystirng)




1、說明:複製表(只複製結構,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1 <>1
法二:select top 0 * into b from a

2、說明:拷貝表(拷貝數據,源表名:a 目標表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from a;

3、說明:跨數據庫之間表的拷貝(具體數據使用絕對路徑) (Access可用)
insert into b(a, b, c) select d,e,f from b in ‘具體數據庫’ where 條件
例子:..from b in '"&Server.MapPath(".")&"/data.mdb" &"' where..

4、說明:子查詢(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

5、說明:顯示文章、提交人和最後回覆時間
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

6、說明:外連接查詢(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

7、說明:在線視圖查詢(表名1:a )
select * from (Select a,b,c FROM a) T where t.a > 1;

8、說明:between的用法,between限制查詢數據範圍時包括了邊界值,not between不包括
select * from table1 where time between time1

9、說明:in 的使用方法
select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

10、說明:兩張關聯表,刪除主表中已經在副表中沒有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

11、說明:四表聯查問題:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

12、說明:日程安排提前五分鐘提醒
SQL: select * from 日程安排 where datediff('minute',f開始時間,getdate())>5

13、說明:一條sql 語句搞定數據庫分頁
select top 10 b.* from (select top 20 主鍵字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主鍵字段 = a.主鍵字段 order by a.排序字段

14、說明:前10條記錄
select top 10 * form table1 where 範圍

15、說明:選擇在每一組b值相同的數據中對應的a最大的記錄的所有信息(類似這樣的用法可以用於論壇每月排行榜,每月熱銷產品分析,按科目成績排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

16、說明:包括所有在 TableA 中但不在 TableB和TableC 中的行並消除所有重複行而派生出一個結果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)

17、說明:隨機取出10條數據
select top 10 * from tablename order by newid()

18、說明:隨機選擇記錄
select newid()

19、說明:刪除重複記錄
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

20、說明:列出數據庫裏所有的表名
select name from sysobjects where type='U'

21、說明:列出表裏的所有的列
select name from syscolumns where id=object_id('TableName')

22、說明:列示type、vender、pcs字段,以type字段排列,case可以方便地實現多重選擇,類似select 中的case。
select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
顯示結果:
type vender pcs
電腦 A 1
電腦 A 1
光盤 B 2
光盤 A 2
手機 B 3
手機 C 3

23、說明:初始化表table1
TRUNCATE TABLE table1

24、說明:選擇從10到15的記錄
select top 5 * from (select top 15 * from table order by id asc) table_別名 order by id desc

declare @a varchar(100),@b varchar(20)
select @a='abcdefbcmnbcde',@b='bc'
select (len(@a)-len(replace(@a,@b,'')))/len(@b)

說明:選擇在每一組b值相同的數據中對應的a最大的記錄的所有信息(類似這樣的用法可以用於論壇每月排行榜,每月熱銷產品分析,按科目成績排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章