天天看點

Ms sql sql server 基本常用的Sql語句

來自: http://blog.csdn.net/hanghwp/archive/2007/05/06/1597672.aspx

下列語句部分是Mssql語句,不可以在access中使用。

SQL分類: 

DDL—資料定義語言( CREATE , ALTER , DROP , DECLARE ) 

DML—資料操縱語言( SELECT , DELETE , UPDATE , INSERT ) 

DCL—資料控制語言( GRANT , REVOKE , COMMIT , ROLLBACK )

首先,簡要介紹基礎語句:

1 、說明:建立資料庫

CREATE   DATABASE   database - name 

2 、說明:删除資料庫

drop   database  dbname

3 、說明:備份sql server

-- - 建立 備份資料的 device

USE  master

EXEC  sp_addumpdevice  ' disk ' ,  ' testBack ' ,  ' c:mssql7backupMyNwind_1.dat '

-- - 開始 備份

BACKUP   DATABASE  pubs  TO  testBack 

4 、說明:建立新表

create   table  tabname(col1 type1  [ not null ]   [ primary key ] ,col2 type2  [ not null ] ,..)

根據已有的表建立新表: 

A: create   table  tab_new  like  tab_old (使用舊表建立新表)

B: create   table  tab_new  as   select  col1,col2…  from  tab_old definition  only

5 、說明:删除新表drop  table  tabname 

6 、說明:增加一個列

Alter   table  tabname  add   column  col type

注:列增加後将不能删除。DB2中列加上後資料類型也不能改變,唯一能改變的是增加varchar類型的長度。

7 、說明:添加主鍵:  Alter   table  tabname  add   primary   key (col) 

說明:删除主鍵:  Alter   table  tabname  drop   primary   key (col) 

8 、說明:建立索引: create   [ unique ]   index  idxname  on  tabname(col….) 

删除索引: drop   index  idxname

注:索引是不可更改的,想更改必須删除重建立。

9 、說明:建立視圖: create   view  viewname  as   select  statement 

删除視圖: drop   view  viewname

10 、說明:幾個簡單的基本的sql語句

選擇: select   *   from  table1  where  範圍

插入: insert   into  table1(field1,field2)  values (value1,value2)

删除: delete   from  table1  where  範圍

更新: update  table1  set  field1 = value1  where  範圍

查找: select   *   from  table1  where  field1  like  ’ % value1 % ’  -- -like的文法很精妙,查資料!

排序: select   *   from  table1  order   by  field1,field2  [ desc ]

總數: select   count   as  totalcount  from  table1

求和: select   sum (field1)  as  sumvalue  from  table1

平均: select   avg (field1)  as  avgvalue  from  table1

最大: select   max (field1)  as  maxvalue  from  table1

最小: select   min (field1)  as  minvalue  from  table1

11 、說明:幾個進階查詢運算詞

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 ),不消除重複行。 

注:使用運算詞的幾個查詢結果行必須是一緻的。 

12 、說明:使用外連接配接 

A、 left   outer   join : 

左外連接配接(左連接配接):結果集幾包括連接配接表的比對行,也包括左連接配接表的所有行。 

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

B: right   outer   join : 

右外連接配接(右連接配接):結果集既包括連接配接表的比對連接配接行,也包括右連接配接表的所有行。 

C: full   outer   join : 

全外連接配接:不僅包括符号連接配接表的比對行,還包括兩個連接配接表中的所有記錄。

其次,大家來看一些不錯的sql語句

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  b;

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  and  time2

select  a,b,c,  from  table1  where  a  not   between  數值1  and  數值2

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

CD光牒 B  2

CD光牒 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

  

随機選擇資料庫記錄的方法(使用Randomize函數,通過SQL語句實作)

  對存儲在資料庫中的資料來說,随機數特性能給出上面的效果,但它們可能太慢了些。你不能要求ASP“找個随機數”然後列印出來。實際上常見的解決方案是建立如下所示的循環: 

Randomize 

RNumber  =   Int (Rnd * 499 )  + 1  

 

While   Not  objRec.EOF 

If  objRec("ID")  =  RNumber  THEN  

... 這裡是執行腳本 ... 

end   if  

objRec.MoveNext 

Wend 

 

  這很容易了解。首先,你取出1到500範圍之内的一個随機數(假設500就是資料庫内記錄的總數)。然後,你周遊每一記錄來測試ID 的值、檢查其是否比對RNumber。滿足條件的話就執行由THEN 關鍵字開始的那一塊代碼。假如你的RNumber 等于495,那麼要循環一遍資料庫花的時間可就長了。雖然500這個數字看起來大了些,但相比更為穩固的企業解決方案這還是個小型資料庫了,後者通常在一個資料庫内就包含了成千上萬條記錄。這時候不就死定了? 

  采用SQL,你就可以很快地找出準确的記錄并且打開一個隻包含該記錄的recordset,如下所示: 

Randomize 

RNumber  =   Int (Rnd * 499 )  +   1  

 

sql  =  " SELECT   *   FROM  Customers  WHERE  ID  =  "  &  RNumber 

 

set  objRec  =  ObjConn. Execute (SQL) 

Response.WriteRNumber  &  "  =  "  &  objRec("ID")  &  " "  &  objRec("c_email") 

 

  不必寫出RNumber 和ID,你隻需要檢查比對情況即可。隻要你對以上代碼的工作滿意,你自可按需操作“随機”記錄。Recordset沒有包含其他内容,是以你很快就能找到你需要的記錄這樣就大大降低了處理時間。 

再談随機數 

  現在你下定決心要榨幹Random 函數的最後一滴油,那麼你可能會一次取出多條随機記錄或者想采用一定随機範圍内的記錄。把上面的标準Random 示例擴充一下就可以用SQL應對上面兩種情況了。 

  為了取出幾條随機選擇的記錄并存放在同一recordset内,你可以存儲三個随機數,然後查詢資料庫獲得比對這些數字的記錄: 

sql  =  " SELECT   *   FROM  Customers  WHERE  ID  =  "  &  RNumber  &  "  OR  ID  =  "  &  RNumber2  &  "  OR  ID  =  "  &  RNumber3 

 

  假如你想選出10條記錄(也許是每次頁面裝載時的10條連結的清單),你可以用BETWEEN 或者數學等式選出第一條記錄和适當數量的遞增記錄。這一操作可以通過好幾種方式來完成,但是  SELECT  語句隻顯示一種可能(這裡的ID 是自動生成的号碼): 

sql  =  " SELECT   *   FROM  Customers  WHERE  ID  BETWEEN  "  &  RNumber  &  "  AND  "  &  RNumber  &  " +   9 " 

  注意:以上代碼的執行目的不是檢查資料庫内是否有9條并發記錄。

 

随機讀取若幹條記錄,測試過

Access文法: SELECT   top   10   *   From  表名  ORDER   BY  Rnd(id)

sql server: select   top  n  *   from  表名  order   by   newid ()

mysqlelect  *   From  表名  Order   By   rand () Limit n

Access左連接配接文法(最近開發要用左連接配接,Access幫助什麼都沒有,網上沒有Access的SQL說明,隻有自己測試, 現在記下以備後查)

文法elect table1.fd1,table1,fd2,table2.fd2  From  table1  left   join  table2  on  table1.fd1,table2.fd1  where  ...

使用SQL語句 用...代替過長的字元串顯示

文法:

SQL資料庫: select   case   when   len (field) > 10   then   left (field, 10 ) + ' ... '   else  field  end   as  news_name,news_id  from  tablename

Access資料庫: SELECT  iif( len (field) > 2 , left (field, 2 ) + ' ... ' ,field)  FROM  tablename; 

 

Conn.Execute說明

Execute方法

  該方法用于執行SQL語句。根據SQL語句執行後是否傳回記錄集,該方法的使用格式分為以下兩種:

1 .執行SQL查詢語句時,将傳回查詢得到的記錄集。用法為:

     Set  對象變量名 = 連接配接對象. Execute ("SQL 查詢語言")

   Execute方法調用後,會自動建立記錄集對象,并将查詢結果存儲在該記錄對象中,通過Set方法,将記錄集賦給指定的對象儲存,以後對象變量就代表了該記錄集對象。

2 .執行SQL的操作性語言時,沒有記錄集的傳回。此時用法為:

    連接配接對象. Execute  "SQL 操作性語句"  [ , RecordAffected ][ , Option ]

      ·RecordAffected 為可選項,此出可放置一個變量,SQL語句執行後,所生效的記錄數會自動儲存到該變量中。通過通路該變量,就可知道SQL語句隊多少條記錄進行了操作。

      · Option  可選項,該參數的取值通常為adCMDText,它用于告訴ADO,應該将Execute方法之後的第一個字元解釋為指令文本。通過指定該參數,可使執行更高效。

BeginTrans、RollbackTrans、CommitTrans方法

  這三個方法是連接配接對象提供的用于事務處理的方法。BeginTrans用于開始一個事物;RollbackTrans用于復原事務;CommitTrans用于送出所有的事務處理結果,即确認事務的處理。

  事務處理可以将一組操作視為一個整體,隻有全部語句都成功執行後,事務處理才算成功;若其中有一個語句執行失敗,則整個處理就算失敗,并恢複到處裡前的狀态。

  BeginTrans和CommitTrans用于标記事務的開始和結束,在這兩個之間的語句,就是作為事務處理的語句。判斷事務處理是否成功,可通過連接配接對象的Error集合來實作,若Error集合的成員個數不為0,則說明有錯誤發生,事務處理失敗。Error集合中的每一個Error對象,代表一個錯誤資訊。