SGBDR en Arabe
SGBDR en Arabe
SQL
2
"ﻳﺎ ﺃﻳﻬﺎ ﺍﻟﺬﻳﻦ ﺁﻣﻨﻮﺍ ﺍﺗﻘﻮﺍ ﺍﷲ ﻭ
ﻗﻮﻟﻮﺍ ﻗﻮﻻ ﺳﺪﻳﺪﺍ .ﻳﺼﻠﺢ ﻟﻜﻢ
ﺃﻋﻤﺎﻟﻜﻢ ﻭ ﻳﻐﻔﺮ ﻟﻜﻢ ﺫﻧﻮﺑﻜﻢ ﻭﻣﻦ
ﻳﻄﻊ ﺍﷲ ﻭ ﺭﺳﻮﻟﻪ ﻓﻘﺪ ﻓﺎﺯ ﻓﻮﺯﺍ
ﻋﻈﻴﻤﺎ"
71 ﺍﻷﺣﺰﺍﺏ 70 :ﻭ
3
ﻗﺒﻞ ﺃﻥ ﻧﺒﺪﺃ
ﺍﳊﻤﺪ ﷲ ﺍﺑﺘﺪﺍﺀ ﻭﺍﻧﺘﻬﺎﺀ ،ﻭﺍﻟﺼﻼﺓ ﻭﺍﻟﺴﻼﻡ ﻋﻠﻰ ﺣﺒﻴﺒﻨﺎ ﳏﻤﺪ ﺻﻠﻰ ﺍﷲ ﻋﻠﻴﻪ ﻭﻋﻠﻰ ﺁﻟﻪ
ﻭﺻﺤﺒﻪ ﻭﺳﻠﻢ ﺗﺴﻠﻴﻤﺎ ﻛﺜﲑﺍ ﻭﺑﻌﺪ:
ﻓﺈﻧﻪ ﻣﻦ ﻏﲑ ﺍﻟﻼﺋﻖ ﺑﺄﻣﺔ ﻃﺎﳌﺎ ﲪﻠﺖ ﻣﺸﺎﻋﻞ ﺍﻟﺘﻘﺪﻡ ﻭﺍﻟﺘﻄﻮﺭ ﺃﻥ ﺗﺘﺨﻠﻒ ﻋﻦ ﺭﻛﺐ
ﺍﻟﺘﻜﻨﻮﻟﻮﺟﻴﺎ ،ﻭﺃﻥ ﺗﻨﺸﻐﻞ ﺑﺘﻮﺍﻓﻪ ﺍﻷﻣﻮﺭ ﻣﻦ ﻗﺒﻴﻞ ﻣﺎ ﺍﺻﻄﻠﺢ ﻋﻠﻴﻪ ﺑﺎﻟﻔﻦ ﻭﺍﻹﺑﺪﺍﻉ ﻭﻫﻮ
ﻟﻌﻤﺮﻱ ﻋﻦ ﺍﻟﻔﻦ ﺑﻌﻴﺪ ﺑﻌﺪ ﺍﻟﺸﺮﻕ ﻋﻦ ﺍﻟﻐﺮﺏ ،ﺣﻴﺚ ﺻﺮﻧﺎ ﻧﺮﻯ ﻛﻞ ﺍﻟﺪﻋﻢ ﻳﻮﺟﻪ ﺇﱃ ﺗﺸﺠﻴﻊ
ﺃﻫﻞ ﺍﻟﻐﻨﺎﺀ ﻭﺍﻟﺮﻗﺺ ﻭﺍﻟﻜﻮﻣﻴﺪﻳﺎ ﻭﺍﻷﺟﺪﺭ ﺃﻥ ﺗﻨﻔﻖ ﻫﺬﻩ ﺍﻷﻣﻮﺍﻝ ﻓﻴﻤﺎ ﻳﻌﻮﺩ ﻋﻠﻰ ﺍﻷﻣﺔ
ﺑﺎﻟ ﻨﻔﻊ ﻭﺍﻟﺼﻼﺡ ﻟﺘﺴﺘﻌﻴﺪ ﻣﺜﺎﺑﺘﻬﺎ ﰲ ﺍﻟﺮﻳﺎﺩﺓ ﻭﺍﻟﻘﻴﺎﺩﺓ ،ﻭﻟﻦ ﻳﺘﺄﺗﻰ ﺫﻟﻚ ﺑﻌﺪ ﺍﻟﻨﺠﻮﻡ ﻭﻻ
ﺑﺎﻧﺘﻈﺎﺭ ﻫﻄﻮﻝ ﺍﻟﺬﻫﺐ ،ﻓﺈﻥ ﺍﷲ ﺟﻞ ﻭﻋﻼ ﻻ ﻳﻐﲑ ﻣﺎ ﺑﻘﻮﻡ ﺣﱴ ﻳﻐﲑﻭﺍ ﻣﺎ ﺑﺄﻧﻔﺴﻬﻢ.
ﻋﻠﻴﻨﺎ ﻛﺄﻣﺔ ﻃﺎﳏﺔ ﻟﻔﺮﺽ ﺫﺍﺎ ﺃﻥ ﺗﻌﻤﻞ ﴿ ﻭﻗﹸﻞﹺ ﺍﻋﻤﻠﹸﻮﺍ ﻓﹶﺴﻴﺮﻯ ﺍﻟﻠﹶّﻪ ﻋﻤﻠﹶﻜﹸﻢ ﻭﺭﺳﻮﻟﹸﻪ
ﻭﺍﻟﹾﻤﺆﻣﻨﻮﻥﹶ )ﺍﻟﺘﻮﺑﺔ ﴾(105:ﰲ ﺳﺒﻴﻞ ﻗﻴﺎﻡ ﻀﺔ ﻋﻠﻤﻴﺔ .ﻗﺪ ﻳﻘﻮﻝ ﻗﺎﺋﻞ ﺑﺄﻥ ﻛﻞ ﻣﺎ ﻧﻮﺭﺩﻩ
ﺍﻵﻥ ﻫﻮ ﻣﻮﺟﻮﺩ ﻭﻗﺪ ﺳﺒﻘﻨﺎ ﺇﻟﻴﻪ ﺍﻟﻐﺮﺏ ،ﺃﻗﻮﻝ ﻟﻴﺲ ﻋﻴﺒﺎ ﺃﻥ ﻧﺒﺪﺃ ﻣﻦ ﺣﻴﺚ ﺍﻧﺘﻬﻰ ﻏﲑﻧﺎ ،ﻓﻬﻢ
ﺃﻳﻀﺎ ﺑﻨﻮﺍ ﺣﻀﺎﺭﺍﻢ ﻋﻠﻰ ﺃﻃﻼﻝ ﺣﻀﺎﺭﺍﺗﻨﺎ ﻭﻗﺪ ﺗﺮﲨﻮﺍ ﻣﻦ ﺃﻣﻬﺎﺕ ﺍﻟﻜﺘﺐ ﺍﻟﻌﻠﻤﻴﺔ ﻣﺎﺍﷲ
ﺑﻪ ﻋﻠﻴﻢ ،ﻧﺎﻫﻴﻚ ﻋ ﻦ ﺗﺰﻭﻳﺮ ﺍﳊﻘﺎﺋﻖ ﺍﻟﺬﻱ ﻗﺎﻣﻮﺍ ﺑﻪ ﻣﻦ ﻧﺴﺐ ﺑﻌﺾ ﺍﻻﻛﺘﺸﺎﻓﺎﺕ ﺇﱃ
ﻣﻐﻤﻮﺭﻳﻬﻢ ﻋﻠﻰ ﺣﺴﺎﺏ ﻓﻄﺎﺣﻠﻨﺎ.
4
ﻃﺒﻌﺎ ﻫﺬﻩ ﺍﳌﻘﺪﻣﺔ ﺑﻌﻴﺪﺓ ﻛﻞ ﺍﻟﺒﻌﺪ ﻋﻦ ﻟﻐﺔ SQLﻭﻟﻜﻦ ﻻﺑﺪ ﻣﻦ ﻫﺬﺍ ﺍﻟﺘﻤﻬﻴﺪ ﺣﱴ ﺗﺘﺤﻤﺲ
– ﻋﺰﻳﺰﻱ ﺍﻟﻘﺎﺭﺉ – ﺇﱃ ﺍﻹﺑﺪﺍﻉ ﰲ ﻫﺬﺍ ﺍﺎﻝ ﻭﺃﻻ ﺗﻜﺘﻔﻲ ﻓﻘﻂ ﺑﺎﻷﺧﺬ ﳑﺎ ﺟﺎﺀ ﰲ ﻏﻀﻮﻥ
ﺍﻟﻜﺘﺎﺏ ﺑﻞ ﻋﻠﻴﻚ ﺍﻻﺟﺘﻬﺎﺩ ﻭﺍﺳﺘﻐﻼﻝ ﻣﻠﻜﺔ ﺍﻟﺘﻔﻜﲑ.
ﻳﻨﻘﺴﻢ ﻛﺘﺎﺏ "ﺍﻟﺸﺮﺡ ﺍﻟﻮﺍﰲ ،ﻟﺘﻌﻠﻢ ﻟﻐﺔ SQLﻣﻦ ﻧﺒﻌﻬﺎ ﺍﻟﺼﺎﰲ" ﺇﱃ ﲬﺴﺔ ﻓﺼﻮﻝ ﺭﺋﻴﺴﻴﺔ.
ﺍﻟﻔﺼﻞ ﺍﻷﻭﻝ ﻭﺍﻟﺜﺎﱐ ﻳﻌﺮﺿﺎﻥ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﳌﻌﻠﻮﻣﺎﺕ ﻭﺍﻟﺘﻘﻨﻴﺎﺕ ﺍﻟﻨﻈﺮﻳﺔ ﻭﺍﻟﺮﻳﺎﺿﻴﺔ،
ﺑﻴﻨﻤﺎ ﺗﻘﻮﻡ ﺍﻟﻔﺼﻮﻝ ﺍﻟﺜﻼﺛﺔ ﺍﻷﺧﲑﺓ ﺑﻌﺮﺽ ﻣﻌﻠﻮﻣﺎﺕ ﻋﻤﻠﻴﺔ ﺗﻄﺒﻴﻘﻴﺔ ،ﺗﺪﻓﻌﻚ ﺇﱃ
ﺍﻛﺘﺴﺎﺏ ﺗﻘﻨﻴﺎﺕ ﺟﺪﻳﺪﺓ ﲣﻮﻝ ﻟﻚ ﺍﺣﺘﺮﺍﻑ ﻟﻐﺔ SQLﻣﻊ ﺑﺮﻧﺎﻣﺞ .SQL Server
ﻭﻻ ﻧﻨﺴﻰ ﻛﻤﺎ ﺟﺮﺕ ﺍﻟﻌﺎﺩﺓ ،ﺇﱃ ﺗﻨﺒﻴﻬﻜﻢ ﺑﺄﻥ ﻟﻜﻞ ﺷﻲﺀ ﺇﺫﺍ ﻣﺎ ﰎ ﻧﻘﺼﺎﻥ ،ﻭﳎﻬﻮﺩﻧﺎ ﻫﺬﺍ
ﳎﻬﻮﺩ ﺑﺸﺮﻱ ﻗﺪ ﻳﺸﻮﺑﻪ ﺍﻟﻨﻘﺺ ﻭﺍﳋﻠﻞ ﻋﻦ ﺳﻬﻮ ﺃﻭ ﻋﻦ ﺳﻮﺀ ﻓﻬﻢ ،ﻟﺬﺍ ﻧﺮﺟﻮ ﻣﻦ
ﺣﻀﺮﺍﺗﻜﻢ ﺇﻋﻼﻣﻨﺎ ﰲ ﺣﺎﻝ ﻭﺟﻮﺩ ﺃﻱ ﺷﺎﺋﺒﺔ ﺃﻭ ﺧﻄﺄ ﰲ ﻫﺬﺍ ﺍﻟﻜﺘﺎﺏ.
ﻧﺴﺄﻝ ﺍﷲ ﻋﺰ ﻭﺟﻞ ﺃﻥ ﳚﻌﻞ ﻫﺬﺍ ﺍﻟﻌﻤﻞ ﺧﺎﻟﺼﺎ ﻟﻮﺟﻬﻪ ﺍﻟﻜﺮﱘ ،ﻭﺃﻻ ﳚﻌﻞ ﻟﻠﻨﻔﺲ ﻭﻻ
ﻟﻠﻬﻮﻯ ﺣﻈﺎ ﻓﻴﻪ ،ﻛﻤﺎ ﻧﺴﺄﻟﻪ ﻋﺰ ﻭﺟﻞ ﺃﻥ ﻳﻨﻔﻊ ﻛﻞ ﻗﺎﺭﻯﺀ ﳍﺬﺍ ﺍﻟﻜﺘﺎﺏ ﻭﻟﻮ ﺑﺎﻟﱰﺭ ﺍﻟﻘﻠﻴﻞ.
ﺧﺎﻟﺪ ﺍﻟﺴﻌﺪﺍﱐ
5
ﳌﻦ ﻳﻮﺟﻪ ﻫﺬﺍ ﺍﻟﻜﺘﺎﺏ؟
ﻟﻠﺘﻮﺍﺻﻞ ﺍﳌﺒﺎﺷﺮ ﻣﻊ ﺻﺎﺣﺐ ﺍﻟﻜﺘﺎﺏ ،ﺍﻟﺘﺤﻘﻮﺍ ﺑﻨﺎ ﻋﻠﻰ ﺻﻔﺤﺔ ﺧﻄﻮﺓ ﺇﱃ ﺍﻷﻣﺎﻡ:
https://www.facebook.com/Khotwa.Amam
6
ﻣﻠﺤﻮﻇﺔ
ﻛﻞ ﺍﻷﻛﻮﺍﺩ ﺍﻟﱵ ﻳﺘﻀﻤﻨﻬﺎ
ﺍﻟﻜﺘﺎﺏ ﺷﻐﺎﻟﺔ ،%100ﻭﻟﻜﻦ
ﺍﳋﻄﺄ ﻭﺍﻟﺴﻬﻮ ﻭﺍﺭﺩ ،ﻟﺬﺍ ﻟﻮ
ﺣﺪﺙ ﻣﻌﻜﻢ ﺃﻱ ﺧﻄﺄ ﰲ ﲡﺮﻳﺐ
ﺍﻷﻭﺍﻣﺮ ﺍﻟﻮﺍﺭﺩﺓ ﰲ ﺍﻟﻜﺘﺎﺏ
ﻓﺎﻟﺘﻤﺴﻮﺍ ﱄ ﺍﳌﻌﺎﺫﻳﺮ ﻭﺭﺍﺳﻠﻮﱐ
ﺎ ﻋﻠﻰ ﺑﺮﻳﺪﻱ ﺍﻻﻟﻜﺘﺮﻭﱐ
ﺟﺎﺯﺍﻛﻢ ﺍﷲ ﺧﲑﺍ:
7
ﻛﺘﺐ ﻟﻠﻤﺆﻟﻒ
http://www.kutub.info/library/book/7076
http://www.kutub.info/library/book/11495
http://www.kutub.info/library/book/8050
http://www.kutub.info/library/book/10564
http://www.kutub.info/library/book/8305
http://www.kutub.info/library/book/7576
http://www.mediafire.com/?by3e3u4d1emvxgo
8
ﺍﻟﻔﻬﺮﺱ
9
ﺍﻟﺴﺎﺑﻘﺔ23 ........... ................................................................ ................................: ﻋﻴﻮﺏ ﻃﺮﻕ ﺍﻟﺘﺨﺰﻳﻦ
10
ﺍﻻﺳﻘﺎﻁ 34.................................................. ................................................................(π) Projection
11
ﺍﳉﺪﺍﻭﻝ 46 .................................... ................................................................ ................................ ﺇﻧﺸﺎﺀ
12
ﺍﻹﺩﺧﺎﻝ 56 ......................................................................................................................... ﺣﺬﻑ ﺧﺎﺻﻴﺎﺕ
13
67 .................................................................. ................................ SELECT TOP ﺟﺮﺩ ﺍﻷﺳﻄﺮ ﺍﻷﻭﱃ
14
77 .................................... ................................................................ ................................ SQRT ﺍﻟﺪﺍﻟﺔ
15
ﺍﻟﺪﺍﻟﺔ 88 ..................................... ................................................................................................ CAST
16
ﺍﻟﺪﻳﻜﺎﺭﰐ95 ...................................... ................................................................ ﻣﺜﺎﻝ ﻋﻦ ﻋﻤﻴﻠﺔ ﺍﳉﺪﺍﺀ
17
109 ................................................................ ................................ ................................Cursors ﺍﳌﻤﺮﺭﺍﺕ
19
ﻋﻤﻮﻣﻴﺎﺕ ﺣﻮﻝ
ﺍﻟﺒﻴﺎﻧﺎﺕ
20
ﻋﻤﻮﻣﻴﺎﺕ ﺣﻮﻝ ﺍﻟﺒﻴﺎﻧﺎﺕ
ﺍﳌﻠﻔﺎﺕ Files
ﺍﳌﻠﻒ Fileﻫﻮ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﱵ ﺗﻨﺘﻤﻲ ﺇﱃ ﻧﻔﺲ ﺍﻟﻨﻮﻉ ،ﻭﺗﻨﻘﺴﻢ ﺍﳌﻠﻔﺎﺕ ﺇﱃ
ﻧﻮﻋﲔ:
ﲣﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ
ﻳﺴﻌﻰ ﺍﻹﻧﺴﺎﻥ ﺩﺍﺋﻤﺎ ﺇﱃ ﺗﺴﻬﻴﻞ ﺍﳌﻬﺎﻡ ﻋﻠﻴﻪ ﻭﺗﻴﺴﲑ ﻛﻞ ﻋﻘﺒﺎﺕ ﺍﳊﻴﺎﺓ ،ﻓﻠﻮ ﻧﻈﺮﻧﺎ ﺇﱃ ﺃﻭﻝ
ﺇﺻﺪﺍﺭﺍﺕ ﺍﳊﻮﺍﺳﻴﺐ ﻟﻮﺟﺪﻧﺎ ﻣﺴﺎﺣﺎﺕ ﺍﻟﺘﺨﺰﻳﻦ ﻟﺪﻳﻬﺎ ﺻﻐﲑﺓ ﺟﺪﺍ ،ﻧﺎﻫﻴﻚ ﻋﻦ ﺑﻂﺀ
ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺑﺴﺒﺐ ﺿﻌﻒ ﺃﺩﺍﺀ ﺍﳊﺎﺳﻮﺏ ﻣﻦ ﺟﻬﺔ ،ﻭﺑﺴﺒﺐ ﺭﺩﺍﺀﺓ ﻧﻈﺎﻡ ﺍﻟﺘﺸﻐﻴﻞ ﻣﻦ
ﺟﺎﻧﺐ ﺁﺧﺮ ،ﻭﻟﻜﻦ ﺍﻹﻧﺴﺎﻥ ﺑﺴﺒﺐ ﻣﻠﻜﺘﻪ ﺍﻹﺑﺪﺍﻋﻴﺔ ﻓﺈﻧﻪ ﻃﻮﺭ ﻭﻣﺎﺯﺍﻝ ﻳﻄﻮﺭ ﺃﺩﺍﺀ ﺍﳊﺎﺳﻮﺏ
ﺁﻟﻴﺎ ﻭﺑﺮﳎﻴﺎ ،ﺣﱴ ﺣﺼﻠﻨﺎ ﻋﻠﻰ ﺣﻮﺍﺳﻴﺐ ﺑﻜﻔﺎﺀﺍﺕ ﻋﺎﻟﻴﺔ ﻭﺑﻄﺮﻕ ﻓﻌﺎﻟﺔ ﻭﺳﺮﻳﻌﺔ ﳊﻔﻆ
ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﻻﺳﺘﻐﻼﳍﺎ.
21
ﻛﺎﻧﺖ ﺑﺪﺍﻳﺔ ﻋﻬﺪ ﺍﻹﻧﺴﺎﻥ ﺑﺘﺨﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﰲ ﺳﻨﺔ ،1956ﺣﻴﻨﻤﺎ ﻗﺎﻡ ﺑﺎﺧﺘﺮﺍﻉ ﺍﻟﻘﺮﺹ
ﺍﻟﺼﻠﺐ ) Hard Diskﺣﺴﺐ ﻣﻮﺳﻮﻋﺔ ﻭﻳﻜﻴﺒﻴﺪﻳﺎ( ،ﻣﻨﺬ ﺫﻟﻚ ﺍﻟﻌﻬﺪ ﻭﺍﻹﻧﺴﺎﻥ ﻳﻄﻮﺭ ﻭﺳﺎﺋﻞ
ﲣﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺇﱃ ﻳﻮﻣﻨﺎ ﻫﺬﺍ.
ﺍﻟﺘﺨﺰﻳﻦ ﺍﳌﺒﺎﺷﺮ:
ﻭﻳﻜﻮﻥ ﺣﻔﻆ ﺍﻟﺒﻴﺎ ﻧﺎﺕ ﻋﻠﻰ ﺷﻜﻞ ﺃﺳﻄﺮ ﻣﺘﺘﺎﻟﻴﺔ ﰲ ﻣﻠﻔﺎﺕ ،ﻭﻳﺘﻤﻴﺰ ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﺍﻟﺘﺨﺰﻳﻦ
ﺑﺒﺴﺎﻃﺘﻪ ﻭﺳﻬﻮﻟﺘﻪ ،ﻭﻟﻜﻨﻪ ﻳﺒﻘﻰ ﺿﻌﻴﻔﺎ ﺑﺴﺒﺐ ﺻﻌﻮﺑﺔ ﺍﺳﺘﺨﺮﺍﺝ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻨﻪ ﻷﻧﻪ ﻟﻴﺴﺖ
ﻫﻨﺎﻟﻚ ﻃﺮﻳﻘﺔ ﳉﻠﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻨﻪ ﺇﻻ ﻣﻦ ﺧﻼﻝ ﺭﺗﺒﺔ ﺍﻟﺴﻄﺮ ،ﺇﺿﺎﻓﺔ ﺇﱃ ﻋﻴﺐ ﺁﺧﺮ ﻭﻫﻮ
ﺃﻧﻪ ﻳﺄﺧﺬ ﺣﺠﻤﺎ ﻛﺒﲑﺍ ،ﻭﻫﺬﺍ ﻣﺜﺎﻝ ﳍﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﺍﻟﺘﺨﺰﻳﻦ:
ﺍﻟﺘﺨﺰﻳﻦ ﺍﻟﺘﺴﻠﺴﻠﻲ:
ﺗﺘﻢ ﻋﻤﻠﻴﺔ ﺍﻟﺘﺨﺰﻳﻦ ﺑﺸﻜﻞ ﻣﺘﺴﻠﺴﻞ ،ﲝﻴﺚ ﻛﻞ ﺳﻄﺮ ﻳﻨﺘﻬﻲ ﺑﻔﺎﺻﻞ )ﻏﺎﻟﺒﺎ ﺍﻟﻔﺎﺻﻠﺔ
ﺍﻟﻌﺎﺩﻳﺔ( ﰒ ﺑﻌﺪ ﺫﻟﻚ ﻳﻠﻴﻪ ﺍﻟﺴﻄﺮ ﺍﻟﺜﺎﱐ ﻋﻠﻰ ﺍﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ:
Abu Bakr ASSIDIQ , Ômar Ibn ALKHATTAB , Ôtman Ibn AFFAN , Ali Ibn ABI TALIB
22
ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﺍﻟﺘﺨﺰﻳﻦ ﻳﺘﻤﻴﺰ ﻋﻦ ﺍﻟﺘﺨﺰﻳﻦ ﺍﳌﺒﺎﺷﺮ ﺑﻜﻮﻧﻪ ﻻ ﻳﺄﺧﺬ ﺣﺠﻤﺎ ﻛﺒﲑﺍ ،ﻭﻟﻜﻨﻪ ﻻ
ﳜﺘﻠﻒ ﻋﻨﻪ ﰲ ﻃﺮﻳﻘﺔ ﺍﻟﺒﺤﺚ ﻋﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﲝﻴﺚ ﳚﺐ ﺍﳌﺮﻭﺭ ﻋﻠﻰ ﻛﻞ ﺍﻷﺳﻄﺮ ﻣﻦ ﺍﻟﺒﺪﺍﻳﺔ
ﺇﱃ ﻏﺎﻳﺔ ﺍﻟﻌﺜﻮﺭ ﻋﻠﻰ ﺍﻟﺴﻄﺮ ﺍﳌﻨﺸﻮﺩ.
ﻭﻣﻦ ﺟﻬﺔ ﺃﺧﺮﻯ ﻣﺴﺄﻟﺔ ﲪﺎﻳﺔ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻓﻬﻲ ﻏﺎﺋﺒﺔ ،ﻓﻘﺪ ﺗﻘﻮﻡ ﲝﺬﻑ ﲣﺼﺺ ﻣﻌﲔ ﻣﻦ
ﺟﺪﻭﻝ ﺍﻟﺘﺨﺼﺼﺎﺕ ،ﻭﳍﺬﺍ ﺍﻟﺘﺨﺼﺺ ﺑﻴﺎﻧﺎﺕ ﰲ ﻣﻠﻒ ﺍﻷﺳﺎﺗﺬﺓ ﻓﺘﻜﻮﻥ ﻫﻨﺎﻟﻚ ﺑﻌﺜﺮﺓ ﻭﺧﻠﻂ
ﻟﻠﺒﻴﺎﻧﺎﺕ ،ﺃﻣﺎ ﺇﺫﺍ ﻛﺎﻥ ﺍﳌﻠﻒ ﻣﺸﺘﺮﻛﺎ ﰲ ﺷﺒﻜﺔ ﳏﻠﻴﺔ ﻓﻬﻨﺎﻟﻚ ﻣﺸﻜﻠﺔ ﻛﺒﲑﺓ ﻭﻫﻲ ﲢﺪﻳﺚ
23
ﺍﻟﺒﻴﺎﻧﺎﺕ ،ﻓﻘﺪ ﻳﺸﺘﻐﻞ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﳌﺴﺘﺨﺪﻣﲔ ﻋﻠﻰ ﻧﻔﺲ ﺍﻟﺒﻴﺎﻧﺎﺕ ﳑﺎ ﻳﺆﺩﻱ ﺇﱃ ﺧﻠﻞ ﰲ
ﺣﻔﻈﻬﺎ ،ﳍﺬﺍ ﺳﺘﺠﺪ ﺍﺳﺘﻌﻤﺎﻝ ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﲣﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻘﺘﺼﺮﺍ ﻋﻠﻰ ﺍﻟﺘﻄﺒﻴﻘﺎﺕ
ﺍﻟﺼﻐﲑﺓ.
ﻗﺎﻣﺖ ﻛﻞ ﺷﺮﻛﺔ ﻣﻨﺘﺠﺔ ﻟﱪﻧﺎﻣﺞ ﻹﺩﺍﺭﺓ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺑﺘﺨﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻋﻠﻰ ﺷﻜﻞ ﻗﻮﺍﻋﺪ
ﺑﻴﺎﻧﺎﺕ ﺗﺮﺍﺗﺒﻴﺔ ﺑ ﻨﻤﻂ ﳜﺼﻬﺎ ،ﻭﺑﺎﻟﺘﺎﱄ ﺃﺿﺤﻰ ﻣﻦ ﺍﻟﺼﻌﺐ ﺍﻹﺣﺎﻃﺔ ﺑﻜﻞ ﺑﺮﺍﻣﺞ ﺇﺩﺍﺭﺓ
ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ،ﻷﻥ ﻛﻞ ﺑﺮﻧﺎﻣﺞ ﻟﻪ ﻃﺮﻳﻘﺘﻪ ﺍﳋﺎﺻﺔ.
ﻟﻺﺷﺎﺭﺓ ﻓﺘﺎﺭﻳﺦ ﻇﻬﻮﺭ ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﺍﻟﺘﺨﺰﻳﻦ ﻛﺎﻥ ﺳﻨﺔ 1960ﺣﺴﺐ ﻣﻮﺳﻮﻋﺔ ﻭﻳﻜﻴﺒﻴﺪﻳﺎ.
24
ﰲ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﻌﻼﺋﻘﻴﺔ ﻳﺘﻢ ﲣﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﰲ ﺟﺪﺍﻭﻝ ﺛﻨﺎﺋﻴﺔ ﺍﻟﺒﻌﺪ )ﺗﺘﻜﻮﻥ ﻣﻦ
ﺃﺳﻄﺮ ﻭﺃﻋﻤﺪﺓ(.
ﻇﻬﺮ ﻫﺬﺍ ﺍﻟﻨﻈﺎﻡ ﻋﻠﻰ ﻳﺪ Edgard Franck Coddﺳﻨﺔ ،1970ﻭﻳﻨﺒﲏ ﻫﺬﺍ ﺍﻟﻨﻤﻮﺫﺝ ﻋﻠﻰ
ﻣﻔﻬﻮﻡ ﺍﳉﱪ ﺍﻟﻌﻼﺋﻘﻲ )ﻣﻔﻬﻮﻡ ﺭﻳﺎﺿﻲ( ﺍﻟﺬﻱ ﻳﺘﻴﺢ ﺍﻻﺳﺘﻌﻼﻡ ﻋﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﻧﻈﺎﻡ
25
ﻳﻀﻢ ﻭﺣﺪﺍﺕ ﻣﺘﺮﺍﺑﻄﺔ ﻓﻴﻤﺎ ﺑﻴﻨﻬﺎ ،ﻟﺬﺍ ﻳﻌﺪ ﺍﳉﱪ ﺍﻟﻌﻼﺋﻘﻲ ﲟﺜﺎﺑﺔ ﺍﳉﺎﻧﺐ ﺍﻟﺘﻨﻈﲑﻱ ﻟﻠﻐﺔ
SQLﺣﻴﺚ ﺃﻥ ﻓﻬﻢ ﺍﳉﱪ ﺍﻟﻌﻼﺋﻘﻲ ﻳﺴﺎﻋﺪﻙ ﻋﻠﻰ ﺍﺳﺘﻴﻌﺎﺏ ﻫﺬﻩ ﺍﻟﻠﻐﺔ ﺑﻜﻞ ﺳﻬﻮﻟﺔ.
ﻧﺘﺞ ﻋﻦ ﺍﺳﺘﺨﺪﺍﻡ ﻫﺬﺍ ﺍﻷﳕﻮﺫﺝ ﺍﻟﻌﻼﺋﻘﻲ ﺗﻨﻈﻴﻢ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺑﺎﻟﻄﺮﻳﻘﺔ ﺍﳌﺸﻬﻮﺭﺓ ﺣﺎﻟﻴﺎ ﻋﻠﻰ
ﺷﻜﻞ ﺟﺪﺍﻭﻝ Tablesﻟﺘﺴﻬﻴﻞ ﻋﻤﻠﻴﺎﺕ ﺍﻹﺿﺎﻓﺔ ﻭﺍﻟﺘﻌﺪﻳﻞ ﻭﺍﳊﺬﻑ ﻭﺍﻟﻌﺮﺽ ﻟﻠﻤﺴﺘﺨﺪﻡ ،ﻣﻊ
ﺍﻹﺷﺎﺭﺓ ﺇﱃ ﺃﻥ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﺎﺯﺍﻟﺖ ﲣﺰﻥ ﰲ ﻣﻠﻔﺎﺕ Filesﻭﻟﻜﻦ ﻃﺮﻳﻘﺔ ﻋﺮﺿﻬﺎ ﺻﺎﺭﺕ ﺃﺳﻬﻞ
ﻭﺃﻳﺴﺮ.
26
ﺍﳉﱪ ﺍﻟﺘﺠﺮﻳﺪﻱ
27
Relationnal Algebra ﺍﳉﱪ ﺍﻟﻌﻼﺋﻘﻲ
ﻋﺒﺎﺭﺓ ﻋﻦ ﻣﻔﻬﻮﻡ ﺭﻳﺎﺿﻲ ﳏﺾ ،ﺃﻋﺘﻘﺪ ﻟﻮ ﻛﻨﺖ ﻣﻦ ﻫﻮﺍﺓ ﺍﻟﺮﻳﺎﺿﻴﺎﺕ ﺳﻴﻜﻮﻥ ﻗﺪ ﻣﺮ ﻋﻠﻰ
ﻣﺴﺎﻣﻌﻚ ﻣﻦ ﺩﻭﻥ ﺷﻚ ،ﻭﻫﻮ ﻳﻘﻮﻡ ﻋﻠﻰ ﺃﻃﺮﻭﺣﺔ ﺍﻤﻮﻋﺎﺕ ،Group Theoryﻭﺍﻟﻐﺎﻳﺔ ﻣﻨﻪ ﻫﻮ
ﺍﳊﺼﻮﻝ ﻋﻠﻰ ﺑﻴﺎﻧﺎﺕ ﺟﺪﻳﺪﺓ ﻣﻦ ﺧﻼﻝ ﺑﻌﺾ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﻟﱵ ﻧﻘﻮﻡ ﺎ ﻋﻠﻰ ﻭﺣﺪﺍﺕ )ﺟﺪﺍﻭﻝ(
ﺃﺧﺮﻯ ،ﻭﻫﺬﻩ ﺍﻟﻌﻤﻠﻴﺎﺕ ﻫﻲ:
ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﻟﺘﺠﻤﻴﻌﻴﺔ:
R1 R2
ﺍﻻﲢﺎﺩ Unionﻫﻮ ﻋﻼﻗﺔ ﺗﺮﺑﻂ ﺑﲔ ﳎﻤﻮﻋﺘﲔ ﳍﻤﺎ ﻧﻔﺲ ﺍﳊﻘﻮﻝ ﻭﻧﻔﺲ ﺍﳋﺼﺎﺋﺺ،
ﻭﺗﻜﻮﻥ ﺍﻟﻨﺘﻴﺠﺔ ﻋﺒﺎﺭﺓ ﻋﻦ ﳎﻤﻮﻋﺔ ﺗﻀﻢ ﻛﻞ ﻋﻨﺎﺻﺮ ﺍﻤﻮﻋﺘﲔ ،ﻭﻳﺮﻣﺰ ﳍﺎ ﺭﻳﺎﺿﻴﺎ ﻫﻜﺬﺍ:
R1 R2
28
ﺍﻟﻔﻮﺝ ﺍﻷﻭﻝ ﻣﻦ ﺍﻟﻌﻤﺎﻝ: R1
ﺍﲢﺎﺩ ﺍﻟﻮﺣﺪﺗﲔ:R1R2
Code Name Age Address
P1E1 Ahmed 26 Kuwait
P1E2 Idriss 24 Morocco
P1E3 Kamal 25 Egypt
P2E1 Khalid 24 Tunisia
P2E2 Ismaîl 27 Syria
ﻗﺎﺋﻤﺔ ﺃﻓﻮﺍﺝ ﺍﻟﻌﻤﺎﻝ
29
:() Intersection ﺍﻟﺘﻘﺎﻃﻊ
R1 R2 R1 R2
ﻭﻳﺮﻣﺰ ﻟﻪ ﺭﻳﺎﺿﻴﺎ، ﻭﻧﻔﺲ ﺍﻟﺒﻨﻴﺔ،ﺍﻟﺘﻘﺎﻃﻊ ﻫﻮ ﻧﺎﺗﺞ ﺭﺑﻂ ﺟﺪﻭﻟﲔ ﳍﻤﺎ ﻧﻔﺲ ﻋﺪﺩ ﺍﳊﻘﻮﻝ
. ﻭﻫﻮ ﻳﻀﻢ ﺍﻟﻌﻨﺎﺻﺮ ﺍﳌﺸﺘﺮﻛﺔ ﺑﲔ ﺟﺪﻭﻟﲔ،R1 R2 ﺬﺍ ﺍﻟﺮﻣﺰ
30
ﻛﻤﺎ ﺗﻼﺣﻆ ﻟﺪﻳﻨﺎ ﳎﻤﻮﻋﺘﺎﻥ ﳍﻤﺎ ﻧﻔﺲ ﺍﻟﺒﻨﻴﺔ ،ﻭﻟﺪﻳﻬﻤﺎ ﺑﻌﺾ ﺍﻟﻌﻨﺎﺻﺮ ﺍﳌﺸﺘﺮﻛﺔ ﺑﻴﻨﻬﻤﺎ
ﻛﻤﺎ ﻳﻌﺮﺽ ﺍﳉﺪﻭﻝ ﺍﻟﺘﺎﱄ:
31
ﺍﻟﻔﻮﺝ ﺍﻷﻭﻝ ﻣﻦ ﺍﻟﻌﻤﺎﻝ: R1
32
ﺑﺎﳌﻘﺎﺑﻞ ﳝﻜﻨﻨﺎ ﺍﻟﻘﻴﺎﻡ ﺑﻌﻤﻠﻴﺔ ﺍﻻﺧﺘﻼﻑ ﺑﺸﻜﻞ ﻋﻜﺴﻲ ،ﻋﻠﻰ ﺷﻜﻞ ،R2-R1ﰲ ﻫﺬﻩ ﺍﳊﺎﻟﺔ
ﺳﺘﻜﻮﻥ ﺍﻟﻨﺘﻴﺠﺔ ﻋﺒﺎﺭﺓ ﻋﻦ ﳎﻤﻮﻋﺔ ﺗﻀﻢ ﻓﻘﻂ ﺍﻟﻌﻨﺎﺻﺮ ﺍﳌﻮﺟﻮﺩﺓ ﰲ R2ﻭﺍﻟﱵ ﻻ ﺗﻮﺟﺪ ﰲ
R1ﺃﻱ ﻛﻤﺎ ﻳﻌﺮﺽ ﺍﳉﺪﻭﻝ ﺍﻟﺘﺎﱄ:
ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﻷﺣﺎﺩﻳﺔ
ﺗﻄﺒﻖ ﻫﺬﻩ ﺍﻟﻌﻤﻠﻴﺎﺕ ﻋﻠﻰ ﳎﻤﻮﻋﺔ ﻭﺍﺣﺪﺓ ،ﻭﺗﻨﻘﺴﻢ ﺇﱃ:
ﻭﺗﻌﲏ ﺍﻧﺘﻘﺎﺀ ﺑﻌﺾ ﺍﻟﻌﻨﺎﺻﺮ/ﺍﻷﺳﻄﺮ Rowsﻣﻦ ﳎﻤﻮﻋﺔ ﻣﻌﻴﻨﺔ ،ﻣﺜﻼ ﻟﻮ ﻋﻨﺪﻧﺎ ﺟﺪﻭﻝ
ﺍﻟﻌﻤﺎﻝ ﺍﻟﺘﺎﱄ:
33
: ﻣﺜﻼ،ﻤﻮﻋﺔﺍﻻﻧﺘﻘﺎﺀ ﰲ ﻫﺬﻩ ﺍﳊﺎﻟﺔ ﻳﻌﲏ ﺍﻻﺳﺘﻌﻼﻡ ﻋﻦ ﺑﻌﺾ ﺍﻟﻌﻤﺎﻝ ﺍﳌﻮﺟﻮﺩﻳﻦ ﺿﻤﻦ ﺍ
ﻭﻟﻴﺲColumns ﺍﻟﻔﺮﻕ ﺑﻴﻨﻪ ﻭﺑﲔ ﺍﻻﻧﺘﻘﺎﺀ ﻫﻮ ﻛﻮﻥ ﺍﻻﺳﻘﺎﻁ ﻳﻜﻮﻥ ﺑﻐﺮﺽ ﺍﻧﺘﻘﺎﺀ ﺍﻷﻋﻤﺪﺓ
: ﻓﻤﺜﻼ ﻟﻮ ﻋﻨﺪﻧﺎ ﻧﻔﺲ ﺍﳉﺪﻭ ﻝ ﺍﻟﺴﺎﺑﻖ،ﺍﻷﺳﻄﺮ
34
ﺟﻠﺐ ﺃﺭﻗﺎﻡ ﻭﺃﲰﺎﺀ ﺍﻟﻌﻤﺎﻝ ﻓﻘﻂ:
ID Name
1 Younes MAADANE
2 Ismaîl WAHBI
3 Reda Hamdi
4 Hamid MAKBOUL
5 Mohammed ELKHAL
Function
Developper
Conceptor
Designer
Director
Web MASTER
ﻭﻳﻜﻮﻥ ﺍﻟﻨﺎﺗﺞ ﻋﻦ ﻫﺬﻩ ﺍﻟﻌﻤﻠﻴﺔ ﻋﺒﺎﺭﺓ ﻋﻦ ﳎﻤﻮﻋﺔ ﺟﺪﻳﺪﺓ ،ﺗﻀﻢ ﺧﺎﺭﺝ ﺟﺪﺍﺀ ﻛﻞ ﻋﻨﺼﺮ
ﻣﻦ ﺍﻤﻮﻋﺘﲔ ﺑﺒﺎﻗﻲ ﻋﻨﺎﺻﺮ ﺍﻤﻮﻋﺔ ﺍﻷﺧﺮﻯ ،ﻓﻤﺜﻼ ﻟﻮ ﻋﻨﺪﻧﺎ ﺍﳉﺪﻭﻻﻥ ﺍﻟﺘﺎﻟﻴﺎﻥ:
35
R1
R2 R1 X R2
ﻭﻳﻌﲏ ﻗﺴﻤﺔ ﺟﺪﻭﻝ ﻋﻠﻰ ﺟﺪﻭﻝ ﺁﺧﺮ ،ﺑﺸﺮﻁ ﺃﻥ ﺗﻜﻮﻥ ﺣﻘﻮﻝ ﺍﳉﺪﻭﻝ ﺍﻟﺜﺎﱐ ﻣﺘﻮﺍﺟﺪﺓ ﰲ
ﺍﳉﺪﻭﻝ ﺍﻷﻭﻝ ،ﻛﻤﺎ ﻳﺮﻣﺰ ﻟﻪ ﰲ ﺍﻟﺮﻳﺎﺿﻴﺎﺕ ÷ ،ﻭﺗﺰﻥ ﺍﻟﻨﺘﻴﺠﺔ ﻋﺒﺎﺭﺓ ﻋﻦ ﺟﺪﻭﻝ ﻳﻀﻢ
ﻋﻨﺎﺻﺮ ﺍﳉﺪﻭﻝ ﺍﻷﻭﻝ ﺍﻟﱵ ﺗﻀﻢ ﻛﻞ ﻋﻨﺎﺻﺮ ﺍﳉﺪﻭﻝ ﺍﻟﺜﺎﱐ ،ﻭﺻﻴﻐﺘﻬﺎ ﺍﻟﺮﻳﺎﺿﻴﺔ ﻫﻜﺬﺍ
R3=R1÷R2
ﻧﻔﺘﺮﺽ ﻣﺜﻼ ﺃﻥ ﻋﻨﺪﻱ ﺟﺪﻭﻻﻥ ،ﺍﻷﻭﻝ ﻳﻀﻢ ﻗﺎﺋﻤﺔ ﻟﻠﻤﻤﺜﻠﲔ ﻭﺍﻷﻓﻼﻡ ﺍﻟﱵ ﺷﺎﺭﻛﻮﺍ ﻓﻴﻬﺎ،
ﻭﺍﻟﺜﺎﱐ ﻳﻀﻢ ﻗﺎﺋﻤﺔ ﻟﻸﻓﻼﻡ ﺍﻟﺴﻴﻨﻤﺎﺋﻴﺔ:
36
R1 R2
ﻭﻧﺘﻴﺠﺔR2 ﻋﻠﻰ ﺍﳉﺪﻭﻝ ﺍﻟﺜﺎﱐR1 ﻟﻠﺠﻮﺍﺏ ﻋﻠﻰ ﻫﺬﺍ ﺍﻟﺴﺆﺍﻝ ﺳﻨﻘﻮﻡ ﺑﻘﺴﻤﺔ ﺍﳉﺪﻭﻝ ﺍﻷﻭﻝ
: ﺃﻱ ﻫﻜﺬﺍ،ﺍﻟﻘﺴﻤﺔ ﺳﺘﻀﻢ ﻓﻘﻂ ﺍﳌﻤﺜﻠﲔ ﺍﻟﺬﻳﻦ ﺷﺎﺭﻛﻮﺍ ﰲ ﻛﻞ ﺍﻷﻓﻼﻡ
R1÷R2
Actor_Name
Franck Richard
José Melany
37
(: ﺍﻟﺮﺑﻂ ) Join
ﻭﻫﻮ ﻣﻦ ﺃﺑﺮﺯ ﺍﳌﻔﺎﻫﻴﻢ ﺍﻟﱵ ﺳﻨﺮﺍﻫﺎ ﺇﻥ ﺷﺎﺀ ﺍﷲ ﻣﻊ ﻟﻐﺔ SQLﻭﻳﻘﺘﻀﻲ ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ
ﺍﻟﻌﻤﻠﻴﺎﺕ ﺟﺪﻭﻟﲔ ﳍﻤﺎ ﺣﻘﻞ ﻣﺸﺘﺮﻙ ﻣﻦ ﻧﻔﺲ ﺍﻟﻨﻮﻉ ،ﻭﻳﺴﺘﻌﻤﻞ ﺍﻟﺮﺑﻂ ﺑﻐﺮﺽ ﺍﻟﺒﺤﺚ ﻋﻦ
ﺍﻟﻌﻨﺎﺻﺮ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺍﳉﺪﻭﻟﲔ ﻣﻦ ﺧﻼﻝ ﲢﻘﻖ ﺷﺮﻁ ﻭﺟﻮﺩ ﺍﳊﻘﻞ ﺍﳌﺸﺘﺮﻙ ﺑﻨﻔﺲ ﺍﻟﻘﻴﻤﺔ
ﰲ ﺍﳉﺪﻭﻟﲔ ،ﻭﻳﺮﻣﺰ ﻟﻪ ﺭﻳﺎﺿﻴﺎ ﺑﺎﻟﺮﻣﺰ ﺍﻟﺘﺎﱄ
R1 R2
ﳝﻜﻨﻨﺎ ﻣﻦ ﺧﻼﻝ ﻋﻤﻠﻴﺔ ﺍﻟﺮﺑﻂ ﺃﻥ ﳒﻠﺐ ﺍﳌﻮﺍﻃﻨﲔ ﻭﺍﻟﺪﻭﻝ ﻣﺎﺩﺍﻡ ﺭﻗﻢ ﺍﻟﺪﻭﻟﺔ ﰲ ﺍﻤﻮﻋﺔ
ﺍﻷﻭﱃ ﻳﺘﻮﺍﻓﻖ ﻣﻊ ﺭﻗﻢ ﺍﻟﺪﻭﻟﺔ ﰲ ﺍﻤﻮﻋﺔ ﺍﻟﺜﺎﻧﻴﺔ ،ﻫﻜﺬﺍ:
38
ﻧﻘﻮﻡ ﲜﻠﺐ ﺍﺳﻢ ﺍﳌﻮﺍﻃﻦ ﻣﻦ ﺟﺪﻭﻝ ﺍﳌﻮﺍﻃﻨﲔ ،ﻭﳒﻠﺐ ﺍﺳﻢ ﺍﻟﻮﻃﻦ ﻣﻦ ﺟﺪﻭﻝ ﺍﻷﻭﻃﺎﻥ،
ﺑﺸﺮﻁ ﺃﻥ ﺗﺘﻮﺍﻓﻖ ﻗﻴﻤﺔ ﺍﳊﻘﻞ ﺍﳌﺸﺘﺮﻙ ﺑﲔ ﺍﻤﻮﻋﺘﲔ ،ﺇﻥ ﺍﺳﺘﻮﻋﺒﺖ ﻫﺬﺍ ﻓﻘﺪ ﻣﺮﺭﺕ ﻟﻚ
ﺟﺰﺀ ﻏﲑ ﻳﺴﲑ ﻣﻦ SQLﻭﺃﻧﺖ ﻻ ﺗﺸﻌﺮ
ﻓﻨﺤﺼﻞ ﻋﻠﻰ
ﰲ ﺍﻟﻔﺼﻞ ﺍﻟﺮﺍﺑﻊ ﺇﻥ ﺷﺎﺀ ﺍﷲ ﺳﻮﻑ ﻧﺮﻯ ﻛﻴﻒ ﳓﻮﻝ ﻫﺎﺗﻪ ﺍﳌﻔﺎﻫﻴﻢ ﺍﻟﺮﻳﺎﺿﻴﺔ ﺇﱃ ﺗﻘﻨﻴﺎﺕ
ﻋﻤﻠﻴﺔ ﳉﻠﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ.
39
ﻣﺪﺧﻞ ﺇﱃ ﻟﻐﺔ
SQL
40
ﻣﺪﺧﻞ ﺇﱃ ﻟﻐﺔ :SQL
ﺗﻌﺮﻳﻒ:
ﻛﻠﻤﺔ SQLﻫﻲ ﺍﺧﺘﺼﺎﺭ ﻝ ،Structured Query Languageﻭﺗﻌﲏ ﻟﻐﺔ ﺍﻻﺳﺘﻌﻼﻣﺎﺕ
ﺍﳌﺮﺗﺒﺔ ،ﻭﺗﺴﺘﻌﻤﻞ ﻣﻦ ﺃﺟﻞ ﺇﺟﺮﺍﺀ ﻋﻤﻠﻴﺎﺕ ﻋﻠﻰ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ.
ﺣﱴ ﻧﺴﺘﻮﻋﺐ ﻫﺬﺍ ﺍﳌﻌﲎ ﺑﺼﻔﺔ ﺩﻗﻴﻘﺔ ،ﻓﻠﻐﺔ SQLﻫﻲ ﺍﻟﺘﻌﺒﲑ ﺍﻟﱪﳎﻲ ﻟﻠﺠﱪ ﺍﻟﻌﻼﺋﻘﻲ
ﺍﻟﺬﻱ ﺭﺃﻳﻨﺎﻩ ﰲ ﻣﺴﺘﻬﻞ ﺍﻟﻜﺘﺎﺏ ،ﻇﻬﺮﺕ ﻫﺬﻩ ﺍﻟﻠﻐﺔ ﺳﻨﺔ ،1974ﰒ ﺑﻌﺪ ﺫﻟﻚ ﰲ ﺳﻨﺔ 1986ﰎ
ﺍﻋﺘﻤﺎﺩﻫﺎ ﻣﻦ ﻃﺮﻑ ) ،(ANSIﻭﰲ ﺳﻨﺔ 1987ﰎ ﺍﻋﺘﻤﺎﺩﻫﺎ ﻣﻦ ﻗﺒﻞ ISOﻟﺘﺼﺒﺢ ﺑﺬﻟﻚ ﺍﻟﻠﻐﺔ
.RDBMS ﺍﻷﻛﺜﺮ ﺷﻴﻮﻋﺎ ﰲ ﺃﻧﻈﻤﺔ ﺇﺩﺍﺭﺓ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﻌﻼﺋﻘﻴﺔ
41
Data Manipulation ﻟﻐﺔ ﳌﻌﺎﳉﺔ ﺍﻟﺒﻴﺎﻧﺎﺕ :DMLﻭﻫﻲ ﺍﺧﺘﺼﺎﺭ ﻝ
،Languageﺃﻱ ﺃﺎ ﲤﻜﻨﻨﺎ ﻣﻦ ﺍﻧﺘﻘﺎﺀ Selectﻭﺇﺿﺎﻓﺔ Addﻭﲢﺪﻳﺚ Update
ﻟﻐﺔ T-SQLﻟﻴﺴﺖ ﻟﻐﺔ ﻟﻼﺳﺘﻌﻼﻡ ﻓﺤﺴﺐ ،ﺑﻞ ﺃﻳﻀﺎ ﻟﻐﺔ ﺑﺮﳎﻴﺔ ﻛﻤﺎ ﺳﻴﺄﰐ ﻣﻌﻨﺎ ﰲ ﺍﻟﻔﺼﻞ
ﺍﳋﺎﻣﺲ ﺇﻥ ﺷﺎﺀ ﺍﷲ.
42
ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ
43
ﻭﺍﻵﻥ ﺳﻨﻌﺮﺽ ﺃﻫﻢ ﺍﻟﻘﻮﺍﺋﻢ ﰲ ﻫﺬﻩ ﺍﻟﻮﺍﺟﻬﺔ ،ﻭﺳﺄﺗﺮﺟﻢ ﻛﻞ ﻛﻠﻤﺔ ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺇﱃ
ﺍﻻﳒﻠﻴﺰﻱ ،ﻷﻥ ﺃﻏﻠﺐ ﺍﻹﺧﻮﺓ ﻳﺘﻮﻓﺮﻭﻥ ﻋﻠﻰ ﻧﺴﺨﺔ MS SQL Serverﺑﺎﻹﳒﻠﻴﺰﻱ.
ﺍﳌﻨﻄﻘﺔ ﺍﶈﺎﻃﺔ ﺑﺎﻷﺯﺭﻕ ﻭﺍﻟﱵ ﰲ ﺍﻟﻨﺴﺨﺔ ﺍﻻﳒﻠﻴﺰﻳﺔ ﺍﲰﻬﺎ ،New Queryﲤﻜﻨﻨﺎ ﻣﻦ ﻓﺘﺢ
ﺻﻔﺤﺔ ﺟﺪﻳﺪﺓ ﻟﻜﺘﺎﺑﺔ ﺃﻭﺍﻣﺮ .T-SQL
ﺍﳌﻨﻄﻘﺔ ﺍﶈﺎﻃﺔ ﺑﺎﻟﻠﻮﻥ ﺍﻟﺒﲏ ﺗﻀﻢ ﻣﺴﺘﻌﺮﺽ ﺍﻟﻜﺎﺋﻨﺎﺕ ،Object Explorerﺍﻟﺬﻱ ﳝﻜﻨﻨﺎ ﻣﻦ
ﺇﻧﺸﺎﺀ ﺍﻟﻜﺎﺋﻨﺎﺕ ﻋﻠﻰ ﻣﺴﺘﻮﻯ ﺍﳋﺎﺩﻡ ،Serverﻗﻮﺍﻋﺪ ﺑﻴﺎﻧﺎﺕ ،ﺟﺪﺍﻭﻝ ... ،ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ
ﻋﻤﻠﻴﺎﺕ ﺍﳊﻤﺎﻳﺔ Securityﻭﺇﺩﺍﺭﺓ ﺍﳌﺴﺘﺨﺪﻣﲔ Usersﻭﺍﻹﺗﺼﺎﻻﺕ .Connctions
ﺑﺈﻣﻜﺎﻧﻨﺎ ﺃﻳﻀﺎ ﺇﻧﺸﺎﺀ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻳﺪﻭﻳﺎ ﻋﱪ ﺍﳌﻌﺎﰿ ،ﻣﻦ ﻏﲑ ﺣﺎﺟﺔ ﺇﱃ ﻛﺘﺎﺑﺔ ﺍﻷﻣﺮ
.CREATE DATABASE
44
ﺣﺬﻑ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ:
ﳊﺬﻑ ﻗﺎﻋﺪﺓ ﺑﻴﺎﻧﺎﺕ ﺑﻮﺍﺳﻄﺔ ﺃﻭﺍﻣﺮ ،SQLﻧﻜﺘﺐ:
; DROP DATABASE MyDatabase
Tables ﺍﳉﺪﺍﻭﻝ
ﺍﳉﺪﺍﻭﻝ ﻋﺒﺎﺭﺓ ﻋﻦ ﻭﺣﺪﺍﺕ ﻟﺘﺨﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻋﻠﻰ ﺷﻜﻞ ﻣﺼﻔﻮﻓﺔ ﺛﻨﺎﺋﻴﺔ ﺍﻷﺑﻌﺎﺩ )ﺗﺘﻜﻮﻥ ﻣﻦ
ﺃﺳﻄﺮ Rowsﻭﺃﻋﻤﺪﺓ .(Columns
45
ﺇﻧﺸﺎﺀ ﺍﳉﺪﺍﻭﻝ:
ﻹﻧﺸﺎﺀ ﺟﺪﻭﻝ ﺑﻮﺍﺳﻄﺔ ﺃﻭﺍﻣﺮ SQLﻓﺎﻟﺼﻴﻐﺔ ﻛﻤﺎ ﻳﻠﻲ:
( CREATE TABLE MyTable
ID INT,
FullName VARCHAR(50),
)BirthDate DATETIME
ﺍﻷﻣﺮ ﺃﻋﻼﻩ ﻳﻘﻮﻡ ﺑﺈﻧﺸﺎﺀ ﺟﺪﻭﻝ ﺍﲰﻪ MyTableﻭﻳﺘﻜﻮﻥ ﻣﻦ ﺣﻘﻮﻝ ﺛﻼﺛﺔ ،ﺍﻷﻭﻝ ﻧﻮﻋﻪ
ﺭﻗﻤﻲ ،ﺍﻟﺜﺎﱐ ﻧﻮﻋﻪ ﻧﺼﻲ ﻳﺘﺴﻊ ﻝ 50ﺣﺮﻑ ،ﻭﺍﻷﺧﲑ ﻣﻦ ﻧﻮﻉ ﺍﻟﺘﺎﺭﻳﺦ .DataTime
ﺣﺬﻑ ﺍﳉﺪﺍﻭﻝ:
ﳊﺬﻑ ﺟﺪﻭﻝ ﻧﻘﻮﻡ ﺑﻜﺘﺎﺑﺔ ﺍﻷﻣﺮ ﺍﻟﺘﺎﱄ:
;DROP TABLE MyTable
ﺗﻌﺪﻳﻞ ﺍﳉﺪﺍﻭﻝ:
ﻹﺿﺎﻓﺔ ﺑﻌﺾ ﺍﳊﻘﻮﻝ ﺇﱃ ﺟﺪﻭﻝ ﻣﺎ ﻓﺎﻟﺼﻴﻐﺔ ﺩﺍﺋﻤﺎ ﻫﻜﺬﺍ:
;ALTER TABLE MyTable ADD Age int
ﻫﺬﺍ ﺇﺫﺍ ﺃﺭﺩﻧﺎ ﺇﺿﺎﻓﺔ ﺣﻘﻞ ﻭﺍﺣﺪ ﻟﻠﺠﺪﻭﻝ ﻋﻦ ﻃﺮﻳﻖ ﺃﻭﺍﻣﺮ ،SQLﻓﻘﻂ ﻧﻜﺘﺐ ﺑﻌﺪ ﺍﻟﻜﻠﻤﺔ
ADDﺍﺳﻢ ﺍﳊﻘﻞ ﻭﻧﻮﻋﻪ ﻟﺘﺘﻢ ﺇﺿﺎﻓﺘﻪ ﺇﱃ ﺍﳉﺪﻭﻝ ﺑﻌﺪ ﺗﻨﻔﻴﺬ ﺍﻷﻣﺮ.
46
ﺃﻣﺎ ﺇﺫﺍ ﺃﺭﺩﻧﺎ ﺇﺿﺎﻓﺔ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﳊﻘﻮﻝ ﺩﻓﻌﺔ ﻭﺍﺣﺪﺓ ،ﻧﻔﺼﻞ ﺑﻴﻨﻬﺎ ﺑﻔﺎﺻﻠﺔ ﻫﻜﺬﺍ:
ﺃﻧﻮﺍﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ:
ﻛﻞ ﺣﻘﻞ ﻣﻦ ﺣﻘﻮﻝ ﺃﻱ ﺟﺪﻭﻝ ﻟﻪ ﺑﺎﻟﻀﺮﻭﺭﺓ ﻧﻮﻉ ﻣﻌﲔ ﻣﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ،ﺣﺴﺐ ﺍﻟﻘﻴﻤﺔ ﺍﳌﺮﺍﺩ
ﲣﺰﻳﻨﻬﺎ ﻓﻴﻪ ،ﻭﺗﻨﻘﺴﻢ ﺃﻧﻮﺍﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺇﲨﺎﻻ ﺇﱃ:
ﺍﻷﻧﻮﺍﻉ ﺍﻟﺮﻗﻤﻴﺔ:
ﻭﺗﺴﺘﻌﻤﻞ ﻟﺘﺨﺰﻳﻦ ﺍﻟﻘﻴﻢ ﺍﻟﺮﻗﻤﻴﺔ ،ﻣﺜﻼ ﻟﻮ ﻋﻨﺪﻧﺎ ﺣﻘﻞ ﺍﻟﻌﻤﺮ Ageﰲ ﺇﺣﺪﻯ ﺍﳉﺪﺍﻭﻝ،
ﻓﺤﺘﻤﺎ ﻋﻠﻴﻨﺎ ﺍﺧﺘﻴﺎﺭ ﻧﻮﻉ ﺭﻗﻤﻲ ﻟﺘﺨﺰﻳﻦ ﻗﻴﻢ ﺍﻷﻋﻤﺎﺭ ،ﻭﺍﻷﻧﻮﺍﻉ ﺍﻟﺮﻗﻤﻴﺔ ﺑﺪﻭﺭﻫﺎ ﺗﻨﻘﺴﻢ ﺇﱃ:
63 63
-2ﻭﺑﲔ 2 - :BIGINT ﻭﻳﺴﺘﻌﻤﻞ ﻟﺘﺨﺰﻳﻦ ﺍﻟﻘﻴﻢ ﺍﻟﺮﻗﻤﻴﺔ ﺍﻟﱵ ﳎﺎﳍﺎ ﳏﺼﻮﺭ ﺑﲔ
، 1ﻭﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻳﺴﺘﻌﻤﻞ 8ﺑﺎﻳﺘﺎﺕ ) (8 Bytesﻟﻠﺘﺨﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ.
- :INT ﻳﺴﺘﻌﻤﻞ ﺃﺭﺑﻊ ﺑﺎﻳﺘﺎﺕ ) (4 Bytesﻟﺘﺨﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﳎﺎﻟﻪ ﺍﻟﺮﻳﺎﺿﻲ ﻳﺒﺘﺪﺉ ﻣﻦ
231ﻭﻳﻨﺘﻬﻲ ﺇﱃ231-1
:TINYINT ﻳﺴﺘﻌﻤﻞ ﺑﺎﻳﺖ ﻭﺍﺣﺪ ﻟﺘﺨﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ،ﻭﳎﺎﻟﻪ ﺍﻟﺮﻳﺎﺿﻲ ﳏﺼﻮﺭ ﺑﲔ 0ﻭ
.255
47
:REAL ﻳﺴﺘﻌﻤﻞ ﳊ ﻔﻆ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﻧﻮﻉ ﺃﺭﻗﺎﻡ ﻋﺸﺮﻳﺔ ،ﻭﻫﻮ ﳛﺘﺎﺝ ﺇﱃ 4ﺑﺎﻳﺖ
ﻟﻠﺘﺨﺰﻳﻦ.
:FLOAT ﻳﺴﺘﻌﻤﻞ ﳊﻔﻆ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﻧﻮﻉ ﺃﺭﻗﺎﻡ ﻋﺸﺮﻳﺔ ،ﻭﻫﻮ ﳛﺘﺎﺝ ﺇﱃ 8ﺑﺎﻳﺖ
ﻟﻠﺘﺨﺰﻳﻦ.
:DECILMAL ﻟﺘﺨﺰﻳﻦ ﺍﻟﻘﻴﻢ ﺍﻟﻌﺸﺮﻳﺔ ﺍﻟﱵ ﳝﺘﺪ ﳎﺎﳍﺎ ﻣﻦ - 999،99999ﺇﱃ
999،99999
).(XML Documents :XML ﻟﺘﺨﺰﻳﻦ ﻭﺛﺎﺋﻖ ﻣﻦ ﻧﻮﻉ ﺍﻹﻛﺲ ﺃﻡ ﺃﻝ
ﺍﻷﻧﻮﺍﻉ ﺍﻟﻨﺼﻴﺔ:
ﺗﺴﺘﺨﺪﻡ ﳊﻔﻆ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﻧﻮﻉ ﻧﺼﻲ ،ﻋﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ ﻟﻮ ﻋﻨﺪﻧﺎ ﺣﻘﻞ ﳊﻔﻆ ﺍﺳﻢ ﺃﻭ
ﻋﻨﻮﺍﻥ ﺃﻭ ﺃﻱ ﻗﻴﻤﺔ ﻧﺼﻴﺔ ،ﻓﻴﻠﺰﻡ ﺃﻥ ﳔﺘﺎﺭ ﻧﻮﻉ ﺑﻴﺎﻧﺎﺕ ﻧﺼﻲ ،ﻭﺗﻨﻘﺴﻢ ﺍﻷﻧﻮﺍﻉ ﺍﻟﻨﺼﻴﺔ ﺇﱃ:
:VARCHAR(n) ﻭﻫﻮ ﻣﻦ ﺃﻫﻢ ﺍﻷﻧﻮﺍﻉ ﺍﻟﻨﺼﻴﺔ ،ﻭﻳﺴﻤﺢ ﺑﺘﺨﺰﻳﻦ 8000ﺑﺎﻳﺖ ﻣﻦ
ﺍﻟﺒﻴ ﺎﻧﺎﺕ ،ﻭﺑﺈﻣﻜﺎﻧﻚ ﲢﺪﻳﺪ ﻋﺪﺩ ﺍﻷﺣﺮﻑ ﺍﳌﻤﻜﻦ ﲣﺰﻳﻨﻬﺎ ﻋﻦ ﻃﺮﻳﻖ ﺗﻐﻴﲑ nﺑﺎﻟﻘﻴﻤﺔ
ﺍﻟﺮﻗﻤﻴﺔ ﺍﳌﺮﺍﺩ ﺇﻋﻄﺎﺅﻫﺎ.
:CHAR(n) ﻳﺴﻤﺢ ﺑﺘﺨﺰﻳﻦ ﺍﻟﻨﺼﻮﺹ ﺣﺴﺐ ﺍﻟﻘﻴﻤﺔ ﺍﻟﺮﻗﻤﻴﺔ ﺍﳌﻜﺘﻮﺑﺔ ﺑﲔ ﺍﻟﻘﻮﺳﲔ،
ﺍﻟﻘﻴﻤﺔ ﺍﻻﻓﺘﺮﺍﺿﻴﺔ ﳍﺬﺍ ﺍﻟﻨﻮﻉ ،1ﻭﻗﻴﻤﺘﻪ ﺍﻟﻘﺼﻮﻯ .8000
.4000 :NCHAR(n) ﻟﺘﺨﺰﻳﻦ ﺍﻟﻨﺼﻮﺹ ،ﻗﻴﻤﺘﻪ ﺍﻟﻘﺼﻮﻯ
48
ﺍﻟﺘﺎﺭﻳﺦ ﻭﺍﻟﻮﻗﺖ:
ﳓﺘﺎﺝ ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﳊﻔﻆ ﺑﻌﺾ ﺍﻟﻘﻴﻢ ﺍﻟﱵ ﺗﻜﻮﻥ ﻋﻠﻰ ﺷﻜﻞ ﺗﺎﺭﻳﺦ ﻭﻭﻗﺖ ﻣﺜﻞ
ﺗﺎﺭﻳﺦ ﺍﻟﺒﻴﻊ ﺃﻭ ﺍﻟﺸﺮﺍﺀ ،...ﻭﻣﻦ ﺃﻫﻢ ﺃﻗﺴﺎﻣﻪ:
:DateTime ﻳﺴﺘﺨﺪﻡ ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ 8ﺑﺎﻳﺘﺎﺕ.
49
ﻭﳝﻜﻨﻨﺎ ﺗﻄﺒﻴﻖ ﺍﳋﺎﺻﻴﺔ NOT NULLﺣﱴ ﺑﻌﺪ ﺇﻧﺸﺎﺀ ﺍﳉﺪﻭﻝ ﻛﻤﺎ ﻳﻠﻲ:
ﻛﻤﺎ ﺗﻼﺣﻆ ﻗﻤﻨﺎ ﺑﺘﺤﺪﻳﺪ ﺍﺳﻢ ﻭﻧﻮﻉ ﺍﳊﻘﻞ ﺍﳌﺮﺍﺩ ﺗﻄﺒﻴﻖ ﺍﳋﺎﺻﻴﺔ ﻋﻠﻴﻪ.
:IDENTITY
ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﺍﻟﻜﻠﻤﺎﺕ ﻳﻄﺒﻖ ﻓﻘﻂ ﻋﻠﻰ ﺍﳊﻘﻮﻝ ﺍﻟﱵ ﻳﻜﻮﻥ ﻧﻮﻋﻬﺎ ﺭﻗﻤﻴﺎ ﻣﻦ ﺃﺟﻞ ﺟﻌﻞ
ﻗﻴﻤﻬﺎ ﺗﺰﺩﺍﺩ ﺗﻠﻘﺎﺋﻴﺎ ﻋﻨﺪ ﺇﺿﺎﻓﺔ ﺃﻱ ﺳﻄﺮ ﺟﺪﻳﺪ ،ﻣﺜﻼ ﻟﻮ ﺃﻧﺸﺄﺕ ﺍﳉﺪﻭﻝ ﺍﻟﺘﺎﱄ ﻭﻃﺒﻘﺖ
ﻫﺬﻩ ﺍﻟﻜﻠﻤﺔ ﻋﻠﻰ ﺍﳊﻘﻞ ،IDﻓﺴﻮﻑ ﺗﺰﺩﺍﺩ ﻗﻴﻤﺘﻪ ﺗﺼﺎﻋﺪﻳﺎ:
ﻋﻨﺪ ﺇﺿﺎﻓﺔ ﺃﻱ ﺳﻄﺮ ﺟﺪﻳﺪ ،ﺳﺘﻼﺣﻆ ﺑﺄﻥ ﺧﺎﻧﺔ ﺍﳊﻘﻞ IDﲤﻨﻌﻚ ﻣﻦ ﺍﻟﻜﺘﺎﺑﺔ ﻓﻴﻬﺎ ،ﻭﻟﻜﻦ
ﲟﺠﺮﺩ ﻣﺎ ﺗﺘﺠﺎﻭﺯﻫﺎ ﺗﻘﻮﻡ ﺑﺮﻓﻊ ﻗﻴﻤﺔ ﺍﳊﻘﻞ ﺑﻮﺍﺣﺪ ﺗﻠﻘﺎﺋﻴﺎ ،ﻛﻤﺎ ﺗﺒﲔ ﺍﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ:
50
ﺗﺴﺘﻄﻴﻊ ﺗﻐﻴﲑ ﺍﻟﻘﻴﻤﺔ ﺍﻟﱵ ﻳﺒﺪﺃ ﻣﻨﻬﺎ ﺍﳊﻘﻞ ،ﻭﺃﻳﻀﺎ ﻣﻌﺎﻣﻞ ﺯﻳﺎﺩﺓ ﺍﻟﻘﻴﻤﺔ ﻫﻜﺬﺍ:
ﰲ ﻫﺬﺍ ﺍﳌﺜﺎﻝ ،ﺳﺘﺒﺪﺃ ﻗﻴﻤﺔ ﺍﳊﻘﻞ ﻣﻦ ﺍﻟﺮﻗﻢ ،2ﻭﻳﻜﻮﻥ ﻣﻌﺎﻣﻞ ﺍﻟﺰﻳﺎﺩﺓ ﻫﻮ ،3ﺃﻱ ﺃﻥ ﺍﻟﻘﻴﻤﺔ
ﺍﻷﻭﱃ ﺳﺘﻜﻮﻥ ،2ﻭﺍﻟﻘﻴﻤﺔ ﺍﻟﺜﺎﻧﻴﺔ ﺳﺘﻜﻮﻥ ،5ﻭﺍﻟﺜﺎﻟﺜﺔ ﺳﺘﻜﻮﻥ ... 8ﺇﱁ.
،NULLﻓﻤﺜﻼ ﻟﻮ ﻋﻨﺪﻧﺎ ﺟﺪﻭﻝ ﻳﻀﻢ ﺑﻴﺎﻧﺎﺕ ﺍﳌﻮﺍﻃﻨﲔ ،ﻓﻤﻦ ﻏﲑ ﺷﻚ ﻫﻨﺎﻟﻚ ﺣﻘﻞ ﳝﻴﺰ
ﻛﻞ ﻣﻮﺍﻃﻦ ﻋﻦ ﻏﲑﻩ ،ﰲ ﻫﺬﻩ ﺍﳊﺎﻟﺔ ﺍﳊﻘﻞ ﺍﻟﺬﻱ ﺳﻴﻜﻮﻥ ﻣﻔﺘﺎﺣﺎ ﺃﺳﺎﺳﻴﺎ PRIMARY KEY
ﻫﻮ ﺍﳊﻘﻞ ﺍﻟﺬﻱ ﻳﻀﻢ ﺃﺭﻗﺎﻡ ﺑﻄﺎﻗﺎﺕ ﺍﻟﺘﻌﺮﻳﻒ ﺍﻟﻮﻃﻨﻴﺔ ،ﻷﻧﻪ ﻣﻦ ﺍﳌﻤﻜﻦ ﺃﻥ ﲡﺪ ﺃﻛﺜﺮ ﻣﻦ
ﻣﻮﺍﻃﻦ ﳛﻤﻠﻮﻥ ﻧﻔﺲ ﺍﻻﺳﻢ ،ﻭﻟﻜﻦ ﻳﺴﺘﺤﻴﻞ ﺃﻥ ﳛﻤﻠﻮﺍ ﻧﻔﺲ ﺭﻗﻢ ﺑﻄﺎﻗﺔ ﺍﻟﺘﻌﺮﻳﻒ ،ﻋﻨﺪ
ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺟﺪﺍﻭﻝ ﻣﺘﺼﻠﺔ ﻓﻴﻤﺎ ﺑﻴﻨﻬﺎ ﻋﻦ ﻃﺮﻳﻖ ﺍﻟﻌﻼﻗﺎﺕ ﻳﺼﺒﺢ ﺇﻟﺰﺍﻣﻴﺎ ﺍﺳﺘﺨﺪﺍﻡ
ﺍﳌﻔﺎﺗﻴﺢ ﺍﻷﺳﺎﺳﻴﺔ.
ﳉﻌﻞ ﺃﺣﺪ ﺍﳊﻘﻮﻝ ﻣﻔﺘﺎﺣﺎ ﺃﺳﺎﺳﻴﺎ ،ﻧﻜﺘﺐ ﺍﻟﺼﻴﻐﺔ ﺍﻟﺘﺎﻟﻴﺔ:
51
ﺃﺛﻨﺎﺀ ﺗﻄﺒﻴﻘﻬﺎ ﻋﻠﻰ ﺇﺣﺪﻯ ﺍﳊﻘﻮﻝPRIMARY KEY ﻭﻧﺴﺘﻄﻴﻊ ﺗﺴﻤﻴﺔ ﺧﺎﺻﻴﺔ ﺍﻟﺘﺤﻘﻖ
:ﺑﺎﻟﺼﻴﻐﺔ ﺍﻟﺘﺎﻟﻴﺔ
CREATE TABLE MyTable (
ID INT CONSTRAINT PK_MyConstraint PRIMARY KEY,
FullName VARCHAR(60))
: ﺃﻱ ﻫﻜﺬﺍ،TABLE
--creation of table
CREATE TABLE MyTable (
ID INT NOT NULL,
FullName VARCHAR(60))
52
:UNIQUE
ﺗﺴﺘﻌﻤﻞ ﻫﺬﻩ ﺍﳋﺎﺻﻴﺔ ﳌﻨﻊ ﻗﻴﻤﺔ ﺣﻘﻞ ﻣﻌﲔ ﻣﻦ ﺍﻟﺘﻜﺮﺍﺭ ،ﻭﺑﺎﻟﺘﺎﱄ ﻻ ﳝﻜﻦ ﺃﻥ ﻳﻀﻢ
ﻧﻔﺲ ﺍﳊﻘﻞ ﻗﻴﻤﺔ ﺃﻛﺜﺮ ﻣﻦ ﻣﺮﺓ ،ﺍﻟﻔﺮﻕ ﺑﲔ ﺍﳋﺎﺻﻴﺔ UNIQUEﻭﺑﲔ ﺍﳋﺎﺻﻴﺔ
،PRIMARY KEYﺃﻥ ﻫﺬﻩ ﺍﻷﺧﲑﺓ ﻻ ﳝﻜﻦ ﺗﻄﺒﻴﻘﻬﺎ ﻋﻠﻰ ﺍﳊﻘﻮﻝ ﺍﻟﱵ ﺗﺴﻤﺢ ﺑﺎﻟﻘﻴﻢ
ﺍﻟﻔﺎﺭﻏﺔ ،NULLﺑﻴﻨﻤﺎ ﺗﺴﻤﺢ ﺍﳋﺎﺻﻴﺔ UNIQUEﺑﺎﻟﻘﻴﻤﺔ ،NULLﻭﳝﻜﻨﻨﺎ ﺗﻄﺒﻴﻖ ﻫﺬﻩ
ﺍﳋﺎﺻﻴﺔ ﻋﻠﻰ ﺍﳊﻘﻞ ﻫﻜﺬﺍ:
( CREATE TABLE MyTable
ID INT UNIQUE,
))FullName VARCHAR(60
:REFERENCE
ﻫﺬﻩ ﺍﳋﺎﺻﻴﺔ ﺗﻄﺒﻖ ﻋﻠﻰ ﺍﳊﻘﻮﻝ ﺍﻷﺟﻨﺒﻴﺔ ﺍﻟﻘﺎﺩﻣﺔ ﻣﻦ ﺟﺪﻭﻝ ﺁﺧﺮ ،ﻭﺗﺴﺘﻌﻤﻞ ﻟﺘﻌﺮﻳﻒ
ﺍﳊﻘﻞ ﺍﻷﺟﻨﱯ ﻭﲢﺪﻳﺪ ﺍﳉﺪﻭﻝ ﺍﻟﻘﺎﺩﻡ ﻣﻨﻪ.
53
ﰲ ﻫﺬﺍ ﺍﳌﺜﺎﻝ ﺳﻨﻨﺸﺊ ﺟﺪﻭﻟﲔ ،ﻭﳓﺎﻭﻝ ﺗﻄﺒﻴﻖ ﺍﳋﺎﺻﻴﺔ REFERENCEﻋﻠﻰ ﺍﳉﺪﻭﻝ
ﺍﻟﺜﺎﱐ:
--creation of the first table
( CREATE TABLE MyTable1
ID INT NOT NULL PRIMARY KEY ,
))FullName VARCHAR(60
ﺍﳉﺪﻭﻝ ﺍﻟﺜﺎﱐ ﻳﺘﻜﻮﻥ ﻣﻦ ﺣﻘﻠﲔ ،ﺍﻷﻭﻝ ﺍﲰﻪ Codeﻭﻫﻮ ﺍﳊﻘﻞ ﺍﻷﺳﺎﺳﻲ ،ﻭﺍﻟﺜﺎﱐ ﺍﲰﻪ ID
ﺍﳌﻔﺘﺎﺡ ﺍﻟﺬﻫﱯ ﻟﻠﺪﻻﻟﺔ ﻋﻠﻰ ﺃﻥ ﺍﳊﻘﻞ ﺃﺳﺎﺳﻲ ،PRIMARY KEYﻭﺍﳌﻔﺘﺎﺡ ﺍﻟﺮﻣﺎﺩﻱ ﻟﻠﺪﻻﻟﺔ
ﻋﻠﻰ ﺃﻥ ﻫﺬﺍ ﺍﳊﻘﻞ ﺃﺟﻨﱯ .FOREIGN KEY
ﻭﻧﺴﺘﻄﻴﻊ ﺃﻳﻀﺎ ﺗﻄﺒﻴﻖ ﺍﳋﺎﺻﻴﺔ REFERENCESﻋﻠﻰ ﺟﺪﻭﻝ ﰎ ﺇﻧﺸﺎﺅﻩ ﻣﻘﺪﻣﺎ ،ﻭﺗﻜﻮﻥ
ﺍﻟﺼﻴﻐﺔ ﻫﻜﺬﺍ:
54
ALTER TABLE MyTable2
ADD CONSTRAINT FK_Constraint
)FOREIGN KEY (ID
)REFERENCES MyTable1(ID
ﺍﻷﻭﱃ ﺍﳌﻘﺮﻭﻧﺔ ﺏ FOREIGN KEYﻓﻬﻮ ﺍﺳﻢ ﺍﳊﻘﻞ ﺍﻷﺟﻨﱯ ﰲ ﺍﳉﺪﻭﻝ ﺍﻟﺜﺎﱐ ،ﻭ IDﺍﻟﺜﺎﻧﻴﺔ
ﺍﳌﻘﺮﻭﻧﺔ ﺏ REFERENCESﻫﻮ ﺍﺳﻢ ﺍﳊﻘﻞ ﺍﻷﺟﻨﱯ ﰲ ﺍﳉﺪﻭﻝ ﺍﳌﺼﺪﺭ )ﰲ ﺣﺎﻟﺘﻨﺎ ﻫﺬﻩ ﻫﻮ
ﺍﳉﺪﻭﻝ ﺍﻷﻭﻝ(.
ﻟﺘﻔﺎﺩﻱ ﻭﻗﻮﻉ ﻣﺸﺎﻛﻞ ،ﻳﺴﺘﺤﺴﻦ ﺇﺿﺎﻓﺔ ﺍﳋﺎﺻﻴﺔ REFERENCESﺑﻌﺪ ﺇﻧﺸﺎﺀ ﺍﳉﺪﺍﻭﻝ ،ﻷﻥ
ﺍﳉﺪﺍﻭﻝ ﺍﻟﱵ ﺗﻀﻢ ﺍﳊﻘﻮﻝ ﺍﻷﺳﺎﺳﻴﺔ ﳚﺐ ﺃﻥ ﺗﻨﺸﺄ ﺃﻭﻻ ﻗﺒﻞ ﺍﳉﺪﺍﻭﻝ ﺍﻟﱵ ﺗﻀﻢ ﺍﳊﻘﻮﻝ
ﺍﻷﺟﻨﺒﻴﺔ.
:DEFAULT
ﺍﻟﻐﺎﻳﺔ ﻣﻦ ﻫﺬﻩ ﺍﳋﺎﺻﻴﺔ ﻫﻲ ﲢﺪﻳﺪ ﻗﻴﻤﺔ ﺍﻓﺘﺮﺍﺿﻴﺔ ﻟﻠﺤﻘﻞ ﺍﳌﻄﺒﻘﺔ ﻋﻠﻴﻪ ﺗﻔﺎﺩﻳﺎ
ﻟﻠﻔﺮﺍﻍ ،NULLﻭﻃﺒﻌﺎ ﻫﺬﻩ ﺍﻟﻘﻴﻤﺔ ﺍﻻﻓﺘﺮﺍﺿﻴﺔ ﻻ ﲢﻔﻆ ﺇﻻ ﺇﺫﺍ ﺗﺮﻙ ﺍﳌﺴﺘﺨﺪﻡ ﻗﻴﻤﺔ
ﺍﳊﻘﻞ ﻓﺎﺭﻏﺔ ،ﻭﻟﺘﻄﺒﻴﻖ ﻫﺬﻩ ﺍﳋﺎﺻﻴﺔ ﻋﻠﻰ ﺣﻘﻞ ﻣﻌﲔ ﻓﺎﻟﺼﻴﻐﺔ ﻛﻤﺎ ﻳﻠﻲ:
)'CREATE TABLE MyTable(MyColumn nvarchar(25) DEFAULT 'UnKnown
ﺇﺫﺍ ﻛﺎﻥ ﻧﻮﻉ ﺍﳊﻘﻞ ﺭﻗﻤﻴﺎ ،ﻧﻜﺘﺐ ﺍﻟﻘﻴﻤﺔ ﻣﻦ ﻏﲑ ﻋﻼﻣﺎﺕ ﺍﻟﺘﻨﺼﻴﺺ ،ﺇﺫﺍ ﺃﺭﺩﻧﺎ ﺗﻄﺒﻴﻖ ﻫﺬﻩ
ﺍﳋﺎﺻﻴﺔ ﻋﻠﻰ ﺣﻘﻞ ﻣﻮﺟﻮﺩ ﻣﺴﺒﻘﺎ ﻓﺎﻟﺼﻴﻐﺔ ﻛﻤﺎ ﻳﻠﻲ:
55
ALTER TABLE MyTable ADD CONSTRAINT D_Constraint DEFAULT 'UnKnown' For
MyColumn
:CHECK
ﺗﺴﺘﻌﻤﻞ ﻫﺬﻩ ﺍﳋﺎﺻﻴﺔ ﻟﻠﺘﺤﻘﻖ ﻣﻦ ﻗﻴﻤﺔ ﺍﳊﻘﻞ ﻗﺒﻞ ﺇﺩﺧﺎﻟﻪ ،ﻓﺈﻥ ﻛﺎﻧﺖ ﺍﻟﻘﻴﻤﺔ ﺗﺘﻮﺍﻓﻖ
ﻣﻊ ﺍﻟﺸﺮﻁ ﺍﳌﺼﺤﻮﺏ ﺑﺎﳋﺎﺻﻴﺔ ﲤﺖ ﻋﻤﻠﻴﺔ ﺍﻹﺩﺧﺎﻝ ،ﻭﺇﻥ ﻛﺎﻧﺖ ﺍﻟﻘﻴﻤﺔ ﲣﺎﻟﻒ ﺍﻟﺸﺮﻁ
ﻳﺘﻢ ﻣﻨﻊ ﻋﻤﻠﻴﺔ ﺍﻹﺩﺧﺎﻝ ،ﻭﺻﻴﻐﺘﻬﺎ ﻫﻜﺬﺍ:
(CREATE TABLE Person
CIN CHAR(9),
FullName NVARCHAR(75),
))AGE INT CONSTRAINT C_Constraint CHECK (AGE BETWEEN 5 AND 160
ﰲ ﻫﺬﺍ ﺍﳌﺜﺎﻝ ﺳﻴﺴﻤﺢ ﻓﻘﻂ ﺑﺈﺩﺧﺎﻝ ﻗﻴﻤﺔ ﺍﻟﻌﻤﺮ ﺍﶈﺼﻮﺭﺓ ﺑﲔ 5ﺳﻨﻮﺍﺕ ﻭ 160ﺳﻨﺔ،
ﻭﳝﻜﻨﻚ ﺗﻌﻮﻳﺾ ﺍﻟﺸﺮﻁ ﺍﳌﻮﺟﻮﺩ ﺑﲔ ﺍﻟﻘﻮﺳﲔ ﺑﺄﻱ ﺷﺮﻁ ﺗﺮﻳﺪ.
56
ALTER TABLE Person
ﲝﻴﺚ Personﻫﻮ ﺍﺳﻢ ﺍﳉﺪﻭﻝ ،ﻭ C_Constraintﺍﺳﻢ ﺧﺎﺻﻴﺔ ﺍﻹﺩﺧﺎﻝ ﺍﳌﺮﺍﺩ ﺣﺬﻓﻬﺎ.
ﺍﳌﺸﺎﻫﺪ :Views
ﺍﳌﺸﺎﻫﺪ Viewsﻋﺒﺎﺭﺓ ﻋﻦ ﺟﺪﺍﻭﻝ ﻭﳘﻴﺔ ،ﻭﺍﻟﱵ ﳍﺎ ﻧﻔﺲ ﺩﻭﺭ ﺍﳉﺪﺍﻭﻝ ﺍﳊﻘﻴﻘﻴﺔ ﺇﻻ ﺃﺎ
ﺃﺧﻒ ﻭﺃﺳﺮﻉ ﻷﺎ ﻻ ﲢﺘﻮﻱ ﻋﻠﻰ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﺇﳕﺎ ﲢﺘﻮﻱ ﻓﻘﻂ ﻋﻠﻰ ﺍﻻﺳﺘﻌﻼﻡ ﺍﻟﺬﻱ ﳚﻠﺐ
ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﺍﳉﺪﺍﻭﻝ ،ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﻫﺬﻩ ﺍﳌﺰﻳﺔ ﲤﻜﻨﻨﺎ ﺍﳌﺸﺎﻫﺪ ﻣﻦ ﲢﺪﻳﺪ ﻋﺪﺩ ﺍﳊﻘﻮﻝ
ﺍﳌﺮﺍﺩ ﺗﻀﻤﻴﻨﻬﺎ ﰲ ﺍﻻﺳﺘﻌﻼﻡ ،ﻧﺎﻫﻴﻚ ﻋﻦ ﻛﻮﺎ ﲤﻜﻨﻨﺎ ﻣﻦ ﺟﻠﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﳎﻤﻮﻋﺔ ﻣﻦ
ﺍﳉﺪﺍﻭﻝ ﺍﳌﺘﺮﺍﺑﻄﺔ ﻭﲡﻤﻴﻌﻬﺎ ﻋﻠﻰ ﺷﻜﻞ ﺟﺪﻭﻝ ﻭﺍﺣﺪ.
ﺇﻧﺸﺎﺀ ﺍﳌﺸﺎﻫﺪ:
ﻹﻧﺸﺎﺀ ﻣﺸﻬﺪ Viewﻣﻌﲔ ،ﻓﺎﻟﺼﻴﻐﺔ ﺍﻟﻌﺎﻣﺔ ﻛﻤﺎ ﻳﻠﻲ:
CREATE VIEW View_Name
AS Query
ﲝﻴﺚ View_Nameﻫﻮ ﺍﺳﻢ ﺍﳌﺸﻬﺪ ﺍﳌﺮﺍﺩ ﺇﻧﺸﺎﺅﻩ ،ﻭﻫﺬﺍ ﻣﺜﺎﻝ ﻟﻜﻴﻔﻴﺔ ﺇﻧﺸﺎﺀ ﻣﺸﻬﺪ ﳚﻠﺐ
ﺑﻴﺎﻧﺎﺕ ﺍﳌﻮﻇﻔﲔ ﺍﻟﺬﻳﻦ ﻳﺴﻜﻨﻮﻥ ﻣﺪﻳﻨﺔ ﺍﻟﺮﻳﺎﺽ:
CREATE VIEW Emp_Riad
AS
57
ﻟﻮ ﺃﺭﺩﺕ ﺭﺅﻳﺔ ﺍﳌﺸﻬﺪ ﺍﻟﺬﻱ ﻗﻤﺖ ﺑﺈﻧﺸﺎﺋﻪ ﺍﺫﻫﺐ ﺇﱃ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ،ﺳﺘﺠﺪ ﰲ ﺍﻟﺘﺒﻮﻳﺐ
ﺍﻟﺬﻱ ﻳﻮﺟﺪ ﻓﻴﻪ ﺍﳉﺪﺍﻭﻝ ،ﺗﺒﻮﻳﺒﺎ ﺍﲰﻪ ،Viewsﺍﺩﺧﻞ ﺇﻟﻴﻪ ﻭﺳﺘﺠﺪ ﺍﳌﺸﻬﺪ ﺑﺎﻹﺳﻢ ﺍﻟﺬﻱ
ﺃﻋﻄﻴﺘﻪ ﺇﻳﺎﻩ.
58
ﺍﻟﻔﻬﺎﺭﺱ :Indexes
ﻫﻲ ﺷﺒﻴﻬﺔ ﺑﺎﻟﻔﻬﺎﺭﺱ ﺍﻟﱵ ﺗﻌﺮﻓﻬﺎ ،ﻭﺍﻟﱵ ﺗﻜﻮﻥ ﻣﻮﺟﻮﺩﺓ ﻏﺎﻟﺒﺎ ﰲ ﺃﻭﺍﺧﺮ ﺻﻔﺤﺎﺕ ﺍﻟﻜﺘﺎﺏ،
ﻛﻤﺎ ﺗﻌﻠﻢ ﻓﻬﺬﻩ ﺍﻟﻔﻬﺎﺭﺱ ﺗﻮﺿﻊ ﻣﻦ ﺃﺟﻞ ﲤﻜﲔ ﺍﻟﻘﺎﺭﺉ ﻣﻦ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﳌﻮﺿﻮﻉ ﺍﻟﺬﻱ ﻳﺒﺤﺚ
ﻋﻨﻪ ﺑﻜﻞ ﺳﺮﻋﺔ.
ﻧﻔﺲ ﺍﻟﺸﻲﺀ ﻳﻨﻄﺒﻖ ﻋﻠﻰ ﺍﻟﻔﻬﺎﺭﺱ ﰲ ﻟﻐﺔ ،SQLﺇﺫ ﺃﻥ ﺍﻟﻐﺎﻳﺔ ﻣﻦ ﺇﻧﺸﺎﺀ ﺍﻟﻔﻬﺎﺭﺱ ﻫﻮ ﺗﺴﺮﻳﻊ
ﻋﻤﻠﻴﺎﺕ ﺟﺮﺩ ﺍﻟﺒﻴﺎﻧﺎﺕ ) ،(Selectﻟﻜﻦ ﻋﻴﺒﻬﺎ ﻫﻮ ﺃﺎ ﺗﺒﻄﺊ ﻋﻤﻠﻴﺎﺕ ﲢﺪﻳﺚ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ
ﺇﺿﺎﻓﺔ ﻭﺣﺬﻑ ﻭﺗﻌﺪﻳﻞ ،ﻷﻥ ﻛﻞ ﻋﻤﻠﻴﺔ ﲢﺪﻳﺚ ﺗﺘﺴﺒﺐ ﰲ ﺇﻋﺎﺩﺓ ﺇﻧﺸﺎﺀ ﺍﻟﻔﻬﺮﺱ ،ﳍﺬﺍ
ﻭﺣﺴﻦ ﺍﻟﺘﻘﻠﻴﻞ ﻣﻨﻬﺎ.
ﺇﻧﺸﺎﺀ ﺍﻟﻔﻬﺎﺭﺱ:
ﻹﻧﺸﺎﺀ ﻓﻬﺮﺱ ﺟﺪﻳﺪ ﻋﻠﻰ ﺇﺣﺪﻯ ﺍﳊﻘﻮﻝ ﰲ ﺟﺪﻭﻝ ﻣﺎ ،ﻓﺈﻥ ﺍﻟﺼﻴﻐﺔ ﻛﻤﺎ ﻳﻠﻲ:
CREATE INDEX Index_Name
)ON Table_Name (Column_Name Desc | Asc
ﲝﻴﺚ Index_Nameﻫﻮ ﺍﺳﻢ ﺍﻟﻔﻬﺮﺱ ،ﻭ Table_Nameﺍﺳﻢ ﺍﳉﺪﻭﻝ ﺍﳌﻌﲏ ﺑﺎﻷﻣﺮ ،ﻭ
Column_Nameﺍﺳﻢ ﺍﻟﻌﻤﻮﺩ /ﺍﳊﻘﻞ ﺍﳌﺮﺍﺩ ﻋﻤﻞ ﻓﻬﺮﺳﺔ ﻟﻪ.
ﺃﻣﺎ Descﻭ Ascﻓﻬﻲ ﲢﺪﺩ ﻃﺮﻳﻘﺔ ﺟﺮﺩ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﻫﻲ ﺇﻣﺎ ﺗﺼﺎﻋﺪﻳﺔ Ascendingﺃﻭ
ﺗﻨﺎﺯﻟﻴﺔ .Descending
59
ﻭﻫﺬﺍ ﻣﺜﺎﻝ ﻹﻧﺸﺎﺀ ﻓﻬﺮﺱ:
ﺣﺬﻑ ﺍﻟﻔﻬﺎﺭﺱ:
ﳊﺬﻑ ﻓﻬﺮﺱ ﺑﻮﺍﺳﻄﺔ ﺃﻭﺍﻣﺮ ،SQLﻓﺎﻟﺼﻴﻐﺔ ﻛﻤﺎ ﻳﻠﻲ:
ﻣﻌﺎﳉﺔ ﺍﻟﺒﻴﺎﻧﺎﺕ:
ﲢﺪﺛﻨﺎ ﻋﻦ ﻣﻔﻬﻮﻡ ﻣﻌﺎﳉﺔ ﺍﻟﺒﻴﺎﻧﺎﺕ ﰲ ﻣﺴﺘﻬﻞ ﺍﻟﻔﺼﻞ ﺍﻟﺜﺎﱐ ،ﻭﻗﻠﻨﺎ ﺑﺄﺎ ﺗﺸﻤﻞ ﻛﻞ ﻋﻤﻠﻴﺎﺕ
ﺍﻹﺿﺎﻓﺔ ﻭﺍﻟﺘﻌﺪﻳﻞ ﻭﺍﳊﺬﻑ ﺍﻟﱵ ﺗﻄﺎﻝ ﺍﳉﺪﺍﻭﻝ.
60
ﲝﻴﺚ MyTableﻫﻮ ﺍﺳﻢ ﺍﳉﺪﻭﻝ ﺍﻟﺬﻱ ﻧﺮﻳﺪ ﺇﺿﺎﻓﺔ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺇﻟﻴﻪ ،ﻭ IDﻭ FullNameﳘﺎ
ﺍﳊﻘﻼﻥ ﺍﳌﺸﻜﻼﻥ ﳍﺬﺍ ﺍﳉﺪﻭﻝ ،ﺃﹶﻱ ﺣﻘﻞ ﻣﻦ ﺣﻘﻮﻝ ﺍﳉﺪﻭﻝ ﻻ ﻳﻜﺘﺐ ﺑﲔ ﺍﻷﻗﻮﺍﺱ ﺗﻮﺿﻊ
ﻓﻴﻪ ﺍﻟﻘﻴﻤﺔ NULLﺍﻓﺘﺮﺍﺿﻴﺎ.
ﺇﺫﺍ ﻛﺎﻥ ﺃﺣﺪ ﺍﳊﻘﻮﻝ ﻳﻄﺒﻖ ﺍﳋﺎﺻﻴﺔ IDENTITYﺍﻟﱵ ﲡﻌﻞ ﺍﻟﺮﻗﻢ ﻳﺰﺩﺍﺩ ﺗﻠﻘﺎﺋﻴﺎ ،ﻓﻼ
ﻳﻨﺒﻐﻲ ﺃﻥ ﻧﻀﻌﻪ ﻣﻊ ﺍﳊﻘﻮﻝ.
ﺇﺫﺍ ﻛﻨﺎ ﻣﺘﺄﻛﺪﻳﻦ ﻣﻦ ﺗﺮﺗﻴﺐ ﺍﳊﻘﻮﻝ ،ﻓﺒﺈﻣﻜﺎﻧﻨﺎ ﺇﻟﻐﺎﺀ ﺫﻛﺮ ﺍﳊﻘﻮﻝ ﰲ ﺍﻟﺼﻴﻐﺔ ﻭﺍﻻﻛﺘﻔﺎﺀ
ﻓﻘﻂ ﺑﺈﺩﺧﺎﻝ ﺍﻟﻘﻴﻤﺔ ،ﻛﻤﺎ ﻧﻌﺮﺽ ﻫﻨﺎ:
INSERT INTO MyTable
VALUES
)'(1, 'Khalid
ﰲ ﺍﻟﺴﻄﺮ ﺍﻷﻭﻝ ﻗﻤﻨﺎ ﺑﺘﺤﺪﻳﺪ ﺍﺳﻢ ﺍﳉﺪﻭﻝ ﺍﳌﺮﺍﺩ ﻧﺴﺦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺇﻟﻴﻪ ﻣﻊ ﲢﺪﻳﺪ ﺃﲰﺎﺀ
ﺍﳊﻘﻮﻝ ،ﰒ ﺑﻌﺪ ﺫﻟﻚ ﻧﻘﻮﻡ ﲜﻠﺐ ﻗﻴﻢ ﺍﳊﻘﻮﻝ ﻣﻦ ﺍﳉﺪﻭﻝ ﺍﳌﺼﺪﺭ ﻋﻦ ﻃﺮﻳﻖ ﺍﻟﻜﻠﻤﺔ Select
61
ﺇﺿﺎﻓﺔ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺇﱃ ﺟﺪﻭﻝ ﰲ ﻧﻔﺲ ﳊﻈﺔ ﺇﻧﺸﺎﺋﻪ:
ﺑﺈﻣﻜﺎﻧﻨﺎ ﺗﻌﺒﺌﺔ ﺟﺪﻭﻝ ﰲ ﳊﻈﺔ ﺇﻧﺸﺎﺋﻪ ﺑﻌﻨﺎﺻﺮ ﺟﺪﻭﻝ ﺁﺧﺮ ﻣﻮﺟﻮﺩ ﻣﺴﺒﻘﺎ ،ﻟﻠﻘﻴﺎﻡ ﺑﺬﻟﻚ
ﻓﺎﻟﺼﻴﻐﺔ ﻛﻤﺎ ﻳﻠﻲ:
* SELECT
INTO NewTable
FROM OldTable
ﺍﻟﻨﺠﻤﺔ * ﺗﻌﲏ ﺟﻠﺐ ﲨﻴﻊ ﺍﳊﻘﻮﻝ ،ﺇﺫﺍ ﻗﻤﺖ ﺑﺘﻨﻔﻴﺬ ﻫﺬﺍ ﺍﻟﻜﻮﺩ ﺳﻮﻑ ﺗﻜﻮﻥ ﺍﻟﻨﺘﻴﺠﺔ ﻋﺒﺎﺭﺓ
ﻋﻦ ﺟﺪﻭﻝ ﺟﺪﻳﺪ ،ﺍﲰﻪ NewTableﻣﻌﺒﺄ ﺑﻨﻔﺲ ﺑﻴﺎﻧﺎﺕ ﺍﳉﺪﻭﻝ .OldTable
ﺇﺫﺍ ﺃﺭﺩﻧﺎ ﺣﺬﻑ ﺑﻌﺾ ﺍﻟﻌﻨﺎﺻﺮ ﻓﻘﻂ ﻓﻴﻠﺰﻣﻨﺎ ﺇﺿﺎﻓﺔ ﺍﻟﻜﻠﻤﺔ ﺍﻟﺸﺮﻃﻴﺔ ،WHEREﺍﻟﱵ ﲣﻮﻝ
ﻟﻨﺎ ﲢﺪﻳﺪ ﺍﻟﺸﺮﻁ ﺍﻟﺬﻱ ﺑﺘﺤﻘﻘﻪ ﺗﺘﻢ ﻋﻤﻠﻴﺔ ﺍﳊﺬﻑ.
ﻭﻛﻤﺜﺎﻝ ﻟﺬﻟﻚ ﻧﻔﺘﺮﺽ ﺃﻥ ﻟﺪﻳﻨﺎ ﺟﺪﻭﻻ ﻳﻀﻢ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﳌﻮﻇﻔﲔ ،ﻭﻧﺮﻳﺪ ﺣﺬﻑ ﺍﳌﻮﻇﻔﲔ
ﺍﻟﺬﻳﻦ ﻳﻘﻄﻨﻮﻥ ﲟﺪﻳﻨﺔ ﺍﻟﺮﺑﺎﻁ:
DELETE FROM Employee
;'WHERE Adress= 'Rabat
62
DELETE FROM Employee
;WHERE Age > 60
ﻟﻠﻘﻴﺎﻡ ﺑﻌﻤﻠﻴﺔ ﺗﻌﺪﻳﻞ ﺍﻟﺒﻴﺎﻧﺎﺕ ﰲ ﺟﺪﻭﻝ ﻣﺎ ،ﻓﺈﻥ ﺍﻟﺼﻴﻐﺔ ﺗﻜﻮﻥ ﻛﻤﺎ ﻳﻠﻲ:
UPDATE Employee
'SET FullName='UnKnown', Adress='Jeddah
ﺍﳌﺜﺎﻝ ﺃﻋﻼﻩ ﻳﻘﻮﻡ ﺑﺘﻌﺪﻳﻞ ﺑﻴﺎﻧﺎﺕ ﻛﻞ ﺍﻟﻌﻨﺎﺻﺮ ﺍﳌﻮﺟﻮﺩﺓ ﺩﺍﺧﻞ ﺟﺪﻭﻝ ،Employeesﻭﺑﺎﻟﺘﺎﱄ
ﳉﻌﻞ ﺍﻟﺘﻌﺪﻳﻞ ﻳﺸﻤﻞ ﺑﻌﺾ ﺍﻟﻌﻨﺎﺻﺮ ﺩﻭﻥ ﻏﲑﻫﺎ ﻳﻠﺰﻣﻨﺎ ﲢﺪﻳﺪ ﺷﺮﻁ ﺍﻟﺘﻌﺪﻳﻞ ﻭﺍﻟﺬﻱ ﻳﺄﰐ
ﺑﻌﺪ ﺍﻟﻜﻠﻤﺔ ،WHEREﰲ ﺍﳌﺜﺎﻝ ﺍﻵﰐ ﺳﻨﻐﲑ ﻣﻌﻠﻮﻣﺎﺕ ﺍﳌﻮﻇﻒ ﺍﻟﺬﻱ ﳛﻤﻞ ﺍﻟﺮﻗﻢ :1
63
UPDATE Employee
'SET FullName='UnKnown', Adress='Jeddah
WHERE ID=1
ﻭﻫﺬﺍ ﻣﺜﺎﻝ ﺁﺧﺮ ﻳﻘﻮﻡ ﺑﺘﻐﻴﲑ ﺃﲰﺎﺀ ﺍﳌﻮﻇﻔﲔ ﺍﻟﻘﺎﻃﻨﲔ ﲟﺪﻳﻨﺔ ﺍﻟﺮﻳﺎﺽ ،ﻭﺗﻌﻮﻳﺾ ﺃﲰﺎﺋﻬﻢ
ﺏ "ﲪﺰﺓ":
UPDATE Employee
'SET FullName='Hamza
'WHERE Adress='Riad
ﰲ ﺍﳉﺰﺀ ﺍﻷﻭﻝ ﻣﻦ Selectﻧﻘﻮﻡ ﺑﺘﺤﺪﻳﺪ ﺍﳊﻘﻮﻝ ﺍﻟﱵ ﻧﺮﻳﺪ ﺍﺳﺘﻌﺮﺍﺽ ﻗﻴﻤﻬﺎ ،ﻭﰲ ﺍﳉﺰﺀ
ﺍﻟﺜﺎﱐ ﳓﺪﺩ ﺍﳉﺪﻭﻝ ﺍﳌﺮﺍﺩ ﺟﻠﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻨﻪ ،ﻭﰲ ﺍﳉﺰﺀ ﺍﻟﺜﺎﻟﺚ ﻧﺴﺘﻄﻴﻊ ﺃﻥ ﻧﻀﻊ ﺷﺮﻃﺎ
ﻳﻀﺒﻂ ﺟﻠﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ ،ﻛﻤﺎ ﻳﻈﻬﺮ ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ:
SELECT ID, FullName, Adress
FROM Employee
'WHERE Adress='Mekkah
64
ﺳﺘﻜﻮﻥ ﺍﻟﻨﺘﻴﺠﺔ ﻛﻤﺎ ﻳﻠﻲ:
ﳉﻠﺐ ﲨﻴﻊ ﺍﳊﻘﻮﻝ ،ﻧﺴﺘﻐﲏ ﻋﻦ ﻛﺘﺎﺑﺔ ﺍﻷﲰﺎﺀ ﻭﻧﻌﻮﺿﻬﺎ ﺑﺎﻟﺮﻣﺰ ﳒﻤﺔ )*( ﺍﻟﺬﻱ ﻳﻌﲏ ﻛﻞ
ﺍﳊﻘﻮﻝ:
* SELECT
FROM Employee
'WHERE Adress='Mekkah
* SELECT
FROM Employee
'WHERE Adress='Mekkah
And Age < 30
ﻫﺬﻩ ﺍﳌﺮﺓ ﺳﻴﺠﻠﺐ ﺍﳌﻮﻇﻔﲔ ﺍﻟﻘﺎﻃﻨﲔ ﰲ ﻣﻜﺔ ﺍﳌﻜﺮﻣﺔ ﻭﺍﻟﺪﻳﻦ ﻋﻤﺮﻫﻢ ﺃﺻﻐﺮ ﻣﻦ 30ﺳﻨﺔ.
ﻭﻫﺬﺍ ﻣﺜﺎﻝ ﺁﺧﺮ ﻳﻘﻮﻡ ﲜﻠﺐ ﺍﳌﻮﻇﻔﲔ ﺍﻟﻘﺎﻃﻨﲔ ﰲ ﻣﻜﺔ ﺍﳌﻜﺮﻣﺔ ﺃﻭ ﺍﳌﺪﻳﻨﺔ ﺍﳌﻨﻮﺭﺓ:
* SELECT
FROM Employee
'WHERE Adress='Mekkah
'OR Adress='Madina
65
ﺳﻴﻘﻮﻡ ﺍﻻﺳﺘﻌﻼﻡ ﺃﻋﻼﻩ ﲜﻠﺐ ﻛﻞ ﺍﳌﻮﻇﻔﲔ ﺍﻟﻘﺎﻃﻨﲔ ﲟﻜﺔ ﻭﺍﳌﺪﻳﻨﺔ ،ﻭﺍﻟﻨﺘﻴﺠﺔ ﻛﻤﺎ ﻳﻠﻲ:
ﺑﺈﻣﻜﺎﻧﻨﺎ ﺗﻐﻴﲑ ﺃﲰﺎﺀ ﺍﳊﻘﻮﻝ ﻋﻨﺪ ﺍﻟﻌﺮﺽ ،ﻭﻟﻔﻌﻞ ﺫﻟﻚ ﳓﺪﺩ ﺍﺳﻢ ﺍﳊﻘﻞ ﺍﳌﺮﺍﺩ ﻋﺮﺿﻪ ﺑﻌﺪ
ﺍﻟﻜﻠﻤﺔ :AS
66
ﺩﻣﺞ ﺍﳊﻘﻮﻝ :Concatenation
ﺃﺣﻴﺎﻧﺎ ﻧﺮﻳﺪ ﺇﻇﻬﺎﺭ ﻗﻴﻢ ﺑﻌﺾ ﺍﳊﻘﻮﻝ ﻣﺮﺗﺒﻄﺔ ﻓﻴﻤﺎ ﺑﻴﻨﻬﺎ ﻛﻤﺎ ﻟﻮ ﺃﺎ ﻗﻴﻤﺔ ﻭﺍﺣﺪﺓ ،ﺗﺴﻤﻰ
ﻫﺬﻩ ﺍﻟﻌﻤﻴﻠﺔ ﺑﺎﻟﺪﻣﺞ ،Concatenationﻟﻠﻘﻴﺎﻡ ﺑﺬﻟﻚ ﻧﻔﺮﻕ ﺑﲔ ﺍﳊﻘﻮﻝ ﺑﻌﻼﻣﺔ ،+ﻛﻤﺎ
ﻳﻌﺮﺽ ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ:
' SELECT FullName + Is From: '' + Adress as 'About this emplyee
From Employee
ﺑﻌﺪ ﺍﻟﻜﻠﻤﺔ SELECTﰒ ﳓﺪﺩ ﻋﺪﺩ ﺍﻷﺳﻄﺮ ﺍﻷﻭﱃ ﺍﳌﺮﺍﺩ ﺍﺳﺘﻌﺮﺍﺿﻬﺎ ،ﻛﻤﺎ ﻳﻮﺿﺢ ﺍﳌﺜﺎﻝ
ﺍﻟﺘﺎﱄ:
* SELECT TOP 3
FROM Employee
67
ﻧﺘﻴﺠﺔ ﺍﳌﺜﺎﻝ ﺃﻋﻼﻩ ﻛﻤﺎ ﻳﻠﻲ:
ﰲ ﻛﻞ ﻣﺮﺓ ﺗﻘﻮﻡ ﺑﺘﻨﻔﻴﺬ ﻫﺬﺍ ﺍﻻﺳﺘﻌﻼﻡ ،ﺳﺘﻼﺣﻆ ﺑﺄﻥ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺗﺄﰐ ﻋﺸﻮﺍﺋﻴﺎ ،ﻗﺪ ﲢﺘﺎﺝ
ﻫﺬﺍ ﺍﻷﻣﺮ ﺇﺫﺍ ﻛﻨﺖ ﺑﺼﺪﺩ ﺇﳒﺎﺯ ﺑﺮﻧﺎﻣﺞ ﳛﺘﺎﺝ ﺇﱃ ﺗﻮﻟﺪ ﺍﺧﺘﻴﺎﺭﺍﺕ ﻋﺸﻮﺍﺋﻴﺔ ﻣﺜﻞ ﻣﺴﺎﺑﻘﺔ
"ﻣﻦ ﺳﲑﺑﺢ ﺍﳌﻠﻴﻮﻥ؟".
* SELECT
FROM Employee
'WHERE FullName like 'M%
69
ﺍﻻﺳﺘﻌﻼﻡ ﺃﻋﻼﻩ ﻳﻌﲏ ﺟﺮﺩ ﺍﳌﻮﻇﻔﲔ ﺍﻟﺬﻳﻦ ﻳﺒﺪﺃ ﺍﲰﻬﻢ ﲝﺮﻑ ،Mﻭﺭﻣﺰ ﺍﻟﻨﺴﺒﺔ ﺍﳌﺌﻮﻳﺔ %
ﻳﻌﲏ ﻻ ﻳﻬﻤﻨﺎ ﻣﺎ ﻳﺄﰐ ﺑﻌﺪ ﺍﳊﺮﻑ ،Mﻭﻋﻠﻴﻪ ﻓﺎﻟﻨﺘﻴﺠﺔ ﺳﺘﻜﻮﻥ ﻛﻤﺎ ﻳﻠﻲ:
ﻭﻫﺬﺍ ﻣﺜﺎﻝ ﺁﺧﺮ ﻳﻘﻮﻡ ﲜﻠﺐ ﺍﳌﻮﻇﻔﲔ ﺍﻟﺬﻳﻦ ﺗﻨﺘﻬﻲ ﺃﲰﺎﺅﻫﻢ ﲝﺮﻑ ﺑﺎﳊﺮﻑ ":"I
* SELECT
FROM Employee
'WHERE FullName Like '%I
70
ﺗﺮﺗﻴﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ :ORDER BY
ﻧﺮﻳﺪ ﺟﺮﺩ ﺍﳌﻮﻇﻔﲔ ﻣﺮﺗﺒﲔ ﺣﺴﺐ ﺃﻋﻤﺎﺭﻫﻢ ،ﻣﻦ ﺍﻷﻛﱪ ﺇﱃ ﺍﻷﺻﻐﺮ ،ﻟﻠﻘﻴﺎﻡ ﺑﺬﻟﻚ ﻧﺴﺘﺨﺪﻡ
ﺍﻟﻜﻠﻤﺔ ORDER BYﺍﻟﱵ ﲤﻜﻨﻨﺎ ﻣﻦ ﺗﺮﺗﻴﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺇﻣﺎ ﺗﺼﺎﻋﺪﻳﺎ ﺃﻭ ﺗﻨﺎﺯﻟﻴﺎ:
* SELECT
FROM Employee
ORDER BY Age DESC
ﺍﻻﺳﺘﻌﻼﻡ ﺃﻋﻼﻩ ﻳﻘﻮﻡ ﲜﺮﺩ ﺍﳌﻮﻇﻔﲔ ﻣﺮﺗﺒﲔ ﻭﻓﻖ ﺃﻋﻤﺎﺭﻫﻢ ﺗﻨﺎﺯﻟﻴﺎ ﻣﻦ ﺍﻷﻛﱪ ﺇﱃ ﺍﻷﺻﻐﺮ،
ﻭﺍﻟﻨﺘﻴﺠﺔ ﻛﻤﺎ ﻳﻠﻲ:
ﻭﳝﻜﻨﻨﺎ ﺍﻟﻘﻴﺎﻡ ﻧﻔﺲ ﺍﻟﻌﻤﻠﻴﺔ ﺗﺼﺎﻋﺪﻳﺎ ،ﺃﻱ ﻣﻦ ﺍﻷﺻﻐﺮ ﺇﱃ ﺍﻷﻛﱪ ﻓﻘﻂ ﺑﺘﺒﺪﻳﻞ ﺍﻟﻜﻠﻤﺔ
) DESCﻭﻫﻲ ﺍﺧﺘﺼﺎﺭ ﻟﻠﻜﻠﻤﺔ (descendantﺑﺎﻟﻜﻠﻤﺔ ) ASCﻭﻫﻲ ﺍﺧﺘﺼﺎﺭ ﻟﻠﻜﻠﻤﺔ
.(ascendant
ﻭﻫﺬﺍ ﻣﺜﺎﻝ ﻟﻠﺘﻮﺿﻴﺢ:
* SELECT
FROM Employee
ORDER BY Age ASC
71
ﻭﳝﻜﻨﻨﺎ ﺍﻟﻘﻴﺎﻡ ﺑﺎﻟﺘﺮﺗﻴﺐ ﺍﳌﺘﻌﺪﺩ ﻋﻦ ﻃﺮﻳﻖ ﲢﺪﻳﺪ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﳊﻘﻮﻝ ﺑﻌﺪ ﺍﻟﻜﻠﻤﺔ ORDER
* SELECT
FROM Employee
ORDER BY Age, Adress
ﺍﻟﺪﻭﺍﻝ :Functions
ﺍﻟﺪﻭﺍﻝ ﻋﺒﺎﺭﺓ ﻋﻦ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻟﱪﺍﻣﺞ ﺍﳌﻨﺠﺰﺓ ﻣﺴﺒﻘﺎ ،ﻭﺍﻟﱵ ﺗﺘﻴﺢ ﻟﻠﻤﺴﺘﺨﺪﻡ ﺑﻌﺾ
ﺍﳋﺪﻣﺎﺕ ﺍﻟﱵ ﺗﻐﻨﻴﻪ ﻋﻦ ﻛﺘﺎﺑﺘﻬﺎ ﺑﻮﺍﺳﻄﺔ ﺍﻷﻛﻮﺍﺩ ،ﻣﻦ ﻗﺒﻴﻞ ﺍﻟﺪﻭﺍﻝ ﺍﻟﺮﻳﺎﺿﻴﺔ )ﺍﻤﻮﻉ
،Sumﺍﳌﺘﻮﺳﻂ ،(.. ،Averageﺍﻟﱵ ﻗﺪ ﳛﺘﺎﺟﻬﺎ ﺍﳌﺴﺘﺨﺪﻡ.
ﺗﻮﻓﺮ ﻟﻐﺔ SQLﳎﻤﻮﻋﺔ ﻛﺒﲑﺓ ﻣﻦ ﺍﻟﺪﻭﺍﻝ ﻹﳒﺎﺯ ﺑﻌﺾ ﺍﳌﻬﺎﻡ ﺍﻟﱵ ﳛﺘﺎﺟﻬﺎ ﺍﳌﺴﺘﺨﺪﻡ ،ﰲ
ﻫﺬﺍ ﺍﳉﺰﺀ ﺳﻨﻮﺭﺩ ﺑﻌﺾ ﺍﻟﺪﻭﺍﻝ ﺍﻷﻛﺜﺮ ﺷﻴﻮﻋﺎ ﻭﺍﻟﱵ ﻗﺪ ﲢﺘﺎﺟﻬﺎ ﻣﺴﺘﻘﺒﻼ.
ﺍﻟﺪﺍﻟﺔ :COUNT
ﻭﺗﻌﻴﺪ ﻟﻨﺎ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﻋﺪﺩ ﻋﻨﺎﺻﺮ ﺟﺪﻭﻝ ﻣﻌﲔ ،ﻭﺻﻴﻐﺘﻬﺎ ﻫﻜﺬﺍ:
)*(SELECT COUNT
FROM Employee
72
ﺍﻟﻨﺘﻴﺠﺔ ﻋﺒﺎﺭﺓ ﻋﻦ ﻗﻴﻤﺔ ﺭﻗﻤﻴﺔ ﲤﺜﻞ ﻋﺪﺩ ﺍﻟﻌﻨﺎﺻﺮ ﺍﻟﱵ ﳚﻠﺒﻬﺎ ﺍﻻﺳﺘﻌﻼﻡ.
SUM ﺍﻟﺪﺍﻟﺔ
ﺗﻌﻴﺪ ﻟﻨﺎ ﺍﻟﺪﺍﻟﺔ ،SUMﻗﻴﻤﺔ ﲤﺜﻞ ﳎﻤﻮﻉ ﻗﻴﻢ ﺍﳊﻘﻞ ﺍﻟﺮﻗﻤﻲ ﺍﶈﺪﺩ ،ﻓﻤﺜﻼ ﻟﻮ ﺍﻓﺘﺮﺿﻨﺎ ﺃﻧﻪ
ﻟﺪﻳﻨﺎ ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ ﺍﻟﺘﺎﱄ:
ﻛﻤﺎ ﻳﻠﻲ:
)SELECT SUM(Hours
FROM Employee
ﻻﺑﺪ ﺃﻥ ﻳﻜﻮﻥ ﻧﻮﻉ ﺍﳊﻘﻞ ﺍﻟﺬﻱ ﻧﻄﺒﻖ ﻋﻠﻴﻪ ﺍﻟﺪﺍﻟﺔ SUMﻣﻦ ﻧﻮﻉ ﺭﻗﻤﻲ.
AVG ﺍﻟﺪﺍﻟﺔ
ﻭﺗﻘﻮﻡ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﲝﺴﺎﺏ ﻣﺘﻮﺳﻂ ﺍﳊﻘﻞ ﺍﶈﺪﺩ ،ﻭﻛﻤﺎ ﻫﻮ ﻣﻌﻠﻮﻡ ﰲ ﺍﻟﺮﻳﺎﺿﻴﺎﺕ ﻓﺎﳌﺘﻮﺳﻂ
ﻳﺴﺎﻭﻱ ﳎﻤﻮﻉ ﻗﻴﻢ ﺍﻟﻌﻨﺎﺻﺮ ﻣﻘﺴﻮﻣﺎ ﻋﻠﻰ ﻋﺪﺩ ﺍﻟﻌﻨﺎﺻﺮ.
ﺻﻴﻐﺔ ﺍﻟﺪﺍﻟﺔ AVGﻛﻤﺎ ﻳﻠﻲ:
73
)SELECT AVG(Hours
FROM Employee
ﺍﻟﻨﺘﻴﺠﺔ ﺳﺘﻜﻮﻥ ﻋﻦ ﻋﺒﺎﺭﺓ ﻗﻴﻤﺔ ﺭﻗﻤﻴﺔ ﲤﺜﻞ ﳎﻤﻮﻉ ﺍﻟﺴﺎﻋﺎﺕ ﻣﻘﺴﻮﻡ ﻋﻠﻰ ﻋﺪﺩ ﺍﳌﻮﻇﻔﲔ،
ﺗﻄﺒﻖ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﻓﻘﻂ ﻋﻠﻰ ﺍﳊﻘﻮﻝ ﺍﻟﺮﻗﻤﻴﺔ.
ﺑﺈﻣﻜﺎﻧﻨﺎ ﺍﳊﺼﻮﻝ ﻋﻠﻰ ﻧﻔﺲ ﺍﻟﻨﺘﻴﺠﺔ ﻣﻦ ﻏﲑ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﺪﺍﻟﺔ ،AVGﻭﺫﻟﻚ ﻛﻤﺎ ﻳﻠﻲ:
)SELECT SUM(Hours)/ COUNT(Hours
FROM Employee
MIN ﺍﻟﺪﺍﻟﺔ
ﻭﺗﻌﻴﺪ ﻟﻨﺎ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﺃﺻﻐﺮ ﻗﻴﻤﺔ ﰲ ﺍﳊﻘﻞ ﺍﶈﺪﺩ ،ﻭﺻﻴﻐﺘﻬﺎ ﻛﻤﺎ ﻳﻠﻲ:
)SELECT MIN(Hours
FROM Employee
MAX ﺍﻟﺪﺍﻟﺔ
ﻭﺗﻌﻴﺪ ﻟﻨﺎ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﺃﻛﱪ ﻗﻴﻤﺔ ﰲ ﺍﳊﻘﻞ ﺍﶈﺪﺩ ،ﻭﺻﻴﻐﺘﻬﺎ ﻛﻤﺎ ﻳﻠﻲ:
)SELECT MAX(Hours
FROM Employee
74
ﲡﻤﻴﻊ ﺍﻟﺒﻴﺎﻧﺎﺕ :GROUP BY
ﺗﺴﺘﻌﻤﻞ ﺍﻟﻜﻠﻤﺔ GROUP BYﻣﻊ ﺇﺣﺪﻯ ﺍﻟﺪﻭﺍﻝ ﺍﻟﺘﺠﻤﻴﻌﻴﺔ ،Aggregate functionsﻭﲤﻜﻨﻨﺎ
ﻣﻦ ﲡﻤﻴﻊ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﻓﻖ ﺣﻘﻞ ﻣﻌﲔ ،ﻣﺜﻼ ﲢﺪﻳﺪ ﻋﺪﺩ ﺍﳌﻮﻇﻔﲔ ﺍﻟﻘﺎﻃﻨﲔ ﰲ ﻛﻞ ﻣﺪﻳﻨﺔ ،ﺃﻭ
ﻋﺪﺩ ﺍﻟﺘﻼﻣﻴﺬ ﺍﻟﺬﻳﻦ ﻳﺪﺭﺳﻮﻥ ﰲ ﻛﻞ ﻓﺼﻞ...ﺇﱁ.
ﺑﻌﺪ ﺗﻨﻔﻴﺬ ﻫﺬﺍ ﺍﻻﺳﺘﻌﻼﻡ ،ﺳﻨﺤﺼﻞ ﻋﻠﻰ ﺣﻘﻠﲔ ،ﺍﻷﻭﻝ ﻳﻌﺮﺽ ﻛﻞ ﺍﻷﻋﻤﺎﺭ ﺍﳌﻮﺟﻮﺩﺓ ﰲ
ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ ،ﻭﺍﳊﻘﻞ ﺍﻟﺜﺎﱐ ﻳﻌﺮﺽ ﻋﺪﺩ ﺍﳌﻮﻇﻔﲔ ﺍﻟﺬﻳﻦ ﻳﺒﻠﻐﻮﻥ ﻛﻞ ﻋﻤﺮ ،ﻭﻋﻠﻴﻪ
ﻓﺎﻟﻨﺘﻴﺠﺔ ﺳﺘﻜﻮﻥ ﻫﻜﺬﺍ:
75
ﺷﺮﻁ ﺍﻟﺘﺠﻤﻴﻊ :HAVING
ﺗﺴﺘﺨﺪﻡ ﺍﻟﻜﻠﻤﺔ HAVINGﺑﻌﺪ ﺍﻟﻜﻠﻤﺔ ،GROUP BYﻟﺘﺤﺪﻳﺪ ﺷﺮﻁ ﺟﻠﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ ،ﻣﺜﻼ ﺑﻌﺪ
ﺃﻥ ﺗﻘﻮﻡ GROUP BYﺑﺘﺠﻤﻴﻊ ﺍﳌﻮﻇﻔﲔ ﺣﺴﺐ ﺍﳌﺪﻥ ،ﺗﻘﻮﻡ HAVINGﲜﻠﺐ ﺍﻤﻮﻋﺎﺕ
ﺍﻟﻘﺎﻃﻨﺔ ﰲ ﻣﺪﻳﻨﺔ ﺍﻟﺮﻳﺎﺽ ﻣﺜﻼ.
ﺻﻴﻐﺘﻬﺎ ﻛﻤﺎ ﻳﻠﻲ:
SELECT Adress,
)COUNT(Adress
FROM Employee
GROUP BY Adress
'HAVING adress='Riad
ﺍﻻﺳﺘﻌﻼﻡ ﺃﻋﻼﻩ ﻳﻘﻮﻡ ﲜﻠﺐ ﺍﳌﺪﻥ ،ﻭﺃﻣﺎﻣﻬﺎ ﻋﺪﺩ ﺍﳌﻮﻇﻔﲔ ﺍﻟﻘﺎﻃﻨﲔ ﺎ ،ﻟﻜﻦ ﺑﻌﺪ ﺃﻥ ﻛﺘﺒﻨﺎ
HAVINGﺳﻴﻘﻮﻡ ﲜﻠﺐ ﺳﻜﺎﻥ ﻣﺪﻳﻨﺔ ﺍﻟﺮﻳﺎﺽ ﻓﻘﻂ.
ﰲ ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ ،ﺳﻨﺠﻠﺐ ﻛﻞ ﺍﻷﻋﻤﺎﺭ ،ﻭﺃﻣﺎﻣﻬﺎ ﻋﺪﺩ ﺍﳌﻮﻇﻔﲔ ﺍﻟﺒﺎﻟﻐﲔ ﳍﺎ ،ﰒ ﻧﻘﻮﻡ ﺑﺎﻟﻔﺮﺯ
ﺑﻮﺍﺳﻄﺔ ، HAVINGﻟﻨﺠﻠﺐ ﻓﻘﻂ ﺍﻷﻋﻤﺎﺭ ﺍﻟﱵ ﻳﻔﻮﻕ ﻋﺪﺩ ﺑﺎﻟﻐﻴﻬﺎ ﺃﺭﺑﻌﺔ ﺃﺷﺨﺎﺹ:
SELECT age,
) COUNT(Age
FROM Employee
GROUP BY age
HAVING COUNT(age)>4
76
ﺍﻟﺪﻭﺍﻝ ﺍﳊﺴﺎﺑﻴﺔ :Arithmetic Functions
ABS ﺍﻟﺪﺍﻟﺔ
ﺍﻟﺪﺍﻟﺔ ABSﺗﻌﻴﺪ ﻟﻨﺎ ﺍﻟﻘﻴﻤﺔ ﺍﳌﻄﻠﻘﺔ Absolute Valueﻟﻠﺤﻘﻞ ﺍﶈﺪﺩ ،ﻭﺻﻴﻐﺘﻬﺎ ﻛﻤﺎ ﻳﻠﻲ:
)SELECT ABS(-67
SQRT ﺍﻟﺪﺍﻟﺔ
ﺗﻌﻴﺪ ﻟﻨﺎ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﻗﻴﻤﺔ ﺍﳉﺬﺭ ﺍﳌﺮﺑﻊ ﻟﻠﺮﻗﻢ ﺍﶈﺪﺩ ،ﻭﺻﻴﻐﺘﻬﺎ ﻣﺜﻞ ﺍﻟﺪﻭﺍﻝ ﺍﻟﺴﺎﻟﻔﺔ.
ﻳﻮﺟﺪ ﺍﳌﺰﻳﺪ ﻣﻦ ﺍﻟﺪﻭﺍﻝ ﺍﻟﺮﻳﺎﺿﻴﺔ ،ﻣﺎ ﺃﻭﺭﺩﻧﺎﻩ ﻟﻴﺲ ﻛﻞ ﺷﻲﺀ.
SUBSTRING ﺍﻟﺪﺍﻟﺔ
ﺗﻌﻴﺪ ﻟﻨﺎ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﺟﺰﺀ ﻣﻦ ﺍﻟﻨﺺ ﺃﻭ ﺍﳊﻘﻞ ﺍﶈﺪﺩ ،ﻭﺻﻴﻐﺘﻬﺎ ﺍﻟﻌﺎﻣﺔ ﻛﻤﺎ ﻳﻠﻲ:
) ﻃﻮل اﻻﺟﺘﺰاء ,ﺑﺪاﯾﺔ اﻻﺟﺘﺰاء,اﻟﻨﺺ أو اﻟﺤﻘﻞ اﻟﻤﺮاد اﺟﺘﺰاؤه(SUBSTRING
ﺍﳌﻌﺎﻣﻞ ﺍﻷﻭﻝ "ﺍﻟﻨﺺ ﺃﻭ ﺍﳊﻘﻞ ﺍﳌﺮﺍﺩ ﺍﺟﺘﺰﺍﺅﻩ" ﻧﻌﻮﺿﻪ ﺑﺎﺳﻢ ﺍﳊﻘﻞ ﺍﻟﺬﻱ ﻧﺮﻳﺪ ﺍﻗﺘﻄﺎﻉ
ﺍﻟﻨﺺ ﻣﻨﻪ.
77
ﺍﳌﻌﺎﻣﻞ ﺍﻟﺜﺎﱐ "ﺑﺪﺍﻳﺔ ﺍﻻﺟﺘﺰﺍﺀ" ﻧﻌﻮﺿﻪ ﺑﺮﻗﻢ ﺍﳊﺮﻑ ﺍﻟﺬﻱ ﻧﺮﻳﺪ ﺍﺑﺘﺪﺍﺀ ﺍﻟﺘﻘﻄﻴﻊ ﺍﻧﻄﻼﻗﺎ
ﻣﻨﻪ.
ﺍﳌﻌﺎﻣﻞ ﺍﻟﺜﺎﻟﺚ "ﻃﻮﻝ ﺍﻻﺟﺘﺰﺍﺀ" ﻧﻌﻮﺿﻪ ﺑﻌﺪﺩ ﺍﻷﺣﺮﻑ ﺍﳌﺮﺍﺩ ﺗﻘﻄﻴﻌﻬﺎ ﺍﻧﻄﻼﻗﺎ ﻣﻦ ﺑﺪﺍﻳﺔ
ﺍﻻﺟﺘﺰﺍﺀ.
ﻭﻫﺬﺍ ﺍﳌﺜﺎﻝ ﻳﻌﺮﺽ ﻛﻴﻒ ﻧﺴﺘﺨﺪﻡ ﺍﻟﺪﺍﻟﺔ Substringﻣﻊ ﺣﻘﻞ ﻧﺼﻲ:
',اﻻﺳﻢ اﻟﻜﺎﻣﻞ' SELECT FullName AS
'ﺟﺰء ﻣﻦ اﻻﺳﻢ' SUBSTRING(FullName, 3,5) AS
FROM Employee
ﰲ ﻫﺬﺍ ﺍﳌﺜﺎﻝ ﺳﻨﺤﺼﻞ ﻋﻠﻰ ﻧﺘﻴﺠﺔ ﻣﺘﻜﻮﻧﺔ ﻣﻦ ﺣﻘﻠﲔ ،ﺃﺣﺪﳘﺎ ﻳﻌﺮﺽ ﺍﻻﺳﻢ ﻛﺎﻣﻼ ،ﻭﺍﻵﺧﺮ
ﻳﻌﺮﺽ ﲬﺴﺔ ﺃﺣﺮﻑ ﻣﻦ ﺍﻻﺳﻢ ﺍﻧﻄﻼﻗﺎ ﻣﻦ ﺍﳊﺮﻑ ﺍﻟﺜﺎﱐ ،ﻭﻋﻠﻴﻪ ﻓﺈﻥ ﺍﻟﻨﺘﻴﺠﺔ ﻛﻤﺎ ﻳﻠﻲ:
LEFT ﺍﻟﺪﺍﻟﺔ
ﺗﻘﻮﻡ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﺑﺎﻗﺘﻄﺎﻉ ﺍﻟﻨﺺ ﺍﻧﻄﻼﻗﺎ ﻣﻦ ﺍﻟﻴﺴﺎﺭ ﻭﺍﻧﺘﻬﺎﺀ ﺑﻘﻴﻤﺔ ﻃﻮﻝ ﺍﻻﺟﺘﺰﺍﺀ،
ﻭﺻﻴﻐﺘﻬﺎ ﻛﻤﺎ ﻳﻠﻲ:
) ﻃﻮل اﻻﺟﺘﺰاء,اﻟﺤﻘﻞ أو اﻟﻨﺺ اﻟﻤﺮاد اﺟﺘﺰاؤه(LEFT
78
ﺳﻨﻄﺒﻘﻬﺎ ﻋﻠﻰ ﻧﻔﺲ ﺍﳌﺜﺎﻝ ﺍﻟﺴﺎﺑﻖ:
',اﻻﺳﻢ اﻟﻜﺎﻣﻞ' SELECT FullName AS
'ﺟﺰء ﻣﻦ اﻻﺳﻢ' RIGHT(FullName, 5) AS
FROM Employee
ﻫﺬﻩ ﺍﳌﺮﺓ ﺳﺘﻜﻮﻥ ﺍﻟﻨﺘﻴﺠﺔ ﻋﺒﺎﺭﺓ ﻋﻦ ﺣﻘﻠﲔ ،ﺃﻭﳍﻤﺎ ﻳﻌﺮﺽ ﺍﻻﺳﻢ ﻛﺎﻣﻼ ،ﻭﺍﻟﺜﺎﱐ ﻳﻌﺮﺽ
ﺟﺰﺀ ﻣﻦ ﺍﻻﺳﻢ ﻃﻮﻟﻪ ﲬﺴﺔ ﺃﺣﺮﻑ ﺍﺑﺘﺪﺍﺀ ﻣﻦ ﺍﻟﻴﺴﺎﺭ:
RIGHT ﺍﻟﺪﺍﻟﺔ
ﺗﻘﻮﻡ ﺑﻨﻔﺲ ﺩﻭﺭ ﺍﻟﺪﺍﻟﺔ ﺍﻟﺴﺎﺑﻘﺔ ،ﻭﻟﻜﻦ ﺍﻧﻄﻼﻗﺎ ﻣﻦ ﺍﻟﻴﻤﲔ ،ﺑﺎﻟﻨﺴﺒﺔ ﻟﺼﻴﻐﺘﻬﺎ ﻓﻬﻲ ﺃﻳﻀﺎ
ﻫﻜﺬﺍ:
) ﻃﻮل اﻻﺟﺘﺰاء,اﻟﺤﻘﻞ أو اﻟﻨﺺ اﻟﻤﺮاد اﺟﺘﺰاؤه(RIGHT
79
RTRIM ﺍﻟﺪﺍﻟﺘﺎﻥ LTRIMﻭ
ﺗﻘﻮﻡ ﺍﻟﺪﺍﻟﺔ RTRIMﲟﺴﺢ ﺍﻟﻔﺮﺍﻏﺎﺕ ﻋﻦ ﳝﲔ ﺍﻟﻨﺺ ﺃﻭ ﺍﳊﻘﻞ ،ﻭﺑﺎﳌﻘﺎﺑﻞ ﺗﻘﻮﻡ ﺍﻟﺪﺍﻟﺔ
LTRIMﲟﺴﺢ ﺍﻟﻔﺮﺍﻏﺎﺕ ﻋﻦ ﻳﺴﺎﺭ ﺍﻟﻨﺺ ﺃﻭ ﺍﳊﻘﻞ ،ﻭﺻﻴﻐﺘﻬﻤﺎ ﻛﻤﺎ ﻳﻠﻲ:
-- Remove Blanks From The right
SELECT RTRIM('Khalid ;)'
ﰲ ﺍﳊﺎﻟﺘﲔ ﻣﻌﺎ ﺳﺘﻜﻮﻥ ﺍﻟﻨﺘﻴﺠﺔ ﻋﺒﺎﺭﺓ ﻋﻦ ﺍﻟﻜﻠﻤﺔ " "Khalidﻣﻦ ﺩﻭﻥ ﻓﺮﺍﻏﺎﺕ.
80
ﺑﻴﻨﻤﺎ ﺳﺘﻜﻮﻥ ﻧﺘﻴﺠﺔ ﺍﻻﺳﺘﻌﻼﻡ ﺍﻟﺜﺎﱐ ﻫﻜﺬﺍ:
CHARINDEX ﺍﻟﺪﺍﻟﺔ
ﺗﻌﻴﺪ ﻟﻨﺎ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﺭﺗﺒﺔ ﺍﳊﺮﻑ ﺃﻭ ﺍﻟﻨﺺ ﺍﶈﺪﺩ ،ﻭﺻﻴﻐﺘﻬﺎ ﻛﻤﺎ ﻳﻠﻲ:
;)'اﻟﻨﺺ اﻟﻜﺎﻣﻞ'',اﻟﺤﺮف أو اﻟﻨﺺ اﻟﻤﺮاد اﻟﺒﺤﺚ ﻋﻦ رﺗﺒﺘﮫ'(SELECT CHARINDEX
ﻳﻘﻮﻡ ﻫﺬﺍ ﺍﳌﺜﺎﻝ ﺑﺎﻟﺒﺤﺚ ﻋﻦ ﺭﺗﺒﺔ ﺍﳊﺮﻑ dﰲ ﻛﻞ ﺍﻷﲰﺎﺀ ،ﺳﺘﻜﻮﻥ ﻧﺘﻴﺠﺔ ﺍﻻﺳﺘﻌﻼﻡ ﻋﻠﻰ
ﻫﺬﺍ ﺍﻟﺸﻜﻞ:
LEN ﺍﻟﺪﺍﻟﺔ
ﺗﻌﻴﺪ ﻟﻨﺎ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﻃﻮﻝ ﺍﻟﻨﺺ ﺃﻭ ﺍﳊﻘﻞ ﺍﶈﺪﺩ ،ﻭﺻﻴﻐﺘﻬﺎ ﻛﻤﺎ ﻳﻠﻲ:
81
;)'SELECT LEN('Khalid
DATEADD ﺍﻟﺪﺍﻟﺔ
ﺍﻟﺪﺍﻟﺔ DATEADDﺗﻘﻮﻡ ﺑﺈﺿﺎﻓﺔ ﻗﻴﻤﺔ ﺭﻗﻤﻴﺔ ﺇﱃ ﺟﺰﺀ ﻣﻦ ﺣﻘﻞ ﻣﻦ ﻧﻮﻉ ﺗﺎﺭﻳﺦ ،ﻛﺈﺿﺎﻓﺔ
ﺑﻌﺾ ﺍﻷﻳﺎﻡ ﺃﻭ ﺍﻟﺸﻬﻮﺭ ﺃﻭ ﺍﻟﺴﻨﻮﺍﺕ ﺇﱃ ﺗﺎﺭﻳﺦ ﻣﻌﲔ ،ﻭﺻﻴﻐﺔ ﺍﻟﺪﺍﻟﺔ ﻛﻤﺎ ﻳﻠﻲ:
82
)DATEADD(Part_of_date, number, date
ﺍﻻﺳﺘﻌﻼﻡ ﺃﻋﻼﻩ ،ﻳﻘﻮﻡ ﲜﻠﺐ ﺃﲰﺎﺀ ﺍﳌﻮﻇﻔﲔ ﻭﺗﻮﺍﺭﻳﺦ ﺗﻮﻇﻴﻔﻬﻢ ،ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﺣﻘﻞ ﺛﺎﻟﺚ
ﳛﺘﻮﻱ ﻋﻠﻰ ﺗﺎﺭﻳﺦ ﺍﺷﺘﻐﺎﳍﻢ ﺯﺍﺋﺪ ﺛﻼﺙ ﺳﻨﻮﺍﺕ ،ﻭﻋﻠﻴﻪ ﻓﺈﻥ ﺍﻟﻨﺘﻴﺠﺔ ﺳﺘﻜﻮﻥ ﻛﻤﺎ ﻳﻠﻲ:
83
DATEDIFF ﺍﻟﺪﺍﻟﺔ
ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﺗﻘﻮﻡ ﺑﻄﺮﺡ ﺗﺎﺭﻳﺦ ﻣﻦ ﺗﺎﺭﻳﺦ ﺁﺧﺮ ،ﲝﻴﺚ ﺗﻜﻮﻥ ﺍﻟﻘﻴﻤﺔ ﺍﻟﻨﺎﲡﺔ ﻫﻲ ﻓﺎﺭﻕ
ﺍﻟﺘﺎﺭﳜﲔ ﺳﻮﺍﺀ ﺑﺎﻷﻳﺎﻡ ﺃﻭ ﺍﻷﺷﻬﺮ ﺃﻭ ﺍﻟﺴﻨﻮﺍﺕ ،ﻭﺻﻴﻐﺘﻬﺎ ﻛﻤﺎ ﻳﻠﻲ:
)DATEDIFF(Part_of_date, date1, date2
ﺍﳌﻌﺎﻣﻞ ﺍﻷﻭﻝ ﺧﺎﺹ ﺑﺘﺤﺪﻳﺪ ﺟﺰﺀ ﺍﻟﺘﺎﺭﻳﺦ ﺍﳌﺮﺍﺩ ﺇﳒﺎﺯ ﻋﻤﻠﻴﺔ ﺍﻟﻄﺮﺡ ﻋﻠﻴﻪ ،ﻭﺍﳌﻌﺎﻣﻼﻥ
ﺍﻟﺜﺎﱐ ﻭﺍﻟﺜﺎﻟﺚ ﳘﺎ ﺍﳊﻘﻼﻥ ﺃﻭ ﺍﻟﻘﻴﻤﺘﺎﻥ ﺍﻟﺘﺎﺭﳜﻴﺘﺎﻥ ﺍﻟﻠﺘﺎﻥ ﺳﺘﻜﻮﻧﺎﻥ ﻃﺮﰲ ﻋﻤﻠﻴﺔ ﺍﻟﻄﺮﺡ.
ﻭﻫﺬﺍ ﺍﳌﺜﺎﻝ ﻳﺒﲔ ﻛﻴﻔﻴﺔ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﺪﺍﻟﺔ :DATEDIFF
)'SELECT DATEDIFF(Month, '12/01/2012', '12/08/2012
ﺍﻟﻨﺘﻴﺠﺔ ﺳﺘﻜﻮﻥ ﻫﻲ ﺧﺎﺭﺝ ﻋﻤﻠﻴﺔ ﻃﺮﺡ ﺍﻟﺘﺎﺭﻳﺦ ﺍﻷﻭﻝ ﻣﻦ ﺍﻟﺘﺎﺭﻳﺦ ﺍﻟﺜﺎﱐ ﺑﺎﻷﺷﻬﺮ ﺃﻱ ﺃﻥ
ﺍﻟﻨﺘﻴﺠﺔ ﺳﺘﺴﺎﻭﻱ .7
DATEPART ﺍﻟﺪﺍﻟﺔ
ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﺗﻌﻴﺪ ﻟﻨﺎ ﺟﺰﺀ ﻣﻦ ﻗﻴﻤﺔ ﺗﺎﺭﳜﻴﺔ ﺃﻭ ﺣﻘﻞ ﻣﻦ ﻧﻮﻉ ﺍﻟﺘﺎﺭﻳﺦ ،ﻭﺻﻴﻐﺘﻬﺎ ﻛﻤﺎ ﻳﻠﻲ:
)DATEPART(part_of_date, date
ﺍﳌﻌﺎﻣﻞ ﺍﻷﻭﻝ ﻫﻮ ﺟﺰﺀ ﺍﻟﺘﺎﺭﻳﺦ ﺍﳌﺮﺍﺩ ﺍﺳﺘﺨﺮﺍﺟﻪ ،ﻭﺍﳌﻌﺎﻣﻞ ﺍﻟﺜﺎﱐ ﻫﻮ ﺍﻟﺘﺎﺭﻳﺦ ﺍﳌﺮﺍﺩ ﺍﺳﺘﺨﺮﺍﺝ
ﺍﳉﺰﺀ ﻣﻨﻪ.
ﻭﻫﺬﺍ ﻣﺜﺎﻝ ﻻﺳﺘﻌﻤﺎﻝ ﺍﻟﺪﺍﻟﺔ :DATEPART
84
SELECT date_of_working AS 'Date of working',
DATEPART(YEAR, date_of_working) AS 'year',
DATEPART(MONTH, date_of_working) AS 'month',
'DATEPART(DAY, date_of_working) AS 'day
FROM Employee
ﻫﺬﺍ ﺍﳌﺜﺎﻝ ﻳﻘﻮﻡ ﺑﻌﺮﺽ ﺍﻟﺘﺎﺭﻳﺦ ﻛﺎﻣﻼ ،ﰒ ﻳﻈﻬﺮ ﺃﻣﺎﻣﻪ ﺗﻘﻄﻴﻊ ﺍﻟﺘﺎﺭﻳﺦ ﻋﻠﻰ ﺷﻜﻞ ﺃﻳﺎﻡ ﻭﺷﻬﻮﺭ
ﻭﺳﻨﻮﺍﺕ ،ﻭﻫﺬﻩ ﺻﻮﺭﺓ ﻟﻠﻨﺘﻴﺠﺔ ﺍﶈﺼﻞ ﻋﻠﻴﻬﺎ:
ﻭﻳﻮﺟﺪ ﺩﻭﺍﻝ ﺃﺧﺮﻯ ﺗﻘﻮﻡ ﺑﻨﻔﺲ ﺩﻭﺭ ﺍﻟﺪﺍﻟﺔ DATEPARTﻟﻜﻦ ﻋﻠﻰ ﻭﺟﻪ ﺍﻟﺘﺨﺼﻴﺺ ،ﲝﻴﺚ
ﳒﺪ:
ﺍﻟﺪﺍﻟﺔ MONTHﺗﻘﻮﻡ ﺑﺎﺟﺘﺰﺍﺀ ﺍﻟﺸﻬﺮ ﻣﻦ ﺣﻘﻞ ﺃﻭ ﻗﻴﻤﺔ ﺗﺎﺭﳜﻴﺔ.
ﺍﻟﺪﺍﻟﺔ DAYﺗﻘﻮﻡ ﺑﺎﺟﺘﺰﺍﺀ ﺍﻟﻴﻮﻡ ﻣﻦ ﺣﻘﻞ ﺃﻭ ﻗﻴﻤﺔ ﺗﺎﺭﳜﻴﺔ.
ﺍﻟﺪﺍﻟﺔ YEARﺗﻘﻮﻡ ﺑﺎﺟﺘﺰﺍﺀ ﺍﻟﺴﻨﺔ ﻣﻦ ﺣﻘﻞ ﺃﻭ ﻗﻴﻤﺔ ﺗﺎﺭﳜﻴﺔ.
ﻭﻫﺬﺍ ﻣﺜﺎﻝ ﺟﺎﻣﻊ ﻟﻠﺪﻭﺍﻝ ﺍﻟﺜﻼﺛﺔ ﺍﻷﺧﲑﺓ:
SELECT MONTH(date_of_working),
DAY(date_of_working),
)YEAR(date_of_working
FROM Employee
85
GETDATE ﺍﻟﺪﺍﻟﺔ
ﺗﻌﻴﺪ ﻟﻨﺎ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﺍﻟﺘﺎﺭﻳﺦ ﺍﳊﺎﱄ ﻣﻦ ﻧﻈﺎﻡ ﺍﻟﺘﺸﻐﻴﻞ ،ﻭﺻﻴﻐﺘﻬﺎ ﻛﻤﺎ ﻳﻠﻲ:
SELECT 'GETDATE() as 'Current Date & time
ﻭﻟﻨﺨﺘﻢ ﻣﻊ ﺍﻟﺪﻭﺍﻝ ﺍﻟﺘﺎﺭﳜﻴﺔ ،ﺳﻨﻮﺭﺩ ﻣﺜﺎﻻ ﺃﺧﲑﺍ ﻧﺴﺘﻌﻤﻞ ﻓﻴﻪ ﺍﻟﺪﺍﻟﺔ GETDATEﻭﺍﻟﺪﺍﻟﺔ
:DATEDIFF
SELECT date_of_working as 'Employment date',
getdate() as 'current date',
'datediff(year, date_of_working, getdate()) as 'Employment duration
FROM Employee
ﰲ ﻫﺬﺍ ﺍﳌﺜﺎﻝ ﺳﺘﻀﻢ ﺍﻟﻨﺘﻴﺠﺔ ﺛﻼﺛﺔ ﺣﻘﻮﻝ ،ﺍﳊﻘﻞ ﺍﻷﻭﻝ ﻳﻌﺮﺽ ﺗﺎﺭﻳﺦ ﺑﺪﺍﻳﺔ ﺍﻻﺷﺘﻐﺎﻝ
،Employment dateﻭﺍﳊﻘﻞ ﺍﻟﺜﺎﱐ ﺳﻴﻌﺮﺽ ﺍﻟﺘﺎﺭﻳﺦ ﺍﳊﺎﱄ ،Current dateﻭﺍﳊﻘﻞ
ﺍﻟﺜﺎﻟﺚ ﻳﻌﺮﺽ ﻋﺪﺩ ﺍﻟﺴﻨﻮﺍﺕ ﺍﻟﱵ ﻗﻀﺎﻫﺎ ﺍﳌﻮﻇﻔﻮﻥ ﰲ ﺍﻟﺸﻐﻞ ﺍﻧﻄﻼﻗﺎ ﻣﻦ ﺗﺎﺭﻳﺦ ﺑﺪﺍﻳﺔ
ﺍﻻﺷﺘﻐﺎﻝ ﻭﺍﻧﺘﻬﺎﺀً ﺑﺎﻟﺘﺎﺭﻳﺦ ﺍﳊﺎﱄ ،ﺳﺘﻜﻮﻥ ﺍﻟﻨﺘﻴﺠﺔ ﻛﻤﺎ ﻳﻠﻲ:
86
ﺩﻭﺍﻝ ﺍﻟﺘﺤﻮﻳﻞ :Conversion Functions
ﺍﻟﺘﺤﻮﻳﻞ ﺑﲔ ﺃﻧﻮﺍﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﺃﻫﻢ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﻟﱵ ﻗﺪ ﲢﺘﺎﺟﻬﺎ ﻣﺴﺘﻘﺒﻼ ،ﻭﳍﺬﺍ ﺳﻨﻮﺭﺩ ﻓﻴﻤﺎ
ﻳﻠﻲ ﺑﻌﺾ ﺍﻟﺪﻭﺍﻝ ﻟﺘﺤﻮﻳﻞ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﻧﻮﻉ ﺇﱃ ﻧﻮﻉ ﺁﺧﺮ.
STR ﺍﻟﺪﺍﻟﺔ
ﺗﻘﻮﻡ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﺑﺘﺤﻮﻳﻞ ﺍﻟﻘﻴﻢ ﺍﻟﺮﻗﻤﻴﺔ ﺇﱃ ﻗﻴﻢ ﻧﺼﻴﺔ ،ﻭﻫﺬﺍ ﻣﺜﺎﻝ ﻻﺳﺘﻌﻤﺎﳍﺎ:
'SELECT 'The age of employee '+Fullname +' is: '+ STR(age) as 'Info
FROM Employee
ﻟﻮ ﺃﻟﻐﻴﻨﺎ ﺩﺍﻟﺔ ﺍﻟﺘﺤﻮﻳﻞ STRﺍﻟﱵ ﺗﻘﻮﻡ ﺑﺘﺤﻮﻳﻞ ﻗﻴﻤﺔ ﺍﻟﻌﻤﺮ Ageﺍﻟﺮﻗﻤﻴﺔ ﺇﱃ ﻗﻴﻤﺔ ﻧﺼﻴﺔ،
ﺳﻮﻑ ﳓﺼﻞ ﻋﻠﻰ ﺧﻄﺄ ﻷﻧﻪ ﻏﲑ ﻣﺴﻤﻮﺡ ﺑﺪﻣﺞ ﺍﻟﻨﺼﻮﺹ ﻣﻊ ﺍﻷﺭﻗﺎﻡ ﺇﻻ ﺑﻌﺪ ﺍﻟﻘﻴﺎﻡ ﺑﻌﻤﻠﻴﺔ
ﺍﻟﺘﺤﻮﻳﻞ.
CONVERT ﺍﻟﺪﺍﻟﺔ
ﻣﻦ ﻣﺰﺍﻳﺎ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﺃﺎ ﻟﻴﺴﺖ ﺣﻜﺮﺍ ﻋﻠﻰ ﻧﻮﻉ ﻣﻌﲔ ،ﺑﻞ ﻣﻦ ﺧﻼﳍﺎ ﺗﺴﺘﻄﻴﻊ ﲢﻮﻳﻞ ﺃﻱ ﻧﻮﻉ
ﺇﱃ ﻧﻮﻉ ﺁﺧﺮ ،ﻭﻫﺬﻩ ﺻﻴﻐﺘﻬﺎ:
87
)CONVERT(Data_Type, value_or_column_to_convert
ﰲ ﺍﳌﻌﺎﻣﻞ ﺍﻷﻭﻝ ﻧﻀﻊ ﻧﻮﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳌﺮﺍﺩ ﺍﻟﺘﺤﻮﻳﻞ ﺇﻟﻴﻪ ،ﻭﰲ ﺍﳌﻌﺎﻣﻞ ﺍﻟﺜﺎﱐ ﻧﻀﻊ ﺍﳊﻘﻞ ﺃﻭ
ﺍﻟﻘﻴﻤﺔ ﺍﳌﺮﺍﺩ ﲢﻮﻳﻞ ﻧﻮﻋﻬﺎ ،ﻭﻫﺬﺍ ﺍﳌﺜﺎﻝ ﻳﻌﺮﺽ ﻛﻴﻔﻴﺔ ﺍﺳﺘﺨﺪﺍﻡ ﺩﺍﻟﺔ ﺍﻟﺘﺤﻮﻳﻞ :CONVERT
SELECT CONVERT(int, '12') AS 'String To Int',
'CONVERT(varchar, 56) AS 'Int To String
ﺍﻟﺴﻄﺮ ﺍﻷﻭﻝ ﻳﻘﻮﻡ ﺑﺎﻟﺘﺤﻮﻳﻞ ﻣﻦ ﺍﻟﻘﻴﻤﺔ ﺍﻟﺮﻗﻤﻴﺔ ﺇﱃ ﻗﻴﻤﺔ ﻧﺼﻴﺔ ،ﻭﺍﻟﺴﻄﺮ ﺍﻟﺜﺎﱐ ﻳﻘﻮﻡ
ﺑﺎﻟﻌﻜﺲ ﺍﻋﺘﻤﺎﺩﺍ ﻋﻠﻰ ﺍﻟﺪﺍﻟﺔ .CONVERT
CAST ﺍﻟﺪﺍﻟﺔ
ﺩﻭﺭﻫﺎ ﺷﺒﻴﻪ ﲤﺎﻣﺎ ﺑﺎﻟﺪﺍﻟﺔ ،CONVERTﻭﺻﻴﻐﺘﻬﺎ ﻛﻤﺎ ﻳﻠﻲ:
)CAST(value_or_column_to_convert as Data_Type
ﺑﲔ ﺍﻟﻘﻮﺳﲔ ﻧﻀﻊ ﺍﻟﻘﻴﻤﺔ ﺃﻭ ﺍﳊﻘﻞ ﺍﳌﺮﺍﺩ ﲢﻮﻳﻞ ﻧﻮﻋﻪ ،ﻣﺘﺒﻮﻋﺎ ﺑﺎﻟﻜﻠﻤﺔ ASﰒ ﺑﻨﻮﻉ
ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳌﺮﺍﺩ ﺍﻟﺘﺤﻮﻳﻞ ﺇﻟﻴﻪ ،ﻭﻫﺬﺍ ﻣﺜﺎﻝ ﻳﻮﺿﺢ ﻛﻴﻔﻴﺔ ﺍﺳﺘﺨﺪﺍﻡ ﺩﺍﻟﺔ ﺍﻟﺘﺤﻮﻳﻞ :CAST
SELECT CAST(age AS CHAR(2)) FROM Employee
88
ﺗﻄﺒﻴﻘﺎﺕ ﺍﳉﱪ
ﺍﻟﺘﺠﺮﻳﺪﻱ ﰲ ﻟﻐﺔ
SQL
89
ﺗﺬﻛﲑ ﺑﺎﳉﱪ ﺍﻟﺘﺠﺮﻳﺪﻱ
ﺭﺃﻳﻨﺎ ﰲ ﺍﻟﻔﺼﻞ ﺍﻷﻭﻝ ﻣﻔﺎﻫﻴﻢ ﺍﳉﱪ ﺍﻟﺘﺠﺮﻳﺪﻱ ﻧﻈﺮﻳﺎ ،ﰲ ﻫﺬﺍ ﺍﻟﻔﺼﻞ ﺇﻥ ﺷﺎﺀ ﺍﷲ ﺳﻨﻨﺘﻘﻞ
ﺇﱃ ﺍﳉﺎﻧﺐ ﺍﻟﺘﻄﺒﻴﻘﻲ ﳍﺬﻩ ﺍﻟﻌﻤﻠﻴﺎﺕ ،ﻋﻠﻰ ﺃﻣﻞ ﺃﻥ ﺗﺘﻮﻃﺪ ﺍﳌﻌﻠﻮﻣﺎﺕ ﺍﻟﻨﻈﺮﻳﺔ ﰲ ﺃﺫﻫﺎﻧﻨﺎ
ﻭﺗﺘﺮﺳﺦ ﺍﻟﺘﻘﻨﻴﺎﺕ ﺍﻟﻌﻤﻠﻴﺔ ﰲ ﺃﻳﺎﺩﻳﻨﺎ
ﺳﻨﻘﻮﻡ ﺑﻌﺮﺽ ﺗﺬﻛﲑ ﻣﻮﺟﺰ ﻟﻜﻞ ﻋﻤﻠﻴﺔ ﻣﻦ ﻋﻤﻠﻴﺎﺕ ﺍﳉﱪ ﺍﻟﺘﺠﺮﻳﺪﻱ ،ﻣﻊ ﺇﻋﻄﺎﺀ ﻣﺜﺎﻝ ﳍﺎ
ﺑﻠﻐﺔ ،SQLﻭﺍﻟﺒﺪﺍﻳﺔ ﺳﺘﻜﻮﻥ ﻣﻊ :
ﺗﺬﻛﲑ
ﺍﻻﲢﺎﺩ Unionﻫﻮ ﻋﻼﻗﺔ ﺗﺮﺑﻂ ﺑﲔ ﳎﻤﻮﻋﺘﲔ ﳍﻤﺎ ﻧﻔﺲ ﺍﳊﻘﻮﻝ ﻭﻧﻔﺲ ﺍﳋﺼﺎﺋﺺ،
ﻭﺗﻜﻮﻥ ﺍﻟﻨﺘﻴﺠﺔ ﻋﺒﺎﺭﺓ ﻋﻦ ﳎﻤﻮﻋﺔ ﺗﻀﻢ ﻛﻞ ﻋﻨﺎﺻﺮ ﺍﻤﻮﻋﺘﲔ ،ﻭﻳﺮﻣﺰ ﳍﺎ ﺭﻳﺎﺿﻴﺎ
R1 R2 ﻫﻜﺬﺍ:
ﻣﺜﺎﻝ ﻋﻦ ﻋﻤﻴﻠﺔ ﺍﻻﲢﺎﺩ:
ﻟﻨﻔﺘﺮﺽ ﺃﻥ ﻟﺪﻳﻨﺎ ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ ﻭﺟﺪﻭﻝ ﺭﺅﺳﺎﺀ ﺍﻤﻮﻋﺎﺕ ،ﻭﳘﺎ ﺟﺪﻭﻻﻥ ﻣﺘﺸﺎﺎﻥ ﻣﻦ
ﺣﻴﺚ ﻋﺪﺩ ﻭ ﻧﻮﻉ ﺍﳊﻘﻮﻝ .ﻋﻤﻠﻴﺔ ﺍﲢﺎﺩ ﺍﳉﺪﻭﻟﲔ ﺳﺘﻔﺮﺯ ﻟﻨﺎ ﺟﺪﻭﻻ ﺛﺎﻟﺜﺎ ﻳﻀﻢ ﻛﻞ ﺍﻟﻌﻨﺎﺻﺮ
ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺍﳉﺪﻭﻟﲔ ،ﻭﳝﻜﻨﻨﺎ ﺍﻟﺘﻌﺒﲑ ﻋﻦ ﻋﻤﻠﻴﺔ ﺍﻻﲢﺎﺩ ﺑﻠﻐﺔ SQLﺑﺎﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ:
SELECT Id, FullName FROM Employee
UNION
SELECT Id, FullName FROM Director
90
ﺑﻌﺪ ﺗﻨﻔﻴﺬ ﺍﻷﻣﺮ ﺃﻋﻼﻩ ،ﺳﻨﺤﺼﻞ ﻋﻠﻰ ﺟﺪﻭﻝ ﻳﻀﻢ ﺃﺭﻗﺎﻡ ﻭﺃﲰﺎﺀ ﻛﻞ ﻣﻦ ﺍﳌﻮﻇﻔﲔ
ﻭﺍﻟﺮﺅﺳﺎﺀ.
ﺗﺬﻛﲑ
ﺍﻟﺘﻘ ﺎﻃﻊ ﻫﻮ ﻧﺎﺗﺞ ﺭﺑﻂ ﺟﺪﻭﻟﲔ ﳍﻤﺎ ﻧﻔﺲ ﻋﺪﺩ ﺍﳊﻘﻮﻝ ،ﻭﻧﻔﺲ ﺍﻟﺒﻨﻴﺔ ،ﻭﻳﺮﻣﺰ ﻟﻪ ﺭﻳﺎﺿﻴﺎ
R1 ﻭﻫﻮ ﻳﻀﻢ ﺍﻟﻌﻨﺎﺻﺮ ﺍﳌﺸﺘﺮﻛﺔ ﺑﲔ ﺟﺪﻭﻟﲔ. R2 ﺬﺍ ﺍﻟﺮﻣﺰ
ﻧﺘﻴﺠﺔ ﺍﻷﻣﺮ ﺃﻋﻼﻩ ،ﻋﺒﺎﺭﺓ ﻋﻦ ﺟﺪﻭﻝ ﻳﻀﻢ ﺍﻷﲰﺎﺀ ﺍﳌﺸﺘﺮﻛﺔ ﺑﲔ ﺍﳉﺪﻭﻟﲔ ،ﻣﺜﻼ ﻟﻮ ﻫﻨﺎﻙ
ﻣﻮﻇﻒ ﺍﲰﻪ "ﻛﺮﱘ" ﻭﰲ ﺟﺪﻭﻝ ﺍﻟﺮﺅﺳﺎﺀ ﻳﻮﺟﺪ ﺭﺋﻴﺲ ﺬﺍ ﺍﻹﺳﻢ ،ﺳﻴﻈﻬﺮ ﰲ ﺍﻟﻨﺘﻴﺠﺔ.
91
ﺍﻻﺧﺘﻼﻑ :(-) Difference
ﺗﺬﻛﲑ
Result=Employee-Director
ﻗﻢ ﺑﺘﺠﺮﻳﺐ ﻣﺜﺎﻝ ﺁﺧﺮ ﻣﻦ ﻧﺴﺞ ﺃﻓﻜﺎﺭﻙ ،ﺟﺮﺏ ﺍﺳﺘﻌﻤﺎﻝ INﻟﻮﺣﺪﻫﺎ ﻟﺘﺘﻌﺮﻑ ﻋﻠﻰ ﺩﻭﺭ ﻫﺬﻩ
ﺍﻟﻜﻠﻤﺔ.
92
ﻛﻤﺎ ﳝﻜﻨﻨﺎ ﺍﻟﻘﻴﺎﻡ ﺑﻌﻤﻠﻴﺔ ﺍﻹﺧﺘﻼﻑ ﺑﻜﻞ ﺑﺴﺎﻃﺔ ﻋﻦ ﻃﺮﻳﻖ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﻜﻠﻤﺔ ،Except
ﻭﺻﻴﻐﺔ ﺍﺳﺘﻌﻤﺎﳍﺎ ﻛﻤﺎ ﻳﻠﻲ:
ﺗﺬﻛﲑ
93
ﺍﻻﺳﻘﺎﻁ :(π) Projection
ﺗﺬﻛﲑ
Columns ﺍﻟﻔﺮﻕ ﺑﻴﻨﻪ ﻭﺑﲔ ﺍﻻﻧﺘﻘﺎﺀ ﻫﻮ ﻛﻮﻥ ﺍﻻﺳﻘﺎﻁ ﻳﻜﻮﻥ ﺑﻐﺮﺽ ﺍﻧﺘﻘﺎﺀ ﺍﻷﻋﻤﺪﺓ
ﺍﻷﺳﻄﺮ. ﻭﻟﻴﺲ
ﻣﺜﺎﻝ ﻋﻦ ﻋﻤﻴﻠﺔ ﺍﻻﺳﻘﺎﻁ:
ﺗﻄﺒﻴﻖ ﻋﻤﻠﻴﺔ ﺍﻹﺳﻘﺎﻁ ﻋﻠﻰ ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ ﻳﻌﲏ ﺇﻇﻬﺎﺭ ﺑﻌﺾ ﺍﳊﻘﻮﻝ ﻓﻘﻂ ،ﻣﺜﻼ :
SELECT FullName, Adress FROM Employee
ﺗﺬﻛﲑ
ﻭﻳﻜﻮﻥ ﺍﻟﻨﺎﺗﺞ ﻋﻦ ﻫﺬﻩ ﺍﻟﻌﻤﻠﻴﺔ ﻋﺒﺎﺭﺓ ﻋﻦ ﳎﻤﻮﻋﺔ ﺟﺪﻳﺪﺓ ،ﺗﻀﻢ ﺧﺎﺭﺝ ﺟﺪﺍﺀ ﻛﻞ
ﺍﻷﺧﺮﻯ. ﻋﻨﺼﺮ ﻣﻦ ﺍﻤﻮﻋﺘﲔ ﺑﺒﺎﻗﻲ ﻋﻨﺎﺻﺮ ﺍﻤﻮﻋﺔ
94
ﻣﺜﺎﻝ ﻋﻦ ﻋﻤﻴﻠﺔ ﺍﳉﺪﺍﺀ ﺍﻟﺪﻳﻜﺎﺭﰐ:
ﻟﻨﻔﺘﺮﺽ ﺃﻥ ﻟﺪﻳﻨﺎ ﺟﺪﻭﻝ ﻟﻠﺴﻴﺎﺭﺍﺕ ﻳﻀﻢ ﺃﺭﻗﺎﻡ ﻭﺃﻧﻮﺍﻉ ﺍﻟﺴﻴﺎﺭﺍﺕ ،ﻭﺟﺪﻭﻝ ﺛﺎﻥ ﻳﻀﻢ ﺧﺼﺎﺋﺺ
ﺍﻟﺴﻴﺎﺭﺍﺕ ،ﻭﳛﺘﻮﻱ ﻋﻠﻰ ﺍﻟﻠﻮﻥ ﻭﺍﻟﺜﻤﻦ ،ﻛﻤﺎ ﻳﻠﻲ:
2 Ferrari
ﺗﻄﺒﻴﻖ ﺍﳉﺪﺍﺀ ﺍﻟﺪﻳﻜﺎﺭﰐ ﻋﻠﻰ ﺍﳉﺪﻭﻟﲔ ،ﻳﻌﲏ ﺍﳊﺼﻮﻝ ﻋﻠﻰ ﺟﺪﻭﻝ ﺛﺎﻟﺚ ﻳﻀﻢ ﻛﻞ
ﺍﻻﺣﺘﻤﺎﻻﺕ ﺍﳌﻤﻜﻨﺔ ،ﺃﻱ ﻛﻤﺎ ﻳﻠﻲ:
ID Model Color Price
1 Mercedes Black 3 000 000
95
ﻭﳝﻜﻨﻨﺎ ﺇﳒﺎﺯ ﻫﺬﺍ ﺍﻷﻣﺮ ﰲ ﻟﻐﺔ SQLﺑﺎﻟﻄﺮﻳﻘﺔ ﺍﻟﺘﺎﻟﻴﺔ:
SELECT Car.ID, Car.Model,
Descrip.Color, Descrip.Price
FROM Car, Descrip ORDER BY Car.ID
ﺗﺬﻛﲑ
ﻭﻳﻌﲏ ﻗﺴﻤﺔ ﺟﺪﻭﻝ ﻋﻠﻰ ﺟﺪﻭﻝ ﺁﺧﺮ ،ﺑﺸﺮﻁ ﺃﻥ ﺗﻜﻮﻥ ﺣﻘﻮﻝ ﺍﳉﺪﻭﻝ ﺍﻟﺜﺎﱐ ﻣﺘﻮﺍﺟﺪﺓ
ﰲ ﺍﳉﺪﻭﻝ ﺍﻷﻭﻝ ،ﻭ ﻳﺮﻣﺰ ﳍﺎ ﰲ ﺍﻟﺮﻳﺎﺿﻴﺎﺕ ﺏ ÷ ،ﻭﺗﻜﻮﻥ ﺍﻟﻨﺘﻴﺠﺔ ﻋﺒﺎﺭﺓ ﻋﻦ ﺟﺪﻭﻝ
ﻳﻀﻢ ﻋﻨﺎﺻﺮ ﺍﳉﺪﻭﻝ ﺍﻷﻭﻝ ﺍﻟﱵ ﺗﻀﻢ ﻛﻞ ﻋﻨﺎﺻﺮ ﺍﳉﺪﻭﻝ ﺍﻟﺜﺎﱐ ،ﻭﺻﻴﻐﺘﻬﺎ ﺍﻟﺮﻳﺎﺿﻴﺔ
ﻫﻜﺬﺍ R3=R1÷R2
96
Developer Project_ID
Ahmed Ismaîl 1
Younes Khalifa 2
Ahmed Ismaîl 2
Rachid Kamal 1
Younes Khalifa 1
ﻹﺟﺮﺍﺀ ﻋﻤﻠﻴﺔ ﺍﻟﻘﺴﻤﺔ ﺑﻮﺍﺳﻄﺔ ،SQLﻳﻠﺰﻣﻨﺎ ﺗﺸﻐﻴﻞ ﻋﻘﻮﻟﻨﺎ ﺟﻴﺪﺍ ،ﻭﻛﻞ ﺣﺴﺐ ﻣﻘﺪﺭﺍﺗﻪ
ﺍﻟﺬﻫﻨﻴﺔ ﺳﻴﻀﻊ ﺻﻴﻐﺔ ﻟﻠﻮﺻﻮﻝ ﺇﱃ ﺍﻟﻨﺘﻴﺠﺔ ،ﻣﺜﻼ ﻫﺬﺍ ﻣﺎ ﺍﺳﺘﻄﻌﺖ ﺍﻟﻮﺻﻮﻝ ﺇﻟﻴﻪ ﺑﻔﻀﻞ
ﺍﷲ ﻭﻋﻮﻧﻪ:
97
SELECT Developer
FROM Developers
WHERE project_id IN
(SELECT project_id FROM projects
)WHERE project_id IN(SELECT project_id from developers
)
GROUP BY developer
)HAVING COUNT(project_id)=(SELECT COUNT(project_id) FROM projects
ﺭﲟﺎ ﺗﺴﺘﻄﻴﻊ ﻛﺘﺎﺑﺔ ﺻﻴﻐﺔ ﺃﺧﺮﻯ ﺃﺳﻬﻞ ﻣﻦ ﻫﺬﻩ ﻭﺫﻟﻚ ﺣﺴﺐ ﻗﺪﺭﺗﻚ ﺍﻟﻔﻜﺮﻳﺔ ،ﳍﺬﺍ ﺿﻊ
ﻧﺼﺐ ﻋﻴﻨﻴﻚ ﺍﻟﻨﺘﻴﺠﺔ ،ﻭﻓﻜﺮ ﰲ ﻃﺮﻳﻘﺔ ﺫﻛﻴﺔ ﻟﻠﻮﺻﻮﻝ ﺇﻟﻴﻬﺎ.
ﺗﺬﻛﲑ
ﻭﻳﻘﺘﻀﻲ ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺟﺪﻭﻻﻥ ﳍﻤﺎ ﺣﻘﻞ ﻣﺸﺘﺮﻙ ﻣﻦ ﻧﻔﺲ ﺍﻟﻨﻮﻉ ،ﻭﻳﺴﺘﻌﻤﻞ
ﺑﻐﺮﺽ ﺍﻟﺒﺤﺚ ﻋﻦ ﺍﻟﻌﻨﺎﺻﺮ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺍﳉﺪﻭﻟﲔ ﻣﻦ ﺧﻼﻝ ﲢﻘﻖ ﺷﺮﻁ ﻭﺟﻮﺩ ﺍﳊﻘﻞ
ﺍﳌﺸﺘﺮﻙ ﺑﻨﻔﺲ ﺍﻟﻘﻴﻤﺔ ﰲ ﺍﳉﺪﻭﻟﲔ ،ﻭﻳﺮﻣﺰ ﻟﻪ ﺭﻳﺎﺿﻴﺎ ﺑﺎﻟﺮﻣﺰ ﺍﻟﺘﺎﱄ
98
Group_ID Group_Name
1 Group 1
2 Group 2
3 Group 3
ﻋﻤﻴﻠﺔ ﺍﻟﺮﺑﻂ ﺑﲔ ﺍﳉﺪﻭﻟﲔ ﺳﺘﺘﻢ ﻣﻦ ﺧﻼﻝ ﺍﳊﻘﻞ Group_IDﻷﻧﻪ ﻣﺸﺘﺮﻙ ﺑﻴﻨﻬﻤﺎ ،ﻟﻨﻘﻢ
ﲜﻠﺐ ﺃﲰﺎﺀ ﺍﻷﻋﻀﺎﺀ ﻭﺍﻤﻮﻋﺎﺕ ﻣﻌﺎ ﲝﻴﺚ ﻧﻌﺮﺽ ﻳﻜﻮﻥ ﺭﻗﻢ ﺍﻤﻮﻋﺎﺕ ﻣﺸﺘﺮﻛﺎ ﺑﲔ
ﺍﳉﺪﻭﻟﲔ ،ﺃﻱ ﺃﻥ ﺍﻟﻨﺘﻴﺠﺔ ﺍﺑﺘﺪﺍﺀ ﺳﺘﻜﻮﻥ ﺬﺍ ﺍﻟﺸﻜﻞ:
Member Group_Name
Khalid Ahmed Group 1
Hamid MAKBOUL Group 2
NABIL ZAKI Group 1
ﰎ ﺟﻠﺐ ﻛﻞ ﺍﻷﻋﻀﺎﺀ ﺑﺎﺳﺘﺜﻨﺎﺀ ،ﺍﻟﻌﻀﻮ ﺍﻷﺧﲑ ﻷﻧﻪ ﻳﻨﺘﻤﻲ ﺇﱃ ﺍﻤﻮﻋﺔ ﺭﻗﻢ ،8ﻭﻫﺬﺍ
ﺍﻟﺮﻗﻢ ﻏﲑ ﻣﻮﺟﻮﺩ ﰲ ﺟﺪﻭﻝ ﺍﻤﻮﻋﺎﺕ.
ﺇﺫﻥ ﻓﺒﺈﻣﻜﺎﻧﻨﺎ ﺗﺮﲨﺔ ﻫﺬﺍ ﺍﻷﻣﺮ ﺇﱃ ﻟﻐﺔ ،SQLﻛﻤﺎ ﻳﻠﻲ:
SELECT Member, Group_Name
FROM Members, Groups
WHERE Members.Group_ID=Groups.Group_ID
99
ﺑﺈﻣﻜﺎﻧﻨﺎ ﺃﻳﻀﺎ ﺇﺟﺮﺍﺀ ﻋﻤﻠﻴﺔ ﺍﻟﺮﺑﻂ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﻜﻠﻤﺔ ،JOINﻛﻤﺎ ﻳﻌﺮﺽ ﻫﺬﺍ ﺍﳌﺜﺎﻝ:
SELECT Member, Group_Name
FROM Members
JOIN Groups
ON Members.Group_ID=Groups.Group_ID
100
ﺍﻟﱪﳎﺔ ﰲ
Transact SQL
101
ﺭﲟﺎ ﻗﺪ ﺗﺴﺘﻐﺮﺏ ﻣﻦ ﺍﺳﻢ ﻫﺬﺍ ﺍﻟﻔﺼﻞ ،ﻭﻟﻌﻠﻚ ﺗﺘﺴﺎﺀﻝ ﻣﺎ ﻋﻼﻗﺔ T-SQLﺑﺎﻟﱪﳎﺔ؟ ﻧﻌﻢ،
ﺑﺈﻣﻜﺎﻧﻨﺎ ﺍﻟﱪﳎﺔ ﺑﻠﻐﺔ ،T-SQLﲤﺎﻣﺎ ﻛﺄﻧﻨﺎ ﺩﺍﺧﻞ ﻟﻐﺔ ﻟﻠﱪﳎﺔ ،ﺳﻨﺘﻌﺮﻑ ﻋﻠﻰ ﺍﳌﺘﻐﲑﺍﺕ
ﻭﺍﻟﺒﻨﻴﺎﺕ ﺍﻟﺸﺮﻃﻴﺔ ﻭﺍﻟﺘﻜﺮﺍﺭﻳﺔ ،ﻷﺎ ﺳﺘﻔﻴﺪﻧﺎ ﰲ ﺑﺮﳎﺔ ﺍﻹﺟﺮﺍﺀ ﺍﺕ ﺍﳌﺨﺰﻧﺔ ﻭﺍﻟﻘﻮﺍﺩﺡ
ﺍﻟﱵ ﻗﺪ ﺗﺴﺘﺨﺪﻣﻬﺎ ﰲ ﺇﺣﺪﻯ ﺑﺮﺍﳎﻚ ﺍﳌﺼﻤﻤﺔ ﺑﻠﻐﺔ VB.Netﺃﻭ .C#.Net
ﺍﳌﺘﻐﲑﺍﺕ :Variables
ﺍﳌﺘﻐﲑﺍﺕ ﻫﻲ ﺣﻴﺰ ﰲ ﺍﻟﺬﺍﻛﺮﺓ ﻟﻪ ﺍﺳﻢ ﻣﻌﲔ ،ﻭﻧﻮﻉ ﺑﻴﺎﻧﺎﺕ ،ﻭﻳﺴﺘﺨﺪﻡ ﻟﺘﺨﺰﻳﻦ ﻗﻴﻢ ﻣﺆﻗﺘﺔ
ﻣﻮﺍﻓﻘﺔ ﳍﺬﺍ ﺍﻟﻨﻮﻉ ،ﻭﻳﺘﻢ ﺍﻹﻋﻼﻥ ﻋﻦ ﺍﳌﺘﻐﲑﺍﺕ ﰲ ﻟﻐﺔ T-SQLﺑﺎﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ:
DECLARE @myVariable int
ﺍﻟﻄﺮﻳﻘﺔ ﺍﻟﺜﺎﻧﻴﺔ:
SELECT @myVariable=4
102
ﺑﺈﻣﻜﺎﻧﻨﺎ ﺇﻋﻄﺎﺀ ﻗﻴﻤﺔ ﺇﺣﺪﻯ ﺣﻘﻮﻝ ﺟﺪﻭﻝ ﻣﺎ ﳌﺘﻐﲑ ﻛﻤﺎ ﻳﻠﻲ:
)SELECT @myVariable=(SELECT Age FROM Employee WHERE ID=3
'SELECT @myName='Khalid
ﺍﻷﻣﺮ :RETURN
ﻳﺴﺘﺨﺪﻡ ﻟﻠﺨﺮﻭﺝ ﻣﻦ ﻋﻤﻠﻴﺔ ﻣﻌﻴﻨﺔ ،ﺃﻭ ﻹﻳﻘﺎﻑ ﺍﻟﱪﻧﺎﻣﺞ.
103
)IF (Conditon
BEGIN
--Do Something
END
ELSE
BEGIN
--Do Something
END
)IF (@Count>3
ELSE
ﻗﻤﻨﺎ ﺑﺎﻹﻋﻼﻥ ﻋﻦ ﻣﺘﻐﲑ ﺭﻗﻤﻲ ﺍﲰﻪ ،@Countﰒ ﺃﻋﻄﻴﻨﺎﻩ ﻋﺪﺩ ﻋﻨﺎﺻﺮ ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ
ﻛﻘﻴﻤﺔ ،ﺑﻌﺪﻫﺎ ﲢﻘﻘﻨﺎ ﻣﻦ ﻫﺬﻩ ﺍﻟﻘﻴﻤﺔ ،ﺇﻥ ﻛﺎﻧﺖ ﺃﻛﱪ ﻣﻦ ،3ﺃﻇﻬﺮﻧﺎ ﺭﺳﺎﻟﺔ ﺑﺄﻥ ﻋﺪﺩ ﻋﻨﺎﺻﺮ
ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ ﺃﻛﱪ ﻣﻦ ﺛﻼﺛﺔ ،ﻭﺇﻥ ﻛﺎﻥ ﺍﻟﻌﻜﺲ ﺃﻇﻬﺮﻧﺎ ﺭﺳﺎﻟﺔ ﻣﻔﺎﺩﻫﺎ ﺑﺄﻥ ﺍﻟﻌﺪﺩ ﺃﻗﻞ ﻣﻦ .3
104
:Case ﺍﻟﺒﻨﻴﺔ ﺍﻟﺸﺮﻃﻴﺔ ﺑﺎﺳﺘﺨﺪﺍﻡ
:ﺻﻴﻐﺘﻬﺎ ﻛﻤﺎ ﻳﻠﻲ
CASE
ELSE ResultN
END
ﰒ ﻧﻈﻬﺮ ﺃﻣﺎ ﻛﻞ ﻣﻮﻇﻒ ﺭﺳﺎﻟﺔ، ﻭﻧﺘﺤﻘﻖ ﻣﻦ ﻋﻤﺮ ﻛﻞ ﻣﻮﻇﻒ،ﺳﻨﻘﻮﻡ ﲜﻠﺐ ﺑﻴﺎﻧﺎﺕ ﺍﳌﻮﻇﻔﲔ
:ﺣﺴﺐ ﻋﻤﺮﻩ
Else
End
From Employee
105
:WHILE ﺍﻟﺒﻨﻴﺔ ﺍﻟﺘﻜﺮﺍﺭﻳﺔ ﺑﺎﺳﺘﻌﻤﺎﻝ
، ﻟﺘﻜﺮﺍﺭ ﺃﻣﺮ ﻣﻌﲔ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﳌﺮﺍﺕ ﻭﻓﻖ ﺍﻟﻌﺪﺩ ﺍﶈﺪﺩ ﰲ ﺍﻟﺸﺮﻁWHILE ﺗﺴﺘﺨﺪﻡ ﺍﻟﻜﻠﻤﺔ
WHILE Condition
:ﻭﺻﻴﻐﺘﻬﺎ ﻛﻤﺎ ﻳﻠﻲ
BEGIN
--Do something
END
ﳍﺬﺍ ﻻ ﺗﺮﺗﺒﻚ ﻷﻧﻨﺎ، ﻟﻜﻨﻪ ﺳﻴﺒﺪﻭ ﻟﻚ ﻣﻌﻘﺪﺍ ﻣﻦ ﺣﻴﺚ ﺃﻭﺍﻣﺮﻩ،ﺳﻨﻌﻄﻲ ﻣﺜﺎﻻ ﺳﻬﻼ ﺟﺪﺍ
:ﺳﻨﺸﺮﺣﻪ ﺟﻴﺪﺍ ﺇﻥ ﺷﺎﺀ ﺍﷲ
DECLARE @count INT
SET @ID=10
BEGIN
SET @ID=@ID+1
END
106
ﻗﻤﻨﺎ ﺑﺎﻹﻋﻼﻥ ﻋﻦ ﻣﺘﻐﲑﻳﻦ ﺭﻗﻤﻴﲔ ،ﺍﻷﻭﻝ @countﻳﺴﺎﻭﻱ ﻋﺪﺩ ﻋﻨﺎﺻﺮ ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ،
ﻭﺍﻟﺜﺎﱐ @IDﻳﺴﺎﻭﻱ ﺍﺑﺘﺪﺍﺀ ،10ﰒ ﻗﻤﻨﺎ ﺑﺘﻜﺮﺍﺭ ﻋﻤﻠﻴﺔ ﺇﺿﺎﻓﺔ ﺃﺳﻄﺮ ﺟﺪﻳﺪﺓ ﻣﺎﺩﺍﻡ ﺍﻟﺸﺮﻁ
)ﻋﺪﺩ ﺍﻟﻌﻨﺎﺻﺮ ﺃﻗﻞ ﻣﻦ ﻋﺸﺮﺓ( ﻣﺘﺤﻘﻘﺎ ،ﲟﻌﲎ ﺃﻥ ﻫﺬﺍ ﺍﻟﱪﻧﺎﻣﺞ ﻳﻘﻮﻡ ﲝﺴﺎﺏ ﻋﺪﺩ ﻋﻨﺎﺻﺮ
ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ ،ﻓﺈﻥ ﻛﺎﻥ ﺃﻗﻞ ﻣﻦ ﻋﺸﺮﺓ ﺃﺿﺎﻑ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻟﻌﻨﺎﺻﺮ ﻹﻛﻤﺎﻝ ﻋﺸﺮﺓ
ﻋﻨﺎﺻﺮ ،ﻗﻢ ﺑﺎﻟﻌﻮﺩﺓ ﺇﱃ ﺍﳌﺜﺎﻝ ﻭﺗﺄﻣﻠﻪ ﺳﻄﺮﺍ ﺳﻄﺮﺍ.
ﻣﺜﻼ ﻟﻮ ﻋﻨﺪﻱ ﰲ ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ ﺳﺘﺔ ﻋﻨﺎﺻﺮ ،ﺳﻴﺘﻢ ﺇﺿﺎﻓﺔ ﺃﺭﺑﻌﺔ ﻋﻨﺎﺻﺮ.
ﻭﻫﺬﻩ ﺻﻮﺭﺓ ﳉﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ ﺑﻌﺪ ﺗﻨﻔﻴﺬ ﺍﻟﱪﻧﺎﻣﺞ:
107
ﻗﻢ ﺑﺘﺠﺮﻳﺐ ﺍﳌﺜﺎﻝ ،ﻭﻋﺪﻝ ﻋﻠﻴﻪ ﻟﺘﺴﺘﻮﻋﺒﻪ ﺟﻴﺪﺍ.
)IF (Condition
ELSE
--Cancel the transaction
ﻟﻨﻔﺘﺮﺽ ﺃﻥ ﻟﺪﻳﻨﺎ ﺟﺪﻭﻝ ﺍﳌﱪﳎﲔ ﻭﺟﺪﻭﻝ ﺍﳌﺸﺎﺭﻳﻊ ،ﻟﻜﻦ ﻫﺬﻩ ﺍﳌﺮﺓ ﻻ ﻳﻮﺟﺪ ﺃﻱ ﺭﺍﺑﻂ ﺑﲔ
ﺍﳉﺪﻭﻟﲔ ،ﻭﻧﺮﻳﺪ ﺣﺬﻑ ﺍﳌﱪﻣﺞ ﺭﻗﻢ 100ﻭﻛﺎﻓﺔ ﺍﳌﺸﺎﺭﻳﻊ ﺍﻟﱵ ﻗﺎﻡ ﺑﱪﳎﺘﻬﺎ ،ﺍﻟﻄﺮﻳﻘﺔ
ﺍﻟﻌﺎﺩﻳﺔ ﻛﻤﺎ ﻳﻠﻲ:
'DELETE From Programmers WHERE Programmer.Programmer_ID='100
108
ﻟﻜﻦ ﻧﻔﺘﺮﺽ ﺃﻧﻪ ﺑﻌﺪ ﺗﻨﻔﻴﺬ ﺍﻷﻣﺮ ﺍﻷﻭﻝ ،ﺣﺪﺙ ﻣﺸﻜﻞ ﰲ ﺍﻟﱪﻧﺎﻣﺞ ،ﺃﻭ ﺍﻧﻘﻄﻊ ﺍﻟﺘﻴﺎﺭ ،ﺃﻭ ﻣﺎ
ﺇﱃ ﺫﻟﻚ ﻣﻦ ﺃﺳﺒﺎﺏ ﲢﻮﻝ ﺩﻭﻥ ﺗﻜﻤﻠﺔ ﺑﺎﻗﻲ ﺍﻷﻭﺍﻣﺮ ،ﰲ ﻫﺬﻩ ﺍﳊﺎﻟﺔ ﺳﺘﺘﺒﻌﺜﺮ ﺍﻟﺒﻴﺎﻧﺎﺕ،
ﲝﻴﺚ ﺳﻨﺠﺪ ﺍﳌﱪﻣﺞ ﻏﲑ ﻣﻮﺟﻮﺩ ﰲ ﺟﺪﻭﻝ ﺍﳌﱪﳎﲔ ﻟﻜﻦ ﺭﻗﻤﻪ ﺣﺎﺿﺮ ﰲ ﺟﺪﻭﻝ ﺍﳌﺸﺎﺭﻳﻊ.
ﺣﺎﻟﺘﻨﺎ ﻫﺬﻩ ﻳﺴﲑﺓ ،ﻟﻜﻦ ﺍﻓﺘﺮﺽ ﺃﻧﻚ ﺑﺼﺪﺩ ﺇﳒﺎﺯ ﺑﺮﻧﺎﻣﺞ ﻹﺩﺍﺭﺓ ﺍﻟﺒﻨﻮﻙ ﻭﻳﻠﺰﻡ ﺍﻟﱪﻧﺎﻣﺞ ﺃﻥ
ﻳﻘﻮﻡ ﺑﺎﺳﺘﻼﻡ ﺍﻷﻣﻮﺍﻝ ﻣﻦ ﺍﻟﺰﺑﻮﻥ ﻭﺇﺿﺎﻓﺘﻬﺎ ﺇﱃ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ،ﰒ ﺗﻮﻗﻒ ﺍﻟﱪﻧﺎﻣﺞ ﰲ
ﻣﺮﺣﻠﺔ ﺣﺮﺟﺔ ﻣﺎﺫﺍ ﺳﻴﻜﻮﻥ ﺭﺩ ﻓﻌﻠﻚ؟
ﻫﻨﺎ ﺗﺒﺰﻍ ﺃﳘﻴﺔ ﺇﺩﺍﺭﺓ ﺍﻟﻌﻤﻠﻴﺎﺕ ،Transactionsﲝﻴﺚ ﺑﺎﺳﺘﺨﺪﺍﻣﻬﺎ ﺳﺘﻨﻔﺬ ﻛﻞ ﺍﻷﻭﺍﻣﺮ ﺃﻭ
ﺗﻠﻐﻰ ﻛﻠﻬﺎ ،ﻭﻫﻨﺎ ﻧﻄﺒﻖ ﺇﺩﺍﺭﺓ ﺍﻟﻌﻤﻠﻴﺎﺕ ﻋﻠﻰ ﺍﳌﺜﺎﻝ ﺍﻟﺴﺎﺑﻖ:
BEGIN TRAN
COMMIT TRAN
Cursors ﺍﳌﻤﺮﺭﺍﺕ
ﺍﳌﻤﺮﺭﺍﺕ Cursorsﻋﺒﺎﺭﺓ ﻋﻦ ﻛﺎﺋﻨﺎﺕ ﲤﻜﻨﻨﺎ ﻣﻦ ﺇﺟﺮﺍﺀ ﺃﻣﺮ ﻣﻌﲔ ﻋﻠﻰ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻟﻌﻨﺎﺻﺮ
ﺩﻓﻌﺔ ﻭﺍﺣﺪﺓ ﻭﺍﺣﺪﺍ ﺑﻮﺍﺣﺪ ،ﺍﻷﻣﺮ ﺍﻟﺬﻱ ﻻ ﳒﺪﻩ ﰲ ﻃﺮﻕ ﺍﻹﺳﺘﻌﻼﻡ ﺍﻟﻌﺎﺩﻳﺔ ،ﻭﺻﻴﻐﺔ ﺇﻧﺸﺎﺀ
ﺍﳌﻤﺮﺭﺍﺕ ﻛﻤﺎ ﻳﻠﻲ:
109
ﺑﺈﻋﻄﺎﺋﮫ اﺳﻤﺎ و أﻣﺮا ﻟﻠﺘﻨﻔﯿﺬ-- اﻹﻋﻼن ﻋﻦ اﻟﻤﻤﺮر
ﻧﻔﺘﺢ اﻟﻤﻤﺮر--
OPEN Cursor_Name
While @@fetch_status=0
BEGIN
END
ﻧﻐﻠﻖ اﻟﻤﻤﺮر--
Close Cursor_Name
Deallocate Cursor_Name
ﰲ ﻫﺬﺍ ﺍﻟﺴﻄﺮ ﻧﻘﻮﻡ ﺑﺎﻹﻋﻼﻥ ﻋﻦ ﺍﳌﻤﺮﺭ ﻣﻊ ﺇﻋﻄﺎﺋﻪ ﺍﲰﺎ ﻣﻦ ﻧﻮﻉ ،Cursorﰒ ﺑﻌﺪ ﺍﻟﻜﻠﻤﺔ
FORﻧﻜﺘﺐ ﺍﻻﺳﺘﻌﻼﻡ ﺍﳌﺮﺍﺩ ﺗﻨﻔﻴﺬﻩ ﻣﻦ ﻃﺮﻑ ﺍﳌﻤﺮﺭ.
110
OPEN Cursor_Name
While @@fetch_status=0
ﲤﻜﻨﻨﺎ ﻣﻦ ﻣﻌﺮﻓﺔ ﻣﺎ ﺇﺫﺍ ﻭﺻﻞ ﺍﳌﻤﺮﺭ ﺇﱃ ﺁﺧﺮ ﻋﻨﺼﺮ ﺃﻡ ﻻ ،ﻭﻣﺎ @@fetch_status ﺍﻟﺪﺍﻟﺔ
ﺩﺍﻣﺖ ﻗﻴﻤﺘﻬﺎ ﺻﻔﺮ ﻓﻬﺬﺍ ﻳﻌﲏ ﺃﻥ ﺍﳌﻤﺮﺭ ﱂ ﻳﺼﻞ ﺑﻌﺪ ﺇﱃ ﺍﻟﻌﻨﺼﺮ ﺍﻷﺧﲑ.
ﻟﻠﻤﺮﻭﺭ ﻣﻦ ﻋﻨﺼﺮ ﺇﱃ ﺍﻟﺬﻱ ﻳﻠﻴﻪ ،ﺍﺳﺘﻌﻤﻠﻨﺎﻩ ﻗﺒﻞ ﺍﻟﺪﺍﻟﺔ ﻭﺩﺍﺧﻞ ﺍﻟﺪﺍﻟﺔ ،ﰲ ﺍﻷﻭﻝ ﻟﺘﺤﺪﻳﺪ
ﺍﻟﻌﻨﺼﺮ ﺍﻷﻭﻝ ،ﻭﰲ ﺍﻟﺜﺎﱐ ﻟﻼﻧﺘﻘﺎﻝ ﺑﲔ ﺍﻟﻌﻨﺎﺻﺮ.
ﻣﻊ ﺍﻟﻌﻠﻢ ﺃﻥ ﺍﳌﺘﻐﲑﺍﺕ @Var1ﻭ @Var2ﳚﺐ ﺃﻥ ﻧﻌﻠﻦ ﻋﻨﻬﺎ ﻻﺳﺘﻘﺒﺎﻝ ﺍﻟﻘﻴﻢ ﺍﻟﻨﺎﲡﺔ ﻋﻦ
ﺍﳌﻤﺮﺭ ،ﻭﻳﻨﺒﻐﻲ ﺃﻥ ﻳﻜﻮﻥ ﻧﻮﻋﻬﺎ ﻭﺣﺠﻤﻬﺎ ﳑﺎﺛﻼ ﻟﻠﻘﻴﻤﺔ ﺍﻟﻨﺎﲡﺔ ،ﺇﻳﺎﻙ ﺃﻥ ﺗﺴﺘﻌﻤﻞ ﻧﻔﺲ
ﺃﻧﺎ ﺃﲰﻴﺘﻬﺎ ﻫﻜﺬﺍ ﻓﻘﻂ ﻟﻠﺘﻮﺿﻴﺢ. ﺍﻷﲰﺎﺀ
Close Cursor_Name
Deallocate Cursor_Name
111
.ﻭﻫﺬﺍ ﺍﻷﻣﺮ ﻟﺘﺤﺮﻳﺮ ﺍﳌﻮﺍﺭﺩ ﺍﳌﺴﺘﺨﺪﻣﺔ ﻣﻦ ﻃﺮﻑ ﺍﳌﻤﺮﺭ
ﻭﻟﻴﻜﻦ ﺇﻇﻬﺎﺭ ﺍﳌﻮﻇﻔﲔ ﺑﺎﻟﺸﻜﻞ، ﻳﻨﺒﻐﻲ ﺃﻥ ﻧﻌﻄﻲ ﻣﺜﺎﻻ،ﻭﺍﻵﻥ ﻟﻨﺴﺘﻮﻋﺐ ﺍﳌﻤﺮﺭﺍﺕ ﺑﺸﻜﻞ ﺟﻴﺪ
:ﺍﻟﺘﺎﱄ
Employee ID : XXX, Called : XXX, has :XX Years.
OPEN Emp_Cur
While @@fetch_status=0
BEGIN
'+Convert(varchar,@Age)
END
Close Emp_Cur
Deallocate Emp_Cur
112
ﺃﻋﻠﻨﺎ ﰲ ﺍﻷﻭﻝ ﻋﻠﻰ ﻣﺘﻐﲑﺍﺕ ﺑﻌﺪﺩ ﻭﻧﻮﻉ ﺍﳊﻘﻮﻝ ﺍﻟﱵ ﻧﺮﻳﺪ ﺇﻇﻬﺎﺭﻫﺎ ،ﰒ ﺃﻧﺸﺄﻧﺎ ﳑﺮﺭﺍ ﳉﻠﺐ
ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ ،ﻗﻤﻨﺎ ﺑﻔﺘﺤﻪ ﻭﻋﺮﺽ ﺍﻟﻌﻨﺎﺻﺮ ﺑﻮﺍﺳﻄﺔ Printﻭﺣﻮﻟﻨﺎ ﺍﳌﺘﻐﲑ
@Ageﺇﱃ Varcharﻷﻧﻪ ﻛﻤﺎ ﻗﻠﻨﺎ ﰲ ﺃﺣﺪ ﺍﻟﻔﺼﻮﻝ ﺍﻟﺴﺎﺑﻘﺔ ﻻ ﻧﺴﺘﻄﻴﻊ ﺩﻣﺞ ﺍﻷﺭﻗﺎﻡ
ﻭﺍﻟﻨﺼﻮﺹ ﺇﻻ ﺑﻌﺪ ﲢﻮﻳﻞ ﺍﻷﺭﻗﺎﻡ ﺇﱃ ﻧﺼﻮﺹ.
ﺑﻌﺪ ﺗﻨﻔﻴﺬ ﻫﺬﺍ ﺍﳌﻤﺮ ﺳﻨﺤﺼﻞ ﻋﻠﻰ ﻧﺘﻴﺠﺔ ﻛﻬﺬﻩ:
ﻣﻼﺣﻈﺔ:
ﱂ ﻧﺬﻛﺮ ﻛﻞ ﻣﺎ ﻳﺘﻌﻠﻖ ﺑﺎﳌﻤﺮﺭﺍﺕ ﻣﻦ ﺑﺎﺏ ﺍﻻﺧﺘﺼﺎﺭ ،ﻭﺗﻔﺎﺩﻳﺎ ﻟﺘﻜﺮﺍﺭ ﺍﻟﺸﺮﻭﺣﺎﺕ ﻷﻥ ﻫﻨﺎﻟﻚ
ﺑﻌﺾ ﺍﻟﺪﻭﺍﻝ ﻭﺍﻟﻜﻠﻤﺎﺕ ﺍﻟﱵ ﺗﺆﺩﻱ ﻧﻔﺲ ﺍﻷﺩﻭﺍﺭ.
114
ﻹﻧﺸﺎﺀ ﺇﺟﺮﺍﺀ ﳐﺰﻥ ،ﻧﺴﺘﻌﻤﻞ ﺍﻟﺼﻴﻐﺔ ﺍﻟﺘﺎﻟﻴﺔ:
CREATE PROC Proc_Name
--Parameters
As
//Do something
)@ID varchar(50
As
From Employee
Where ID=@ID
ﺍﻟﱪﺍﻣﺘﺮ @IDﻣﻦ ﻧﻮﻉ ،Inputﻷﻧﻪ ﻳﺘﻄﻠﺐ ﺇﺩﺧﺎﻝ ﻗﻴﻤﺘﻪ ﻟﺘﻨﻔﻴﺬ ﻫﺬﺍ ﺍﻹﺟﺮﺍﺀ ﺍﳌﺨﺰﻥ.
ﰲ ﻫﺬﺍ ﺍﳌﺜﺎﻝ ﺳﻨﺠﻠﺐ ﺇﺳﻢ ﻭﻋﻨﻮﺍﻥ ﻭﻋﻤﺮ ﺍﳌﻮﻇﻒ ﺍﻟﺬﻱ ﺭﻗﻤﻪ ﺍﻟﻮﻇﻴﻔﻲ ﻳﺴﺎﻭﻱ ﺍﻟﺮﻗﻢ ﺍﳌﺪﺧﻞ
ﻣﻜﺎﻥ ﺍﻟﱪﺍﻣﺘﺮ ،ﻭﻃﺮﻳﻘﺔ ﺗﻨﻔﻴﺬ ﻫﺬﺍ ﺍﻹﺟﺮﺍﺀ ﺍﳌﺨﺰﻥ ﻛﻤﺎ ﻳﻠﻲ:
115
)declare @ID varchar(50
As
116
ﻭﻫﻨﺎﻙ ﻧﻮﻉ ﺛﺎﻟﺚ ﻣﻦ ﺍﻹﺟﺮﺍﺀﺍﺕ ﺍﳌﺨﺰﻧﺔ ،ﻳﻜﻮﻥ ﻣﻦ ﻧﻮﻉ:
ﺇﺭﺟﺎﻉ ﺍﻟﻘﻴﻤﺔ :Returnﻭﻳﺴﺘﻌﻤﻞ ﻹﻳﻘﺎﻑ ﺗﻨﻔﻴﺬ ﺍﻹﺟﺮﺍﺀ ﺍﳌﺨﺰﻥ ﺑﻌﺪ ﺃﻣﺮ ﻣﻌﲔ ،ﻭﻳﻜﻮﻥ
ﺍﻟﻨﻮﻉ ﺍﳌﺮﺟﻊ ﺩﺍﺋﻤﺎ ﺭﻗﻤﻴﺎ ،ﻭﻫﺬﺍ ﻣﺜﺎﻝ ﻻﺳﺘﺨﺪﺍﻡ ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﺍﻹﺟﺮﺍﺀ ﺍﺕ ﺍﳌﺨﺰﻧﺔ ،ﻳﺘﺤﻘﻖ
ﻣﻦ ﺗﻄﺎﺑﻖ ﺍﺳﻢ ﺍﳌﺴﺘﺨﺪﻡ ﻭﻛﻠﻤﺔ ﺍﳌﺮﻭﺭ ﻣﻊ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺟﺪﻭﻝ ﺍﳌﺴﺘﺨﺪﻣﲔ ،ﺇﻥ
ﲢﻘﻖ ﺍﻟﺘﻄﺎﺑﻖ ﺳﻴﻌﻴﺪ ﻟﻨﺎ ﺍﻟﻘﻴﻤﺔ 1ﻭﻳﻮﻗﻒ ﺍﻟﺘﻨﻔﻴﺬ ،ﻭﺇﻥ ﻛﺎﻥ ﻫﻨﺎﻙ ﺗﺒﺎﻳﻦ ﻳﻌﻴﺪ ﻟﻨﺎ 0
As
begin
return 1
End
Else
Begin
return 0
end
117
ﺃﻗﻮﻡ ﻓﻘﻂ ﲟﻌﺮﻓﺔ،ﺷﺨﺼﻴﺎ ﺃﺳﺘﻌﻤﻞ ﻣﺜﻞ ﻫﺎﺗﻪ ﺍﻹﺟﺮﺍﺀﺍﺕ ﰲ ﺑﺮﺍﳎﻲ ﻋﻨﺪ ﻧﻮﺍﻓﺬ ﺍﻟﺪﺧﻮﻝ
.ﺍﻟﻘﻴﻤﺔ ﺍﳌﺮﺟﻌﺔ ﻭﻣﻦ ﺧﻼﳍﺎ ﺃﺣﺪﺩ ﺣﺎﻟﺔ ﺍﻟﺪﺧﻮﻝ ﺃﻫﻲ ﺳﻠﻴﻤﺔ ﺃﻡ ﻋﻠﻰ ﺧﻼﻑ ﺫﻟﻚ
:ﺃﻣﺜﻠﺔ ﺗﺪﻋﻴﻤﻴﺔ
:ﰲ ﻫﺬﺍ ﺍﳉﺰﺀ ﺳﺄﻭﺭﺩ ﺃﺭﺑﻌﺔ ﺃﻣﺜﻠﺔ ﻟﻺﺟﺮﺍﺀ ﺍﺕ ﺍﳌﺨﺰﻧﺔ ﻭﻫﻲ ﻛﻤﺎ ﻳﻠﻲ
118
ﺇﺟﺮﺍﺀ ﳐﺰﻥ ﻳﻘﻮﻡ ﺑﻌﻤﻠﻴﺔ ﺍﳊﺬﻑ:
Create Proc Update_Employee
)@ID varchar(50
as
]DELETE FROM [Employee
WHERE ID=@ID
GO
119
ﻛﻤﺎ ﻧﺴﺘﻄﻴﻊ ﺗﻌﺪﻳﻞ ﺍﻹﺟﺮﺍﺀ ﺑﺎﻟﺬﻫﺎﺏ ﺇﱃ ﻧﺎﻓﺬﺓ ﺍﻟﺘﺤﺮﻳﺮ ﻭﻛﺘﺎﺑﺔ ﺍﻷﻣﺮ ﺍﻟﺘﺎﱄ:
ALTER Proc Update_Employee
//Edit Content
120
ﺍﻟﺪﻭﺍﻝ :Functions
ﺍﻟﺪﺍﻟﺔ ﻫﻲ ﳎﻤﻮﻋﺔ ﻣﻦ ﺃﻭﺍﻣﺮ SQLﺍﻟﱵ ﲢﻤﻞ ﺍﲰﺎ ،ﻭﳝﻜﻨﻨﺎ ﺍﺳﺘﺪﻋﺎﺅﻫﺎ ﻣﻦ ﺧﻼﻝ ﻫﺬﺍ
ﺍﻹﺳﻢ .ﻭﻫﻲ ﺷﺒﻴﻬﺔ ﺑﺎﻹﺟﺮﺍﺀ ﺍﺕ ﺍﳌﺨﺰﻧﺔ ﻷﺎ ﺃﻳﻀﺎ ﻗﺪ ﺗﺴﺘﻘﺒﻞ ﺑﺮﺍﻣﺘﺮﺍﺕ ،ﺇﻻ ﺃﻥ ﻣﺎ
ﳝﻴﺰﻫﺎ ﻫﻮ ﺃﻣﺮ ،Returnﻷﻥ ﺍﻟﺪﺍﻟﺔ ﳎﱪﺓ ﻋﻠﻰ ﺇﺭﺟﺎﻉ ﻗﻴﻤﺔ ،ﻭﻳﺸﺘﺮﻁ ﰲ ﻫﺬﻩ ﺍﻟﻘﻴﻤﺔ ﺃﻥ
ﺗﻜﻮﻥ ﺭﻗﻤﻴﺔ ﺃﻭ ﻋﺒﺎﺭﺓ ﻋﻦ ﺟﺪﻭﻝ .Table
@Parameters
)
RETURNS Data_Type
AS
Begin
//Do Something
RETURN Value
END
ﻧﻌﻄﻲ ﺍﻟﺪﺍﻟﺔ ﺍﲰﺎ ،ﰒ ﻧﻘﻮﻡ ﺑﺘﺤﺪﻳﺪ ﺍﻟﱪﺍﻣﺘﺮﺍﺕ -ﺇﻥ ﻭﺟﺪﺕ ،-ﺍﻟﻜﻠﻤﺔ RETURNS
ﻧﺴﺘﺨﺪﻣﻬﺎ ﻟﺘﺤﺪﻳﺪ ﻧﻮﻉ ﺍﻟﺪﺍﻟﺔ ،ﺑﻌﺪ ﺍﻟﻜﻠﻤﺔ BEGINﻧﻜﺘﺐ ﺍﻷﻭﺍﻣﺮ ﺍﳌﺮﺍﺩ ﺗﻨﻔﻴﺬﻫﺎ ،ﰒ ﰲ
ﺍﻷﺧﲑ ﻧﻌﻴﺪ ﺍﻟﻘﻴﻤﺔ ﺍﻟﻨﺎﲡﺔ ﻋﻦ ﺍﻷﻭﺍﻣﺮ ،ﻭﻳﻠﺰﻣﻬﺎ ﺃﻥ ﺗﻜﻮﻥ ﻣﻦ ﻧﻔﺲ ﺍﻟﻨﻮﻉ ﺍﻟﺬﻱ ﺣﺪﺩﻧﺎﻩ
ﺃﻭﻻ ﺑﻌﺪ .RETURNS
121
ﺍﻵﻥ ﺳﻨﻨﺸﻰ ﺩﺍﻟﺔ ﺗﻘﻮﻡ ﲝﺴﺎﺏ ﻋﺪﺩ ﺍﳌﺸﺎﺭﻳﻊ ﺍﻟﱵ ﺷﺎﺭﻙ ﻓﻴﻬﺎ ﺍﳌﱪﻣﺞ ﺍﻟﺬﻱ ﳕﺮﺭ ﺭﻗﻤﻪ ﰲ
ﺍﻟﱪﺍﻣﺘﺮ:
))CREATE FUNCTION Count_Projects(@ID VARCHAR(50
RETURNS INT
AS
BEGIN
RETURN @Nbr
END
ﺍﻟﺪﺍﻟﺔ ﺗﺴﺘﻘﺒﻞ ﺍﻟﺮﻗﻢ ﺍﻟﻮﻇﻴﻔﻲ ﻟﻠﻤﱪﻣﺞ ،ﰒ ﺗﻌﻴﺪ ﻟﻨﺎ ﻗﻴﻤﺔ ﺭﻗﻤﻴﺔ ﺗﻀﻢ ﻋﺪﺩ ﺍﳌﺸﺎﺭﻳﻊ ﺍﻟﱵ
ﺷﺎﺭﻙ ﻓﻴﻬﺎ ﻫﺬﺍ ﺍﳌﱪﻣﺞ ،ﳌﺸﺎﻫﺪﺓ ﻧﺘﻴﺠﺔ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ،ﻧﻘﻮﻡ ﻓﻘﻂ ﺑﻜﺘﺎﺑﺔ ﺍﲰﻬﺎ ﻣﻊ ﺗﻌﻮﻳﺾ
ﺍﻟﱪﺍﻣﺘﺮ ﺑﻘﻴﻤﺔ ﻣﻦ ﻧﻔﺲ ﻧﻮﻋﻪ ،ﻛﻤﺎ ﻳﻈﻬﺮ ﻫﺬﺍ ﺍﳌﺜﺎﻝ:
)'SELECT [dbo].[Count_Projects] ('Dev 1
ﺍﺳﻢ ﺍﳌﺴﺘﺨﺪﻡ ﻟﻘﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﱵ ][dbo ﻫﻮ ﺍﺳﻢ ﺍﻟﺪﺍﻟﺔ ،ﻭ ][Count_Projects ﲝﻴﺚ
ﺗﻀﻢ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ.
ﺑﻌﺪ ﺗﻨﻔﻴﺬ ﺍﻟﺴﻄﺮ ﺃﻋﻼﻩ ،ﺳﺘﺤﺼﻞ ﻋﻠﻰ ﻧﺘﻴﺠﺔ ﻛﻬﺬﻩ:
122
ﺍﻵﻥ ﺳﻨﺠﺮﺏ ﻣﺜﺎﻻ ﺁﺧﺮ ﻳﻌﻴﺪ ﻟﻨﺎ ﺟﺪﻭﻻ ﻭﻟﻴﺲ ﻗﻴﻤﺔ ،ﻫﺬﻩ ﺍﳌﺮﺓ ﺳﻨﺠﻠﺐ ﻻﺋﺤﺔ ﺍﳌﻮﻇﻔﲔ
ﺍﻟﺬﻳﻦ ﻳﻔﻮﻕ ﺳﻨﻬﻢ ﺍﻟﻌﻤﺮ ﺍﳌﻤﺮﺭ ﻋﱪ ﺍﻟﱪﺍﻣﺘﺮ:
)CREATE FUNCTION Employees_By_Age(@Age INT
RETURNS TABLE
AS
123
ﺗﻌﺪﻳﻞ ﺍﻟﺪﻭﺍﻝ:
ﺍﻟﺘﻌﺪﻳﻞ ﺷﺒﻴﻪ ﺟﺪﺍ ﺑﺎﻹﺟﺮﺍﺀﺍﺕ ﺍﳌﺨﺰﻧﺔ ،ﻳﻜﻮﻥ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﻜﻠﻤﺔ :ALTER
(ALTER FUNCTION Function_Name
@Parameters
)
RETURNS Data_Type
-- Do Somthing
ﺣﺬﻑ ﺍﻟﺪﻭﺍﻝ:
ﻋﻤﻠﻴﺔ ﺍﳊﺬﻑ ﺃﻳﻀﺎ ﺗﻜﻮﻥ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﻜﻠﻤﺔ DROPﻣﺜﻞ ﺑﺎﻗﻲ ﻛﺎﺋﻨﺎﺕ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ:
DROP FUNCTION Function_Name
ﺍﻟﻘﻮﺍﺩﺡ :Triggers
ﺍﻟﻘﻮﺍﺩﺡ ﻫﻲ ﻛﺎﺋﻨﺎﺕ ﻧﱪﳎﻬﺎ ﻟﺘﺆﺩﻱ ﺩﻭﺭ ﻣﺮﺍﻗﺒﺔ ﺍﻟﺒﻴﺎﻧﺎﺕ ،ﻭﺃﻳﻀﺎ ﺍﻟﺘﺄﺛﲑ ﻋﻠﻰ ﻣﺴﺎﺭ
ﺍﻟﻌﻤﻠﻴﺎﺕ ،ﲝﻴﺚ ﻣﻦ ﺧﻼﳍﺎ ﻧﺴﺘﻄﻴﻊ ﺍﻟﺘﺤﻜﻢ ﰲ ﻋﻤﻠﻴﺎﺕ ﺍﻹﺿﺎﻓﺔ ﻭﺍﳊﺬﻑ ﻭﺍﻟﺘﻌﺪﻳﻞ ﺩﻭﻥ ﺃﻱ
ﺗﺪﺧﻞ ﻣﻨﺎ ،ﻭﻳﺘﻢ ﺭﺑﻂ ﺍﻟﻘﻮﺍﺩﺡ ﺑﺎﳉﺪﺍﻭﻝ ﻟﻠﺘﺤﻜﻢ ﰲ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﳌﻤﻜﻦ ﺍﻟﻘﻴﺎﻡ ﺎ ﻋﻠﻰ
ﺍﳉﺪﺍﻭﻝ ،ﻭﻳﻮﺟﺪ ﻧﻮﻋﺎﻥ ﻣﻦ ﺍﻟﻘﻮﺍﺩﺡ:
ﺍﻟﻘﻮﺍﺩﺡ :INSTEAD OFﻳﺘﻢ ﺗﻨﻔﻴﺬﻫﺎ ﻗﺒﻞ ﻋﻤﻠﻴﺎﺕ ﺍﻹﺿﺎﻓﺔ ﻭﺍﻟﺘﻌﺪﻳﻞ ﻭﺍﳊﺬﻑ.
124
ﺍﻟﻘﻮﺍﺩﺡ AFTERﺃﻭ :FORﻳﺘﻢ ﺗﻨﻔﻴﺬﻫﺎ ﺑﻌﺪ ﻋﻤﻠﻴﺎﺕ ﺍﻹﺿﺎﻓﺔ ﻭﺍﻟﺘﻌﺪﻳﻞ ﻭﺍﳊﺬﻑ.
ﺣﱴ ﻧﻔﻬﻢ ﻛﻴﻒ ﲤﺮ ﻋﻤﻠﻴﺎﺕ ﺍﻹﺿﺎﻓﺔ ﻭﺍﻟﺘﻌﺪﻳﻞ ﻭﺍﳊﺬﻑ ﻳﻨﺒﻐﻲ ﺃﻥ ﻧﻔﻬﻢ ﺃﻭﻻ ،ﺃﻧﻪ ﻋﻨﺪ
ﺇﺿﺎﻓﺔ ﺳﻄﺮ ﺟﺪﻳﺪ ﺇﱃ ﺟﺪﻭﻝ ﻣﺎ ،ﻓﺈﻥ ﺍﻹﺿﺎﻓﺔ ﺗﺘﻢ ﺃﻭﻻ ﰲ ﺟﺪﻭﻝ ﻣﺆﻗﺖ ﻳﺴﻤﻰ ،Inserted
ﺣﱴ ﻳﺘﻢ ﺗﻔﻌﻴﻠﻬﺎ ،ﺑﻌﺪ ﺫﻟﻚ ﺗﻈﻬﺮ ﰲ ﺍﳉﺪﻭﻝ ﺍﳊﻘﻴﻘﻲ ،ﺃﻳﻀﺎ ﻋﻤﻠﻴﺔ ﺍﳊﺬﻑ ،ﻓﺈﻧﻚ ﺣﻴﻨﻤﺎ
ﺗﻘﻮﻡ ﲝﺬﻑ ﺳﻄﺮ ﻣﺎ ﻓﺈﻧﻪ ﻻ ﳛﺬﻑ ﻓﻌﻠﻴﺎ ﻭﺇﳕﺎ ﻳﺘﻢ ﻧﻘﻠﻪ ﺇﱃ ﺟﺪﻭﻝ ﻣﺆﻗﺖ ﺍﲰﻪ Deleted
ﺇﱃ ﺣﲔ ﺗﻔﻌﻴﻞ ﺍﳊﺬﻑ ﲟﻌﲎ ﻋﺪﻡ ﻭﺟﻮﺩ ﻗﺎﺩﺡ ﺃﻭ ﺃﻣﺮ ﻣﻌﲔ ﻹﻟﻐﺎﺀ ﻋﻤﻠﻴﺔ ﺍﳊﺬﻑ.
ﺃﻣﺎ ﻋﻤﻠﻴﺔ ﺍﻟﺘﺤﺪﻳﺚ ﻓﻬﻲ ﺗﺘﻄﻠﺐ ﺍﳉﺪﻭﻟﲔ ﻣﻌﺎ Insertedﻭ ،Deletedﲝﻴﺚ ﻳﺘﻢ ﻧﻘﻞ ﺍﻟﻘﻴﻢ
ﺍﻟﻘﺪﳝﺔ ﺇﱃ ﺍﳉﺪﻭﻝ Deletedﻭﻳﺘﻢ ﻭﺿﻊ ﺍﻟﻘﻴﻢ ﺍﳉﺪﻳﺪﺓ ﰲ ﺍﳉﺪﻭﻝ .Inserted
إذا ﻛﺎﻧت ﻋﻧدك ﻧﺳﺧﺔ اﻧﺟﻠﯾزﯾﺔ اﺗﺑﻊ اﻟﺧطوات اﻟﻣﻛﺗوﺑﺔ أﻋﻠﻰ اﻟﺻورة
125
ﺳﻴﻌﻄﻴﻚ ﺍﻟﺼﻴﻐﺔ ﺍﻟﻌﺎﻣﺔ ﻟﻜﺘﺎﺑﺔ ﺍﻟﻘﻮﺍﺩﺡ ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻟﺘﻌﺎﻟﻴﻖ:
ﻗﻢ ﲝﺬﻑ ﺍﶈﺘﻮﻯ ﻭﺍﻛﺘﺐ ﻓﻴﻪ ﺃﻭﺍﻣﺮ ﺍﻟﻘﺎﺩﺡ ﺍﳌﺮﺍﺩ ﺇﻧﺸﺎﺅﻩ ،ﺻﻴﻐﺔ ﺇﻧﺸﺎﺀ ﺍﻟﻘﻮﺍﺩﺡ ﺑﺎﺧﺘﺼﺎﺭ
ﻛﻤﺎ ﻳﻠﻲ:
CREATE TRIGGER Trigger_Name
ON Table_Name
AS
--Do Something
ﳝﻜﻨﻚ ﺍﺧﺘﻴﺎﺭ ﻧﻮﻉ ﺍﻟﻘﺎﺩﺡ ﻛﻤﺎ ﺗﺮﻳﺪ ،ﻭﻧﻮﻉ ﺍﻟﻌﻤﻠﻴﺔ ﺍﳌﺮﺍﺩ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻌﻬﺎ.
126
ﳝﻜﻦ ﻟﻠﻘﺎﺩﺡ ﺍﻟﻮﺍﺣﺪ ﺃﻥ ﻳﺘﺤﻜﻢ ﰲ ﺃﻛﺜﺮ ﻣﻦ ﻋﻤﻠﻴﺔ ،ﺃﻱ ﺑﺈﻣﻜﺎﻧﻨﺎ ﲢﺪﻳﺪ ﺍﻹﺿﺎﻓﺔ ﻭﺍﻟﺘﻌﺪﻳﻞ
ﻭﺍﳊﺬﻑ ﻣﺮﺓ ﻭﺍﺣﺪﺓ ﺇﺫﺍ ﺃﺭﺩﻧﺎ ﺫﻟﻚ.
ﻭﺍﻵﻥ ﺗﻌﺎﻝ ﺑﻨﺎ ﻧﺘﺄﻣﻞ ﻫﺬﺍ ﺍﻟﻘﺎﺩﺡ ﺍﻟﺒﺴﻴﻂ ﺍﻟﺬﻱ ﳝﻨﻊ ﻋﻤﻠﻴﺔ ﺍﳊﺬﻑ ﻣﻦ ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ:
CREATE TRIGGER TR_Delete
ON Employee
FOR DELETE
AS
ROLLBACK
ﺍﻵﻥ ﻟﻮ ﺃﺭﺩﻧﺎ ﺣﺬﻑ ﺃﻱ ﻋﻨﺼﺮ ﻣﻦ ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ ﺳﺘﻄﺎﻟﻌﻨﺎ ﺭﺳﺎﻟﺔ ﺍﳋﻄﺄ ﺍﻟﺘﺎﻟﻴﺔ:
ﺍﻟﺮﺳﺎﻟﺔ ﺑﺎﻟﻔﺮﻧﺴﻴﺔ ﻣﻔﺎﺩﻫﺎ ﺃﻥ ﻋﻤﻠﻴﺔ ﺍﳊﺬﻑ ﻏﲑ ﳑﻜﻨﺔ ﺑﺴﺒﺐ ﻣﺸﻜﻞ ﻣﺎ ،ﺑﺈﻣﻜﺎﻧﻨﺎ ﺇﻇﻬﺎﺭ
ﻧﺺ ﺧﺎﺹ ﺑﻨﺎ ﺩﺍﺧﻞ ﻫﺬﻩ ﺍﻟﺮﺳﺎﻟﺔ ﺑﻮﺍﺳﻄﺔ ﺍﻷﻣﺮ .Raiserror
127
ﺍﻷﻣﺮ : Raiserror
ﺍﻷﻣﺮ Raiserrorﳝﻜﻨﻨﺎ ﻣﻦ ﺇﻇﻬﺎﺭ ﺭﺳﺎﻟﺔ ﺧﻄﺄ ﻟﻠﻤﺴﺘﺨﺪﻡ ،ﻭﺻﻴﻐﺘﻬﺎ ﺍﳌﺨﺘﺼﺮﺓ ﻛﻤﺎ ﻳﻠﻲ:
)RAISERROR('Text_Message',Level_Message,State_Message
ON Employee
AS
ROLLBACK
ﺑﻌﺪ ﺗﻨﻔﻴﺬ ﻫﺬﺍ ﺍﻟﻘﺎﺩﺡ ،ﻭﺫﻫﺎﺑﻚ ﺇﱃ ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ ﻟﻠﻘﻴﺎﻡ ﺑﺈﺿﺎﻓﺔ ﺳﻄﺮ ﺟﺪﻳﺪ ﺃﻭ ﺗﻌﺪﻳﻞ
ﺳﻄﺮ ﻣﻮﺟﻮﺩ ،ﺳﺘﻄﺎﻟﻌﻚ ﻟﺮﺳﺎﻟﺔ ﺍﻟﺘﺎﻟﻴﺔ:
128
ﺣﺬﻑ ﺍﻟﻘﻮﺍﺩﺡ
ﳊﺬﻑ ﻗﺎﺩﺡ ﻣﻌﲔ ،ﳝﻜﻨﻚ ﺍﻟﺬﻫﺎﺏ ﺇﱃ ﺍﻟﺘﺒﻮﻳﺐ Triggersﺍﳌﻮﺟﻮﺩ ﺿﻤﻦ ﺗﺒﻮﻳﺒﺎﺕ ﺍﳉﺪﻭﻝ
ﺍﳌﻌﲏ ،ﻭﻗﻢ ﲝﺬﻓﻪ ﺑﻜﻞ ﺑﺴﺎﻃﺔ ،ﺃﻭ ﺑﻮﺍﺳﻄﺔ ﺗﻨﻔﻴﺬ ﺍﻷﻣﺮ ﺍﻟﺘﺎﱄ:
DROP TRIGGER Trigger_Name
ﺗﻌﺪﻳﻞ ﺍﻟﻘﻮﺍﺩﺡ
ﻋﻤﻠﻴﺔ ﺍﻟﺘﻌﺪﻳﻞ ﺃﻳﻀﺎ ﺑﻨﻔﺲ ﺍﻟﻄﺮﻳﻘﺔ ،ﺍﺫﻫﺐ ﺇﱃ ﺍﻟﻘﺎﺩﺡ ﻭﺍﺧﺘﺮ ﺃﻣﺮ ﺍﻟﺘﻌﺪﻳﻞ Editﺃﻭ
ﺍﺳﺘﻌﻤﻞ ﺍﻟﻜﻠﻤﺔ ALTERﻛﻤﺎ ﺭﺃﻳﻨﺎ ﻣﻊ ﺑﺎﻗﻲ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺳﺎﺑﻘﺎ.
129
ﺍﳋﺎﲤﺔ
https://www.facebook.com/Khotwa.Amam
130