以下是我在網(wǎng)上收集的一些經(jīng)典的SQL語句。
精典的SQL語句
1. 行列轉(zhuǎn)換--普通
假設(shè)有張學(xué)生成績表(CJ)如下
Name Subject Result
張三 語文 80
張三 數(shù)學(xué) 90
張三 物理 85
李四 語文 85
李四 數(shù)學(xué) 92
李四 物理 82
想變成
姓名 語文 數(shù)學(xué) 物理
張三 80 90 85
李四 85 92 82
2. 行列轉(zhuǎn)換--合并
有表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
創(chuàng)建一個(gè)合并的函數(shù)
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

--調(diào)用自定義函數(shù)得到結(jié)果
select?distinct?id,dbo.fmerg(id)?from?表A

3. 如何取得一個(gè)數(shù)據(jù)表的所有列名
方法如下:先從SYSTEMOBJECT系統(tǒng)表中取得數(shù)據(jù)表的SYSTEMID,然后再SYSCOLUMN表中取得該數(shù)據(jù)表的所有列名。
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

4. 通過SQL語句來更改用戶的密碼
5. 怎么判斷出一個(gè)表的哪些字段不允許為空?
select?COLUMN_NAME?from?INFORMATION_SCHEMA.COLUMNS?where?IS_NULLABLE='NO'?and?TABLE_NAME=tablename?

6. 如何在數(shù)據(jù)庫里找到含有相同字段的表?
a. 查已知列名的情況
b. 未知列名查所有在不同表出現(xiàn)過的列名
7. 查詢第xxx行數(shù)據(jù)
8. SQL Server日期計(jì)算
感謝那些網(wǎng)上提供相關(guān)SQL的作者。










假設(shè)有張學(xué)生成績表(CJ)如下
Name Subject Result
張三 語文 80
張三 數(shù)學(xué) 90
張三 物理 85
李四 語文 85
李四 數(shù)學(xué) 92
李四 物理 82
想變成
姓名 語文 數(shù)學(xué) 物理
張三 80 90 85
李四 85 92 82
1
declare?@sql?varchar(4000)
2
set?@sql?=?'select?Name'
3
select?@sql?=?@sql?+?',sum(case?Subject?when?'''+Subject+'''?then?Result?end)?['+Subject+']'
4
from?(select?distinct?Subject?from?CJ)?as?a
5
select?@sql?=?@sql+'?from?test?group?by?name'
6
exec(@sql)
7

2

3

4

5

6

7

2. 行列轉(zhuǎn)換--合并
有表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















3. 如何取得一個(gè)數(shù)據(jù)表的所有列名







4. 通過SQL語句來更改用戶的密碼
1
修改別人的,需要sysadmin?role?
2
EXEC?sp_password?NULL,?'newpassword',?'User'
3
4
如果帳號為SA執(zhí)行EXEC?sp_password?NULL,?'newpassword',?sa?
5

2

3

4

5

5. 怎么判斷出一個(gè)表的哪些字段不允許為空?


6. 如何在數(shù)據(jù)庫里找到含有相同字段的表?
a. 查已知列名的情況
1
SELECT?b.name?as?TableName,a.name?as?columnname?
2
From?syscolumns?a?INNER?JOIN?sysobjects?b?
3
ON?a.id=b.id?
4
AND?b.type='U'?
5
AND?a.name='你的字段名字'?
6

2

3

4

5

6

b. 未知列名查所有在不同表出現(xiàn)過的列名
1
Select?o.name?As?tablename,s1.name?As?columnname?
2
From?syscolumns?s1,?sysobjects?o?
3
Where?s1.id?=?o.id?
4
?And?o.type?=?'U'?
5
?And?Exists?(?
6
?Select?1?From?syscolumns?s2?
7
?Where?s1.name?=?s2.name?
8
?And?s1.id?<>?s2.id?
9
?)

2

3

4

5

6

7

8

9

7. 查詢第xxx行數(shù)據(jù)
1
假設(shè)id是主鍵:?
2
select?*?
3
from?(select?top?xxx?*?from?yourtable)?aa?
4
where?not?exists(select?1?from?(select?top?xxx-1?*?from?yourtable)?bb?where?aa.id=bb.id)
5
?
6
如果使用游標(biāo)也是可以的?
7
fetch?absolute?[number]?from?[cursor_name]?
8
行數(shù)為絕對行數(shù)
9

2

3

4

5

6

7

8

9

8. SQL Server日期計(jì)算
?1
a.?一個(gè)月的第一天
?2
SELECT?DATEADD(mm,?DATEDIFF(mm,0,getdate()),?0)?
?3
b.?本周的星期一
?4
SELECT?DATEADD(wk,?DATEDIFF(wk,0,getdate()),?0)?
?5
c.?一年的第一天
?6
SELECT?DATEADD(yy,?DATEDIFF(yy,0,getdate()),?0)?
?7
d.?季度的第一天
?8
SELECT?DATEADD(qq,?DATEDIFF(qq,0,getdate()),?0)?
?9
e.?上個(gè)月的最后一天?
10
SELECT?dateadd(ms,-3,DATEADD(mm,?DATEDIFF(mm,0,getdate()),?0))?
11
f.?去年的最后一天
12
SELECT?dateadd(ms,-3,DATEADD(yy,?DATEDIFF(yy,0,getdate()),?0))?
13
g.?本月的最后一天
14
SELECT?dateadd(ms,-3,DATEADD(mm,?DATEDIFF(m,0,getdate())+1,?0))?
15
h.?本月的第一個(gè)星期一
16
select?DATEADD(wk,?DATEDIFF(wk,0,?
17
?dateadd(dd,6-datepart(day,getdate()),getdate())?
18
?),?0)?
19
i.?本年的最后一天
20
SELECT?dateadd(ms,-3,DATEADD(yy,?DATEDIFF(yy,0,getdate())+1,?0))

?2

?3

?4

?5

?6

?7

?8

?9

10

11

12

13

14

15

16

17

18

19

20

感謝那些網(wǎng)上提供相關(guān)SQL的作者。










