一、SQL分類 DDL—數據定義語言(CREATE,ALTER,DROP,DECLARE) DML—數據操縱語言(SELECT,DELETE,UPDATE,INSERT) DCL—數據控制語言(GRANT,REVOKE,COMMIT,ROLLBACK) 二、基礎語句 2.1、說明:創建資料庫 2.2 ...
一、SQL分類
DDL—數據定義語言(CREATE,ALTER,DROP,DECLARE)
DML—數據操縱語言(SELECT,DELETE,UPDATE,INSERT)
DCL—數據控制語言(GRANT,REVOKE,COMMIT,ROLLBACK)
二、基礎語句
2.1、說明:創建資料庫
create database db-name
2.2、說明:刪除資料庫
drop database db-name
2.3、說明:備份sql server
--- 創建 備份
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat'
--- 開始 備份
BACKUP DATABASE pubs TO testBack
2.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
2.5、說明:刪除新表
drop table tabname
2.6、說明:增加一個列
Alter table tabname add column col type
註:列增加後將不能刪除。DB2中列加上後數據類型也不能改變,唯一能改變的是增加varchar類型的長度。
2.7、說明:添加/刪除主鍵
Alter table tabname add primary key(col)
Alter table tabname drop primary key(col)
2.8、說明:創建/刪除索引
create [unique] index idxname on tabname(col….)
drop index idxname
註:索引是不可更改的,想更改必須刪除重新建。
2.9、說明:創建/刪除視圖
create view viewname as select statement
drop view viewname
2.10、說明:基本sql語句選擇
查詢:select * from table1 where 範圍
插入:insert into table1(field1,field2) s(1,2)
刪除:delete from table1 where 範圍
更新:update table1 set field1=1 where 範圍
查找:select * from table1 where field1 like ’%1%’ ---like的語法
排序:select * from table1 order by field1,field2 [desc]
總數:select count * as totalcount from table1
求和:select sum(field1) as sum from table1
平均:select avg(field1) as avg from table1
最大:select max(field1) as max from table1
最小:select min(field1) as min from table1
2.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),不消除重覆行。
註:使用運算詞的幾個查詢結果行必須是一致的。
2.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: 全外連接:不僅包括符號連接表的匹配行,還包括兩個連接表中的所有記錄。
補充:
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
光碟 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
三、sql技巧
3.1、如何刪除一個表中重覆的記錄?
create table a_dist(id int,name varchar(20)) insert into a_dist values(1,'abc') insert into a_dist values(1,'abc') insert into a_dist values(1,'abc') insert into a_dist values(1,'abc') exec up_distinct 'a_dist','id' select * from a_dist
存儲過程如下:
1 create procedure up_distinct(@t_name varchar(30),@f_key varchar(30)) 2 --f_key表示是分組欄位﹐即主鍵欄位 3 4 as 5 begin 6 declare @max integer,@id varchar(30) ,@sql varchar(7999) ,@type integer 7 select @sql = 'declare cur_rows cursor for select '+@f_key+' ,count(*) from ' +@t_name +' group by ' +@f_key +' having count(*) > 1' 8 exec(@sql) 9 10 open cur_rows 11 fetch cur_rows into @id,@max 12 13 while @@fetch_status=0 14 begin 15 select @max = @max -1 16 set rowcount @max 17 select @type = xtype from syscolumns where id=object_id(@t_name) and name=@f_key 18 if @type=56 19 select @sql = 'delete from '+@t_name+' where ' + @f_key+' = '+ @id 20 if @type=167 21 select @sql = 'delete from '+@t_name+' where ' + @f_key+' = '+''''+ @id +'''' 22 exec(@sql) 23 24 fetch cur_rows into @id,@max 25 end 26 27 close cur_rows 28 deallocate cur_rows 29 30 set rowcount 0 31 end 32 33 select * from systypes 34 select * from syscolumns where id = object_id('a_dist')View Code
3.2、查詢數據的最大排序問題(只能用一條語句寫)
CREATE TABLE hard (qu char (11) ,co char (11) ,je numeric(3, 0)) insert into hard values ('A','1',3) insert into hard values ('A','2',4) insert into hard values ('A','4',2) insert into hard values ('A','6',9) insert into hard values ('B','1',4) insert into hard values ('B','2',5) insert into hard values ('B','3',6) insert into hard values ('C','3',4) insert into hard values ('C','6',7) insert into hard values ('C','2',3)
要求查詢出來的結果如下:
qu co je
----------- ----------- -----
A 6 9
A 2 4
B 3 6
B 2 5
C 6 7
C 3 4
就是要按qu分組,每組中取je最大的前2位,且只能用一句sql語句。
select * from hard a where je in (select top 2 je from hard b where a.qu=b.qu order by je)
3.3、求刪除重覆記錄的sql語句
怎樣把具有相同欄位的記錄刪除,只留下一條。
例如,表test里有id,name欄位
如果有name相同的記錄 只留下一條,其餘的刪除。
name的內容不定,相同的記錄數不定。
==============================
一個完整的解決方案:
1)將重覆的記錄記入temp1表: select [標誌欄位id],count(*) into temp1 from [表名] group by [標誌欄位id] having count(*)>1 2)將不重覆的記錄記入temp1表: insert temp1 select [標誌欄位id],count(*) from [表名] group by [標誌欄位id] having count(*)=1 3)作一個包含所有不重覆記錄的表: select * into temp2 from [表名] where 標誌欄位id in(select 標誌欄位id from temp1) 4)刪除重覆表: delete [表名] 5)恢復表: insert [表名] select * from temp2 6)刪除臨時表: drop table temp1 drop table temp2
3.4、行列轉換--普通
假設有張學生成績表(CJ)如下
Name Subject Result
張三 語文 80
張三 數學 90
張三 物理 85
李四 語文 85
李四 數學 92
李四 物理 82
想變成
姓名 語文 數學 物理
張三 80 90 85
李四 85 92 82
declare @sql varchar(4000) set @sql = 'select Name'
select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']' from (select distinct Subject from CJ) as a
select @sql = @sql+' from test group by name' exec(@sql)
3.5、行列轉換--合併
有表A,
id pid
1 1
1 2
1 3
2 1
2 2
3 1
如何化成表B:
id pid
1 1,2,3
2 1,2
3 1
創建一個合併的函數
create function fmerg(@id int) returns varchar(8000) as begin declare @str varchar(8000) set @str='' select @str=@str+','+cast(pid as varchar) from 表A where id=@id set @str=right(@str,len(@str)-1) return(@str) End go
調用自定義函數得到結果
select distinct id,dbo.fmerg(id) from 表A
3.6、如何取得一個數據表的所有列名
先從SYSTEMOBJECT系統表中取得數據表的SYSTEMID,然後再SYSCOLUMN表中取得該數據表的所有列名。
SQL語句如下:
declare @objid int,@objname char(40) set @objname = 'tablename'
select @objid = id from sysobjects where id = object_id(@objname) select 'Column_name' = name from syscolumns where id = @objid order by colid
或
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ='users'
3.7、通過SQL語句來更改用戶的密碼
修改別人的,需要sysadmin role EXEC sp_password NULL, 'newpassword', 'User' 如果帳號為SA執行 EXEC sp_password NULL, 'newpassword', sa
3.8、怎麼判斷出一個表的哪些欄位不允許為空
select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where IS_NULLABLE='NO' and TABLE_NAME=tablename
3.9、如何在資料庫里找到含有相同欄位的表
a. 查已知列名的情況
SELECT b.name as TableName,a.name as columnname From syscolumns a INNER JOIN sysobjects b ON a.id=b.id AND b.type='U' AND a.name='欄位名'
b.未知列名查所有在不同表出現過的列名
Select o.name As tablename,s1.name As columnname From syscolumns s1, sysobjects o Where s1.id = o.id And o.type = 'U' And Exists ( Select 1 From syscolumns s2 Where s1.name = s2.name And s1.id <> s2.id )
3.10、查詢第xxx行數據
假設id是主鍵:
select * from (select top xxx * from yourtable) aa where not exists(select 1 from (select top xxx-1 * from yourtable) bb where aa.id=bb.id)
如果使用游標也是可以的
fetch absolute [number] from [cursor_name]
註:行數為絕對行數