程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 用好SQL Server命令必需的“三熟”

用好SQL Server命令必需的“三熟”

編輯:關於SqlServer

SQL Server使用過程中,最難應用的是命令,雖然命令不多,但命令格式多種多樣,真要用好一條命令有效地解決一個問題確並不容易,只要做到下面的“三熟”,任何數據庫處理任務其實都顯得不那麼難了。何謂三熟呢?下面通過一個數據庫的實例來說明一下什麼是三熟。

  一熟:熟悉表及其要素

  所謂一熟,指熟悉要操作的數據庫及其表。所謂知己知彼,百戰不殆,同樣,在練習數據庫命令時要熟悉自己要操作的對象,即各種表,這個表的名字,表的各列及列的名字,列對應的數據類型,只有將這些內容都熟悉了,才可能保證後面用到命令時與真實的情況對應,使抽象的命令變得動態生動起來。

  示例表格共有三張,共同組成學生成績數據庫couser,三張表分別是Student學生表、S_Course選課表和Course課程表,這三張表的表結構分別見表1-1、表1-2和表1-3。

  

 對於上面的三張表,以第一張為例,首先要弄明白其名稱,也就是在數據庫查詢命令中要查的名稱是student,這是在命令中很重要的一個選項,只有找到表名,才可能談後面對表的操作,在命名上,要分清中文英文。另外,它由七列組成,每一列有不同的數據類型,這些也是後面對它查詢等動做操作時必須注意的,還有一點值得注意,在這張表的列中,其名稱我們用的是漢字,這在命令中要找第一列時,只要找到“學號”就可以了。

  例如:查詢計算機系的女生的學號與姓名。

  要做這個查詢動做,首先需要熟悉這張表的名字是student;另外,還需要弄明白其最後組成表的列數及其名稱,即2列,也即學號與姓名;還有最後一點,如何表達女生,這還需進一步理解這個表的“性別”列,因為男為1,女則用0表示,所以女生自然而然的就有了,即:性別=0。查詢命令也就有了:


  Select 學號,姓名
  From student
  Where 性別=0

  上面的命令非常簡單,因為只涉及一張表與一個簡單的條件,但多張表的熟悉也是在一張表基礎之上的,所以用好SQL Server的命令,首先一點是熟悉表,對各張表的要素爛熟於胸,這是對它們操作的基礎,也是用好命令的基礎。

  二熟:熟悉任務要求

  只對表與其要素熟悉還不夠,還要進一步明確相應處理任務或問題的要求,只有對要求熟悉,才能有的放矢。首要問題找到一個主要表,也就是包含最終要輸出的列的表,但往往一張表在有些問題處理中不夠,把握如下原則:如果一表可解決那最好,如果一表不能夠解決,還要通過表間相同的列找到輔助表,這些要求有的在任務中明確提出了,有的則是暗含在條件中。在熟悉上面表的過程中,還要將要求一個個理順,保證在命令中將各個項目靈活地運用上。

  示例:將計算機系,全體學生的成績設置為60分。

  此例中,首先要明確要操作的主要表一定是和“成績”相關的,三個表中只有選課表s_course中有“成績”一項,所以這個表就是主表,主要的任務就在這裡面,但這樣只將原題中的一個要求去除了,還有計算機系如何表達的問題,因為主表即s_course中壓根就沒有系的問題,所以只能再找到一個輔助表,即學生表student,這裡面有“所在系”,如何將“所在系”同“成績”建立聯系,也即兩個表之間的聯系,在兩個表中都有的列是“學號”,所以“學號”就是突破口。現在,任務中的所有要求都理順了,現在只要在命令中將上面的要求都體現出來就可以了,命令如下:


  update s_course
  set 成績=60
  where 學號 in
  ( select 學號
  from student
  where 所在系='計算機')

  當然,除了涉及兩個表,有時可能會更多,也就是涉及多個表,例如下面的示例。

  示例: 查詢“陳晨”所選修的全部課程名稱。

  這個任務中,最終選擇的是“課程名稱”,所以主表是course,但course中是沒有學生姓名的,所以沒法查學生陳晨,怎麼辦呢,只有找有“姓名”的,即student,但這個表卻不能直接與course建立聯系,所以第二步首先需要一個中轉的表s_course來完成信息的中轉,使任務中最終找到姓名一項,這裡只有通過“課程號”來建立s_course與course聯系,最通過s_course與student中共有的學號建立聯系,通過這兩次中轉,終於可以完成這項“偉大”的任務了。命令如下:

select 課程名稱
  from course
  where 課程號in
  ( select 課程號
  from s_course
  where 學號in
  (select 學號
  from student
  where 姓名='陳晨')
  )

  三熟:熟悉命令格式

  最後還有一項必須熟悉,才能更好地應用命令,即各個命令的格式,有了上面的兩熟,可以保證對於問題的精准了解,這種了解最終要讓SQL Server能夠使用,還需要命令,命令最致命的一點是其格式,死板的格式,要弄清楚這個格式中可變與不可變的部分,要弄明白這個格式對於任務各要素即二熟中提到的各要素的對應關系,只有做到這一點,才能靈活有效地使用命令,達到遇問題不慌亂,遇錯誤耐心解決,最終實現將問題解決。

  示例:查詢至少選修兩門及兩門以上課程的學生姓名、性別。

  此任務的實現,首先按前兩熟中找出相應的要素來,主表是有“姓名”,“學號”的表student,但只有些表顯然不行,因為這個表中沒有課程信息,所以不可能只通過它就能查出選修課程的學生來,選課信息在另外一個表s_course中,而這兩個表要建立聯系,必需通過“學號”來完成。使用的過程中,上述要素要很好地應用在select命令中,要和它的格式緊密相聯。在命令中,由於要用到另外一個表中的聚合信息,所以在子條件中要用到having來完成這一任務,而在主條件中只要用where就可以了,具體命令如下:


  SELECT 姓名, 性別
  FROM student
  WHERE 學號 IN
  (SELECT 學號 FROM s_course
  GROUP BY 學號 HAVING COUNT(學號)>=2)
  示例:查詢“C語言”課程獲最高分的學生姓名、性別、所在系。
  select 姓名,性別,所在系
  from student
  where 學號in
  ( select 學號
  from s_course
  where 成績in
  (select max(成績) as 最高分
  from s_course
  where 課程號in
  (select 課程號
  from course
  where 課程名稱='c語言'
  )
  )
  )

  小結

  SQL Server中的命令有許多,變化的形式也多種多樣,但只要掌握上面的“三熟”,應該可以很好地處理相應的任務,通過一熟,使操作者對操作對象即各個表有了一個透徹的了解,這種了解除了解各個列外,還要了解表的內容,這樣,對於後面的任務執行的結果就有了相應的期待,不至於命令執行了不知道結果究竟對不對。二熟可以使操作者明了當前究竟要干什麼,通過與一熟結合,可以更好地將自然語言描述的任務分割成SQL語言的各要素。而三熟則是將上面的各要素利用命令的相對固定的格式組合起來,命令是死的,命令又是活的,格式雖然多種多樣,最重要的是把握格式中可變與不變的東西,在應用中靈活掌握,使處理結果更有效。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved