今天在一個.NET群里看到有個人問如何查找到每組第一個人的全部信息,當時自己也在忙着公司的和學校的需求報告,但是自己也是希望嘗試一下的,就讓他先把數據庫給我,在完成了該完成任務的時候,我還是很樂意的幫助那些需要幫助的人了,可是還是挺悲劇的,我的Sql2008打不開他的數據庫(因為Sql2008支持智能提示,所有現在用的是Sql2008)。跟他交流了一下,才知道數據庫沒有多少數據,那我還不如自己寫腳本來解決這個問題。當然還是脫離不了互聯網的,最好把寫好的代碼和大家分享一下。
題目大概的意思是這樣的,找出每組老師(Teacher)的最大的Uid的數據。
1 --創建一個數據庫
2 CREATE DATABASE MyStudySql
3 GO
4
5 --創建表
6 CREATE TABLE DOGroupByFirstTable(
7 [Uid] INT IDENTITY NOT NULL PRIMARY KEY, --主鍵
8 Student nvarchar(10) NOT NULL, --學生姓名
9 Teacher nvarchar(10) NOT NULL --老師姓名
10 )
11 GO
12
13 --插入數據
14 INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小童','小吳');
15 GO
16 INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小童','小王');
17 GO
18 INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小童','小黃');
19 GO
20 INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小林','小吳');
21 GO
22 INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小林','小王');
23 GO
24 INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小林','小黃');
25 GO
26 INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小徐','小吳');
27 GO
28 INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小徐','小王');
29 GO
30 INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小徐','小黃');
31 GO
32 INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小黑','小吳');
33 GO
34 INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小白','小王');
35 GO
36 INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小蘭','小黃');
37 GO
38
39 --測試插入的數據
40 SELECT * FROM DOGroupByFirstTable
41
42 --查找每組老師中最大的Uid
43 SELECT *
44 FROM DOGroupByFirstTable AS temp
45 WHERE temp.Student IN
46 (SELECT TOP 1 Student
47 FROM DOGroupByFirstTable
48 WHERE temp.Teacher=[Teacher] --這里是以老師為相等,就是你需要分組的對象
49 ORDER BY [Uid] DESC --查找最大的Uid,即你需要查找的最大(或者是最小)的數據
50 )
當然問題解決了不是就完事了,你還是需要學習的是一種風格,說道風格,我想你第一個感覺就是換行和tab鍵的使用了,但這些真的是太基礎了,我這里就不介紹了。這里不知道大家注意到沒有,這里的關鍵字我都是大寫的,當然你用小寫也不會有事(因為sql不區分大小寫),但是當我們在沒有沒有軟件的幫助下,我們直接用notepad打開的話,那樣密密麻麻的代碼,我想你一定會很頭痛的吧;但當如果你用notepad打開的時候,關鍵字是大寫的,自己定義的變量首字母大寫其余小寫(我們程序員叫這種命名規范為大駝峰式),數據部分又是另一個風格,那應該是另一種感覺吧。
還有需要注意的一點是:
INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小林','小黃');
等這些語句,其實是可以簡寫的,但是我這里故意沒有簡寫,因為良好的書寫風格,可以提高移植性,當你把你的代碼移植到Oracle中后,發現這個報錯,那個報錯,你就不會為現在多花點時間注意風格而后悔了。
當然這里還是有一點不足的SELECT *這里我用的是*來代替,但是sql server在翻譯的時候,會把*轉變成我們需要查找的數據(Uid,Student,Teacher)這是需要花時間的,從性能方面考慮還是盡量不要用SELECT *了,我上面的sql腳本就不改了。
上面只不過是個人的一點意見。當然自己對sql server 也並不是高手的那種,也是有多多少少的不足,希望高手看到哪里不足之處多多指點。希望在你們的指點中我們一起成長。
如果這篇文章對你有幫助,請不要浪費你的推薦,分享是另一種快樂。