0% found this document useful (0 votes)
109 views130 pages

SGBDR en Arabe

Uploaded by

Mimi Dz
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
109 views130 pages

SGBDR en Arabe

Uploaded by

Mimi Dz
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 130



SQL


‫ ﺧﺎﻟﺪ ﺍﻟﺴﻌﺪﺍﱐ‬: ‫ﻣﻦ ﺇﻋﺪﺍﺩ‬

2
‫"ﻳﺎ ﺃﻳﻬﺎ ﺍﻟﺬﻳﻦ ﺁﻣﻨﻮﺍ ﺍﺗﻘﻮﺍ ﺍﷲ ﻭ‬
‫ﻗﻮﻟﻮﺍ ﻗﻮﻻ ﺳﺪﻳﺪﺍ‪ .‬ﻳﺼﻠﺢ ﻟﻜﻢ‬
‫ﺃﻋﻤﺎﻟﻜﻢ ﻭ ﻳﻐﻔﺮ ﻟﻜﻢ ﺫﻧﻮﺑﻜﻢ ﻭﻣﻦ‬
‫ﻳﻄﻊ ﺍﷲ ﻭ ﺭﺳﻮﻟﻪ ﻓﻘﺪ ﻓﺎﺯ ﻓﻮﺯﺍ‬
‫ﻋﻈﻴﻤﺎ"‬
‫‪71‬‬ ‫ﺍﻷﺣﺰﺍﺏ ‪ 70 :‬ﻭ‬

‫‪3‬‬
‫ﻗﺒﻞ ﺃﻥ ﻧﺒﺪﺃ‬
‫ﺍﳊﻤﺪ ﷲ ﺍﺑﺘﺪﺍﺀ ﻭﺍﻧﺘﻬﺎﺀ‪ ،‬ﻭﺍﻟﺼﻼﺓ ﻭﺍﻟﺴﻼﻡ ﻋﻠﻰ ﺣﺒﻴﺒﻨﺎ ﳏﻤﺪ ﺻﻠﻰ ﺍﷲ ﻋﻠﻴﻪ ﻭﻋﻠﻰ ﺁﻟﻪ‬
‫ﻭﺻﺤﺒﻪ ﻭﺳﻠﻢ ﺗﺴﻠﻴﻤﺎ ﻛﺜﲑﺍ ﻭﺑﻌﺪ‪:‬‬

‫ﻓﺈﻧﻪ ﻣﻦ ﻏﲑ ﺍﻟﻼﺋﻖ ﺑﺄﻣﺔ ﻃﺎﳌﺎ ﲪﻠﺖ ﻣﺸﺎﻋﻞ ﺍﻟﺘﻘﺪﻡ ﻭﺍﻟﺘﻄﻮﺭ ﺃﻥ ﺗﺘﺨﻠﻒ ﻋﻦ ﺭﻛﺐ‬
‫ﺍﻟﺘﻜﻨﻮﻟﻮﺟﻴﺎ‪ ،‬ﻭﺃﻥ ﺗﻨﺸﻐﻞ ﺑﺘﻮﺍﻓﻪ ﺍﻷﻣﻮﺭ ﻣﻦ ﻗﺒﻴﻞ ﻣﺎ ﺍﺻﻄﻠﺢ ﻋﻠﻴﻪ ﺑﺎﻟﻔﻦ ﻭﺍﻹﺑﺪﺍﻉ ﻭﻫﻮ‬
‫ﻟﻌﻤﺮﻱ ﻋﻦ ﺍﻟﻔﻦ ﺑﻌﻴﺪ ﺑ‪‬ﻌ‪‬ﺪ‪ ‬ﺍﻟﺸﺮﻕ ﻋﻦ ﺍﻟﻐﺮﺏ‪ ،‬ﺣﻴﺚ ﺻﺮﻧﺎ ﻧﺮﻯ ﻛﻞ ﺍﻟﺪﻋﻢ ﻳﻮﺟﻪ ﺇﱃ ﺗﺸﺠﻴﻊ‬
‫ﺃﻫﻞ ﺍﻟﻐﻨﺎﺀ ﻭﺍﻟﺮﻗﺺ ﻭﺍﻟﻜﻮﻣﻴﺪﻳﺎ ﻭﺍﻷﺟﺪﺭ ﺃﻥ ﺗﻨﻔﻖ ﻫﺬﻩ ﺍﻷﻣﻮﺍﻝ ﻓﻴﻤﺎ ﻳﻌﻮﺩ ﻋﻠﻰ ﺍﻷﻣﺔ‬
‫ﺑﺎﻟ ﻨﻔﻊ ﻭﺍﻟﺼﻼﺡ ﻟﺘﺴﺘﻌﻴﺪ ﻣﺜﺎﺑﺘﻬﺎ ﰲ ﺍﻟﺮﻳﺎﺩﺓ ﻭﺍﻟﻘﻴﺎﺩﺓ‪ ،‬ﻭﻟﻦ ﻳﺘﺄﺗﻰ ﺫﻟﻚ ﺑﻌﺪ ﺍﻟﻨﺠﻮﻡ ﻭﻻ‬
‫ﺑﺎﻧﺘﻈﺎﺭ ﻫﻄﻮﻝ ﺍﻟﺬﻫﺐ‪ ،‬ﻓﺈﻥ ﺍﷲ ﺟﻞ ﻭﻋﻼ ﻻ ﻳﻐﲑ ﻣﺎ ﺑﻘﻮﻡ ﺣﱴ ﻳﻐﲑﻭﺍ ﻣﺎ ﺑﺄﻧﻔﺴﻬﻢ‪.‬‬

‫ﻋﻠﻴﻨﺎ ﻛﺄﻣﺔ ﻃﺎﳏﺔ ﻟﻔﺮﺽ ﺫﺍ‪‬ﺎ ﺃﻥ ﺗﻌﻤﻞ ﴿ ﻭ‪‬ﻗﹸﻞﹺ ﺍﻋ‪‬ﻤ‪‬ﻠﹸﻮﺍ ﻓﹶﺴ‪‬ﻴ‪‬ﺮ‪‬ﻯ ﺍﻟﻠﹶّﻪ‪ ‬ﻋ‪‬ﻤ‪‬ﻠﹶﻜﹸﻢ‪ ‬ﻭ‪‬ﺭ‪‬ﺳ‪‬ﻮﻟﹸﻪ‪‬‬
‫ﻭ‪‬ﺍﻟﹾﻤ‪‬ﺆ‪‬ﻣ‪‬ﻨ‪‬ﻮﻥﹶ )ﺍﻟﺘﻮﺑﺔ‪ ﴾(105:‬ﰲ ﺳﺒﻴﻞ ﻗﻴﺎﻡ ‪‬ﻀﺔ ﻋﻠﻤﻴﺔ‪ .‬ﻗﺪ ﻳﻘﻮﻝ ﻗﺎﺋﻞ ﺑﺄﻥ ﻛﻞ ﻣﺎ ﻧﻮﺭﺩﻩ‬
‫ﺍﻵﻥ ﻫﻮ ﻣﻮﺟﻮﺩ ﻭﻗﺪ ﺳﺒﻘﻨﺎ ﺇﻟﻴﻪ ﺍﻟﻐﺮﺏ‪ ،‬ﺃﻗﻮﻝ ﻟﻴﺲ ﻋﻴﺒﺎ ﺃﻥ ﻧﺒﺪﺃ ﻣﻦ ﺣﻴﺚ ﺍﻧﺘﻬﻰ ﻏﲑﻧﺎ‪ ،‬ﻓﻬﻢ‬
‫ﺃﻳﻀﺎ ﺑﻨﻮﺍ ﺣﻀﺎﺭﺍ‪‬ﻢ ﻋﻠﻰ ﺃﻃﻼﻝ ﺣﻀﺎﺭﺍﺗﻨﺎ ﻭﻗﺪ ﺗﺮﲨﻮﺍ ﻣﻦ ﺃﻣﻬﺎﺕ ﺍﻟﻜﺘﺐ ﺍﻟﻌﻠﻤﻴﺔ ﻣﺎﺍﷲ‬
‫ﺑﻪ ﻋﻠﻴﻢ‪ ،‬ﻧﺎﻫﻴﻚ ﻋ ﻦ ﺗﺰﻭﻳﺮ ﺍﳊﻘﺎﺋﻖ ﺍﻟﺬﻱ ﻗﺎﻣﻮﺍ ﺑﻪ ﻣﻦ ﻧﺴﺐ ﺑﻌﺾ ﺍﻻﻛﺘﺸﺎﻓﺎﺕ ﺇﱃ‬
‫ﻣﻐﻤﻮﺭﻳﻬﻢ ﻋﻠﻰ ﺣﺴﺎﺏ ﻓﻄﺎﺣﻠﻨﺎ‪.‬‬

‫‪4‬‬
‫ﻃﺒﻌﺎ ﻫﺬﻩ ﺍﳌﻘﺪﻣﺔ ﺑﻌﻴﺪﺓ ﻛﻞ ﺍﻟﺒﻌﺪ ﻋﻦ ﻟﻐﺔ ‪ SQL‬ﻭﻟﻜﻦ ﻻﺑﺪ ﻣﻦ ﻫﺬﺍ ﺍﻟﺘﻤﻬﻴﺪ ﺣﱴ ﺗﺘﺤﻤﺲ‬
‫– ﻋﺰﻳﺰﻱ ﺍﻟﻘﺎﺭﺉ – ﺇﱃ ﺍﻹﺑﺪﺍﻉ ﰲ ﻫﺬﺍ ﺍ‪‬ﺎﻝ ﻭﺃﻻ ﺗﻜﺘﻔﻲ ﻓﻘﻂ ﺑﺎﻷﺧﺬ ﳑﺎ ﺟﺎﺀ ﰲ ﻏﻀﻮﻥ‬
‫ﺍﻟﻜﺘﺎﺏ ﺑﻞ ﻋﻠﻴﻚ ﺍﻻﺟﺘﻬﺎﺩ ﻭﺍﺳﺘﻐﻼﻝ ﻣﻠﻜﺔ ﺍﻟﺘﻔﻜﲑ‪.‬‬

‫ﻳﻨﻘﺴﻢ ﻛﺘﺎﺏ "ﺍﻟﺸﺮﺡ ﺍﻟﻮﺍﰲ‪ ،‬ﻟﺘﻌﻠﻢ ﻟﻐﺔ ‪ SQL‬ﻣﻦ ﻧﺒﻌﻬﺎ ﺍﻟﺼﺎﰲ" ﺇﱃ ﲬﺴﺔ ﻓﺼﻮﻝ ﺭﺋﻴﺴﻴﺔ‪.‬‬
‫ﺍﻟﻔﺼﻞ ﺍﻷﻭﻝ ﻭﺍﻟﺜﺎﱐ ﻳﻌﺮﺿﺎﻥ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﳌﻌﻠﻮﻣﺎﺕ ﻭﺍﻟﺘﻘﻨﻴﺎﺕ ﺍﻟﻨﻈﺮﻳﺔ ﻭﺍﻟﺮﻳﺎﺿﻴﺔ‪،‬‬
‫ﺑﻴﻨﻤﺎ ﺗﻘﻮﻡ ﺍﻟﻔﺼﻮﻝ ﺍﻟﺜﻼﺛﺔ ﺍﻷﺧﲑﺓ ﺑﻌﺮﺽ ﻣﻌﻠﻮﻣﺎﺕ ﻋﻤﻠﻴﺔ ﺗﻄﺒﻴﻘﻴﺔ‪ ،‬ﺗﺪﻓﻌﻚ ﺇﱃ‬
‫ﺍﻛﺘﺴﺎﺏ ﺗﻘﻨﻴﺎﺕ ﺟﺪﻳﺪﺓ ﲣﻮﻝ ﻟﻚ ﺍﺣﺘﺮﺍﻑ ﻟﻐﺔ ‪ SQL‬ﻣﻊ ﺑﺮﻧﺎﻣﺞ ‪.SQL Server‬‬

‫ﻭﻻ ﻧﻨﺴﻰ ﻛﻤﺎ ﺟﺮﺕ ﺍﻟﻌﺎﺩﺓ‪ ،‬ﺇﱃ ﺗﻨﺒﻴﻬﻜﻢ ﺑﺄﻥ ﻟﻜﻞ ﺷﻲﺀ ﺇﺫﺍ ﻣﺎ ﰎ ﻧﻘﺼﺎﻥ‪ ،‬ﻭﳎﻬﻮﺩﻧﺎ ﻫﺬﺍ‬
‫ﳎﻬﻮﺩ ﺑﺸﺮﻱ ﻗﺪ ﻳﺸﻮﺑﻪ ﺍﻟﻨﻘﺺ ﻭﺍﳋﻠﻞ ﻋﻦ ﺳﻬﻮ ﺃﻭ ﻋﻦ ﺳﻮﺀ ﻓﻬﻢ‪ ،‬ﻟﺬﺍ ﻧﺮﺟﻮ ﻣﻦ‬
‫ﺣﻀﺮﺍﺗﻜﻢ ﺇﻋﻼﻣﻨﺎ ﰲ ﺣﺎﻝ ﻭﺟﻮﺩ ﺃﻱ ﺷﺎﺋﺒﺔ ﺃﻭ ﺧﻄﺄ ﰲ ﻫﺬﺍ ﺍﻟﻜﺘﺎﺏ‪.‬‬

‫ﻧﺴﺄﻝ ﺍﷲ ﻋﺰ ﻭﺟﻞ ﺃﻥ ﳚﻌﻞ ﻫﺬﺍ ﺍﻟﻌﻤﻞ ﺧﺎﻟﺼﺎ ﻟﻮﺟﻬﻪ ﺍﻟﻜﺮﱘ‪ ،‬ﻭﺃﻻ ﳚﻌﻞ ﻟﻠﻨﻔﺲ ﻭﻻ‬
‫ﻟﻠﻬﻮﻯ ﺣﻈﺎ ﻓﻴﻪ‪ ،‬ﻛﻤﺎ ﻧﺴﺄﻟﻪ ﻋﺰ ﻭﺟﻞ ﺃﻥ ﻳﻨﻔﻊ ﻛﻞ ﻗﺎﺭﻯﺀ ﳍﺬﺍ ﺍﻟﻜﺘﺎﺏ ﻭﻟﻮ ﺑﺎﻟﱰﺭ ﺍﻟﻘﻠﻴﻞ‪.‬‬

‫ﺩﺍﻡ ﻟﻜﻢ ﺍﻟﺒﺸﺮ ﻭﺍﻟﻔﺮﺡ ﻭﺑﺎﻟﺘﻮﻓﻴﻖ ﻭﺍﻟﺴﺪﺍﺩ ﺇﻥ ﺷﺎﺀ ﺍﷲ‪.‬‬

‫ﺧﺎﻟﺪ ﺍﻟﺴﻌﺪﺍﱐ‬

‫‪5‬‬
‫ﳌﻦ ﻳﻮﺟﻪ ﻫﺬﺍ ﺍﻟﻜﺘﺎﺏ؟‬

‫ﻫﺬﺍ ﺍﻟﻜﺘﺎﺏ ﻣﻮﺟﻪ ﺇﱃ ﻛﻞ ﺍﳌﺴﺘﻮﻳﺎﺕ‪:‬‬

‫ﺇﻥ ﻛﻨﺖ ﻣﺒﺘﺪﺋﺎ ﺳﻴﻨﻄﻠﻖ ﺑﻚ ﻣﻨﺬ ﺍﻟﺒﺪﺍﻳﺔ‪.‬‬

‫ﺇﻥ ﻛﻨﺖ ﻣﺘﻮﺳﻄﺎ‪ ،‬ﻓﻬﺬﻩ ﻓﺮﺻﺘﻚ ﻟﺘﺘﺤﻘﻖ ﻣﻦ‬


‫ﻣﻜﺘﺴﺒﺎﺗﻚ ﻭﻟﺘﺘﻌﻠﻢ ﺃﺷﻴﺎﺀ ﺟﺪﻳﺪﺓ‪.‬‬

‫ﺇﻥ ﻛﻨﺖ ﳏﺘﺮﻓﺎ‪ ،‬ﻓﻘﺪ ﲢﺘﺎﺝ ﻫﺬﺍ ﺍﻟﻜﺘﺎﺏ‬


‫ﻛﻤﺮﺟﻊ ﻋﺮﰊ ﻣﺒﺴﻂ ﺗﻌﻮﺩ ﺇﻟﻴﻪ ﻛﻠﻤﺎ ﻧﺴﻴﺖ ﻣﻔﻬﻮﻣﺎ ﻣﺎ‪.‬‬

‫ﻛﻞ ﺃﻣﺜﻠﺔ ﺍﻟﻜﺘﺎﺏ ﺟﺮﺑﺘﻬﺎ ﻋﻠﻰ ﺑﺮﻧﺎﻣﺞ ﺇﺩﺍﺭﺓ‬


‫ﻭ ‪،2008‬‬ ‫‪2005‬‬ ‫ﺑﻨﺴﺨﺘﻴﻪ‬ ‫‪SQL Server‬‬ ‫ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
‫ﺃﻭ ﻏﲑﻩ‬ ‫‪Oracle‬‬ ‫ﺑﺎﻟﻨﺴﺒﺔ ﳌﺴﺘﺨﺪﻣﻲ ﺑﺮﻧﺎﻣﺞ ﺍﻷﻭﺭﺍﻛﻞ‬
‫ﻓﺎﳌﻔﺎﻫﻴﻢ ﺍﻟﻮﺍﺭﺩﺓ ﰲ ﺍﻟﻜﺘﺎﺏ ﻣﻔﻴﺪﺓ ﻟﻜﻢ ﺃﻳﻀﺎ ﺳﻴﻤﺎ‬
‫ﻓﻴﻤﺎ ﻳﺘﻌﻠﻖ ﺑﺎﳉﺎﻧﺐ ﺍﻟﻨﻈﺮﻱ )ﺍﳉﱪ ﺍﻟﺘﺠﺮﻳﺪﻱ‪،‬‬
‫ﻛﺎﺋﻨﺎﺕ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‪(... ،‬‬

‫ﻟﻠﺘﻮﺍﺻﻞ ﺍﳌﺒﺎﺷﺮ ﻣﻊ ﺻﺎﺣﺐ ﺍﻟﻜﺘﺎﺏ‪ ،‬ﺍﻟﺘﺤﻘﻮﺍ ﺑﻨﺎ ﻋﻠﻰ ﺻﻔﺤﺔ ﺧﻄﻮﺓ ﺇﱃ ﺍﻷﻣﺎﻡ‪:‬‬

‫‪https://www.facebook.com/Khotwa.Amam‬‬
‫‪6‬‬
‫ﻣﻠﺤﻮﻇﺔ‬
‫ﻛﻞ ﺍﻷﻛﻮﺍﺩ ﺍﻟﱵ ﻳﺘﻀﻤﻨﻬﺎ‬
‫ﺍﻟﻜﺘﺎﺏ ﺷﻐﺎﻟﺔ ‪ ،%100‬ﻭﻟﻜﻦ‬
‫ﺍﳋﻄﺄ ﻭﺍﻟﺴﻬﻮ ﻭﺍﺭﺩ‪ ،‬ﻟﺬﺍ ﻟﻮ‬
‫ﺣﺪﺙ ﻣﻌﻜﻢ ﺃﻱ ﺧﻄﺄ ﰲ ﲡﺮﻳﺐ‬
‫ﺍﻷﻭﺍﻣﺮ ﺍﻟﻮﺍﺭﺩﺓ ﰲ ﺍﻟﻜﺘﺎﺏ‬
‫ﻓﺎﻟﺘﻤﺴﻮﺍ ﱄ ﺍﳌﻌﺎﺫﻳﺮ ﻭﺭﺍﺳﻠﻮﱐ‬
‫‪‬ﺎ ﻋﻠﻰ ﺑﺮﻳﺪﻱ ﺍﻻﻟﻜﺘﺮﻭﱐ‬
‫ﺟﺎﺯﺍﻛﻢ ﺍﷲ ﺧﲑﺍ‪:‬‬

‫‪[email protected]‬‬

‫‪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‬‬

‫ﻣﺪﺧﻞ ﺇﱃ ‪ xml‬ﻭﺗﻮﺍﺑﻌﻪ)‪(DTD, XSL,CSS‬‬

‫‪http://www.kutub.info/library/book/8305‬‬

‫ﻣﺪﺧﻞ ﺇﱃ ﺍﻟﺪﺍﺗﺎ ﺃﻛﺴﻴﺲ ﻻﻳﺮ ﰲ ﺍﻟﺴﻲ‪#‬‬

‫‪http://www.kutub.info/library/book/7576‬‬

‫ﲢﺰﱘ ﺍﻟﱪﺍﻣﺞ ﺧﺎﺩﻡ ‪ /‬ﻋﻤﻴﻞ ﰲ ﺍﻟﻔﻴﺠﻮﺍﻝ ﺍﺳﺘﻮﺩﻳﻮ )ﻧﺴﺨﺔ ﻓﺮﻧﺴﻴﺔ(‬

‫‪http://www.mediafire.com/?by3e3u4d1emvxgo‬‬

‫‪8‬‬
‫ﺍﻟﻔﻬﺮﺱ‬

‫ﻧﺒﺪﺃ ‪4 ............................................................................... ................................................................‬‬ ‫ﻗﺒﻞ ﺃﻥ‬

‫ﺍﻟﻜﺘﺎﺏ؟ ‪6 ............................................................... ................................................................‬‬ ‫ﳌﻦ ﻳﻮﺟﻪ ﻫﺬﺍ‬

‫ﻣﻠﺤﻮﻇﺔ ‪7 .................................................... ................................................................................................‬‬

‫ﻟﻠﻤﺆﻟﻒ ‪8 ..............................................................................................................................................‬‬ ‫ﻛﺘﺐ‬

‫ﺍﻟﻔﻬﺮﺱ ‪9 ..................... ................................................................................................ ................................‬‬

‫ﺍﻟﻔﺼﻞ ﺍﻷﻭﻝ‪ :‬ﻋﻤﻮﻣﻴﺎﺕ ﺣﻮﻝ ﺍﻟﺒﻴﺎﻧﺎﺕ‬

‫ﺍﻟﺒﻴﺎﻧﺎﺕ ‪21 .......................................................................................... ................................‬‬ ‫ﻋﻤﻮﻣﻴﺎﺕ ﺣﻮﻝ‬

‫ﺍﳌﻠﻔﺎﺕ ‪21 ....................................................................................................... ................................ Files‬‬

‫ﺍﻟﺒﻴﺎﻧﺎﺕ ‪21 ... ................................................................ ................................ ................................‬‬ ‫ﲣﺰﻳﻦ‬

‫ﺍﳌﺒﺎﺷﺮ‪22 ................................................................................................................................ :‬‬ ‫ﺍﻟﺘﺨﺰﻳﻦ‬

‫ﺍﻟﺘﺴﻠﺴﻠﻲ‪22 ............................ ................................................................ ................................ :‬‬ ‫ﺍﻟﺘﺨﺰﻳﻦ‬

‫ﺍﳌﻔﻬﺮﺱ‪23.............................................................................. ................................ :‬‬ ‫ﺍﻟﺘﺨﺰﻳﻦ ﺍﻟﺘﺴﻠﺴﻠﻲ‬

‫‪9‬‬
‫ﺍﻟﺴﺎﺑﻘﺔ‪23 ........... ................................................................ ................................:‬‬ ‫ﻋﻴﻮﺏ ﻃﺮﻕ ﺍﻟﺘﺨﺰﻳﻦ‬

‫ﺍﻟﺘﺮﺍﺗﺒﻴﺔ‪24 ................................................. ................................................................ :‬‬ ‫ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‬

‫ﺍﻟﻌﻼﺋﻘﻴﺔ‪24 ........................................................................................... :‬‬ ‫ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﺘﺮﺍﺑﻄﻴﺔ ﺃﻭ‬

‫ﺍﻟﺒﻴﺎﻧﺎﺕ ؟ ‪25 ....................................................................................... ................................‬‬ ‫ﻣﺎﻫﻲ ﻗﺎﻋﺪﺓ‬

‫ﺍﻟﺒﻴﺎﻧﺎﺕ ؟‪25 ...................................... ................................................................‬‬ ‫ﻣﺎﻫﻮ ﻧﻈﺎﻡ ﺇﺩﺍﺭﺓ ﻗﻮﺍﻋﺪ‬

‫‪25 ........................ ................................................................ Relationnal Model‬‬ ‫ﺍﻷﳕﻮﺫﺝ ﺍﻟﻌﻼﺋﻘﻲ‬

‫ﺍﻟﻔﺼﻞ ﺍﻟﺜﺎﱐ ‪ :‬ﺍﳉﱪ ﺍﻟﺘﺠﺮﻳﺪﻱ‬

‫‪28 ............................................................. ................................ Relationnal Algebra‬‬ ‫ﺍﳉﱪ ﺍﻟﻌﻼﺋﻘﻲ‬

‫ﺍﻟﺘﺠﻤﻴﻌﻴﺔ ‪28 ............................ ................................................................ ................................‬‬ ‫ﺍﻟﻌﻤﻠﻴﺎﺕ‬

‫ﺍﻻﲢﺎﺩ ‪28 .......................................................................................... ................................() Union‬‬

‫ﺍﻟﺘﻘﺎﻃﻊ ‪30.............................................................................. ................................ () Intersection‬‬

‫ﺍﻻﺧﺘﻼﻑ ‪31 ................................................. ................................................................ (-) Difference‬‬

‫ﺍﻷﺣﺎﺩﻳﺔ ‪33 .............................................................. ................................................................‬‬ ‫ﺍﻟﻌﻤﻠﻴﺎﺕ‬

‫ﺍﻻﻧﺘﻘﺎﺀ ‪33 ..................................................... ................................................................ (σ) Selection‬‬

‫‪10‬‬
‫ﺍﻻﺳﻘﺎﻁ ‪34.................................................. ................................................................(π) Projection‬‬

‫ﺍﻟﻌﻼﺋﻘﻴﺔ‪35................ ................................ ................................................................‬‬ ‫ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﻟﺜﻨﺎﺋﻴﺔ‬

‫‪35‬‬ ‫ﺍﳉﺪﺍﺀ ﺍﻟﺪﻳﻜﺎﺭﰐ )×(‬

‫ﺍﻟﻘﺴﻤﺔ ‪36 ........................ ................................................................ ................................ (÷) Division‬‬

‫( ‪38 ............................ ................................................................ ................................‬‬ ‫ﺍﻟﺮﺑﻂ ‪) Join‬‬

‫ﺍﻟﻌﻼﺋﻘﻲ ‪39 .......................................................................................... ................................‬‬ ‫ﺧﻼﺻﺔ ﺍﳉﱪ‬

‫ﺍﻟﻔﺼﻞ ﺍﻟﺜﺎﻟﺚ‪ :‬ﻣﺪﺧﻞ ﺇﱃ ﻟﻐﺔ ‪SQL‬‬

‫‪41 ............................................................... ................................................................SQL‬‬ ‫ﻣﺪﺧﻞ ﺇﱃ ﻟﻐﺔ‬

‫ﺗﻌﺮﻳﻒ ‪41................ ................................ ................................................................ ................................‬‬

‫ﻟﻐﺔ ‪41 ................................................................. ................................................................ T-SQL‬‬ ‫ﻣﻬﺎﻡ‬

‫ﺍﻟﺒﻴﺎﻧﺎﺕ ‪43 ....................................................................................................... ................................‬‬ ‫ﻗﻮﺍﻋﺪ‬

‫ﺍﻟﺒﻴﺎﻧﺎﺕ ‪43 .........................................................................................................................‬‬ ‫ﺇﻧﺸﺎﺀ ﻗﻮﺍﻋﺪ‬

‫ﺍﻟﺒﻴﺎﻧﺎﺕ ‪45 .........................................................................................................................‬‬ ‫ﺣﺬﻑ ﻗﺎﻋﺪﺓ‬

‫‪45 ... ................................................................ ................................ ................................ Tables‬‬ ‫ﺍﳉﺪﺍﻭﻝ‬

‫ﺍﻟﺘﺴﻤﻴﺔ ‪45 .......................................................................................... ................................‬‬ ‫ﻗﻮﺍﻋﺪ ﺣﻮﻝ‬

‫‪11‬‬
‫ﺍﳉﺪﺍﻭﻝ ‪46 .................................... ................................................................ ................................‬‬ ‫ﺇﻧﺸﺎﺀ‬

‫ﺍﳉﺪﺍﻭﻝ ‪46 .................................... ................................................................ ................................‬‬ ‫ﺣﺬﻑ‬

‫ﺍﳉﺪﺍﻭﻝ‪46 ... ................................................................ ................................ ................................‬‬ ‫ﺗﻌﺪﻳﻞ‬

‫ﺍﻟﺒﻴﺎﻧﺎﺕ ‪47.......................................... ................................ ................................................................‬‬ ‫ﺃﻧﻮﺍﻉ‬

‫ﺍﻟﺮﻗﻤﻴﺔ‪47 ... ................................................................ ................................ ................................‬‬ ‫ﺍﻷﻧﻮﺍﻉ‬

‫ﺍﻟﻨﺼﻴﺔ ‪48 .................................... ................................................................ ................................‬‬ ‫ﺍﻷﻧﻮﺍﻉ‬

‫ﻭﺍﻟﻮﻗﺖ‪49 .................................... ................................................................ ................................‬‬ ‫ﺍﻟﺘﺎﺭﻳﺦ‬

‫ﺍﻷﺧﺮﻯ ‪49 .......................................................................................... ................................‬‬ ‫ﺑﻌﺾ ﺍﻷﻧﻮﺍﻉ‬

‫‪49 ......................................... ................................ ................................‬‬ ‫ﺧﺎﺻﻴﺎﺕ ﺍﻹﺩﺧﺎﻝ ‪Constraints‬‬

‫‪49 ..................................... ................................................................................................‬‬ ‫‪NOT NULL‬‬

‫‪50 ......................................... ................................ ................................................................ IDENTITY‬‬

‫‪51 .............................................................. ................................................................‬‬ ‫‪PRIMARY KEY‬‬

‫‪53 ......................................... ................................ ................................................................‬‬ ‫‪UNIQUE‬‬

‫‪53 ... ................................................................ ................................ ................................ REFERENCE‬‬

‫‪55 ........................................ ................................................................ ................................ DEFAULT‬‬

‫‪56 ............................................................................. ................................................................‬‬ ‫‪CHECK‬‬

‫‪12‬‬
‫ﺍﻹﺩﺧﺎﻝ ‪56 .........................................................................................................................‬‬ ‫ﺣﺬﻑ ﺧﺎﺻﻴﺎﺕ‬

‫ﺍﳌﺸﺎﻫﺪ ‪57 ...................................... ................................................................ ................................ Views‬‬

‫ﺍﳌﺸﺎﻫﺪ ‪57 ...................................... ................................................................ ................................‬‬ ‫ﺇﻧﺸﺎﺀ‬

‫ﺍﳌﺸﺎﻫﺪ ‪58 .........................................................................................................................Views‬‬ ‫ﺣﺬﻑ‬

‫‪59 ................................................................. ................................................................ Indexes‬‬ ‫ﺍﻟﻔﻬﺎﺭﺱ‬

‫ﺍﻟﻔﻬﺎﺭﺱ ‪59 .................................... ................................................................ ................................‬‬ ‫ﺇﻧﺸﺎﺀ‬

‫ﺍﻟﻔﻬﺎﺭﺱ ‪60 .................................... ................................................................ ................................‬‬ ‫ﺣﺬﻑ‬

‫ﺍﻟﺒﻴﺎﻧﺎﺕ ‪60 ...................................... ................................................................ ................................‬‬ ‫ﻣﻌﺎﳉﺔ‬

‫ﺟﺪﻭﻝ ‪60 .................................... ................................................................‬‬ ‫ﺇﺿﺎﻓﺔ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ Insert‬ﺇﱃ‬

‫ﺁﺧﺮ ‪61 ........................................ ................................................................‬‬ ‫ﻧﺴﺦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﺟﺪﻭﻝ ﺇﱃ‬

‫ﺇﻧﺸﺎﺋﻪ ‪62 .............................................................................‬‬ ‫ﺇﺿﺎﻓﺔ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺇﱃ ﺟﺪﻭﻝ ﰲ ﻧﻔﺲ ﳊﻈﺔ‬

‫‪62 ...................................................... ................................ ................................ Delete‬‬ ‫ﺣﺬﻑ ﺍﻟﺒﻴﺎﻧﺎﺕ‬

‫‪63 ........................................ ................................................................ Update Data‬‬ ‫ﺗﻌﺪﻳﻞ ﺍﻟﺒﻴﺎﻧﺎﺕ‬

‫‪64 ......................................................................................................................... Select‬‬ ‫ﺟﺮﺩ ﺍﻟﺒﻴﺎﻧﺎﺕ‬

‫‪67 ......................................... ................................ ................................ Concatenation‬‬ ‫ﺩﻣﺞ ﺍﳊﻘﻮﻝ‬

‫‪13‬‬
‫‪67 .................................................................. ................................ SELECT TOP‬‬ ‫ﺟﺮﺩ ﺍﻷﺳﻄﺮ ﺍﻷﻭﱃ‬

‫ﻋﺸﻮﺍﺋﻴﺎ ‪68 ................................................................................... RANDOM SELECT‬‬ ‫ﺟﻠﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ‬

‫‪68 ................................................. ................................SELECT DISTINCT‬‬ ‫ﺟﻠﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻏﲑ ﻣﻜﺮﺭﺓ‬

‫‪69 ............................................................................... ................................LIKE‬‬ ‫ﺟﻠﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳌﺸﺎ‪‬ﺔ‬

‫‪71 ............................................................................. ................................ORDER BY‬‬ ‫ﺗﺮﺗﻴﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ‬

‫‪72 ............................................................... ................................................................ Functions‬‬ ‫ﺍﻟﺪﻭﺍﻝ‬

‫‪72 ................................................................................... Aggregate Functions‬‬ ‫ﺍﻟﺪﻭﺍﻝ ﺍﻟﺘﺠﻤﻴﻌﻴﺔ‬

‫ﺍﻟﺪﺍﻟﺔ ‪72 ................................................................. ................................................................ COUNT‬‬

‫ﺍﻟﺪﺍﻟﺔ ‪73 ..................................... ................................................................................................ SUM‬‬

‫ﺍﻟﺪﺍﻟﺔ ‪73 ...................................... ................................................................ ................................AVG‬‬

‫ﺍﻟﺪﺍﻟﺔ ‪74 ...................................... ................................................................ ................................ MIN‬‬

‫ﺍﻟﺪﺍﻟﺔ ‪74 ..................................... ................................................................................................ MAX‬‬

‫ﺍﻟﺒﻴﺎﻧﺎﺕ ‪75 ............................................................................. ................................GROUP BY‬‬ ‫ﲡﻤﻴﻊ‬

‫‪76.................................................. ................................................................ HAVING‬‬ ‫ﺷﺮﻁ ﺍﻟﺘﺠﻤﻴﻊ‬

‫‪77 .................... ................................ ................................ Arithmetic Functions‬‬ ‫ﺍﻟﺪﻭﺍﻝ ﺍﳊﺴﺎﺑﻴﺔ‬

‫ﺍﻟﺪﺍﻟﺔ ‪77 ....................................................................................................... ................................ABS‬‬

‫‪14‬‬
77 .................................... ................................................................ ................................ SQRT ‫ﺍﻟﺪﺍﻟﺔ‬

77 ................................................................. ................................ String Functions ‫ﺍﻟﺪﻭﺍﻝ ﺍﻟﻨﺼﻴﺔ‬

77 ......................................................................................................................... SUBSTRING ‫ﺍﻟﺪﺍﻟﺔ‬

78 ...................................... ................................................................ ................................LEFT ‫ﺍﻟﺪﺍﻟﺔ‬

79 ... ................................................................ ................................ ................................RIGHT ‫ﺍﻟﺪﺍﻟﺔ‬

80................ ................................ ................................................................ RTRIM ‫ ﻭ‬LTRIM ‫ﺍﻟﺪﺍﻟﺘﺎﻥ‬

80.............................................................................. ................................ LOWER ‫ ﻭ‬UPPER ‫ﺍﻟﺪﺍﻟﺘﺎﻥ‬

81 ........................ ................................................................ ................................ CHARINDEX ‫ﺍﻟﺪﺍﻟﺔ‬

81 ....................................................................................................... ................................ LEN ‫ﺍﻟﺪﺍﻟﺔ‬

82 ........................................ ................................................................Date Functions ‫ﺩﻭﺍﻝ ﺍﻟﺘﺎﺭﻳﺦ‬

82 ............................ ................................................................ ................................ DATEADD ‫ﺍﻟﺪﺍﻟﺔ‬

84 ............................ ................................................................ ................................ DATEDIFF ‫ﺍﻟﺪﺍﻟﺔ‬

84 ........................................................................................... ................................DATEPART ‫ﺍﻟﺪﺍﻟﺔ‬

86 ............................................................. ................................................................ GETDATE ‫ﺍﻟﺪﺍﻟﺔ‬

87 ........................ ................................................................ Conversion Functions ‫ﺩﻭﺍﻝ ﺍﻟﺘﺤﻮﻳﻞ‬

87 ....................................................................................................... ................................ STR ‫ﺍﻟﺪﺍﻟﺔ‬

87 ............................ ................................................................ ................................ CONVERT ‫ﺍﻟﺪﺍﻟﺔ‬

15
‫ﺍﻟﺪﺍﻟﺔ ‪88 ..................................... ................................................................................................ CAST‬‬

‫ﺍﻟﻔﺼﻞ ﺍﻟﺮﺍﺑﻊ‪ :‬ﺗﻄﺒﻴﻘﺎﺕ ﺍﳉﱪ ﺍﻟﺘﺠﺮﻳﺪﻱ ﰲ ﻟﻐﺔ ‪SQL‬‬

‫ﺍﻟﺘﺠﺮﻳﺪﻱ ‪90 .........................................................................................................................‬‬ ‫ﺗﺬﻛﲑ ﺑﺎﳉﱪ‬

‫)‪90 ............................................................. ................................................................ (‬‬ ‫ﺍﻻﲢﺎﺩ ‪Union‬‬

‫ﺍﻻﲢﺎﺩ‪90 ...................................................... ................................ ................................‬‬ ‫ﻣﺜﺎﻝ ﻋﻦ ﻋﻤﻴﻠﺔ‬

‫‪91.............................................................................. ................................‬‬ ‫ﺍﻟﺘﻘﺎﻃﻊ ‪() Intersection‬‬

‫ﺍﻟﺘﻘﺎﻃﻊ ‪91 ..................................................... ................................................................‬‬ ‫ﻣﺜﺎﻝ ﻋﻦ ﻋﻤﻴﻠﺔ‬

‫)‪92.................................................. ................................................................ ( -‬‬ ‫ﺍﻻﺧﺘﻼﻑ ‪Difference‬‬

‫ﺍﻻﺧﺘﻼﻑ ‪92.................................................. ................................................................‬‬ ‫ﻣﺜﺎﻝ ﻋﻦ ﻋﻤﻴﻠﺔ‬

‫)‪93 ....................................................................................... ................................ (σ‬‬ ‫ﺍﻻﻧﺘﻘﺎﺀ ‪Selection‬‬

‫ﺍﻻﻧﺘﻘﺎﺀ ‪93 ..................................................... ................................................................‬‬ ‫ﻣﺜﺎﻝ ﻋﻦ ﻋﻤﻴﻠﺔ‬

‫)‪94 ................................................................................................................... (π‬‬ ‫ﺍﻻﺳﻘﺎﻁ ‪Projection‬‬

‫ﺍﻻﺳﻘﺎﻁ ‪94 ...................................................................................................................‬‬ ‫ﻣﺜﺎﻝ ﻋﻦ ﻋﻤﻴﻠﺔ‬

‫)×( ‪94 ............................................................. ................................................................‬‬ ‫ﺍﳉﺪﺍﺀ ﺍﻟﺪﻳﻜﺎﺭﰐ‬

‫‪16‬‬
‫ﺍﻟﺪﻳﻜﺎﺭﰐ‪95 ...................................... ................................................................‬‬ ‫ﻣﺜﺎﻝ ﻋﻦ ﻋﻤﻴﻠﺔ ﺍﳉﺪﺍﺀ‬

‫)÷( ‪96 ........................................................................................... ................................‬‬ ‫ﺍﻟﻘﺴﻤﺔ ‪Division‬‬

‫ﺍﻟﻘﺴﻤﺔ‪96 ...................................................... ................................ ................................‬‬ ‫ﻣﺜﺎﻝ ﻋﻦ ﻋﻤﻴﻠﺔ‬

‫( ‪98 ................................................................................................................................‬‬ ‫ﺍﻟﺮﺑﻂ ‪) Join‬‬

‫ﺍﻟﺮﺑﻂ ‪98 ....................................................................................... ................................‬‬ ‫ﻣﺜﺎﻝ ﻋﻦ ﻋﻤﻴﻠﺔ‬

‫ﺍﻟﻔﺼﻞ ﺍﳋﺎﻣﺲ‪ :‬ﺍﻟﱪﳎﺔ ﰲ ‪Transact SQL‬‬

‫‪102 ........................................................... ................................................................ Variables‬‬ ‫ﺍﳌﺘﻐﲑﺍﺕ‬

‫ﻟﻠﻤﺘﻐﲑ ‪102 ......................... ................................................................ ................................‬‬ ‫ﺇﻋﻄﺎﺀ ﻗﻴﻤﺔ‬

‫ﻣﺘﻐﲑ‪103 ..............................................................................................................................‬‬ ‫ﺇﻇﻬﺎﺭ ﻗﻴﻤﺔ‬

‫‪103 ................................... ................................................................................................RETURN‬‬ ‫ﺍﻷﻣﺮ‬

‫‪103 .................................................. ................................................................IF…ELSE‬‬ ‫ﺍﻟﺒﻨﻴﺔ ﺍﻟﺸﺮﻃﻴﺔ‬

‫ﺑﺎﺳﺘﺨﺪﺍﻡ ‪105 ....................................... ................................ ................................ Case‬‬ ‫ﺍﻟﺒﻨﻴﺔ ﺍﻟﺸﺮﻃﻴﺔ‬

‫‪106 .................................... ................................................................WHILE‬‬ ‫ﺍﻟﺒﻨﻴﺔ ﺍﻟﺘﻜﺮﺍﺭﻳﺔ ﺑﺎﺳﺘﻌﻤﺎﻝ‬

‫‪108 .............................................. ................................Transactions Management‬‬ ‫ﺇﺩﺍﺭﺓ ﺍﻟﻌﻤﻠﻴﺎﺕ‬

‫‪17‬‬
‫‪109 ................................................................ ................................ ................................Cursors‬‬ ‫ﺍﳌﻤﺮﺭﺍﺕ‬

‫‪113 ....................................................................................... Stored Procedures‬‬ ‫ﺍﻹﺟﺮﺍﺀﺍﺕ ﺍﳌﺨﺰﻧﺔ‬

‫ﺗﺪﻋﻴﻤﻴﺔ‪118 .................................. ................................................................ ................................‬‬ ‫ﺃﻣﺜﻠﺔ‬

‫ﺇﺟﺮﺍﺀ ﳐﺰﻥ ﻳﻘﻮﻡ ﺑﻌﻤﻠﻴﺔ ﺍﻹﺿﺎﻓﺔ ‪118 .....................................................................................................‬‬

‫ﺇﺟﺮﺍﺀ ﳐﺰﻥ ﻳﻘﻮﻡ ﺑﻌﻤﻠﻴﺔ ﺍﻟﺘﻌﺪﻳﻞ ‪118 ...................................... ................................................................‬‬

‫ﺇﺟﺮﺍﺀ ﳐﺰﻥ ﻳﻘﻮﻡ ﺑﻌﻤﻠﻴﺔ ﺍﳊﺬﻑ ‪119 ....................................... ................................ ................................‬‬

‫ﺇﺟﺮﺍﺀ ﳐﺰﻥ ﻳﻘﻮﻡ ﺑﻌﻤﻠﻴﺔ ﺍﻻﺳﺘﻌﻼﻡ‪119 .................................... ................................................................‬‬

‫ﺍﳌﺨﺰﻧﺔ ‪119 ................................................ ................................................................‬‬ ‫ﺗﻌﺪﻳﻞ ﺍﻹﺟﺮﺍﺀﺍﺕ‬

‫ﺍﳌﺨﺰﻧﺔ ‪120 ................................................ ................................................................‬‬ ‫ﺣﺬﻑ ﺍﻹﺟﺮﺍﺀ ﺍﺕ‬

‫‪121 ............................................................. ................................................................ Functions‬‬ ‫ﺍﻟﺪﻭﺍﻝ‬

‫ﺍﻟﺪﻭﺍﻝ‪124 .................................... ................................................................ ................................‬‬ ‫ﺗﻌﺪﻳﻞ‬

‫ﺍﻟﺪﻭﺍﻝ‪124 ..................................................................................................... ................................‬‬ ‫ﺣﺬﻑ‬

‫‪124 ................................................................ ................................ ................................Triggers‬‬ ‫ﺍﻟﻘﻮﺍﺩﺡ‬

‫‪125................. ................................................................................................Triggers‬‬ ‫ﺇﻧﺸﺎﺀ ﺍﻟﻘﻮﺍﺩﺡ‬

‫‪128 ............................................................. ................................................................ Raiserror‬‬ ‫ﺍﻷﻣﺮ‬

‫ﺍﻟﻘﻮﺍﺩﺡ ‪129 ................................... ................................................................................................‬‬ ‫ﺣﺬﻑ‬


‫‪18‬‬
‫ﺍﻟﻘﻮﺍﺩﺡ ‪129 .................................. ................................................................ ................................‬‬ ‫ﺗﻌﺪﻳﻞ‬

‫ﺍﳋﺎﲤﺔ ‪130................. ................................................................................................ ................................‬‬

‫ﺑﺴﻢ ﺍﷲ ﻋﻠﻰ ﺑﺮﻛﺔ ﺍﷲ‬

‫‪19‬‬
‫‪‬‬

‫ﻋﻤﻮﻣﻴﺎﺕ ﺣﻮﻝ‬
‫ﺍﻟﺒﻴﺎﻧﺎﺕ‬

‫‪20‬‬
‫ﻋﻤﻮﻣﻴﺎﺕ ﺣﻮﻝ ﺍﻟﺒﻴﺎﻧﺎﺕ‬

‫ﺍﳌﻠﻔﺎﺕ ‪Files‬‬

‫ﺍﳌﻠﻒ ‪ File‬ﻫﻮ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﱵ ﺗﻨﺘﻤﻲ ﺇﱃ ﻧﻔﺲ ﺍﻟﻨﻮﻉ‪ ،‬ﻭﺗﻨﻘﺴﻢ ﺍﳌﻠﻔﺎﺕ ﺇﱃ‬
‫ﻧﻮﻋﲔ‪:‬‬

‫‪ ‬ﺍﳌﻠﻔﺎﺕ ﺍﻟﻨﺼﻴﺔ ‪ :Text File‬ﻭﻳﻜﻮﻥ ﳏﺘﻮﻯ ﺍﳌﻠﻒ ﻋﺒﺎﺭﺓ ﻋﻦ ﺑﻴﺎﻧﺎﺕ ﻧﺼﻴﺔ‪.‬‬


‫‪ ‬ﺍﳌﻠﻔﺎﺕ ﺍﻟﺜﻨﺎﺋﻴﺔ ‪ :Binary File‬ﺗﻜﻮﻥ ﻋﻠﻰ ﺷﻜﻞ ﺑﻴﺎﻧﺎﺕ ﺛﻨﺎﺋﻴﺔ ‪ ،Binary Data‬ﻭﻫﺬﺍ‬
‫ﺍﻟﻨﻮﻉ ﻣﻦ ﺍﳌﻠﻔﺎﺕ ﻳﺴﺘﺨﺪﻡ ﻏﺎﻟﺒﺎ ﻣﻦ ﻗﺒﻞ ﻟﻐﺎﺕ ﺍﻟﱪﳎﺔ‪.‬‬

‫ﲣﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
‫ﻳﺴﻌﻰ ﺍﻹﻧﺴﺎﻥ ﺩﺍﺋﻤﺎ ﺇﱃ ﺗﺴﻬﻴﻞ ﺍﳌﻬﺎﻡ ﻋﻠﻴﻪ ﻭﺗﻴﺴﲑ ﻛﻞ ﻋﻘﺒﺎﺕ ﺍﳊﻴﺎﺓ‪ ،‬ﻓﻠﻮ ﻧﻈﺮﻧﺎ ﺇﱃ ﺃﻭﻝ‬
‫ﺇﺻﺪﺍﺭﺍﺕ ﺍﳊﻮﺍﺳﻴﺐ ﻟﻮﺟﺪﻧﺎ ﻣﺴﺎﺣﺎﺕ ﺍﻟﺘﺨﺰﻳﻦ ﻟﺪﻳﻬﺎ ﺻﻐﲑﺓ ﺟﺪﺍ‪ ،‬ﻧﺎﻫﻴﻚ ﻋﻦ ﺑﻂﺀ‬
‫ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺑﺴﺒﺐ ﺿﻌﻒ ﺃﺩﺍﺀ ﺍﳊﺎﺳﻮﺏ ﻣﻦ ﺟﻬﺔ‪ ،‬ﻭﺑﺴﺒﺐ ﺭﺩﺍﺀﺓ ﻧﻈﺎﻡ ﺍﻟﺘﺸﻐﻴﻞ ﻣﻦ‬
‫ﺟﺎﻧﺐ ﺁﺧﺮ‪ ،‬ﻭﻟﻜﻦ ﺍﻹﻧﺴﺎﻥ ﺑﺴﺒﺐ ﻣﻠﻜﺘﻪ ﺍﻹﺑﺪﺍﻋﻴﺔ ﻓﺈﻧﻪ ﻃﻮﺭ ﻭﻣﺎﺯﺍﻝ ﻳﻄﻮﺭ ﺃﺩﺍﺀ ﺍﳊﺎﺳﻮﺏ‬
‫ﺁﻟﻴﺎ ﻭﺑﺮﳎﻴﺎ‪ ،‬ﺣﱴ ﺣﺼﻠﻨﺎ ﻋﻠﻰ ﺣﻮﺍﺳﻴﺐ ﺑﻜﻔﺎﺀﺍﺕ ﻋﺎﻟﻴﺔ ﻭﺑﻄﺮﻕ ﻓﻌﺎﻟﺔ ﻭﺳﺮﻳﻌﺔ ﳊﻔﻆ‬
‫ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﻻﺳﺘﻐﻼﳍﺎ‪.‬‬

‫‪21‬‬
‫ﻛﺎﻧﺖ ﺑﺪﺍﻳﺔ ﻋﻬﺪ ﺍﻹﻧﺴﺎﻥ ﺑﺘﺨﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﰲ ﺳﻨﺔ ‪ ،1956‬ﺣﻴﻨﻤﺎ ﻗﺎﻡ ﺑﺎﺧﺘﺮﺍﻉ ﺍﻟﻘﺮﺹ‬
‫ﺍﻟﺼﻠﺐ ‪) Hard Disk‬ﺣﺴﺐ ﻣﻮﺳﻮﻋﺔ ﻭﻳﻜﻴﺒﻴﺪﻳﺎ(‪ ،‬ﻣﻨﺬ ﺫﻟﻚ ﺍﻟﻌﻬﺪ ﻭﺍﻹﻧﺴﺎﻥ ﻳﻄﻮﺭ ﻭﺳﺎﺋﻞ‬
‫ﲣﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺇﱃ ﻳﻮﻣﻨﺎ ﻫﺬﺍ‪.‬‬

‫ﺑﺎﻟﻨﺴﺒﺔ ﻟﻄﺮﻕ ﲣﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻓﺈﻥ ﺃﺷﻬﺮﻫﺎ‪:‬‬

‫ﺍﻟﺘﺨﺰﻳﻦ ﺍﳌﺒﺎﺷﺮ‪:‬‬
‫ﻭﻳﻜﻮﻥ ﺣﻔﻆ ﺍﻟﺒﻴﺎ ﻧﺎﺕ ﻋﻠﻰ ﺷﻜﻞ ﺃﺳﻄﺮ ﻣﺘﺘﺎﻟﻴﺔ ﰲ ﻣﻠﻔﺎﺕ‪ ،‬ﻭﻳﺘﻤﻴﺰ ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﺍﻟﺘﺨﺰﻳﻦ‬
‫ﺑﺒﺴﺎﻃﺘﻪ ﻭﺳﻬﻮﻟﺘﻪ‪ ،‬ﻭﻟﻜﻨﻪ ﻳﺒﻘﻰ ﺿﻌﻴﻔﺎ ﺑﺴﺒﺐ ﺻﻌﻮﺑﺔ ﺍﺳﺘﺨﺮﺍﺝ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻨﻪ ﻷﻧﻪ ﻟﻴﺴﺖ‬
‫ﻫﻨﺎﻟﻚ ﻃﺮﻳﻘﺔ ﳉﻠﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻨﻪ ﺇﻻ ﻣﻦ ﺧﻼﻝ ﺭﺗﺒﺔ ﺍﻟﺴﻄﺮ‪ ،‬ﺇﺿﺎﻓﺔ ﺇﱃ ﻋﻴﺐ ﺁﺧﺮ ﻭﻫﻮ‬
‫ﺃﻧﻪ ﻳﺄﺧﺬ ﺣﺠﻤﺎ ﻛﺒﲑﺍ‪ ،‬ﻭﻫﺬﺍ ﻣﺜﺎﻝ ﳍﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﺍﻟﺘﺨﺰﻳﻦ‪:‬‬

‫‪Abu Bakr ASSIDIQ‬‬

‫‪Ômar Ibn ALKHATTAB‬‬

‫‪Ôtman Ibn AFFAN‬‬

‫‪Ali Ibn ABI TALIB‬‬

‫ﺍﻟﺘﺨﺰﻳﻦ ﺍﻟﺘﺴﻠﺴﻠﻲ‪:‬‬
‫ﺗﺘﻢ ﻋﻤﻠﻴﺔ ﺍﻟﺘﺨﺰﻳﻦ ﺑﺸﻜﻞ ﻣﺘﺴﻠﺴﻞ‪ ،‬ﲝﻴﺚ ﻛﻞ ﺳﻄﺮ ﻳﻨﺘﻬﻲ ﺑﻔﺎﺻﻞ )ﻏﺎﻟﺒﺎ ﺍﻟﻔﺎﺻﻠﺔ‬
‫ﺍﻟﻌﺎﺩﻳﺔ( ﰒ ﺑﻌﺪ ﺫﻟﻚ ﻳﻠﻴﻪ ﺍﻟﺴﻄﺮ ﺍﻟﺜﺎﱐ ﻋﻠﻰ ﺍﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ‪:‬‬
‫‪Abu Bakr ASSIDIQ , Ômar Ibn ALKHATTAB , Ôtman Ibn AFFAN , Ali Ibn ABI TALIB‬‬

‫‪22‬‬
‫ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﺍﻟﺘﺨﺰﻳﻦ ﻳﺘﻤﻴﺰ ﻋﻦ ﺍﻟﺘﺨﺰﻳﻦ ﺍﳌﺒﺎﺷﺮ ﺑﻜﻮﻧﻪ ﻻ ﻳﺄﺧﺬ ﺣﺠﻤﺎ ﻛﺒﲑﺍ‪ ،‬ﻭﻟﻜﻨﻪ ﻻ‬
‫ﳜﺘﻠﻒ ﻋﻨﻪ ﰲ ﻃﺮﻳﻘﺔ ﺍﻟﺒﺤﺚ ﻋﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﲝﻴﺚ ﳚﺐ ﺍﳌﺮﻭﺭ ﻋﻠﻰ ﻛﻞ ﺍﻷﺳﻄﺮ ﻣﻦ ﺍﻟﺒﺪﺍﻳﺔ‬
‫ﺇﱃ ﻏﺎﻳﺔ ﺍﻟﻌﺜﻮﺭ ﻋﻠﻰ ﺍﻟﺴﻄﺮ ﺍﳌﻨﺸﻮﺩ‪.‬‬

‫ﺍﻟﺘﺨﺰﻳﻦ ﺍﻟﺘﺴﻠﺴﻠﻲ ﺍﳌﻔﻬﺮﺱ‪:‬‬


‫ﻧﻔﺲ ﻃﺮﻳﻘﺔ ﺍﻟﺘﺨﺰﻳﻦ ﺍﻟﺴﺎﺑﻘﺔ‪ ،‬ﻭﻟﻜﻨﻨﺎ ﻧﻘﻮﻡ ﺑﻔﻬﺮﺳﺔ ﻟﻠﺒﻴﺎﻧﺎﺕ ﺍﳌﺨﺰﻧﺔ ﰲ ﺍﳌﻠﻒ‪ ،‬ﻣﺜﻼ ﻟﻮ‬
‫ﻋﻨﺪﻧﺎ ﻣﻠﻒ ﳊﻔﻆ ﺑﻴﺎﻧﺎﺕ ﺍﻟﻌﻤﺎﻝ )ﻧﻘﻮﻡ ﲝﻔﻆ ﺍﻻﺳﻢ‪ ،‬ﺍﻟﺴﻦ‪ ،‬ﺍﻟﻌﻨﻮﺍﻥ ﻣﺜﻼ(‪ ،‬ﻓﻜﻞ ﻋﺎﻣﻞ‬
‫ﻳﺄﺧﺬ ﺭﻗﻤﺎ ﺗﺮﺗﻴﺒﻴﺎ‪ ،‬ﻭﺫﻟﻚ ﺑﻐﺮﺽ ﺗﺴﺮﻳﻊ ﻭﺛﲑﺓ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﻟﻌﺎﻣﻞ ﺍﳌﺒﺤﻮﺙ ﻋﻨﻪ‪ ،‬ﻷﻥ‬
‫ﺍﻟﺒﺤﺚ ﻻ ﻳﺸﻤﻞ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﺇﳕﺎ ﳜﺺ ﻓﻘﻂ ﻓﻬﺎﺭﺳﻬﺎ ‪ ،Index‬ﻟﻜﻦ ﺗﺒﻘﻰ ﻣﺴﺄﻟﺔ ﻣﺮﺍﺟﻌﺔ‬
‫ﻓﻬﺎﺭﺱ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺻﻌﺒﺔ ﻷﻧﻪ ﻣﻦ ﺍﻟﻮﺍﺟﺐ ﲢﺪﻳﺜﻬﺎ ﻋﻨﺪ ﻛﻞ ﻋﻤﻠﻴﺔ ﺇﺿﺎﻓﺔ ﺃﻭ ﺗﻌﺪﻳﻞ ﺃﻭ‬
‫ﺣﺬﻑ‪.‬‬

‫ﻋﻴﻮﺏ ﻃﺮﻕ ﺍﻟﺘﺨﺰﻳﻦ ﺍﻟﺴﺎﺑﻘﺔ‪:‬‬


‫ﻣﻦ ﻋﻴﻮﺏ ﺍﻟﺘﺨﺰﻳﻦ ﺍﳌﺒﺎﺷﺮ ﻭﺍﻟﺘﺴﻠﺴﻠﻲ‪ ،‬ﺃﻧﻪ ﻟﻴﺲ ﻫﻨﺎﻟﻚ ﺗﺮﺍﺑﻂ ﻭﻋﻼﻗﺎﺕ ﺑﲔ ﺍﳌﻠﻔﺎﺕ‪ ،‬ﻣﺜﻼ ﻟﻮ‬
‫ﻋﻨﺪﻧﺎ ﻣﻠﻒ ﳜﺰﻥ ﺑﻴﺎﻧﺎﺕ ﺍﻷﺳﺘﺎﺫ‪ ،‬ﻭﻣﻠﻒ ﳜﺰﻥ ﻗﺎﺋﻤﺔ ﺍﻟﺘﺨﺼﺼﺎﺕ ﻓﻤﻦ ﺍﳌﺴﺘﺤﻴﻞ ﺍﻟﺘﻮﺍﺻﻞ‬
‫ﺑﻴﻨﻬﻤﺎ ﻷ‪‬ﻤﺎ ﻣﻠﻔﺎﻥ ﻣﻨﻌﺰﻻﻥ‪.‬‬

‫ﻭﻣﻦ ﺟﻬﺔ ﺃﺧﺮﻯ ﻣﺴﺄﻟﺔ ﲪﺎﻳﺔ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻓﻬﻲ ﻏﺎﺋﺒﺔ‪ ،‬ﻓﻘﺪ ﺗﻘﻮﻡ ﲝﺬﻑ ﲣﺼﺺ ﻣﻌﲔ ﻣﻦ‬
‫ﺟﺪﻭﻝ ﺍﻟﺘﺨﺼﺼﺎﺕ‪ ،‬ﻭﳍﺬﺍ ﺍﻟﺘﺨﺼﺺ ﺑﻴﺎﻧﺎﺕ ﰲ ﻣﻠﻒ ﺍﻷﺳﺎﺗﺬﺓ ﻓﺘﻜﻮﻥ ﻫﻨﺎﻟﻚ ﺑﻌﺜﺮﺓ ﻭﺧﻠﻂ‬
‫ﻟﻠﺒﻴﺎﻧﺎﺕ‪ ،‬ﺃﻣﺎ ﺇﺫﺍ ﻛﺎﻥ ﺍﳌﻠﻒ ﻣﺸﺘﺮﻛﺎ ﰲ ﺷﺒﻜﺔ ﳏﻠﻴﺔ ﻓﻬﻨﺎﻟﻚ ﻣﺸﻜﻠﺔ ﻛﺒﲑﺓ ﻭﻫﻲ ﲢﺪﻳﺚ‬

‫‪23‬‬
‫ﺍﻟﺒﻴﺎﻧﺎﺕ‪ ،‬ﻓﻘﺪ ﻳﺸﺘﻐﻞ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﳌﺴﺘﺨﺪﻣﲔ ﻋﻠﻰ ﻧﻔﺲ ﺍﻟﺒﻴﺎﻧﺎﺕ ﳑﺎ ﻳﺆﺩﻱ ﺇﱃ ﺧﻠﻞ ﰲ‬
‫ﺣﻔﻈﻬﺎ‪ ،‬ﳍﺬﺍ ﺳﺘﺠﺪ ﺍﺳﺘﻌﻤﺎﻝ ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﲣﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻘﺘﺼﺮﺍ ﻋﻠﻰ ﺍﻟﺘﻄﺒﻴﻘﺎﺕ‬
‫ﺍﻟﺼﻐﲑﺓ‪.‬‬

‫ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﺘﺮﺍﺗﺒﻴﺔ‪:‬‬


‫ﰲ ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﺃﻧﻮﺍﻉ ﲣﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ‪ ،‬ﻧﺘﺨﻠﺺ ﻣﻦ ﻣﺸﺎﻛﻞ ﺍﳊﻤﺎﻳﺔ ﻭﺃﻳﻀﺎ ﻣﻦ ﻣﺸﺎﻛﻞ‬
‫ﺍﻟﺮﺑﻂ ﺑﲔ ﺍﳌﻠﻔﺎﺕ‪ ،‬ﻭﻟﻜﻦ ﻫﻨﺎﻟﻚ ﻣﺸﻜﻞ ﺁﺧﺮ‪...‬‬

‫ﻗﺎﻣﺖ ﻛﻞ ﺷﺮﻛﺔ ﻣﻨﺘﺠﺔ ﻟﱪﻧﺎﻣﺞ ﻹﺩﺍﺭﺓ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺑﺘﺨﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻋﻠﻰ ﺷﻜﻞ ﻗﻮﺍﻋﺪ‬
‫ﺑﻴﺎﻧﺎﺕ ﺗﺮﺍﺗﺒﻴﺔ ﺑ ﻨﻤﻂ ﳜﺼﻬﺎ‪ ،‬ﻭﺑﺎﻟﺘﺎﱄ ﺃﺿﺤﻰ ﻣﻦ ﺍﻟﺼﻌﺐ ﺍﻹﺣﺎﻃﺔ ﺑﻜﻞ ﺑﺮﺍﻣﺞ ﺇﺩﺍﺭﺓ‬
‫ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‪ ،‬ﻷﻥ ﻛﻞ ﺑﺮﻧﺎﻣﺞ ﻟﻪ ﻃﺮﻳﻘﺘﻪ ﺍﳋﺎﺻﺔ‪.‬‬

‫ﻟﻺﺷﺎﺭﺓ ﻓﺘﺎﺭﻳﺦ ﻇﻬﻮﺭ ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﺍﻟﺘﺨﺰﻳﻦ ﻛﺎﻥ ﺳﻨﺔ ‪ 1960‬ﺣﺴﺐ ﻣﻮﺳﻮﻋﺔ ﻭﻳﻜﻴﺒﻴﺪﻳﺎ‪.‬‬

‫ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﺘﺮﺍﺑﻄﻴﺔ ﺃﻭ ﺍﻟﻌﻼﺋﻘﻴﺔ‪:‬‬


‫ﺃﺗﻰ ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﺃﻧﻮﺍﻉ ﲣﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﳊﻞ ﻛﻞ ﺍﳌﺸﺎﻛﻞ ﺍﻟﺴﺎﺑﻘﺔ‪ ،‬ﲝﻴﺚ ﻳﺘﻮﻓﺮ ﻋﻠﻰ ﲪﺎﻳﺔ‬
‫ﻋﺎﻟﻴﺔ ﻟﻠﺒﻴﺎﻧﺎﺕ‪ ،‬ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﺇﻣﻜﺎﻧﻴﺎﺕ ﺭﺑﻂ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻓﻴﻤﺎ ﺑﻴﻨﻬﺎ ﻋﻠﻰ ﺷﻜﻞ ﻋﻼﻗﺎﺕ‬
‫ﺳﻨﻔﺼﻠﻬﺎ ﻓﻴﻤﺎ ﺑﻌﺪ ﺇﻥ ﺷﺎﺀ ﺍﷲ‪ ،‬ﻭﺍﳌﻴﺰﺓ ﺍﻟﺒﺎﻫﺮﺓ ﺍﻟﱵ ﺃﺗﻰ ‪‬ﺎ ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﺍﻟﺘﺨﺰﻳﻦ ﻫﻮ‬
‫ﺍﻋﺘﻤﺎﺩ ﻛﻞ ﺃﻧﻈﻤﺔ ﺇﺩﺍﺭﺓ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﻌﻼﺋﻘﻴﺔ ﻋﻠﻰ ﻟﻐﺔ ﻣﻮﺣﺪﺓ‪ ،‬ﺃﺗﺪﺭﻥ ﻣﺎﻫﻲ ﻫﺬﻩ‬
‫ﺍﻟﻠﻐﺔ؟؟ ﺇ‪‬ﺎ ﻟﻐﺔ ‪.SQL‬‬

‫‪24‬‬
‫ﰲ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﻌﻼﺋﻘﻴﺔ ﻳﺘﻢ ﲣﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﰲ ﺟﺪﺍﻭﻝ ﺛﻨﺎﺋﻴﺔ ﺍﻟﺒﻌﺪ )ﺗﺘﻜﻮﻥ ﻣﻦ‬
‫ﺃﺳﻄﺮ ﻭﺃﻋﻤﺪﺓ(‪.‬‬

‫ﻣﺎﻫﻲ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ؟‬


‫ﻫﻲ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳌﺨﺰﻧﺔ ﺑﺸﻜﻞ ﻣﻨﻈﻢ‪ ،‬ﻭﻫﻲ ﻣﻦ ﺃﻫﻢ ﺍﻟﺪﻋﺎﺋﻢ ﺍﻟﱵ ﺗﻘﻮﻡ ﻋﻠﻴﻬﺎ‬
‫ﺍﳌﻌﻠﻮﻣﻴﺎﺕ‪ ،‬ﺣﻴﺚ ﻣﻦ ﺧﻼﻝ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻧﺴﺘﻄﻴﻊ ﺣﻔﻆ ﻭﺗﻌﺪﻳﻞ ﻭﺣﺬﻑ ﺍﳌﻌﻠﻮﻣﺎﺕ ﺑﻄﺮﻕ‬
‫ﺳﻠﺴﺔ‪ ،‬ﻭﻛﺬﻟﻚ ﺗﺘﻴﺢ ﻟﻨﺎ ﺍﺳﺘﺨﺮﺍﺝ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﶈﻔﻮﻇﺔ ﻛﻤﺎ ﻧﺮﻳﺪ‪.‬‬

‫ﻣﺎﻫﻮ ﻧﻈﺎﻡ ﺇﺩﺍﺭﺓ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ؟‬


‫ﻫﻮ ﺑﺮﻧﺎﻣﺞ ﺧﺎﺹ ﺑﺈﺩﺍﺭﺓ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‪ ،‬ﻭﻳﺴﻤﺢ ﻟﻚ ﺑﺈﺿﺎﻓﺔ ﻭﺗﻌﺪﻳﻞ ﻭﺣﺬﻑ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻋﱪ‬
‫ﻭﺍﺟﻬﺎﺕ ﻭﻧﻮﺍﻓﺬ‪ ،‬ﺃﻳﻀﺎ ﻣﻦ ﺧﻼﻝ ﺭﺑﻂ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺑﺈﺣﺪﻯ ﻟﻐﺎﺕ ﺍﻟﱪﳎﺔ‪ ،‬ﻭﻳﺘﻴﺢ ﻟﻚ‬
‫ﺃﻳﻀﺎ ﻣﺸﺎﺭﻛﺔ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺩﺍﺧﻞ ﺷﺒﻜﺔ ‪ ،Network‬ﻭﺗﻮﺟﺪ ﺍﻵﻥ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺃﻧﻈﻤﺔ‬
‫ﺇﺩﺍﺭﺓ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﻟﻌﻞ ﺃﺷﻬﺮﻫﺎ ) ‪Microsoft ACCESS, Microsoft SQL Server, Oracle‬‬

‫‪(Database , MySQL, PostqreSQL, Sybase, IBM DB2, ..‬‬

‫ﺍﻷﳕﻮﺫﺝ ﺍﻟﻌﻼﺋﻘﻲ ‪Relationnal Model‬‬

‫ﻇﻬﺮ ﻫﺬﺍ ﺍﻟﻨﻈﺎﻡ ﻋﻠﻰ ﻳﺪ ‪ Edgard Franck Codd‬ﺳﻨﺔ ‪ ،1970‬ﻭﻳﻨﺒﲏ ﻫﺬﺍ ﺍﻟﻨﻤﻮﺫﺝ ﻋﻠﻰ‬
‫ﻣﻔﻬﻮﻡ ﺍﳉﱪ ﺍﻟﻌﻼﺋﻘﻲ )ﻣﻔﻬﻮﻡ ﺭﻳﺎﺿﻲ( ﺍﻟﺬﻱ ﻳﺘﻴﺢ ﺍﻻﺳﺘﻌﻼﻡ ﻋﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﻧﻈﺎﻡ‬

‫‪25‬‬
‫ﻳﻀﻢ ﻭﺣﺪﺍﺕ ﻣﺘﺮﺍﺑﻄﺔ ﻓﻴﻤﺎ ﺑﻴﻨﻬﺎ‪ ،‬ﻟﺬﺍ ﻳﻌﺪ ﺍﳉﱪ ﺍﻟﻌﻼﺋﻘﻲ ﲟﺜﺎﺑﺔ ﺍﳉﺎﻧﺐ ﺍﻟﺘﻨﻈﲑﻱ ﻟﻠﻐﺔ‬
‫‪ SQL‬ﺣﻴﺚ ﺃﻥ ﻓﻬﻢ ﺍﳉﱪ ﺍﻟﻌﻼﺋﻘﻲ ﻳﺴﺎﻋﺪﻙ ﻋﻠﻰ ﺍﺳﺘﻴﻌﺎﺏ ﻫﺬﻩ ﺍﻟﻠﻐﺔ ﺑﻜﻞ ﺳﻬﻮﻟﺔ‪.‬‬

‫ﻧﺘﺞ ﻋﻦ ﺍﺳﺘﺨﺪﺍﻡ ﻫﺬﺍ ﺍﻷﳕﻮﺫﺝ ﺍﻟﻌﻼﺋﻘﻲ ﺗﻨﻈﻴﻢ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺑﺎﻟﻄﺮﻳﻘﺔ ﺍﳌﺸﻬﻮﺭﺓ ﺣﺎﻟﻴﺎ ﻋﻠﻰ‬
‫ﺷﻜﻞ ﺟﺪﺍﻭﻝ ‪ Tables‬ﻟﺘﺴﻬﻴﻞ ﻋﻤﻠﻴﺎﺕ ﺍﻹﺿﺎﻓﺔ ﻭﺍﻟﺘﻌﺪﻳﻞ ﻭﺍﳊﺬﻑ ﻭﺍﻟﻌﺮﺽ ﻟﻠﻤﺴﺘﺨﺪﻡ‪ ،‬ﻣﻊ‬
‫ﺍﻹﺷﺎﺭﺓ ﺇﱃ ﺃﻥ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﺎﺯﺍﻟﺖ ﲣﺰﻥ ﰲ ﻣﻠﻔﺎﺕ ‪ Files‬ﻭﻟﻜﻦ ﻃﺮﻳﻘﺔ ﻋﺮﺿﻬﺎ ﺻﺎﺭﺕ ﺃﺳﻬﻞ‬
‫ﻭﺃﻳﺴﺮ‪.‬‬

‫‪26‬‬


‫ﺍﳉﱪ ﺍﻟﺘﺠﺮﻳﺪﻱ‬

27
‫‪Relationnal Algebra‬‬ ‫ﺍﳉﱪ ﺍﻟﻌﻼﺋﻘﻲ‬
‫ﻋﺒﺎﺭﺓ ﻋﻦ ﻣﻔﻬﻮﻡ ﺭﻳﺎﺿﻲ ﳏﺾ‪ ،‬ﺃﻋﺘﻘﺪ ﻟﻮ ﻛﻨﺖ ﻣﻦ ﻫﻮﺍﺓ ﺍﻟﺮﻳﺎﺿﻴﺎﺕ ﺳﻴﻜﻮﻥ ﻗﺪ ﻣﺮ ﻋﻠﻰ‬
‫ﻣﺴﺎﻣﻌﻚ ﻣﻦ ﺩﻭﻥ ﺷﻚ‪ ،‬ﻭﻫﻮ ﻳﻘﻮﻡ ﻋﻠﻰ ﺃﻃﺮﻭﺣﺔ ﺍ‪‬ﻤﻮﻋﺎﺕ ‪ ،Group Theory‬ﻭﺍﻟﻐﺎﻳﺔ ﻣﻨﻪ ﻫﻮ‬
‫ﺍﳊﺼﻮﻝ ﻋﻠﻰ ﺑﻴﺎﻧﺎﺕ ﺟﺪﻳﺪﺓ ﻣﻦ ﺧﻼﻝ ﺑﻌﺾ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﻟﱵ ﻧﻘﻮﻡ ‪‬ﺎ ﻋﻠﻰ ﻭﺣﺪﺍﺕ )ﺟﺪﺍﻭﻝ(‬
‫ﺃﺧﺮﻯ‪ ،‬ﻭﻫﺬﻩ ﺍﻟﻌﻤﻠﻴﺎﺕ ﻫﻲ‪:‬‬

‫ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﻟﺘﺠﻤﻴﻌﻴﺔ‪:‬‬

‫ﺗﻄﺒﻖ ﻫﺬﻩ ﺍﻟﻌﻤﻠﻴﺎﺕ ﻋﻠﻰ ﳎﻤﻮﻋﺘﲔ‪.‬‬

‫ﺍﻻﲢﺎﺩ ‪:() Union‬‬

‫‪R1‬‬ ‫‪R2‬‬

‫ﺍﻻﲢﺎﺩ ‪ Union‬ﻫﻮ ﻋﻼﻗﺔ ﺗﺮﺑﻂ ﺑﲔ ﳎﻤﻮﻋﺘﲔ ﳍﻤﺎ ﻧﻔﺲ ﺍﳊﻘﻮﻝ ﻭﻧﻔﺲ ﺍﳋﺼﺎﺋﺺ‪،‬‬
‫ﻭﺗﻜﻮﻥ ﺍﻟﻨﺘﻴﺠﺔ ﻋﺒﺎﺭﺓ ﻋﻦ ﳎﻤﻮﻋﺔ ﺗﻀﻢ ﻛﻞ ﻋﻨﺎﺻﺮ ﺍ‪‬ﻤﻮﻋﺘﲔ‪ ،‬ﻭﻳﺮﻣﺰ ﳍﺎ ﺭﻳﺎﺿﻴﺎ ﻫﻜﺬﺍ‪:‬‬
‫‪R1  R2‬‬

‫ﺣﱴ ﻧﺴﺘﻮﻋﺐ ﺍﳌﻔﻬﻮﻡ ﺃﻛﺜﺮ ﺳﻨﻮﺭﺩ ﺍﳉﺪﻭﻟﲔ ﺍﻟﺘﺎﻟﻴﲔ ﺑﻨﻔﺲ ﺍﻟﺒﻨﻴﺔ‪:‬‬

‫‪28‬‬
‫ ﺍﻟﻔﻮﺝ ﺍﻷﻭﻝ ﻣﻦ ﺍﻟﻌﻤﺎﻝ‬: R1

Code Name Age Address


P1E1 Ahmed 26 Kuwait
P1E2 Idriss 24 Morocco
P1E3 Kamal 25 Egypt

‫ ﺍﻟﻔﻮﺝ ﺍﻟﺜﺎﱐ ﻣﻦ ﺍﻟﻌﻤﺎﻝ‬: R2

Code Name Age Address


P2E1 Khalid 24 Tunisia
P2E2 Ismaîl 27 Syria

‫ ﺍﲢﺎﺩ ﺍﻟﻮﺣﺪﺗﲔ‬:R1R2
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 ‫ﺬﺍ ﺍﻟﺮﻣﺰ‬

:‫ﺣﱴ ﻧﺴﺘﻮﻋﺐ ﺍﳌﻔﻬﻮﻡ ﺃﻛﺜﺮ ﺳﻨﻮﺭﺩ ﺍﳉﺪﻭﻟﲔ ﺍﻟﺘﺎﻟﻴﲔ ﺑﻨﻔﺲ ﺍﻟﺒﻨﻴﺔ‬

:"‫ ﺑﻌﺾ ﻛﺘﺐ ﻣﻜﺘﺒﺔ "ﺍﻟﻜﻨﺪﻱ‬:R1


Code Book
B1 Kalila wa dimna
B2 Moqadimat Ibn Khaldoun
B3 Truth of life
B4 C# Programming
B5 Java Programming

:"‫ ﺑﻌﺾ ﻛﺘﺐ ﻣﻜﺘﺒﺔ "ﺍﻟﺮﺿﻮﺍﻥ‬:R2


Code Book
B4 C# Programming
B13 Health & Body
B3 Truth of life
B15 PHP for beginners
B5 Java Programming

30
‫ﻛﻤﺎ ﺗﻼﺣﻆ ﻟﺪﻳﻨﺎ ﳎﻤﻮﻋﺘﺎﻥ ﳍﻤﺎ ﻧﻔﺲ ﺍﻟﺒﻨﻴﺔ‪ ،‬ﻭﻟﺪﻳﻬﻤﺎ ﺑﻌﺾ ﺍﻟﻌﻨﺎﺻﺮ ﺍﳌﺸﺘﺮﻛﺔ ﺑﻴﻨﻬﻤﺎ‬
‫ﻛﻤﺎ ﻳﻌﺮﺽ ﺍﳉﺪﻭﻝ ﺍﻟﺘﺎﱄ‪:‬‬

‫‪ :R1  R2‬ﺍﻟﻌﻨﺎﺻﺮ ﺍﳌﺸﺘﺮﻛﺔ ﺑﲔ ﺍ‪‬ﻤﻮﻋﺘﲔ‪:‬‬


‫‪Code‬‬ ‫‪Book‬‬
‫‪B4‬‬ ‫‪C# Programming‬‬
‫‪B3‬‬ ‫‪Truth of life‬‬
‫‪B5‬‬ ‫‪Java Programming‬‬

‫ﺍﻻﺧﺘﻼﻑ ‪:( -) Difference‬‬

‫‪R1‬‬ ‫‪R2‬‬ ‫‪R3‬‬ ‫‪R3=R1 - R2‬‬

‫ﺍﻻﺧﺘﻼﻑ ﻫﻮ ﺍﻟﻔﺎﺭﻕ ﺍﻟﻨﺎﺗﺞ ﻋﻦ ﻃﺮﺡ ﳎﻤﻮﻋﺔ ﻣﻦ ﳎﻤﻮﻋﺔ ﺃﺧﺮﻯ‪ ،‬ﻭﻳﺸﺘﺮﻁ ﺃﻥ ﻳﻜﻮﻥ‬


‫ﻟﻠﻤﺠﻤﻮﻋﺘﲔ )ﺍﳉﺪﻭﻟﲔ( ﻧﻔﺲ ﺍﻟﺒﻨﻴﺔ ﻭﻧﻔﺲ ﺍﳊﻘﻮﻝ‪.‬‬

‫ﻟﻨﺄﺧﺬ ﻧﻔﺲ ﺍﳌﺜﺎﻝ ﺍﻷﻭﻝ ﻭﻧﻄﺒﻖ ﻋﻠﻴﻪ ﻋﻤﻠﻴﺔ ﺍﻻﺧﺘﻼﻑ‪.‬‬

‫‪31‬‬
‫ ﺍﻟﻔﻮﺝ ﺍﻷﻭﻝ ﻣﻦ ﺍﻟﻌﻤﺎﻝ‬: R1

Code Name Age Address


P1E1 Ahmed 26 Kuwait
P1E2 Idriss 24 Morocco
P2E1 Khalid 24 Tunisia
P2E2 Ismaîl 27 Syria
P1E3 Youssef 32 Algeria

‫ ﺍﻟﻔﻮﺝ ﺍﻟﺜﺎﱐ ﻣﻦ ﺍﻟﻌﻤﺎﻝ‬: R2

Code Name Age Address


P2E1 Khalid 24 Tunisia
P2E2 Ismaîl 27 Syria
P2E3 Karim 29 Qatar
P2E4 Mahmoud 31 Arabic Saudia
P2E5 Ibrahim 36 Libya

:‫ ﺍﻟﻔﻮﺝ ﺍﻷﻭﻝ ﻧﺎﻗﺺ ﺍﻟﻔﻮﺝ ﺍﻟﺜﺎﱐ‬:R1-R2

Code Name Age Address


P1E1 Ahmed 26 Kuwait
P1E2 Idriss 24 Morocco
P1E3 Youssef 32 Algeria

.R2 ‫ ﻭﻏﲑ ﺍﳌﻮﺟﻮﺩﺓ ﰲ‬R1 ‫ ﺗﻌﲏ ﺟﻠﺐ ﺍﻟﻌﻨﺎﺻﺮ ﺍﳌﻮﺟﻮﺩﺓ ﰲ‬:R1-R2

32
‫ﺑﺎﳌﻘﺎﺑﻞ ﳝﻜﻨﻨﺎ ﺍﻟﻘﻴﺎﻡ ﺑﻌﻤﻠﻴﺔ ﺍﻻﺧﺘﻼﻑ ﺑﺸﻜﻞ ﻋﻜﺴﻲ‪ ،‬ﻋﻠﻰ ﺷﻜﻞ ‪ ،R2-R1‬ﰲ ﻫﺬﻩ ﺍﳊﺎﻟﺔ‬
‫ﺳﺘﻜﻮﻥ ﺍﻟﻨﺘﻴﺠﺔ ﻋﺒﺎﺭﺓ ﻋﻦ ﳎﻤﻮﻋﺔ ﺗﻀﻢ ﻓﻘﻂ ﺍﻟﻌﻨﺎﺻﺮ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ‪ R2‬ﻭﺍﻟﱵ ﻻ ﺗﻮﺟﺪ ﰲ‬
‫‪ R1‬ﺃﻱ ﻛﻤﺎ ﻳﻌﺮﺽ ﺍﳉﺪﻭﻝ ﺍﻟﺘﺎﱄ‪:‬‬

‫‪ :R2-R1‬ﺍﻟﻔﻮﺝ ﺍﻟﺜﺎﱐ ﻧﺎﻗﺺ ﺍﻟﻔﻮﺝ ﺍﻷﻭﻝ‪:‬‬

‫‪Code‬‬ ‫‪Name‬‬ ‫‪Age‬‬ ‫‪Address‬‬


‫‪P2E3‬‬ ‫‪Karim‬‬ ‫‪29‬‬ ‫‪Qatar‬‬
‫‪P2E4‬‬ ‫‪Mahmoud‬‬ ‫‪31‬‬ ‫‪Arabic Saudia‬‬
‫‪P2E5‬‬ ‫‪Ibrahim‬‬ ‫‪36‬‬ ‫‪Libya‬‬

‫ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﻷﺣﺎﺩﻳﺔ‬
‫ﺗﻄﺒﻖ ﻫﺬﻩ ﺍﻟﻌﻤﻠﻴﺎﺕ ﻋﻠﻰ ﳎﻤﻮﻋﺔ ﻭﺍﺣﺪﺓ‪ ،‬ﻭﺗﻨﻘﺴﻢ ﺇﱃ‪:‬‬

‫ﺍﻻﻧﺘﻘﺎﺀ ‪:(σ) Selection‬‬

‫ﻭﺗﻌﲏ ﺍﻧﺘﻘﺎﺀ ﺑﻌﺾ ﺍﻟﻌﻨﺎﺻﺮ‪/‬ﺍﻷﺳﻄﺮ ‪ Rows‬ﻣﻦ ﳎﻤﻮﻋﺔ ﻣﻌﻴﻨﺔ‪ ،‬ﻣﺜﻼ ﻟﻮ ﻋﻨﺪﻧﺎ ﺟﺪﻭﻝ‬
‫ﺍﻟﻌﻤﺎﻝ ﺍﻟﺘﺎﱄ‪:‬‬

‫‪ID‬‬ ‫‪Name‬‬ ‫‪Function‬‬ ‫‪City‬‬


‫‪1‬‬ ‫‪Younes MAADANE‬‬ ‫‪Developper‬‬ ‫‪CasaBlanca‬‬
‫‪2‬‬ ‫‪Ismaîl WAHBI‬‬ ‫‪Conceptor‬‬ ‫‪CasaBlanca‬‬
‫‪3‬‬ ‫‪Reda Hamdi‬‬ ‫‪Designer‬‬ ‫‪Rabat‬‬
‫‪4‬‬ ‫‪Hamid MAKBOUL‬‬ ‫‪Director‬‬ ‫‪CasaBlanca‬‬
‫‪5‬‬ ‫‪Mohammed ELKHAL‬‬ ‫‪Web MASTER‬‬ ‫‪Agadir‬‬

‫‪33‬‬
:‫ ﻣﺜﻼ‬،‫ﻤﻮﻋﺔ‬‫ﺍﻻﻧﺘﻘﺎﺀ ﰲ ﻫﺬﻩ ﺍﳊﺎﻟﺔ ﻳﻌﲏ ﺍﻻﺳﺘﻌﻼﻡ ﻋﻦ ﺑﻌﺾ ﺍﻟﻌﻤﺎﻝ ﺍﳌﻮﺟﻮﺩﻳﻦ ﺿﻤﻦ ﺍ‬

:CasaBlanca ‫ﺍﻧﺘﻘﺎﺀ ﺍﻟﻌﻤﺎﻝ ﺍﻟﺬﻳﻦ ﻳﺴﻜﻨﻮﻥ ﰲ ﻣﺪﻳﻨﺔ ﺍﻟﺪﺍﺭ ﺍﻟﺒﻴﻀﺎﺀ‬

ID Name Function City


1 Younes MAADANE Developper CasaBlanca
2 Ismaîl WAHBI Conceptor CasaBlanca
4 Hamid MAKBOUL Director CasaBlanca

:Developper ‫ﺍﻧﺘﻘﺎﺀ ﺍﻟﻌﻤﺎﻝ ﺍﻟﺬﻳﻦ ﻋﻨﺪﻫﻢ ﺻﻔﺔ ﻣﱪﻣﺞ‬

ID Name Function City


1 Younes MAADANE Developper CasaBlanca

:(π) Projection ‫ﺍﻻﺳﻘﺎﻁ‬

‫ ﻭﻟﻴﺲ‬Columns ‫ﺍﻟﻔﺮﻕ ﺑﻴﻨﻪ ﻭﺑﲔ ﺍﻻﻧﺘﻘﺎﺀ ﻫﻮ ﻛﻮﻥ ﺍﻻﺳﻘﺎﻁ ﻳﻜﻮﻥ ﺑﻐﺮﺽ ﺍﻧﺘﻘﺎﺀ ﺍﻷﻋﻤﺪﺓ‬
:‫ ﻓﻤﺜﻼ ﻟﻮ ﻋﻨﺪﻧﺎ ﻧﻔﺲ ﺍﳉﺪﻭ ﻝ ﺍﻟﺴﺎﺑﻖ‬،‫ﺍﻷﺳﻄﺮ‬

ID Name Function City


1 Younes MAADANE Developper CasaBlanca
2 Ismaîl WAHBI Conceptor CasaBlanca
3 Reda Hamdi Designer Rabat
4 Hamid MAKBOUL Director CasaBlanca
5 Mohammed ELKHAL Web MASTER Agadir
:‫ ﻣﺜﻼ‬،‫ﻓﺈﻥ ﺍﻻﺳﻘﺎﻁ ﻳﻌﲏ ﲢﺪﻳﺪ ﺑﻌﺾ ﺍﳊﻘﻮﻝ ﻓﻘﻂ ﰲ ﻋﻤﻠﻴﺔ ﺟﻠﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ‬

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‬‬

‫‪1‬‬ ‫‪10‬‬ ‫‪1‬‬ ‫‪10‬‬


‫‪2‬‬ ‫‪11‬‬ ‫‪2‬‬ ‫‪10‬‬
‫‪3‬‬
‫‪3‬‬ ‫‪10‬‬
‫‪1‬‬ ‫‪11‬‬
‫‪2‬‬ ‫‪11‬‬
‫‪3‬‬ ‫‪11‬‬

‫ﺍﻟﻘﺴﻤﺔ ‪:(÷) Division‬‬

‫ﻭﻳﻌﲏ ﻗﺴﻤﺔ ﺟﺪﻭﻝ ﻋﻠﻰ ﺟﺪﻭﻝ ﺁﺧﺮ‪ ،‬ﺑﺸﺮﻁ ﺃﻥ ﺗﻜﻮﻥ ﺣﻘﻮﻝ ﺍﳉﺪﻭﻝ ﺍﻟﺜﺎﱐ ﻣﺘﻮﺍﺟﺪﺓ ﰲ‬
‫ﺍﳉﺪﻭﻝ ﺍﻷﻭﻝ‪ ،‬ﻛﻤﺎ ﻳﺮﻣﺰ ﻟﻪ ﰲ ﺍﻟﺮﻳﺎﺿﻴﺎﺕ ÷‪ ،‬ﻭﺗﺰﻥ ﺍﻟﻨﺘﻴﺠﺔ ﻋﺒﺎﺭﺓ ﻋﻦ ﺟﺪﻭﻝ ﻳﻀﻢ‬
‫ﻋﻨﺎﺻﺮ ﺍﳉﺪﻭﻝ ﺍﻷﻭﻝ ﺍﻟﱵ ﺗﻀﻢ ﻛﻞ ﻋﻨﺎﺻﺮ ﺍﳉﺪﻭﻝ ﺍﻟﺜﺎﱐ‪ ،‬ﻭﺻﻴﻐﺘﻬﺎ ﺍﻟﺮﻳﺎﺿﻴﺔ ﻫﻜﺬﺍ‬
‫‪R3=R1÷R2‬‬

‫ﻧﻔﺘﺮﺽ ﻣﺜﻼ ﺃﻥ ﻋﻨﺪﻱ ﺟﺪﻭﻻﻥ‪ ،‬ﺍﻷﻭﻝ ﻳﻀﻢ ﻗﺎﺋﻤﺔ ﻟﻠﻤﻤﺜﻠﲔ ﻭﺍﻷﻓﻼﻡ ﺍﻟﱵ ﺷﺎﺭﻛﻮﺍ ﻓﻴﻬﺎ‪،‬‬
‫ﻭﺍﻟﺜﺎﱐ ﻳﻀﻢ ﻗﺎﺋﻤﺔ ﻟﻸﻓﻼﻡ ﺍﻟﺴﻴﻨﻤﺎﺋﻴﺔ‪:‬‬

‫‪36‬‬
R1 R2

Actor_Name Film Film


Franck Richard Sun & Moon Sun & Moon
José Melany Like a boss Like a boss
Franck Richard Like a boss
Michel Ravaud Sun & Moon
Katherine elise Like a boss
José Melany Sun & Moon

‫ﻛﻴﻒ ﻧﺴﺘﻄﻴﻊ ﺟﻠﺐ ﺃﲰﺎﺀ ﺍﳌﻤﺜﻠﲔ ﺍﻟﺬﻳﻦ ﺷﺎﺭﻛﻮﺍ ﰲ ﻛﻞ ﺍﻷﻓﻼﻡ؟‬

‫ ﻭﻧﺘﻴﺠﺔ‬R2 ‫ ﻋﻠﻰ ﺍﳉﺪﻭﻝ ﺍﻟﺜﺎﱐ‬R1 ‫ﻟﻠﺠﻮﺍﺏ ﻋﻠﻰ ﻫﺬﺍ ﺍﻟﺴﺆﺍﻝ ﺳﻨﻘﻮﻡ ﺑﻘﺴﻤﺔ ﺍﳉﺪﻭﻝ ﺍﻷﻭﻝ‬
:‫ ﺃﻱ ﻫﻜﺬﺍ‬،‫ﺍﻟﻘﺴﻤﺔ ﺳﺘﻀﻢ ﻓﻘﻂ ﺍﳌﻤﺜﻠﲔ ﺍﻟﺬﻳﻦ ﺷﺎﺭﻛﻮﺍ ﰲ ﻛﻞ ﺍﻷﻓﻼﻡ‬

R1÷R2

Actor_Name
Franck Richard
José Melany

37
‫(‪:‬‬ ‫ﺍﻟﺮﺑﻂ ‪) Join‬‬

‫ﻭﻫﻮ ﻣﻦ ﺃﺑﺮﺯ ﺍﳌﻔﺎﻫﻴﻢ ﺍﻟﱵ ﺳﻨﺮﺍﻫﺎ ﺇﻥ ﺷﺎﺀ ﺍﷲ ﻣﻊ ﻟﻐﺔ ‪ SQL‬ﻭﻳﻘﺘﻀﻲ ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ‬
‫ﺍﻟﻌﻤﻠﻴﺎﺕ ﺟﺪﻭﻟﲔ ﳍﻤﺎ ﺣﻘﻞ ﻣﺸﺘﺮﻙ ﻣﻦ ﻧﻔﺲ ﺍﻟﻨﻮﻉ‪ ،‬ﻭﻳﺴﺘﻌﻤﻞ ﺍﻟﺮﺑﻂ ﺑﻐﺮﺽ ﺍﻟﺒﺤﺚ ﻋﻦ‬
‫ﺍﻟﻌﻨﺎﺻﺮ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺍﳉﺪﻭﻟﲔ ﻣﻦ ﺧﻼﻝ ﲢﻘﻖ ﺷﺮﻁ ﻭﺟﻮﺩ ﺍﳊﻘﻞ ﺍﳌﺸﺘﺮﻙ ﺑﻨﻔﺲ ﺍﻟﻘﻴﻤﺔ‬
‫ﰲ ﺍﳉﺪﻭﻟﲔ‪ ،‬ﻭﻳﺮﻣﺰ ﻟﻪ ﺭﻳﺎﺿﻴﺎ ﺑﺎﻟﺮﻣﺰ ﺍﻟﺘﺎﱄ‬

‫ﻟﻨﺘﺄﻣﻞ ﺍﳌﺜﺎﻝ ﺍﻵﰐ‪:‬‬

‫‪R1‬‬ ‫‪R2‬‬

‫‪ID_Country‬‬ ‫‪Country‬‬ ‫‪ID_Citizen‬‬ ‫‪Citizen‬‬ ‫‪ID_Country‬‬


‫‪1‬‬ ‫‪Egypt‬‬ ‫‪C1‬‬ ‫‪Hamdi‬‬ ‫‪1‬‬
‫‪2‬‬ ‫‪Morocco‬‬ ‫‪C2‬‬ ‫‪Khalid‬‬ ‫‪3‬‬
‫‪3‬‬ ‫‪Algeria‬‬ ‫‪C3‬‬ ‫‪Saîd‬‬ ‫‪2‬‬

‫ﳝﻜﻨﻨﺎ ﻣﻦ ﺧﻼﻝ ﻋﻤﻠﻴﺔ ﺍﻟﺮﺑﻂ ﺃﻥ ﳒﻠﺐ ﺍﳌﻮﺍﻃﻨﲔ ﻭﺍﻟﺪﻭﻝ ﻣﺎﺩﺍﻡ ﺭﻗﻢ ﺍﻟﺪﻭﻟﺔ ﰲ ﺍ‪‬ﻤﻮﻋﺔ‬
‫ﺍﻷﻭﱃ ﻳﺘﻮﺍﻓﻖ ﻣﻊ ﺭﻗﻢ ﺍﻟﺪﻭﻟﺔ ﰲ ﺍ‪‬ﻤﻮﻋﺔ ﺍﻟﺜﺎﻧﻴﺔ‪ ،‬ﻫﻜﺬﺍ‪:‬‬

‫‪SELECT Country, Citizen‬‬


‫‪FROM R1, R2‬‬
‫‪WHERE R1.Country_id=R2.Country_id‬‬

‫‪38‬‬
‫ﻧﻘﻮﻡ ﲜﻠﺐ ﺍﺳﻢ ﺍﳌﻮﺍﻃﻦ ﻣﻦ ﺟﺪﻭﻝ ﺍﳌﻮﺍﻃﻨﲔ‪ ،‬ﻭﳒﻠﺐ ﺍﺳﻢ ﺍﻟﻮﻃﻦ ﻣﻦ ﺟﺪﻭﻝ ﺍﻷﻭﻃﺎﻥ‪،‬‬
‫ﺑﺸﺮﻁ ﺃﻥ ﺗﺘﻮﺍﻓﻖ ﻗﻴﻤﺔ ﺍﳊﻘﻞ ﺍﳌﺸﺘﺮﻙ ﺑﲔ ﺍ‪‬ﻤﻮﻋﺘﲔ‪ ،‬ﺇﻥ ﺍﺳﺘﻮﻋﺒﺖ ﻫﺬﺍ ﻓﻘﺪ ﻣﺮﺭﺕ ﻟﻚ‬
‫ﺟﺰﺀ ﻏﲑ ﻳﺴﲑ ﻣﻦ ‪ SQL‬ﻭﺃﻧﺖ ﻻ ﺗﺸﻌﺮ‬

‫ﺧﻼﺻﺔ ﺍﳉﱪ ﺍﻟﻌﻼﺋﻘﻲ‪:‬‬


‫ﳑﺎ ﺳﺒﻖ ﻧﺴﺘﻨﺘﺞ ﺑﺄﻥ ﺍﳉﱪ ﺍﻟﻌﻼﺋﻘﻲ ﻫﻮ ﻭﺳﻴﻠﺔ ﳌﺨﺎﻃﺒﺔ ﺍﳉﺪﺍﻭﻝ ‪ /‬ﺍ‪‬ﻤﻮﻋﺎﺕ‪ ،‬ﺑﻐﻴﺔ ﺟﻠﺐ‬
‫ﺑﻌﺾ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺑﻄﺮﻕ ﻣﺘﻌﺪﺩﺓ‪ ،‬ﻭﳝﻜﻨﻨﺎ ﺍﺧﺘﺼﺎﺭ ﻣﺎ ﻣﻀﻰ ﰲ ﺍﳋﻄﺎﻃﺔ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫ﻧﺴﺘﻌﻤﻞ ﺍﳉﱪ ﺍﻟﻌﻼﺋﻘﻲ ﻟﺘﻜﻮﻳﻦ‬


‫ﲨﻠﺔ ﲤﻜﻨﻨﺎ ﻣﻦ ﺍﻻﺳﺘﻌﻼﻡ ﻋﻦ‬
‫‪:‬‬ ‫ﺑﻌﺾ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ‬

‫ﺟﺪﻭﻝ ﺃﻭ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﳉﺪﺍﻭﻝ‬

‫ﻓﻨﺤﺼﻞ ﻋﻠﻰ‬

‫ﻧﺘﻴﺠﺔ ﻋﻠﻰ ﺷﻜﻞ ﺟﺪﻭﻝ ﺟﺪﻳﺪ‬

‫ﰲ ﺍﻟﻔﺼﻞ ﺍﻟﺮﺍﺑﻊ ﺇﻥ ﺷﺎﺀ ﺍﷲ ﺳﻮﻑ ﻧﺮﻯ ﻛﻴﻒ ﳓﻮﻝ ﻫﺎﺗﻪ ﺍﳌﻔﺎﻫﻴﻢ ﺍﻟﺮﻳﺎﺿﻴﺔ ﺇﱃ ﺗﻘﻨﻴﺎﺕ‬
‫ﻋﻤﻠﻴﺔ ﳉﻠﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ‪.‬‬

‫‪39‬‬
 

‫ﻣﺪﺧﻞ ﺇﱃ ﻟﻐﺔ‬
SQL

40
‫ﻣﺪﺧﻞ ﺇﱃ ﻟﻐﺔ ‪:SQL‬‬

‫ﺗﻌﺮﻳﻒ‪:‬‬
‫ﻛﻠﻤﺔ ‪ SQL‬ﻫﻲ ﺍﺧﺘﺼﺎﺭ ﻝ ‪ ،Structured Query Language‬ﻭﺗﻌﲏ ﻟﻐﺔ ﺍﻻﺳﺘﻌﻼﻣﺎﺕ‬
‫ﺍﳌﺮﺗﺒﺔ‪ ،‬ﻭﺗﺴﺘﻌﻤﻞ ﻣﻦ ﺃﺟﻞ ﺇﺟﺮﺍﺀ ﻋﻤﻠﻴﺎﺕ ﻋﻠﻰ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‪.‬‬

‫ﺣﱴ ﻧﺴﺘﻮﻋﺐ ﻫﺬﺍ ﺍﳌﻌﲎ ﺑﺼﻔﺔ ﺩﻗﻴﻘﺔ‪ ،‬ﻓﻠﻐﺔ ‪ SQL‬ﻫﻲ ﺍﻟﺘﻌﺒﲑ ﺍﻟﱪﳎﻲ ﻟﻠﺠﱪ ﺍﻟﻌﻼﺋﻘﻲ‬
‫ﺍﻟﺬﻱ ﺭﺃﻳﻨﺎﻩ ﰲ ﻣﺴﺘﻬﻞ ﺍﻟﻜﺘﺎﺏ‪ ،‬ﻇﻬﺮﺕ ﻫﺬﻩ ﺍﻟﻠﻐﺔ ﺳﻨﺔ ‪ ،1974‬ﰒ ﺑﻌﺪ ﺫﻟﻚ ﰲ ﺳﻨﺔ ‪ 1986‬ﰎ‬
‫ﺍﻋﺘﻤﺎﺩﻫﺎ ﻣﻦ ﻃﺮﻑ )‪ ،(ANSI‬ﻭﰲ ﺳﻨﺔ ‪ 1987‬ﰎ ﺍﻋﺘﻤﺎﺩﻫﺎ ﻣﻦ ﻗﺒﻞ ‪ ISO‬ﻟﺘﺼﺒﺢ ﺑﺬﻟﻚ ﺍﻟﻠﻐﺔ‬
‫‪.RDBMS‬‬ ‫ﺍﻷﻛﺜﺮ ﺷﻴﻮﻋﺎ ﰲ ﺃﻧﻈﻤﺔ ﺇﺩﺍﺭﺓ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﻌﻼﺋﻘﻴﺔ‬

‫ﺑﺎﻟﻨﺴﺒﺔ ﻟﱪﻧﺎﻣﺞ ‪ Microsoft SQL Server‬ﻓﻬﻮ ﻳﺴﺘﻌﻤﻞ ﻧﺴﺨﺔ ﻣﺘﻄﻮﺭﺓ ﻣﻦ ‪ ،SQL‬ﺗﺴﻤﻰ‬


‫‪ Transact SQL‬ﻭﺗﻜﺘﺐ ﺍﺧﺘﺼﺎﺭﺍ ‪ T-SQL‬ﻭﻫﻲ ﺗﻀﻢ ﺍﳌﻬﺎﻡ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫ﻣﻬﺎﻡ ﻟﻐﺔ ‪:T-SQL‬‬


‫ﻟﻐﺔ ﻟﺘﻌﺮﻳﻒ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ :DDL‬ﻭﻫﻲ ﺍﺧﺘﺼﺎﺭ ﻝ ‪،Data Definition Language‬‬
‫ﺃﻱ ﺃ‪‬ﺎ ﺗﺘﻴﺢ ﻟﻨﺎ ﺇﻧﺸﺎﺀ ﻭﺗﻌﺪﻳﻞ ﻭﺣﺬﻑ ﺍﻟﻜﺎﺋﻨﺎﺕ )ﻗﻮﺍﻋﺪ ﺑﻴﺎﻧﺎﺕ ‪،Databases‬‬
‫ﺟﺪﺍﻭﻝ ‪ ،Tables‬ﺍﳌﺸﺎﻫﺪ ‪ ،Views‬ﺍﻟﻔﻬﺎﺭﺱ ‪ ،Indexes‬ﺇﺟﺮﺍﺀﺍﺕ ﳐﺰﻧﺔ ‪Stored‬‬

‫‪ ،Procedures‬ﻗﻮﺍﺩﺡ ‪ (...،Triggers‬ﻛﻴﻔﻤﺎ ﻧﺸﺎﺀ ﰲ ﻗﺎﻋﺪﺓ ﺑﻴﺎﻧﺎﺕ ﻋﻼﺋﻘﻴﺔ‪.‬‬

‫‪41‬‬
‫‪Data Manipulation‬‬ ‫ﻟﻐﺔ ﳌﻌﺎﳉﺔ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ :DML‬ﻭﻫﻲ ﺍﺧﺘﺼﺎﺭ ﻝ‬
‫‪ ،Language‬ﺃﻱ ﺃ‪‬ﺎ ﲤﻜﻨﻨﺎ ﻣﻦ ﺍﻧﺘﻘﺎﺀ ‪ Select‬ﻭﺇﺿﺎﻓﺔ ‪ Add‬ﻭﲢﺪﻳﺚ ‪Update‬‬

‫ﻭﺣﺬﻑ ‪ Delete‬ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﻗﺎﻋﺪﺓ ﺑﻴﺎﻧﺎﺕ ﻋﻼﺋﻘﻴﺔ‪.‬‬


‫ﻟﻐﺔ ﻟﻠﺘﺤﻜﻢ ﰲ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ :DCL‬ﻭﻫﻲ ﺍﺧﺘﺼﺎﺭ ﻝ ‪ ،Data Control Language‬ﺃﻱ‬
‫ﺃ‪‬ﺎ ﲤﻜﻨﻨﺎ ﻣﻦ ﺍﻟﺘﺤﻜﻢ ﰲ ﻣﺴﺘﺨﺪﻣﻲ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻋﱪ ﲢﺪﻳﺪ ﺍﻟﺼﻼﺣﻴﺎﺕ‪.‬‬

‫ﻟﻐﺔ ‪ T-SQL‬ﻟﻴﺴﺖ ﻟﻐﺔ ﻟﻼﺳﺘﻌﻼﻡ ﻓﺤﺴﺐ‪ ،‬ﺑﻞ ﺃﻳﻀﺎ ﻟﻐﺔ ﺑﺮﳎﻴﺔ ﻛﻤﺎ ﺳﻴﺄﰐ ﻣﻌﻨﺎ ﰲ ﺍﻟﻔﺼﻞ‬
‫ﺍﳋﺎﻣﺲ ﺇﻥ ﺷﺎﺀ ﺍﷲ‪.‬‬

‫‪42‬‬
‫ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‬

‫ﺇﻧﺸﺎﺀ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ‪:‬‬


‫ﻹﻧﺸﺎﺀ ﻗﺎﻋﺪﺓ ﺑﻴﺎﻧﺎﺕ ﺑﻠﻐﺔ ‪ ،SQL‬ﻓﺎﻟﺼﻴﻐﺔ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬

‫; ‪CREATE DATABASE MyDatabase‬‬

‫ﲝﻴﺚ ‪ MyDatabase‬ﻫﻮ ﺍﺳﻢ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﱵ ﻧﺮﻳﺪ ﺇﻧﺸﺎﺀﻫﺎ‪.‬‬

‫ﺻﻮﺭﺓ ﻟﻮﺍﺟﻬﺔ ﺑﺮﻧﺎﻣﺞ ‪Microsoft SQL Server‬‬

‫‪43‬‬
‫ﻭﺍﻵﻥ ﺳﻨﻌﺮﺽ ﺃﻫﻢ ﺍﻟﻘﻮﺍﺋﻢ ﰲ ﻫﺬﻩ ﺍﻟﻮﺍﺟﻬﺔ‪ ،‬ﻭﺳﺄﺗﺮﺟﻢ ﻛﻞ ﻛﻠﻤﺔ ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﺇﱃ‬
‫ﺍﻻﳒﻠﻴﺰﻱ‪ ،‬ﻷﻥ ﺃﻏﻠﺐ ﺍﻹﺧﻮﺓ ﻳﺘﻮﻓﺮﻭﻥ ﻋﻠﻰ ﻧﺴﺨﺔ ‪ MS SQL Server‬ﺑﺎﻹﳒﻠﻴﺰﻱ‪.‬‬

‫ﺍﳌﻨﻄﻘﺔ ﺍﶈﺎﻃﺔ ﺑﺎﻷﺯﺭﻕ ﻭﺍﻟﱵ ﰲ ﺍﻟﻨﺴﺨﺔ ﺍﻻﳒﻠﻴﺰﻳﺔ ﺍﲰﻬﺎ ‪ ،New Query‬ﲤﻜﻨﻨﺎ ﻣﻦ ﻓﺘﺢ‬
‫ﺻﻔﺤﺔ ﺟﺪﻳﺪﺓ ﻟﻜﺘﺎﺑﺔ ﺃﻭﺍﻣﺮ ‪.T-SQL‬‬

‫ﺍﳌﻨﻄﻘﺔ ﺍﶈﺎﻃﺔ ﺑﺎﻷﺧﻀﺮ ﺍﲰﻬﺎ ‪ ،Execute‬ﻭﻫﻲ ﺧﺎﺻﺔ ﺑﺘﻨﻔﻴﺬ ﺃﻭﺍﻣﺮ ‪ SQL‬ﺍﳌﻜﺘﻮﺑﺔ ﰲ‬


‫ﺍﶈﺮﺭ‪ ،‬ﺑﺈﻣﻜﺎﻧﻚ ﺍﻟﻀﻐﻂ ﻋﻠﻴﻬﺎ ﺃﻭ ﻋﻠﻰ ﺍﻟﺰﺭ ‪.F5‬‬

‫ﺍﳌﻨﻄﻘﺔ ﺍﶈﺎﻃﺔ ﺑﺎﻟﻠﻮﻥ ﺍﻟﺒﲏ ﺗﻀﻢ ﻣﺴﺘﻌﺮﺽ ﺍﻟﻜﺎﺋﻨﺎﺕ ‪ ،Object Explorer‬ﺍﻟﺬﻱ ﳝﻜﻨﻨﺎ ﻣﻦ‬
‫ﺇﻧﺸﺎﺀ ﺍﻟﻜﺎﺋﻨﺎﺕ ﻋﻠﻰ ﻣﺴﺘﻮﻯ ﺍﳋﺎﺩﻡ ‪ ،Server‬ﻗﻮﺍﻋﺪ ﺑﻴﺎﻧﺎﺕ‪ ،‬ﺟﺪﺍﻭﻝ‪ ... ،‬ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ‬
‫ﻋﻤﻠﻴﺎﺕ ﺍﳊﻤﺎﻳﺔ ‪ Security‬ﻭﺇﺩﺍﺭﺓ ﺍﳌﺴﺘﺨﺪﻣﲔ ‪ Users‬ﻭﺍﻹﺗﺼﺎﻻﺕ ‪.Connctions‬‬

‫ﺑﺈﻣﻜﺎﻧﻨﺎ ﺃﻳﻀﺎ ﺇﻧﺸﺎﺀ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻳﺪﻭﻳﺎ ﻋﱪ ﺍﳌﻌﺎﰿ‪ ،‬ﻣﻦ ﻏﲑ ﺣﺎﺟﺔ ﺇﱃ ﻛﺘﺎﺑﺔ ﺍﻷﻣﺮ‬
‫‪.CREATE DATABASE‬‬

‫‪44‬‬
‫ﺣﺬﻑ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‪:‬‬
‫ﳊﺬﻑ ﻗﺎﻋﺪﺓ ﺑﻴﺎﻧﺎﺕ ﺑﻮﺍﺳﻄﺔ ﺃﻭﺍﻣﺮ ‪ ،SQL‬ﻧﻜﺘﺐ‪:‬‬
‫; ‪DROP DATABASE MyDatabase‬‬

‫‪Tables‬‬ ‫ﺍﳉﺪﺍﻭﻝ‬
‫ﺍﳉﺪﺍﻭﻝ ﻋﺒﺎﺭﺓ ﻋﻦ ﻭﺣﺪﺍﺕ ﻟﺘﺨﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻋﻠﻰ ﺷﻜﻞ ﻣﺼﻔﻮﻓﺔ ﺛﻨﺎﺋﻴﺔ ﺍﻷﺑﻌﺎﺩ )ﺗﺘﻜﻮﻥ ﻣﻦ‬
‫ﺃﺳﻄﺮ ‪ Rows‬ﻭﺃﻋﻤﺪﺓ ‪.(Columns‬‬

‫ﻗﻮﺍﻋﺪ ﺣﻮﻝ ﺍﻟﺘﺴﻤﻴﺔ‪:‬‬


‫ﻋﻨﺪ ﺇﻧﺸﺎﺀ ﺟﺪﻭﻝ‪ ،‬ﻳﻠﺰﻡ ﻋﻤﻮﻣﺎ ﺍﺣﺘﺮﺍﻡ ﻣﺎﻳﻠﻲ‪:‬‬

‫‪ ‬ﺃﻥ ﻻ ﻳﻜﻮﻥ ﺍﺳﻢ ﺍﳉﺪﻭﻝ ﻛﻠﻤﺔ ﳏﺠﻮﺯﺓ ﰲ ﻟﻐﺔ ‪.SQL‬‬


‫‪ ‬ﺃﻥ ﻻ ﻳﺒﺘﺪﺉ ﺑﺮﻗﻢ ﺃﻭ ﺑﺮﻣﺰ ﻣﺎﻋﺪﺍ ﺑﻌﺾ ﺍﻟﺮﻣﻮﺯ ﻟﻦ ﻧﻮﺭﺩﻫﺎ ﻷ‪‬ﺎ ﻟﻴﺴﺖ ﻣﻮﺣﺪﺓ ﺑﲔ‬
‫ﺍﻟﱪﺍﻣﺞ‪ ،‬ﻓﻤﺜﻼ ﺑﺮﻧﺎﻣﺞ ‪ ORACLE‬ﻳﺴﻤﺢ ﺑﺄﻥ ﻳﺒﺪﺃ ﺍﺳﻢ ﺍﳉﺪﻭﻝ ﺑﺎﻟﺮﻣﺰ ‪ ،$‬ﰲ ﺣﲔ ﻻ‬
‫ﻳﺴﻤﺢ ﺑﺮﻧﺎﻣﺞ ‪ SQL Server‬ﺑﺬﻟﻚ‪.‬‬

‫‪45‬‬
‫ﺇﻧﺸﺎﺀ ﺍﳉﺪﺍﻭﻝ‪:‬‬
‫ﻹﻧﺸﺎﺀ ﺟﺪﻭﻝ ﺑﻮﺍﺳﻄﺔ ﺃﻭﺍﻣﺮ ‪ SQL‬ﻓﺎﻟﺼﻴﻐﺔ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬
‫( ‪CREATE TABLE MyTable‬‬
‫‪ID INT,‬‬
‫‪FullName VARCHAR(50),‬‬
‫)‪BirthDate DATETIME‬‬

‫ﺍﻷﻣﺮ ﺃﻋﻼﻩ ﻳﻘﻮﻡ ﺑﺈﻧﺸﺎﺀ ﺟﺪﻭﻝ ﺍﲰﻪ ‪ MyTable‬ﻭﻳﺘﻜﻮﻥ ﻣﻦ ﺣﻘﻮﻝ ﺛﻼﺛﺔ‪ ،‬ﺍﻷﻭﻝ ﻧﻮﻋﻪ‬
‫ﺭﻗﻤﻲ‪ ،‬ﺍﻟﺜﺎﱐ ﻧﻮﻋﻪ ﻧﺼﻲ ﻳﺘﺴﻊ ﻝ ‪ 50‬ﺣﺮﻑ‪ ،‬ﻭﺍﻷﺧﲑ ﻣﻦ ﻧﻮﻉ ﺍﻟﺘﺎﺭﻳﺦ ‪.DataTime‬‬

‫ﺣﺬﻑ ﺍﳉﺪﺍﻭﻝ‪:‬‬
‫ﳊﺬﻑ ﺟﺪﻭﻝ ﻧﻘﻮﻡ ﺑﻜﺘﺎﺑﺔ ﺍﻷﻣﺮ ﺍﻟﺘﺎﱄ‪:‬‬
‫;‪DROP TABLE MyTable‬‬

‫ﲝﻴﺚ ‪ MyTable‬ﻫﻮ ﺍﺳﻢ ﺍﳉﺪﻭﻝ ﺍﳌﺮﺍﺩ ﺣﺬﻓﻪ‪.‬‬

‫ﺗﻌﺪﻳﻞ ﺍﳉﺪﺍﻭﻝ‪:‬‬
‫ﻹﺿﺎﻓﺔ ﺑﻌﺾ ﺍﳊﻘﻮﻝ ﺇﱃ ﺟﺪﻭﻝ ﻣﺎ ﻓﺎﻟﺼﻴﻐﺔ ﺩﺍﺋﻤﺎ ﻫﻜﺬﺍ‪:‬‬
‫;‪ALTER TABLE MyTable ADD Age int‬‬

‫ﻫﺬﺍ ﺇﺫﺍ ﺃﺭﺩﻧﺎ ﺇﺿﺎﻓﺔ ﺣﻘﻞ ﻭﺍﺣﺪ ﻟﻠﺠﺪﻭﻝ ﻋﻦ ﻃﺮﻳﻖ ﺃﻭﺍﻣﺮ ‪ ،SQL‬ﻓﻘﻂ ﻧﻜﺘﺐ ﺑﻌﺪ ﺍﻟﻜﻠﻤﺔ‬
‫‪ ADD‬ﺍﺳﻢ ﺍﳊﻘﻞ ﻭﻧﻮﻋﻪ ﻟﺘﺘﻢ ﺇﺿﺎﻓﺘﻪ ﺇﱃ ﺍﳉﺪﻭﻝ ﺑﻌﺪ ﺗﻨﻔﻴﺬ ﺍﻷﻣﺮ‪.‬‬
‫‪46‬‬
‫ﺃﻣﺎ ﺇﺫﺍ ﺃﺭﺩﻧﺎ ﺇﺿﺎﻓﺔ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﳊﻘﻮﻝ ﺩﻓﻌﺔ ﻭﺍﺣﺪﺓ‪ ،‬ﻧﻔﺼﻞ ﺑﻴﻨﻬﺎ ﺑﻔﺎﺻﻠﺔ ﻫﻜﺬﺍ‪:‬‬

‫;)‪ALTER TABLE MyTable ADD Age int, Address VARCHAR(250‬‬

‫ﺃﻧﻮﺍﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ‪:‬‬
‫ﻛﻞ ﺣﻘﻞ ﻣﻦ ﺣﻘﻮﻝ ﺃﻱ ﺟﺪﻭﻝ ﻟﻪ ﺑﺎﻟﻀﺮﻭﺭﺓ ﻧﻮﻉ ﻣﻌﲔ ﻣﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ‪ ،‬ﺣﺴﺐ ﺍﻟﻘﻴﻤﺔ ﺍﳌﺮﺍﺩ‬
‫ﲣﺰﻳﻨﻬﺎ ﻓﻴﻪ‪ ،‬ﻭﺗﻨﻘﺴﻢ ﺃﻧﻮﺍﻉ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺇﲨﺎﻻ ﺇﱃ‪:‬‬

‫ﺍﻷﻧﻮﺍﻉ ﺍﻟﺮﻗﻤﻴﺔ‪:‬‬
‫ﻭﺗﺴﺘﻌﻤﻞ ﻟﺘﺨﺰﻳﻦ ﺍﻟﻘﻴﻢ ﺍﻟﺮﻗﻤﻴﺔ‪ ،‬ﻣﺜﻼ ﻟﻮ ﻋﻨﺪﻧﺎ ﺣﻘﻞ ﺍﻟﻌﻤﺮ ‪ Age‬ﰲ ﺇﺣﺪﻯ ﺍﳉﺪﺍﻭﻝ‪،‬‬
‫ﻓﺤﺘﻤﺎ ﻋﻠﻴﻨﺎ ﺍﺧﺘﻴﺎﺭ ﻧﻮﻉ ﺭﻗﻤﻲ ﻟﺘﺨﺰﻳﻦ ﻗﻴﻢ ﺍﻷﻋﻤﺎﺭ‪ ،‬ﻭﺍﻷﻧﻮﺍﻉ ﺍﻟﺮﻗﻤﻴﺔ ﺑﺪﻭﺭﻫﺎ ﺗﻨﻘﺴﻢ ﺇﱃ‪:‬‬
‫‪63‬‬ ‫‪63‬‬
‫‪ -2‬ﻭﺑﲔ ‪2 -‬‬ ‫‪ :BIGINT ‬ﻭﻳﺴﺘﻌﻤﻞ ﻟﺘﺨﺰﻳﻦ ﺍﻟﻘﻴﻢ ﺍﻟﺮﻗﻤﻴﺔ ﺍﻟﱵ ﳎﺎﳍﺎ ﳏﺼﻮﺭ ﺑﲔ‬
‫‪ ، 1‬ﻭﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻳﺴﺘﻌﻤﻞ ‪ 8‬ﺑﺎﻳﺘﺎﺕ )‪ (8 Bytes‬ﻟﻠﺘﺨﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ‪.‬‬
‫‪-‬‬ ‫‪ :INT ‬ﻳﺴﺘﻌﻤﻞ ﺃﺭﺑﻊ ﺑﺎﻳﺘﺎﺕ )‪ (4 Bytes‬ﻟﺘﺨﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﳎﺎﻟﻪ ﺍﻟﺮﻳﺎﺿﻲ ﻳﺒﺘﺪﺉ ﻣﻦ‬
‫‪ 231‬ﻭﻳﻨﺘﻬﻲ ﺇﱃ‪231-1‬‬

‫‪ :SMALLINT ‬ﻳﺴﺘﻌﻤﻞ ‪ 2‬ﺑﺎﻳﺖ )‪ (2 Bytes‬ﻟﺘﺨﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﳎﺎﻟﻪ ﺍﻟﺮﻳﺎﺿﻲ ﻳﺒﺘﺪﺉ‬


‫ﻣﻦ ‪ -215‬ﻭﻳﻨﺘﻬﻲ ﺇﱃ‪215-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‬ﺑﺎﻳﺘﺎﺕ‪.‬‬

‫ﺑﻌﺾ ﺍﻷﻧﻮﺍﻉ ﺍﻷﺧﺮﻯ‪:‬‬


‫‪:Binary ‬ﻟﺘﺨﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﺜﻨﺎﺋﻴﺔ ‪.Binary Data‬‬
‫‪ :Image ‬ﻭﻳﺴﺘﻌﻤﻞ ﻟﺘﺨﺰﻳﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﻧﻮﻉ ﺑﺎﻳﺖ‪ ،‬ﻭﺃﻳﻀﺎ ﻟﺘﺨﺰﻳﻦ ﺍﻟﺼﻮﺭ‪.‬‬
‫‪ :Bit ‬ﻳﺴﻤﺢ ﻓﻘﻂ ﺑﺘﺨﺰﻳﻦ ﺍﻟﻘﻴﻤﺘﲔ ‪ 0‬ﻭ ‪ ،1‬ﻭﻫﻮ ﻳﺴﺘﻌﻤﻞ ﻏﺎﻟﺒﺎ ﺣﻴﻨﻤﺎ ﻧﺘﻌﺎﻣﻞ ﻣﻊ ﺑﻴﺎﻧﺎﺕ‬
‫ﻣﻨﻄﻘﻴﺔ ‪.‬‬

‫ﺧﺎﺻﻴﺎﺕ ﺍﻹﺩﺧﺎﻝ ‪: Constraints‬‬


‫ﻭﻫﻲ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻷﻭﺍﻣﺮ ﺍﻟﱵ ﻧﻄﺒﻘﻬﺎ ﻋﻠﻰ ﺍﳊﻘﻮﻝ‪ ،‬ﻣﻦ ﺃﺟﻞ ﺍﻟﺘﺤﻘﻖ ﻣﻦ ﺍﻟﻘﻴﻤﺔ ﺍﳌﺮﺍﺩ‬
‫ﺣﻔﻈﻬﺎ‪ ،‬ﻭﺃﻭﻝ ﻫﺬﻩ ﺍﻟﻜﻠﻤﺎﺕ ﻫﻲ‪:‬‬
‫‪:NOT NULL ‬‬
‫ﻭﺗﺴﺘﻌﻤﻞ ﻫﺬﻩ ﺍﳋﺎﺻﻴﺔ ﳌﻨﻊ ﺗﺮﻙ ﻗﻴﻤﺔ ﺣﻘﻞ ﻣﻌﲔ ﻓﺎﺭﻏﺔ‪ ،‬ﻭﺻﻴﻐﺘﻬﺎ ﻫﻜﺬﺍ‪:‬‬

‫( ‪CREATE TABLE MyTable‬‬


‫‪ID INT NOT NULL,‬‬
‫))‪FullName VARCHAR(60‬‬

‫‪49‬‬
‫ﻭﳝﻜﻨﻨﺎ ﺗﻄﺒﻴﻖ ﺍﳋﺎﺻﻴﺔ ‪ NOT NULL‬ﺣﱴ ﺑﻌﺪ ﺇﻧﺸﺎﺀ ﺍﳉﺪﻭﻝ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬

‫‪--Duting creation of table‬‬


‫( ‪CREATE TABLE MyTanble‬‬
‫‪ID INT NOT NULL,‬‬
‫))‪FullName VARCHAR(60‬‬

‫‪--After creation of table :‬‬

‫‪ALTER TABLE MyTable‬‬


‫‪ALTER COLUMN ID INT NOT NULL‬‬

‫ﻛﻤﺎ ﺗﻼﺣﻆ ﻗﻤﻨﺎ ﺑﺘﺤﺪﻳﺪ ﺍﺳﻢ ﻭﻧﻮﻉ ﺍﳊﻘﻞ ﺍﳌﺮﺍﺩ ﺗﻄﺒﻴﻖ ﺍﳋﺎﺻﻴﺔ ﻋﻠﻴﻪ‪.‬‬

‫‪:IDENTITY ‬‬
‫ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﺍﻟﻜﻠﻤﺎﺕ ﻳﻄﺒﻖ ﻓﻘﻂ ﻋﻠﻰ ﺍﳊﻘﻮﻝ ﺍﻟﱵ ﻳﻜﻮﻥ ﻧﻮﻋﻬﺎ ﺭﻗﻤﻴﺎ ﻣﻦ ﺃﺟﻞ ﺟﻌﻞ‬
‫ﻗﻴﻤﻬﺎ ﺗﺰﺩﺍﺩ ﺗﻠﻘﺎﺋﻴﺎ ﻋﻨﺪ ﺇﺿﺎﻓﺔ ﺃﻱ ﺳﻄﺮ ﺟﺪﻳﺪ‪ ،‬ﻣﺜﻼ ﻟﻮ ﺃﻧﺸﺄﺕ ﺍﳉﺪﻭﻝ ﺍﻟﺘﺎﱄ ﻭﻃﺒﻘﺖ‬
‫ﻫﺬﻩ ﺍﻟﻜﻠﻤﺔ ﻋﻠﻰ ﺍﳊﻘﻞ ‪ ،ID‬ﻓﺴﻮﻑ ﺗﺰﺩﺍﺩ ﻗﻴﻤﺘﻪ ﺗﺼﺎﻋﺪﻳﺎ‪:‬‬

‫( ‪CREATE TABLE MyTable‬‬


‫‪ID INT IDENTITY(1,1),‬‬
‫))‪FullName VARCHAR(60‬‬

‫ﻋﻨﺪ ﺇﺿﺎﻓﺔ ﺃﻱ ﺳﻄﺮ ﺟﺪﻳﺪ‪ ،‬ﺳﺘﻼﺣﻆ ﺑﺄﻥ ﺧﺎﻧﺔ ﺍﳊﻘﻞ ‪ ID‬ﲤﻨﻌﻚ ﻣﻦ ﺍﻟﻜﺘﺎﺑﺔ ﻓﻴﻬﺎ‪ ،‬ﻭﻟﻜﻦ‬
‫ﲟﺠﺮﺩ ﻣﺎ ﺗﺘﺠﺎﻭﺯﻫﺎ ﺗﻘﻮﻡ ﺑﺮﻓﻊ ﻗﻴﻤﺔ ﺍﳊﻘﻞ ﺑﻮﺍﺣﺪ ﺗﻠﻘﺎﺋﻴﺎ‪ ،‬ﻛﻤﺎ ﺗﺒﲔ ﺍﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫‪50‬‬
‫ﺗﺴﺘﻄﻴﻊ ﺗﻐﻴﲑ ﺍﻟﻘﻴﻤﺔ ﺍﻟﱵ ﻳﺒﺪﺃ ﻣﻨﻬﺎ ﺍﳊﻘﻞ‪ ،‬ﻭﺃﻳﻀﺎ ﻣﻌﺎﻣﻞ ﺯﻳﺎﺩﺓ ﺍﻟﻘﻴﻤﺔ ﻫﻜﺬﺍ‪:‬‬

‫( ‪CREATE TABLE MyTable‬‬


‫‪ID INT IDENTITY(2,3),‬‬
‫))‪FullName VARCHAR(60‬‬

‫ﰲ ﻫﺬﺍ ﺍﳌﺜﺎﻝ‪ ،‬ﺳﺘﺒﺪﺃ ﻗﻴﻤﺔ ﺍﳊﻘﻞ ﻣﻦ ﺍﻟﺮﻗﻢ ‪ ،2‬ﻭﻳﻜﻮﻥ ﻣﻌﺎﻣﻞ ﺍﻟﺰﻳﺎﺩﺓ ﻫﻮ ‪ ،3‬ﺃﻱ ﺃﻥ ﺍﻟﻘﻴﻤﺔ‬
‫ﺍﻷﻭﱃ ﺳﺘﻜﻮﻥ ‪ ،2‬ﻭﺍﻟﻘﻴﻤﺔ ﺍﻟﺜﺎﻧﻴﺔ ﺳﺘﻜﻮﻥ ‪ ،5‬ﻭﺍﻟﺜﺎﻟﺜﺔ ﺳﺘﻜﻮﻥ ‪... 8‬ﺇﱁ‪.‬‬

‫‪:PRIMARY KEY ‬‬


‫ﺗﻄﺒﻖ ﻫﺬﻩ ﺍﳋﺎﺻﻴﺔ ﻋﻠﻰ ﺍﳊﻘﻞ ﳉﻌﻞ ﻗﻴﻤﺘﻪ ﻣﺘﻔﺮﺩﺓ‪ ،‬ﻏﲑ ﻗﺎﺑﻠﺔ ﻟﻠﺘﻜﺮﺍﺭ ﻭﻻ ﻳﻨﺒﻐﻲ ﺃﻥ‬
‫ﺗﺘﺮﻙ ﻗﻴﻤﺔ ﺍﳊﻘﻞ ﺍﻟﺬﻱ ﺗﻄﺒﻖ ﻋﻠﻴﻪ ﻫﺬﻩ ﺍﳋﺎﺻﻴﺔ ﻓﺎﺭﻏﺔ ﺃﻱ ﻳﻨﺒﻐﻲ ﺃﻥ ﺗﻜﻮﻥ ‪NOT‬‬

‫‪ ،NULL‬ﻓﻤﺜﻼ ﻟﻮ ﻋﻨﺪﻧﺎ ﺟﺪﻭﻝ ﻳﻀﻢ ﺑﻴﺎﻧﺎﺕ ﺍﳌﻮﺍﻃﻨﲔ‪ ،‬ﻓﻤﻦ ﻏﲑ ﺷﻚ ﻫﻨﺎﻟﻚ ﺣﻘﻞ ﳝﻴﺰ‬
‫ﻛﻞ ﻣﻮﺍﻃﻦ ﻋﻦ ﻏﲑﻩ‪ ،‬ﰲ ﻫﺬﻩ ﺍﳊﺎﻟﺔ ﺍﳊﻘﻞ ﺍﻟﺬﻱ ﺳﻴﻜﻮﻥ ﻣﻔﺘﺎﺣﺎ ﺃﺳﺎﺳﻴﺎ ‪PRIMARY KEY‬‬

‫ﻫﻮ ﺍﳊﻘﻞ ﺍﻟﺬﻱ ﻳﻀﻢ ﺃﺭﻗﺎﻡ ﺑﻄﺎﻗﺎﺕ ﺍﻟﺘﻌﺮﻳﻒ ﺍﻟﻮﻃﻨﻴﺔ‪ ،‬ﻷﻧﻪ ﻣﻦ ﺍﳌﻤﻜﻦ ﺃﻥ ﲡﺪ ﺃﻛﺜﺮ ﻣﻦ‬
‫ﻣﻮﺍﻃﻦ ﳛﻤﻠﻮﻥ ﻧﻔﺲ ﺍﻻﺳﻢ‪ ،‬ﻭﻟﻜﻦ ﻳﺴﺘﺤﻴﻞ ﺃﻥ ﳛﻤﻠﻮﺍ ﻧﻔﺲ ﺭﻗﻢ ﺑﻄﺎﻗﺔ ﺍﻟﺘﻌﺮﻳﻒ‪ ،‬ﻋﻨﺪ‬
‫ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺟﺪﺍﻭﻝ ﻣﺘﺼﻠﺔ ﻓﻴﻤﺎ ﺑﻴﻨﻬﺎ ﻋﻦ ﻃﺮﻳﻖ ﺍﻟﻌﻼﻗﺎﺕ ﻳﺼﺒﺢ ﺇﻟﺰﺍﻣﻴﺎ ﺍﺳﺘﺨﺪﺍﻡ‬
‫ﺍﳌﻔﺎﺗﻴﺢ ﺍﻷﺳﺎﺳﻴﺔ‪.‬‬
‫ﳉﻌﻞ ﺃﺣﺪ ﺍﳊﻘﻮﻝ ﻣﻔﺘﺎﺣﺎ ﺃﺳﺎﺳﻴﺎ‪ ،‬ﻧﻜﺘﺐ ﺍﻟﺼﻴﻐﺔ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫( ‪CREATE TABLE MyTable‬‬


‫‪ID INT PRIMARY KEY,‬‬
‫))‪FullName VARCHAR(60‬‬

‫‪51‬‬
‫ ﺃﺛﻨﺎﺀ ﺗﻄﺒﻴﻘﻬﺎ ﻋﻠﻰ ﺇﺣﺪﻯ ﺍﳊﻘﻮﻝ‬PRIMARY KEY ‫ﻭﻧﺴﺘﻄﻴﻊ ﺗﺴﻤﻴﺔ ﺧﺎﺻﻴﺔ ﺍﻟﺘﺤﻘﻖ‬
:‫ﺑﺎﻟﺼﻴﻐﺔ ﺍﻟﺘﺎﻟﻴﺔ‬
CREATE TABLE MyTable (
ID INT CONSTRAINT PK_MyConstraint PRIMARY KEY,
FullName VARCHAR(60))

‫ ﺏ‬ID ‫ ﺍﳌﻄﺒﻘﺔ ﻋﻠﻰ ﺍﳊﻘﻞ‬PRIMARY KEY ‫ﰲ ﻫﺬﻩ ﺍﳊﺎﻟﺔ ﺃﲰﻴﻨﺎ ﺍﳋﺎﺻﻴﺔ‬


.PK_MyConstraint
ALTER ‫ ﻋﻦ ﻃﺮﻳﻖ ﺍﳋﺎﺻﻴﺔ‬،‫ﻧﺴﺘﻄﻴﻊ ﺃﻳﻀﺎ ﺗﻄﺒﻴﻖ ﻫﺬﻩ ﺍﳋﺎﺻﻴﺔ ﺣﱴ ﺑﻌﺪ ﺇﻧﺸﺎﺀ ﺍﳉﺪﻭﻝ‬

: ‫ ﺃﻱ ﻫﻜﺬﺍ‬،TABLE
--creation of table
CREATE TABLE MyTable (
ID INT NOT NULL,
FullName VARCHAR(60))

--Add primary key constraint :

ALTER TABLE MyTable ADD CONSTRAINT PK_MyConstraint PRIMARY KEY(ID)

:‫ ﺳﺘﺠﺪﻩ ﺑﺎﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ‬Columns ‫ ﻭﺩﺧﻠﺖ ﺇﱃ ﺍﻷﻋﻤﺪﺓ‬،‫ﻟﻮ ﺫﻫﺒﺖ ﺇﱃ ﺍﳉﺪﻭﻝ ﰲ ﺍﻟﻘﺎﺋﻤﺔ‬

.PRIMARY KEY ‫ ﺣﻘﻞ ﺃﺳﺎﺳﻲ‬ID ‫ﺭﻣﺰ ﺍﳌﻔﺘﺎﺡ ﻟﻠﺪﻻﻟﺔ ﻋﻠﻰ ﺃﻥ ﺍﳊﻘﻞ‬

52
‫‪:UNIQUE ‬‬
‫ﺗﺴﺘﻌﻤﻞ ﻫﺬﻩ ﺍﳋﺎﺻﻴﺔ ﳌﻨﻊ ﻗﻴﻤﺔ ﺣﻘﻞ ﻣﻌﲔ ﻣﻦ ﺍﻟﺘﻜﺮﺍﺭ‪ ،‬ﻭﺑﺎﻟﺘﺎﱄ ﻻ ﳝﻜﻦ ﺃﻥ ﻳﻀﻢ‬
‫ﻧﻔﺲ ﺍﳊﻘﻞ ﻗﻴﻤﺔ ﺃﻛﺜﺮ ﻣﻦ ﻣﺮﺓ‪ ،‬ﺍﻟﻔﺮﻕ ﺑﲔ ﺍﳋﺎﺻﻴﺔ ‪ UNIQUE‬ﻭﺑﲔ ﺍﳋﺎﺻﻴﺔ‬
‫‪ ،PRIMARY KEY‬ﺃﻥ ﻫﺬﻩ ﺍﻷﺧﲑﺓ ﻻ ﳝﻜﻦ ﺗﻄﺒﻴﻘﻬﺎ ﻋﻠﻰ ﺍﳊﻘﻮﻝ ﺍﻟﱵ ﺗﺴﻤﺢ ﺑﺎﻟﻘﻴﻢ‬
‫ﺍﻟﻔﺎﺭﻏﺔ ‪ ،NULL‬ﺑﻴﻨﻤﺎ ﺗﺴﻤﺢ ﺍﳋﺎﺻﻴﺔ ‪ UNIQUE‬ﺑﺎﻟﻘﻴﻤﺔ ‪ ،NULL‬ﻭﳝﻜﻨﻨﺎ ﺗﻄﺒﻴﻖ ﻫﺬﻩ‬
‫ﺍﳋﺎﺻﻴﺔ ﻋﻠﻰ ﺍﳊﻘﻞ ﻫﻜﺬﺍ‪:‬‬
‫( ‪CREATE TABLE MyTable‬‬
‫‪ID INT UNIQUE,‬‬
‫))‪FullName VARCHAR(60‬‬

‫ﻭﳝﻜﻨﻨﺎ ﺗﻄﺒﻴﻘﻬﺎ ﻋﻠﻰ ﺟﺪﻭﻝ ﻣﻨﺸﺄ ﻣﺴﺒﻘﺎ ﻛﻤﺎ ﻳﻠﻲ ‪:‬‬


‫‪--creation of table‬‬
‫( ‪CREATE TABLE MyTable‬‬
‫‪ID INT UNIQUE,‬‬
‫))‪FullName VARCHAR(60‬‬

‫‪--Add unique constraint :‬‬

‫)‪ALTER TABLE MyTable ADD CONSTRAINT U_MyConstraint UNIQUE (ID‬‬

‫‪:REFERENCE ‬‬
‫ﻫﺬﻩ ﺍﳋﺎﺻﻴﺔ ﺗﻄﺒﻖ ﻋﻠﻰ ﺍﳊﻘﻮﻝ ﺍﻷﺟﻨﺒﻴﺔ ﺍﻟﻘﺎﺩﻣﺔ ﻣﻦ ﺟﺪﻭﻝ ﺁﺧﺮ‪ ،‬ﻭﺗﺴﺘﻌﻤﻞ ﻟﺘﻌﺮﻳﻒ‬
‫ﺍﳊﻘﻞ ﺍﻷﺟﻨﱯ ﻭﲢﺪﻳﺪ ﺍﳉﺪﻭﻝ ﺍﻟﻘﺎﺩﻡ ﻣﻨﻪ‪.‬‬

‫‪53‬‬
‫ﰲ ﻫﺬﺍ ﺍﳌﺜﺎﻝ ﺳﻨﻨﺸﺊ ﺟﺪﻭﻟﲔ‪ ،‬ﻭﳓﺎﻭﻝ ﺗﻄﺒﻴﻖ ﺍﳋﺎﺻﻴﺔ ‪ REFERENCE‬ﻋﻠﻰ ﺍﳉﺪﻭﻝ‬
‫ﺍﻟﺜﺎﱐ‪:‬‬
‫‪--creation of the first table‬‬
‫( ‪CREATE TABLE MyTable1‬‬
‫‪ID INT NOT NULL PRIMARY KEY ,‬‬
‫))‪FullName VARCHAR(60‬‬

‫‪--creation of the second table‬‬


‫( ‪CREATE TABLE MyTable2‬‬
‫‪Code INT NOT NULL PRIMARY KEY ,‬‬
‫)‪ID INT CONSTRAINT PK_MyTable2 REFERENCES MyTable1(ID‬‬
‫)‬

‫ﺍﳉﺪﻭﻝ ﺍﻟﺜﺎﱐ ﻳﺘﻜﻮﻥ ﻣﻦ ﺣﻘﻠﲔ‪ ،‬ﺍﻷﻭﻝ ﺍﲰﻪ ‪ Code‬ﻭﻫﻮ ﺍﳊﻘﻞ ﺍﻷﺳﺎﺳﻲ‪ ،‬ﻭﺍﻟﺜﺎﱐ ﺍﲰﻪ ‪ID‬‬

‫ﻭﻫﻮ ﺃﺟﻨﱯ ﻗﺎﺩﻡ ﻣﻦ ﺍﳉﺪﻭﻝ ﺍﻷﻭﻝ‪.‬‬

‫ﻟﻮ ﺫﻫﺒﺖ ﺇﱃ ﺍﳉﺪﻭﻝ ﰲ ﺍﻟﻘﺎﺋﻤﺔ‪ ،‬ﻭﺩﺧﻠﺖ ﺇﱃ ﺍﻷﻋﻤﺪﺓ ‪ Columns‬ﺳﺘﺠﺪﻩ ﺑﺎﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ‪:‬‬

‫ﺍﳌﻔﺘﺎﺡ ﺍﻟﺬﻫﱯ ﻟﻠﺪﻻﻟﺔ ﻋﻠﻰ ﺃﻥ ﺍﳊﻘﻞ ﺃﺳﺎﺳﻲ ‪ ،PRIMARY KEY‬ﻭﺍﳌﻔﺘﺎﺡ ﺍﻟﺮﻣﺎﺩﻱ ﻟﻠﺪﻻﻟﺔ‬
‫ﻋﻠﻰ ﺃﻥ ﻫﺬﺍ ﺍﳊﻘﻞ ﺃﺟﻨﱯ ‪.FOREIGN KEY‬‬
‫ﻭﻧﺴﺘﻄﻴﻊ ﺃﻳﻀﺎ ﺗﻄﺒﻴﻖ ﺍﳋﺎﺻﻴﺔ ‪ REFERENCES‬ﻋﻠﻰ ﺟﺪﻭﻝ ﰎ ﺇﻧﺸﺎﺅﻩ ﻣﻘﺪﻣﺎ‪ ،‬ﻭﺗﻜﻮﻥ‬
‫ﺍﻟﺼﻴﻐﺔ ﻫﻜﺬﺍ‪:‬‬

‫‪54‬‬
‫‪ALTER TABLE MyTable2‬‬
‫‪ADD CONSTRAINT FK_Constraint‬‬
‫)‪FOREIGN KEY (ID‬‬
‫)‪REFERENCES MyTable1(ID‬‬

‫ﲝﻴﺚ ‪ FK_Constraint‬ﻫﻮ ﺍﺳﻢ ﺍﳋﺎﺻﻴﺔ ‪ REFERENCES‬ﺍﻟﱵ ﳓﻦ ﺑﺼﺪﺩ ﺇﻧﺸﺎﺋﻬﺎ‪ ،‬ﺃﻣﺎ ‪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‬ﺳﻨﺔ‪،‬‬
‫ﻭﳝﻜﻨﻚ ﺗﻌﻮﻳﺾ ﺍﻟﺸﺮﻁ ﺍﳌﻮﺟﻮﺩ ﺑﲔ ﺍﻟﻘﻮﺳﲔ ﺑﺄﻱ ﺷﺮﻁ ﺗﺮﻳﺪ‪.‬‬

‫ﳝﻜﻨﻨﺎ ﺇﺿﺎﻓﺔ ﺍﳋﺎﺻﻴﺔ ‪ CHECK‬ﺣﱴ ﺑﻌﺪ ﺇﻧﺸﺎﺀ ﺍﳉﺪﻭﻝ‪ ،‬ﺑﺎﻟﺼﻴﻐﺔ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫‪ALTER TABLE Person‬‬

‫‪ADD CONSTRAINT C_Constraint‬‬

‫)‪CHECK (Age BETWEEN 5 AND 160‬‬

‫ﺣﺬﻑ ﺧﺎﺻﻴﺎﺕ ﺍﻹﺩﺧﺎﻝ‪:‬‬


‫ﳊﺬﻑ ﺧﺎﺻﻴﺎﺕ ﺍﻹﺩﺧﺎﻝ‪ ،‬ﻧﻜﺘﺐ ﺍﻟﺼﻴﻐﺔ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫‪56‬‬
‫‪ALTER TABLE Person‬‬

‫‪DROP CONSTRAINT C_Constraint‬‬

‫ﲝﻴﺚ ‪ Person‬ﻫﻮ ﺍﺳﻢ ﺍﳉﺪﻭﻝ‪ ،‬ﻭ ‪ C_Constraint‬ﺍﺳﻢ ﺧﺎﺻﻴﺔ ﺍﻹﺩﺧﺎﻝ ﺍﳌﺮﺍﺩ ﺣﺬﻓﻬﺎ‪.‬‬

‫ﺍﳌﺸﺎﻫﺪ ‪:Views‬‬
‫ﺍﳌﺸﺎﻫﺪ ‪ Views‬ﻋﺒﺎﺭﺓ ﻋﻦ ﺟﺪﺍﻭﻝ ﻭﳘﻴﺔ‪ ،‬ﻭﺍﻟﱵ ﳍﺎ ﻧﻔﺲ ﺩﻭﺭ ﺍﳉﺪﺍﻭﻝ ﺍﳊﻘﻴﻘﻴﺔ ﺇﻻ ﺃ‪‬ﺎ‬
‫ﺃﺧﻒ ﻭﺃﺳﺮﻉ ﻷ‪‬ﺎ ﻻ ﲢﺘﻮﻱ ﻋﻠﻰ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﺇﳕﺎ ﲢﺘﻮﻱ ﻓﻘﻂ ﻋﻠﻰ ﺍﻻﺳﺘﻌﻼﻡ ﺍﻟﺬﻱ ﳚﻠﺐ‬
‫ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﺍﳉﺪﺍﻭﻝ ‪ ،‬ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﻫﺬﻩ ﺍﳌﺰﻳﺔ ﲤﻜﻨﻨﺎ ﺍﳌﺸﺎﻫﺪ ﻣﻦ ﲢﺪﻳﺪ ﻋﺪﺩ ﺍﳊﻘﻮﻝ‬
‫ﺍﳌﺮﺍﺩ ﺗﻀﻤﻴﻨﻬﺎ ﰲ ﺍﻻﺳﺘﻌﻼﻡ‪ ،‬ﻧﺎﻫﻴﻚ ﻋﻦ ﻛﻮ‪‬ﺎ ﲤﻜﻨﻨﺎ ﻣﻦ ﺟﻠﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﳎﻤﻮﻋﺔ ﻣﻦ‬
‫ﺍﳉﺪﺍﻭﻝ ﺍﳌﺘﺮﺍﺑﻄﺔ ﻭﲡﻤﻴﻌﻬﺎ ﻋﻠﻰ ﺷﻜﻞ ﺟﺪﻭﻝ ﻭﺍﺣﺪ‪.‬‬
‫ﺇﻧﺸﺎﺀ ﺍﳌﺸﺎﻫﺪ‪:‬‬
‫ﻹﻧﺸﺎﺀ ﻣﺸﻬﺪ ‪ View‬ﻣﻌﲔ‪ ،‬ﻓﺎﻟﺼﻴﻐﺔ ﺍﻟﻌﺎﻣﺔ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬
‫‪CREATE VIEW View_Name‬‬

‫‪AS Query‬‬

‫ﲝﻴﺚ ‪ View_Name‬ﻫﻮ ﺍﺳﻢ ﺍﳌﺸﻬﺪ ﺍﳌﺮﺍﺩ ﺇﻧﺸﺎﺅﻩ‪ ،‬ﻭﻫﺬﺍ ﻣﺜﺎﻝ ﻟﻜﻴﻔﻴﺔ ﺇﻧﺸﺎﺀ ﻣﺸﻬﺪ ﳚﻠﺐ‬
‫ﺑﻴﺎﻧﺎﺕ ﺍﳌﻮﻇﻔﲔ ﺍﻟﺬﻳﻦ ﻳﺴﻜﻨﻮﻥ ﻣﺪﻳﻨﺔ ﺍﻟﺮﻳﺎﺽ‪:‬‬
‫‪CREATE VIEW Emp_Riad‬‬

‫‪AS‬‬

‫'‪SELECT ID, FullName, Age FROM Employee WHERE [City]='Riad‬‬

‫‪57‬‬
‫ﻟﻮ ﺃﺭﺩﺕ ﺭﺅﻳﺔ ﺍﳌﺸﻬﺪ ﺍﻟﺬﻱ ﻗﻤﺖ ﺑﺈﻧﺸﺎﺋﻪ ﺍﺫﻫﺐ ﺇﱃ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‪ ،‬ﺳﺘﺠﺪ ﰲ ﺍﻟﺘﺒﻮﻳﺐ‬
‫ﺍﻟﺬﻱ ﻳﻮﺟﺪ ﻓﻴﻪ ﺍﳉﺪﺍﻭﻝ‪ ،‬ﺗﺒﻮﻳﺒﺎ ﺍﲰﻪ ‪ ،Views‬ﺍﺩﺧﻞ ﺇﻟﻴﻪ ﻭﺳﺘﺠﺪ ﺍﳌﺸﻬﺪ ﺑﺎﻹﺳﻢ ﺍﻟﺬﻱ‬
‫ﺃﻋﻄﻴﺘﻪ ﺇﻳﺎﻩ‪.‬‬

‫ﺍﺩﺧﻞ ﺇﻟﻴﻬﺎ ﺳﺘﺠﺪﻫﺎ ﺷﺒﻴﻬﺔ ﺟﺪﺍ ﺑﺎﳉﺪﺍﻭﻝ ‪.Tables‬‬


‫ﺑﺈﻣﻜﺎﻧﻚ ﺇﻧﺸﺎﺀ ﺍﳌﺸﺎﻫﺪ ﺃﻳﻀﺎ ﻣﻦ ﻫﻨﺎﻙ‪ ،‬ﻣﻦ ﺩﻭﻥ ﺍﳊﺎﺟﺔ ﺇﱃ ﻛﺘﺎﺑﺔ ﺃﻭﺍﻣﺮ ‪ ،SQL‬ﻓﻘﻂ ﺍﺗﺒﻊ‬
‫ﻣﺮﺍﺣﻞ ﺍﻹﻧﺸﺎﺀ‪ ،‬ﺑﻌﺪ ﺍﻟﻀﻐﻂ ﺑﻴﻤﲔ ﺍﻟﻔﺄﺭﺓ ﻋﻠﻰ ‪ Views‬ﻭﺍﺧﺘﻴﺎﺭ ‪.New View‬‬
‫ﺣﺬﻑ ﺍﳌﺸﺎﻫﺪ ‪:Views‬‬
‫ﳊﺬﻑ ﻣﺸﻬﺪ ﻣﻌﲔ‪ ،‬ﻗﻢ ﺑﺎﻟﻀﻐﻂ ﻋﻠﻴﻪ ﺑﻴﻤﲔ ﺍﻟﻔﺄﺭﺓ ﻭﺍﺧﺘﺮ ﺍﻷﻣﺮ ‪ ،Delete‬ﺃﻭ ﺍﻛﺘﺐ ﺍﻷﻣﺮ‬
‫ﺍﻟﺘﺎﱄ‪:‬‬
‫‪DROP VIEW View_Name‬‬

‫‪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‬‬
‫ﻭﻫﺬﺍ ﻣﺜﺎﻝ ﻹﻧﺸﺎﺀ ﻓﻬﺮﺱ‪:‬‬

‫‪CREATE INDEX MyIndex‬‬


‫)‪ON MyTable (ID Desc‬‬

‫ﺣﺬﻑ ﺍﻟﻔﻬﺎﺭﺱ‪:‬‬
‫ﳊﺬﻑ ﻓﻬﺮﺱ ﺑﻮﺍﺳﻄﺔ ﺃﻭﺍﻣﺮ ‪ ،SQL‬ﻓﺎﻟﺼﻴﻐﺔ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬

‫‪DROP INDEX MyIndex‬‬


‫‪ON MyTable‬‬

‫ﻣﻌﺎﳉﺔ ﺍﻟﺒﻴﺎﻧﺎﺕ‪:‬‬
‫ﲢﺪﺛﻨﺎ ﻋﻦ ﻣﻔﻬﻮﻡ ﻣﻌﺎﳉﺔ ﺍﻟﺒﻴﺎﻧﺎﺕ ﰲ ﻣﺴﺘﻬﻞ ﺍﻟﻔﺼﻞ ﺍﻟﺜﺎﱐ‪ ،‬ﻭﻗﻠﻨﺎ ﺑﺄ‪‬ﺎ ﺗﺸﻤﻞ ﻛﻞ ﻋﻤﻠﻴﺎﺕ‬
‫ﺍﻹﺿﺎﻓﺔ ﻭﺍﻟﺘﻌﺪﻳﻞ ﻭﺍﳊﺬﻑ ﺍﻟﱵ ﺗﻄﺎﻝ ﺍﳉﺪﺍﻭﻝ‪.‬‬

‫ﺇﺿﺎﻓﺔ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪ Insert‬ﺇﱃ ﺟﺪﻭﻝ‪:‬‬


‫ﻣﺜﻼ ﻋﻨﺪﻱ ﺟﺪﻭﻝ ﻳﻀﻢ ﻗﺎﺋﻤﺔ ﺍﳌﻮﻇﻔﲔ‪ ،‬ﻭﺃﺭﻳﺪ ﺃﻥ ﺃﺿﻴﻒ ﻣﻮﻇﻔﺎ ﺟﺪﻳﺪﺍ ﺇﱃ ﻫﺬﺍ ﺍﳉﺪﻭﻝ‪،‬‬
‫ﺳﺄﻓﺘﺮﺽ ﺃﻥ ﺍﳉﺪﻭﻝ ﻳﻀﻢ ﺣﻘﻠﲔ ﻓﻘﻂ ﻭﳘﺎ‪ :‬ﺭﻗﻢ ﺍﳌﻮﻇﻒ ﻭﺍﲰﻪ ﺍﻟﻜﺎﻣﻞ‪ ،‬ﻟﻔﻌﻞ ﺫﻟﻚ‬
‫ﻓﺎﻟﺼﻴﻐﺔ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬

‫‪INSERT INTO MyTable‬‬


‫)‪(ID, FullName‬‬
‫‪VALUES‬‬
‫)'‪(1, 'Khalid‬‬

‫‪60‬‬
‫ﲝﻴﺚ ‪ MyTable‬ﻫﻮ ﺍﺳﻢ ﺍﳉﺪﻭﻝ ﺍﻟﺬﻱ ﻧﺮﻳﺪ ﺇﺿﺎﻓﺔ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺇﻟﻴﻪ‪ ،‬ﻭ ‪ ID‬ﻭ ‪ FullName‬ﳘﺎ‬
‫ﺍﳊﻘﻼﻥ ﺍﳌﺸﻜﻼﻥ ﳍﺬﺍ ﺍﳉﺪﻭﻝ‪ ،‬ﺃﹶﻱ‪ ‬ﺣﻘﻞ ﻣﻦ ﺣﻘﻮﻝ ﺍﳉﺪﻭﻝ ﻻ ﻳﻜﺘﺐ ﺑﲔ ﺍﻷﻗﻮﺍﺱ ﺗﻮﺿﻊ‬
‫ﻓﻴﻪ ﺍﻟﻘﻴﻤﺔ ‪ NULL‬ﺍﻓﺘﺮﺍﺿﻴﺎ‪.‬‬
‫ﺇﺫﺍ ﻛﺎﻥ ﺃﺣﺪ ﺍﳊﻘﻮﻝ ﻳﻄﺒﻖ ﺍﳋﺎﺻﻴﺔ ‪ IDENTITY‬ﺍﻟﱵ ﲡﻌﻞ ﺍﻟﺮﻗﻢ ﻳﺰﺩﺍﺩ ﺗﻠﻘﺎﺋﻴﺎ‪ ،‬ﻓﻼ‬
‫ﻳﻨﺒﻐﻲ ﺃﻥ ﻧﻀﻌﻪ ﻣﻊ ﺍﳊﻘﻮﻝ‪.‬‬
‫ﺇﺫﺍ ﻛﻨﺎ ﻣﺘﺄﻛﺪﻳﻦ ﻣﻦ ﺗﺮﺗﻴﺐ ﺍﳊﻘﻮﻝ‪ ،‬ﻓﺒﺈﻣﻜﺎﻧﻨﺎ ﺇﻟﻐﺎﺀ ﺫﻛﺮ ﺍﳊﻘﻮﻝ ﰲ ﺍﻟﺼﻴﻐﺔ ﻭﺍﻻﻛﺘﻔﺎﺀ‬
‫ﻓﻘﻂ ﺑﺈﺩﺧﺎﻝ ﺍﻟﻘﻴﻤﺔ‪ ،‬ﻛﻤﺎ ﻧﻌﺮﺽ ﻫﻨﺎ‪:‬‬
‫‪INSERT INTO MyTable‬‬
‫‪VALUES‬‬
‫)'‪(1, 'Khalid‬‬

‫ﻧﺴﺦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﺟﺪﻭﻝ ﺇﱃ ﺁﺧﺮ‬


‫ﺑﺈﻣﻜﺎﻧﻨﺎ ﻧﺴﺦ ﺑﻴﺎﻧﺎﺕ ﺟﺪﻭﻝ ﻣﻌﲔ‪ ،‬ﻭﻧﻘﻠﻬﺎ ﺇﱃ ﺟﺪﻭﻝ ﺛﺎﻥ ﻭﺍﻟﺼﻴﻐﺔ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬
‫)‪INSERT INTO MyTable2 (ID,FullName‬‬
‫‪SELECT ID,Fullname‬‬
‫‪FROM MyTable1‬‬

‫ﰲ ﺍﻟﺴﻄﺮ ﺍﻷﻭﻝ ﻗﻤﻨﺎ ﺑﺘﺤﺪﻳﺪ ﺍﺳﻢ ﺍﳉﺪﻭﻝ ﺍﳌﺮﺍﺩ ﻧﺴﺦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺇﻟﻴﻪ ﻣﻊ ﲢﺪﻳﺪ ﺃﲰﺎﺀ‬
‫ﺍﳊﻘﻮﻝ‪ ،‬ﰒ ﺑﻌﺪ ﺫﻟﻚ ﻧﻘﻮﻡ ﲜﻠﺐ ﻗﻴﻢ ﺍﳊﻘﻮﻝ ﻣﻦ ﺍﳉﺪﻭﻝ ﺍﳌﺼﺪﺭ ﻋﻦ ﻃﺮﻳﻖ ﺍﻟﻜﻠﻤﺔ ‪Select‬‬

‫ﺍﻟﱵ ﺳﻨﺮﺍﻫﺎ ﺑﺎﻟﺘﻔﺼﻴﻞ ﻓﻴﻤﺎ ﺳﻴﺄﰐ ﺇﻥ ﺷﺎﺀ ﺍﷲ‪.‬‬

‫‪61‬‬
‫ﺇﺿﺎﻓﺔ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺇﱃ ﺟﺪﻭﻝ ﰲ ﻧﻔﺲ ﳊﻈﺔ ﺇﻧﺸﺎﺋﻪ‪:‬‬
‫ﺑﺈﻣﻜﺎﻧﻨﺎ ﺗﻌﺒﺌﺔ ﺟﺪﻭﻝ ﰲ ﳊﻈﺔ ﺇﻧﺸﺎﺋﻪ ﺑﻌﻨﺎﺻﺮ ﺟﺪﻭﻝ ﺁﺧﺮ ﻣﻮﺟﻮﺩ ﻣﺴﺒﻘﺎ‪ ،‬ﻟﻠﻘﻴﺎﻡ ﺑﺬﻟﻚ‬
‫ﻓﺎﻟﺼﻴﻐﺔ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬
‫* ‪SELECT‬‬
‫‪INTO NewTable‬‬
‫‪FROM OldTable‬‬

‫ﺍﻟﻨﺠﻤﺔ * ﺗﻌﲏ ﺟﻠﺐ ﲨﻴﻊ ﺍﳊﻘﻮﻝ‪ ،‬ﺇﺫﺍ ﻗﻤﺖ ﺑﺘﻨﻔﻴﺬ ﻫﺬﺍ ﺍﻟﻜﻮﺩ ﺳﻮﻑ ﺗﻜﻮﻥ ﺍﻟﻨﺘﻴﺠﺔ ﻋﺒﺎﺭﺓ‬
‫ﻋﻦ ﺟﺪﻭﻝ ﺟﺪﻳﺪ‪ ،‬ﺍﲰﻪ ‪ NewTable‬ﻣﻌﺒﺄ ﺑﻨﻔﺲ ﺑﻴﺎﻧﺎﺕ ﺍﳉﺪﻭﻝ ‪.OldTable‬‬

‫ﺣﺬﻑ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪:Delete‬‬


‫ﳊﺬﻑ ﲨﻴﻊ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﺟﺪﻭﻝ ﻣﻌﲔ‪ ،‬ﻓﺎﻟﺼﻴﻐﺔ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬
‫;‪DELETE FROM MyTable‬‬

‫ﺇﺫﺍ ﺃﺭﺩﻧﺎ ﺣﺬﻑ ﺑﻌﺾ ﺍﻟﻌﻨﺎﺻﺮ ﻓﻘﻂ ﻓﻴﻠﺰﻣﻨﺎ ﺇﺿﺎﻓﺔ ﺍﻟﻜﻠﻤﺔ ﺍﻟﺸﺮﻃﻴﺔ ‪ ،WHERE‬ﺍﻟﱵ ﲣﻮﻝ‬
‫ﻟﻨﺎ ﲢﺪﻳﺪ ﺍﻟﺸﺮﻁ ﺍﻟﺬﻱ ﺑﺘﺤﻘﻘﻪ ﺗﺘﻢ ﻋﻤﻠﻴﺔ ﺍﳊﺬﻑ‪.‬‬
‫ﻭﻛﻤﺜﺎﻝ ﻟﺬﻟﻚ ﻧﻔﺘﺮﺽ ﺃﻥ ﻟﺪﻳﻨﺎ ﺟﺪﻭﻻ ﻳﻀﻢ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﳌﻮﻇﻔﲔ‪ ،‬ﻭﻧﺮﻳﺪ ﺣﺬﻑ ﺍﳌﻮﻇﻔﲔ‬
‫ﺍﻟﺬﻳﻦ ﻳﻘﻄﻨﻮﻥ ﲟﺪﻳﻨﺔ ﺍﻟﺮﺑﺎﻁ‪:‬‬
‫‪DELETE FROM Employee‬‬
‫;'‪WHERE Adress= 'Rabat‬‬

‫ﻣﺜﺎﻝ ﺁﺧﺮ ﻳﻘﻮﻡ ﲝﺬﻑ ﺍﳌﻮﻇﻔﲔ ﺍﻟﺬﻳﻦ ﻋﻤﺮﻫﻢ ﺃﻛﱪ ﻣﻦ ‪ 60‬ﺳﻨﺔ‪:‬‬

‫‪62‬‬
‫‪DELETE FROM Employee‬‬
‫;‪WHERE Age > 60‬‬

‫ﺗﻌﺪﻳﻞ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪:Update Data‬‬


‫ﰲ ﻣﻌﻈﻢ ﺍﻷﻣﺜﻠﺔ ﺍﻟﻘﺎﺩﻣﺔ ﺳﻨﺸﺘﻐﻞ ﻋﻠﻰ ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ‪ ،‬ﳍﺬﺍ ﻳﺴﺘﺤﺴﻦ ﺃﻥ ﺗﻨﺸﺌﻪ ﺍﻵﻥ‬
‫ﻟﺘﺠﺮﻳﺐ ﺍﻷﻭﺍﻣﺮ‪ ،‬ﺑﺈﻣﻜﺎﻧﻚ ﺇﻧﺸﺎﺅﻩ ﻳﺪﻭﻳﺎ ﻋﻦ ﻃﺮﻳﻖ ﻧﺎﻓﺬﺓ ﺍﻟﺘﺼﻤﻴﻢ‪ ،‬ﺃﻭ ﻋﱪ ﺃﻭﺍﻣﺮ ‪ SQL‬ﺍﻟﱵ‬
‫ﺭﺃﻳﻨﺎﻫﺎ ﺁﻧﻔﺎ‪.‬‬
‫ﺑﺎﻟﻨﺴﺒﺔ ﳊﻘﻮﻝ ﺍﳉﺪﻭﻝ ﻓﻠﺴﺖ ﻣﻠﺰﻣﺎ ﺑﺎﺗﺒﺎﻉ ﻧﻔﺲ ﺍﳊﻘﻮﻝ ﺍﻟﱵ ﺃﺳﺘﻌﻤﻠﻬﺎ‪ ،‬ﻷﻧﲏ ﺃﻏﲑ‬
‫ﺍﳊﻘﻮﻝ ﻭﻓﻖ ﺍﳌﻔﻬﻮﻡ ﺍﻟﺬﻱ ﺃﻋﺮﺿﻪ‪ ،‬ﻋﻠﻰ ﺍﻟﻌﻤﻮﻡ ﺗﺴﺘﻄﻴﻊ ﺍﺑﺘﺪﺍﺀً ﺇﻧﺸﺎﺀ ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ‬
‫ﺑﺎﳊﻘﻮﻝ ﺍﻟﱵ ﺃﻭﺭﺩﻫﺎ ﰲ ﺍﺳﺘﻌﻼﻡ ﺍﻹﻧﺸﺎﺀ ﺍﻟﺘﺎﱄ‪:‬‬
‫‪CREATE TABLE Employee‬‬
‫‪(ID INT NOT NULL PRIMARY KEY,‬‬
‫‪FullName NVARCHAR(40),‬‬
‫‪Adress NVARCHAR(255),‬‬
‫)‪Age TINYINT‬‬

‫ﻟﻠﻘﻴﺎﻡ ﺑﻌﻤﻠﻴﺔ ﺗﻌﺪﻳﻞ ﺍﻟﺒﻴﺎﻧﺎﺕ ﰲ ﺟﺪﻭﻝ ﻣﺎ‪ ،‬ﻓﺈﻥ ﺍﻟﺼﻴﻐﺔ ﺗﻜﻮﻥ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬
‫‪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‬ﲜﻠﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﺍﳉﺪﺍﻭﻝ‪ ،‬ﺍﻵﻥ ﺇﻥ ﺷﺎﺀ ﺍﷲ‬
‫ﺳﻨﺘﻌﺮﻑ ﻋﻠﻴﻪ ﺃﻛﺜﺮ‪ ،‬ﻭﻛﻨﻘﻄﺔ ﻟﻠﺒﺪﺍﻳﺔ ﺳﻨﻮﺭﺩ ﺻﻴﻐﺔ ﻫﺬﺍ ﺍﻷﻣﺮ‪:‬‬
‫‪SELECT Field1, Field2, ...‬‬
‫‪FROM TableName‬‬
‫‪WHERE Condition‬‬

‫ﰲ ﺍﳉﺰﺀ ﺍﻷﻭﻝ ﻣﻦ ‪ Select‬ﻧﻘﻮﻡ ﺑﺘﺤﺪﻳﺪ ﺍﳊﻘﻮﻝ ﺍﻟﱵ ﻧﺮﻳﺪ ﺍﺳﺘﻌﺮﺍﺽ ﻗﻴﻤﻬﺎ‪ ،‬ﻭﰲ ﺍﳉﺰﺀ‬
‫ﺍﻟﺜﺎﱐ ﳓﺪﺩ ﺍﳉﺪﻭﻝ ﺍﳌﺮﺍﺩ ﺟﻠﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻨﻪ‪ ،‬ﻭﰲ ﺍﳉﺰﺀ ﺍﻟﺜﺎﻟﺚ ﻧﺴﺘﻄﻴﻊ ﺃﻥ ﻧﻀﻊ ﺷﺮﻃﺎ‬
‫ﻳﻀﺒﻂ ﺟﻠﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ‪ ،‬ﻛﻤﺎ ﻳﻈﻬﺮ ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ‪:‬‬
‫‪SELECT ID, FullName, Adress‬‬
‫‪FROM Employee‬‬
‫'‪WHERE Adress='Mekkah‬‬

‫‪64‬‬
‫ﺳﺘﻜﻮﻥ ﺍﻟﻨﺘﻴﺠﺔ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬

‫ﳉﻠﺐ ﲨﻴﻊ ﺍﳊﻘﻮﻝ‪ ،‬ﻧﺴﺘﻐﲏ ﻋﻦ ﻛﺘﺎﺑﺔ ﺍﻷﲰﺎﺀ ﻭﻧﻌﻮﺿﻬﺎ ﺑﺎﻟﺮﻣﺰ ﳒﻤﺔ )*( ﺍﻟﺬﻱ ﻳﻌﲏ ﻛﻞ‬
‫ﺍﳊﻘﻮﻝ‪:‬‬
‫* ‪SELECT‬‬
‫‪FROM Employee‬‬
‫'‪WHERE Adress='Mekkah‬‬

‫ﺍﻻﺳﺘﻌﻼﻡ ﺍﻟﺴﺎﺑﻖ ﺳﻴﻌﻄﻲ ﻧﻔﺲ ﺍﻟﻨﺘﻴﺠﺔ‪.‬‬


‫ﲟﻘﺪﻭﺭﻧﺎ ﻭﺿﻊ ﺃﻛﺜﺮ ﻣﻦ ﺷﺮﻁ ﺑﻌﺪ ﺍﻟﻜﻠﻤﺔ ‪ ،WHERE‬ﻛﻤﺎ ﻳﻮﺿﺢ ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ‪:‬‬

‫* ‪SELECT‬‬
‫‪FROM Employee‬‬
‫'‪WHERE Adress='Mekkah‬‬
‫‪And Age < 30‬‬

‫ﻫﺬﻩ ﺍﳌﺮﺓ ﺳﻴﺠﻠﺐ ﺍﳌﻮﻇﻔﲔ ﺍﻟﻘﺎﻃﻨﲔ ﰲ ﻣﻜﺔ ﺍﳌﻜﺮﻣﺔ ﻭﺍﻟﺪﻳﻦ ﻋﻤﺮﻫﻢ ﺃﺻﻐﺮ ﻣﻦ ‪ 30‬ﺳﻨﺔ‪.‬‬
‫ﻭﻫﺬﺍ ﻣﺜﺎﻝ ﺁﺧﺮ ﻳﻘﻮﻡ ﲜﻠﺐ ﺍﳌﻮﻇﻔﲔ ﺍﻟﻘﺎﻃﻨﲔ ﰲ ﻣﻜﺔ ﺍﳌﻜﺮﻣﺔ ﺃﻭ ﺍﳌﺪﻳﻨﺔ ﺍﳌﻨﻮﺭﺓ‪:‬‬
‫* ‪SELECT‬‬
‫‪FROM Employee‬‬
‫'‪WHERE Adress='Mekkah‬‬
‫'‪OR Adress='Madina‬‬

‫‪65‬‬
‫ﺳﻴﻘﻮﻡ ﺍﻻﺳﺘﻌﻼﻡ ﺃﻋﻼﻩ ﲜﻠﺐ ﻛﻞ ﺍﳌﻮﻇﻔﲔ ﺍﻟﻘﺎﻃﻨﲔ ﲟﻜﺔ ﻭﺍﳌﺪﻳﻨﺔ‪ ،‬ﻭﺍﻟﻨﺘﻴﺠﺔ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬

‫ﺑﺈﻣﻜﺎﻧﻨﺎ ﺗﻐﻴﲑ ﺃﲰﺎﺀ ﺍﳊﻘﻮﻝ ﻋﻨﺪ ﺍﻟﻌﺮﺽ‪ ،‬ﻭﻟﻔﻌﻞ ﺫﻟﻚ ﳓﺪﺩ ﺍﺳﻢ ﺍﳊﻘﻞ ﺍﳌﺮﺍﺩ ﻋﺮﺿﻪ ﺑﻌﺪ‬
‫ﺍﻟﻜﻠﻤﺔ ‪:AS‬‬

‫‪,‬اﻟﺮﻗﻢ ‪SELECT ID AS‬‬


‫‪],‬اﻻﺳﻢ اﻟﻜﺎﻣﻞ[ ‪FullName AS‬‬
‫‪,‬اﻟﻌﻨﻮان ‪Adress AS‬‬
‫اﻟﻌﻤﺮ ‪Age AS‬‬
‫‪FROM Employee‬‬

‫ﻭﺍﻟﻨﺘﻴﺠﺔ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬

‫‪66‬‬
‫ﺩﻣﺞ ﺍﳊﻘﻮﻝ ‪:Concatenation‬‬
‫ﺃﺣﻴﺎﻧﺎ ﻧﺮﻳﺪ ﺇﻇﻬﺎﺭ ﻗﻴﻢ ﺑﻌﺾ ﺍﳊﻘﻮﻝ ﻣﺮﺗﺒﻄﺔ ﻓﻴﻤﺎ ﺑﻴﻨﻬﺎ ﻛﻤﺎ ﻟﻮ ﺃ‪‬ﺎ ﻗﻴﻤﺔ ﻭﺍﺣﺪﺓ‪ ،‬ﺗﺴﻤﻰ‬
‫ﻫﺬﻩ ﺍﻟﻌﻤﻴﻠﺔ ﺑﺎﻟﺪﻣﺞ ‪ ،Concatenation‬ﻟﻠﻘﻴﺎﻡ ﺑﺬﻟﻚ ﻧﻔﺮﻕ ﺑﲔ ﺍﳊﻘﻮﻝ ﺑﻌﻼﻣﺔ ‪ ،+‬ﻛﻤﺎ‬
‫ﻳﻌﺮﺽ ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ‪:‬‬
‫' ‪SELECT FullName +‬‬ ‫‪Is From:‬‬ ‫'‪' + Adress as 'About this emplyee‬‬
‫‪From Employee‬‬

‫ﺳﺘﻜﻮﻥ ﺍﻟﻨﺘﻴﺠﺔ ﻫﻜﺬﺍ ‪:‬‬

‫ﺟﺮﺩ ﺍﻷﺳﻄﺮ ﺍﻷﻭﱃ ‪:SELECT TOP‬‬


‫ﺃﺣﻴﺎﻧﺎ ﻧﺮﻳﺪ ﺇﻇﻬﺎﺭ ﺍﻷﺳﻄﺮ ﺍﻷﻭﱃ ﻓﻘﻂ ﻣﻦ ﺟﺪﻭﻝ ﻣﺎ‪ ،‬ﻟﻠﻘﻴﺎﻡ ﺑﺬﻟﻚ ﻧﺴﺘﺨﺪﻡ ﺍﻟﻜﻠﻤﺔ ‪TOP‬‬

‫ﺑﻌﺪ ﺍﻟﻜﻠﻤﺔ ‪ SELECT‬ﰒ ﳓﺪﺩ ﻋﺪﺩ ﺍﻷﺳﻄﺮ ﺍﻷﻭﱃ ﺍﳌﺮﺍﺩ ﺍﺳﺘﻌﺮﺍﺿﻬﺎ‪ ،‬ﻛﻤﺎ ﻳﻮﺿﺢ ﺍﳌﺜﺎﻝ‬
‫ﺍﻟﺘﺎﱄ‪:‬‬
‫* ‪SELECT TOP 3‬‬
‫‪FROM Employee‬‬

‫‪67‬‬
‫ﻧﺘﻴﺠﺔ ﺍﳌﺜﺎﻝ ﺃﻋﻼﻩ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬

‫ﻛﻤﺎ ﺗﻼﺣﻆ ﻗﺎﻡ ﲜﻠﺐ ﺍﻟﺜﻼﺛﺔ ﺍﻷﻭﺍﺋﻞ ﻓﻘﻂ‪.‬‬

‫ﺟﻠﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻋﺸﻮﺍﺋﻴﺎ ‪:RANDOM SELECT‬‬


‫ﺇﺫﺍ ﺃﺭﺩﻧﺎ ﺟﻠﺐ ﻋﻨﺎﺻﺮ ﻋﺸﻮﺍﺋﻴﺔ ﻓﻌﻠﻴﻨﺎ ﺍﻟﻨﺪﺍﺀ ﻋﻠﻰ ﺍﻟﺪﺍﻟﺔ )(‪ NewId‬ﻣﺼﺤﻮﺑﺔ ﺑﺄﻣﺮ‬
‫ﺍﻟﺘﺮﺗﻴﺐ ‪ Order By‬ﺍﻟﺬﻱ ﺳﻨﺮﺍﻩ ﻻﺣﻘﺎ‪ ،‬ﻭﻛﻤﺜﺎﻝ ﻟﺬﻟﻚ ﻧﻮﺭﺩ‪:‬‬
‫* ‪SELECT‬‬
‫‪FROM Employee‬‬
‫)(‪ORDER BY newid‬‬

‫ﰲ ﻛﻞ ﻣﺮﺓ ﺗﻘﻮﻡ ﺑﺘﻨﻔﻴﺬ ﻫﺬﺍ ﺍﻻﺳﺘﻌﻼﻡ‪ ،‬ﺳﺘﻼﺣﻆ ﺑﺄﻥ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺗﺄﰐ ﻋﺸﻮﺍﺋﻴﺎ‪ ،‬ﻗﺪ ﲢﺘﺎﺝ‬
‫ﻫﺬﺍ ﺍﻷﻣﺮ ﺇﺫﺍ ﻛﻨﺖ ﺑﺼﺪﺩ ﺇﳒﺎﺯ ﺑﺮﻧﺎﻣﺞ ﳛﺘﺎﺝ ﺇﱃ ﺗﻮﻟﺪ ﺍﺧﺘﻴﺎﺭﺍﺕ ﻋﺸﻮﺍﺋﻴﺔ ﻣﺜﻞ ﻣﺴﺎﺑﻘﺔ‬
‫"ﻣﻦ ﺳﲑﺑﺢ ﺍﳌﻠﻴﻮﻥ؟"‪.‬‬

‫ﺟﻠﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻏﲑ ﻣﻜﺮﺭﺓ ‪:SELECT DISTINCT‬‬


‫ﲤﻜﻨﻨﺎ ﺍﻟﺪﺍﻟﺔ ‪ DISTINCT‬ﻣﻦ ﺟﻠﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﺣﻘﻞ ﻣﻌﲔ ﻣﻊ ﺗﻔﺎﺩﻱ ﺍﻟﺘﻜﺮﺍﺭ‪ ،‬ﲝﻴﺚ ﻟﻮ ﻛﺎﻥ‬
‫ﻳﻀﻢ ﺍﳊﻘﻞ ﻧﻔﺲ ﺍﻟﻘﻴﻤﺔ ﰲ ﺃﻛﺜﺮ ﻣﻦ ﺳﻄﺮ‪ ،‬ﲡﻠﺐ ﻫﺬﻩ ﺍﻟﻘﻴﻤﺔ ﻣﺮﺓ ﻭﺍﺣﺪﺓ‪ ،‬ﻭﺻﻴﻐﺔ ﻫﺬﻩ‬
‫ﺍﻟﺪﺍﻟﺔ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬
‫‪68‬‬
‫‪SELECT DISTINCT FullName‬‬
‫‪FROM Employee‬‬

‫ﻟﻨﻔﺘﺮﺽ ﺃﻥ ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ ﻳﻀﻢ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬


‫‪ID‬‬ ‫‪FullName‬‬
‫‪1‬‬ ‫‪Khalid‬‬
‫‪2‬‬ ‫‪Ahmed‬‬
‫‪3‬‬ ‫‪Khalid‬‬
‫‪4‬‬ ‫‪Karim‬‬

‫ﺑﻌﺪ ﺗﻨﻔﻴﺬ ﺍﻻﺳﺘﻌﻼﻡ ﺃﻋﻼﻩ‪ ،‬ﺳﺘﻜﻮﻥ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍ‪‬ﻠﻮﺑﺔ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬


‫‪FullName‬‬
‫‪Khalid‬‬
‫‪Ahmed‬‬
‫‪Karim‬‬

‫ﺟﻠﺐ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳌﺸﺎ‪‬ﺔ ‪:LIKE‬‬


‫ﻟﻌﻠﻚ ﺗﺘﺴﺎﺀﻝ ﻛﻴﻒ ﺗﻘﻮﻡ ﳏﺮﻛﺎﺕ ﺍﻟﺒﺤﺚ )ﻏﻮﻏﻞ ﻣﺜﻼ( ﲜﻠﺐ ﻧﺘﺎﺋﺞ ﻣﺸﺎ‪‬ﺔ ﻟﻠﻜﻠﻤﺔ ﺍﻟﱵ‬
‫ﺗﺒﺤﺚ ﻋﻨﻬﺎ‪ ،‬ﻓﻴﻤﺎ ﻳﻠﻲ ﺳﻨﺘﻌﺮﻑ ﻋﻠﻰ ﻛﻠﻤﺔ ﺗﻘﻮﻡ ﺑﻨﻔﺲ ﺍﻟﻌﻤﻞ‪ ،‬ﺇ‪‬ﺎ ﺍﻟﻜﻠﻤﺔ ‪.Like‬‬
‫ﻫﺬﺍ ﺍﳌﺜﺎﻝ ﻳﻘﻮﻡ ﲜﻠﺐ ﺍﳌﻮﻇﻔﲔ ﺍﻟﺬﻳﻦ ﻳﺒﺪﺃ ﺍﲰﻬﻢ ﲝﺮﻑ "‪:"M‬‬

‫* ‪SELECT‬‬
‫‪FROM Employee‬‬
‫'‪WHERE FullName like 'M%‬‬

‫‪69‬‬
‫ﺍﻻﺳﺘﻌﻼﻡ ﺃﻋﻼﻩ ﻳﻌﲏ ﺟﺮﺩ ﺍﳌﻮﻇﻔﲔ ﺍﻟﺬﻳﻦ ﻳﺒﺪﺃ ﺍﲰﻬﻢ ﲝﺮﻑ ‪ ،M‬ﻭﺭﻣﺰ ﺍﻟﻨﺴﺒﺔ ﺍﳌﺌﻮﻳﺔ ‪%‬‬

‫ﻳﻌﲏ ﻻ ﻳﻬﻤﻨﺎ ﻣﺎ ﻳﺄﰐ ﺑﻌﺪ ﺍﳊﺮﻑ ‪ ،M‬ﻭﻋﻠﻴﻪ ﻓﺎﻟﻨﺘﻴﺠﺔ ﺳﺘﻜﻮﻥ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬

‫ﻭﻫﺬﺍ ﻣﺜﺎﻝ ﺁﺧﺮ ﻳﻘﻮﻡ ﲜﻠﺐ ﺍﳌﻮﻇﻔﲔ ﺍﻟﺬﻳﻦ ﺗﻨﺘﻬﻲ ﺃﲰﺎﺅﻫﻢ ﲝﺮﻑ ﺑﺎﳊﺮﻑ "‪:"I‬‬
‫* ‪SELECT‬‬
‫‪FROM Employee‬‬
‫'‪WHERE FullName Like '%I‬‬

‫ﺍﻟﻨﺘﻴﺠﺔ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬

‫ﻭﻫﻨﺎ ﻣﺜﺎﻝ ﳉﻠﺐ ﺍﳌﻮﻇﻔﲔ ﺍﻟﺬﻳﻦ ﺗﻀﻢ ﺃﲰﺎﺅﻫﻢ ﺣﺮﻑ "‪:"N‬‬


‫* ‪SELECT‬‬
‫‪FROM Employee‬‬
‫'‪WHERE FullName Like '%N%‬‬

‫‪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‬‬

‫‪ ،BY‬ﻛﻤﺎ ﻳﻌﺮﺽ ﻫﺬﺍ ﺍﳌﺜﺎﻝ‪:‬‬

‫* ‪SELECT‬‬
‫‪FROM Employee‬‬
‫‪ORDER BY Age, Adress‬‬

‫ﺍﻟﺪﻭﺍﻝ ‪:Functions‬‬
‫ﺍﻟﺪﻭﺍﻝ ﻋﺒﺎﺭﺓ ﻋﻦ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻟﱪﺍﻣﺞ ﺍﳌﻨﺠﺰﺓ ﻣﺴﺒﻘﺎ‪ ،‬ﻭﺍﻟﱵ ﺗﺘﻴﺢ ﻟﻠﻤﺴﺘﺨﺪﻡ ﺑﻌﺾ‬
‫ﺍﳋﺪﻣﺎﺕ ﺍﻟﱵ ﺗﻐﻨﻴﻪ ﻋﻦ ﻛﺘﺎﺑﺘﻬﺎ ﺑﻮﺍﺳﻄﺔ ﺍﻷﻛﻮﺍﺩ‪ ،‬ﻣﻦ ﻗﺒﻴﻞ ﺍﻟﺪﻭﺍﻝ ﺍﻟﺮﻳﺎﺿﻴﺔ )ﺍ‪‬ﻤﻮﻉ‬
‫‪ ،Sum‬ﺍﳌﺘﻮﺳﻂ ‪ ،(.. ،Average‬ﺍﻟﱵ ﻗﺪ ﳛﺘﺎﺟﻬﺎ ﺍﳌﺴﺘﺨﺪﻡ‪.‬‬
‫ﺗﻮﻓﺮ ﻟﻐﺔ ‪ SQL‬ﳎﻤﻮﻋﺔ ﻛﺒﲑﺓ ﻣﻦ ﺍﻟﺪﻭﺍﻝ ﻹﳒﺎﺯ ﺑﻌﺾ ﺍﳌﻬﺎﻡ ﺍﻟﱵ ﳛﺘﺎﺟﻬﺎ ﺍﳌﺴﺘﺨﺪﻡ‪ ،‬ﰲ‬
‫ﻫﺬﺍ ﺍﳉﺰﺀ ﺳﻨﻮﺭﺩ ﺑﻌﺾ ﺍﻟﺪﻭﺍﻝ ﺍﻷﻛﺜﺮ ﺷﻴﻮﻋﺎ ﻭﺍﻟﱵ ﻗﺪ ﲢﺘﺎﺟﻬﺎ ﻣﺴﺘﻘﺒﻼ‪.‬‬

‫ﺍﻟﺪﻭﺍﻝ ﺍﻟﺘﺠﻤﻴﻌﻴﺔ ‪:Aggregate Functions‬‬

‫ﺍﻟﺪﺍﻟﺔ ‪:COUNT‬‬
‫ﻭﺗﻌﻴﺪ ﻟﻨﺎ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﻋﺪﺩ ﻋﻨﺎﺻﺮ ﺟﺪﻭﻝ ﻣﻌﲔ‪ ،‬ﻭﺻﻴﻐﺘﻬﺎ ﻫﻜﺬﺍ‪:‬‬
‫)*(‪SELECT COUNT‬‬
‫‪FROM Employee‬‬

‫‪72‬‬
‫ﺍﻟﻨﺘﻴﺠﺔ ﻋﺒﺎﺭﺓ ﻋﻦ ﻗﻴﻤﺔ ﺭﻗﻤﻴﺔ ﲤﺜﻞ ﻋﺪﺩ ﺍﻟﻌﻨﺎﺻﺮ ﺍﻟﱵ ﳚﻠﺒﻬﺎ ﺍﻻﺳﺘﻌﻼﻡ‪.‬‬

‫‪SUM‬‬ ‫ﺍﻟﺪﺍﻟﺔ‬
‫ﺗﻌﻴﺪ ﻟﻨﺎ ﺍﻟﺪﺍﻟﺔ ‪ ،SUM‬ﻗﻴﻤﺔ ﲤﺜﻞ ﳎﻤﻮﻉ ﻗﻴﻢ ﺍﳊﻘﻞ ﺍﻟﺮﻗﻤﻲ ﺍﶈﺪﺩ‪ ،‬ﻓﻤﺜﻼ ﻟﻮ ﺍﻓﺘﺮﺿﻨﺎ ﺃﻧﻪ‬
‫ﻟﺪﻳﻨﺎ ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ ﺍﻟﺘﺎﱄ‪:‬‬

‫‪ID‬‬ ‫‪Name‬‬ ‫‪Job‬‬ ‫‪Hours‬‬


‫‪1‬‬ ‫‪Mohamed‬‬ ‫‪Developper‬‬ ‫‪56‬‬
‫‪2‬‬ ‫‪Hamid‬‬ ‫‪Web Master‬‬ ‫‪45‬‬
‫‪3‬‬ ‫‪Younes‬‬ ‫‪Conceptor‬‬ ‫‪78‬‬
‫‪4‬‬ ‫‪Khalid‬‬ ‫‪Designer‬‬ ‫‪84‬‬
‫ﻟﻮ ﺃﺭﺩﻧﺎ ﻣﻌﺮﻓﺔ ﳎﻤﻮﻉ ﺍﻟﺴﺎﻋﺎﺕ ﺍﻟﱵ ﺍﺷﺘﻐﻠﻬﺎ ﻫﺆﻻﺀ ﺍﳌﻮﻇﻔﻮﻥ‪ ،‬ﻓﻌﻠﻴﻨﺎ ﺍﺳﺘﻌﻤﺎﻝ ﺍﻟﺪﺍﻟﺔ ‪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‬ﻭﲤﻜﻨﻨﺎ‬
‫ﻣﻦ ﲡﻤﻴﻊ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭﻓﻖ ﺣﻘﻞ ﻣﻌﲔ‪ ،‬ﻣﺜﻼ ﲢﺪﻳﺪ ﻋﺪﺩ ﺍﳌﻮﻇﻔﲔ ﺍﻟﻘﺎﻃﻨﲔ ﰲ ﻛﻞ ﻣﺪﻳﻨﺔ‪ ،‬ﺃﻭ‬
‫ﻋﺪﺩ ﺍﻟﺘﻼﻣﻴﺬ ﺍﻟﺬﻳﻦ ﻳﺪﺭﺳﻮﻥ ﰲ ﻛﻞ ﻓﺼﻞ‪...‬ﺇﱁ‪.‬‬

‫ﻭﺻﻴﻐﺘﻬﺎ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬


‫‪SELECT‬‬
‫' ﻋﺪد ﺳﻜﺎن ﻛﻞ ﻣﺪﯾﻨﺔ' ‪COUNT(Adress) as‬‬
‫‪FROM Employee‬‬
‫‪GROUP BY Adress‬‬

‫ﻭﻫﺬﺍ ﻣﺜﺎﻝ ﺗﻮﺿﻴﺤﻲ ﻻﺳﺘﻌﻤﺎﻝ ﺍﻟﻜﻠﻤﺔ ‪:GROUP BY‬‬


‫‪',‬اﻟﺴﻦ' ‪SELECT Age as‬‬
‫' ﻋﺪد اﻟﻤﻮﻇﻔﯿﻦ اﻟﺬﯾﻦ ﻟﮭﻢ ھﺬا اﻟﺴﻦ' ‪COUNT(Age) as‬‬
‫‪FROM Employee‬‬
‫‪GROUP BY Age‬‬

‫ﺑﻌﺪ ﺗﻨﻔﻴﺬ ﻫﺬﺍ ﺍﻻﺳﺘﻌﻼﻡ‪ ،‬ﺳﻨﺤﺼﻞ ﻋﻠﻰ ﺣﻘﻠﲔ‪ ،‬ﺍﻷﻭﻝ ﻳﻌﺮﺽ ﻛﻞ ﺍﻷﻋﻤﺎﺭ ﺍﳌﻮﺟﻮﺩﺓ ﰲ‬
‫ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ‪ ،‬ﻭﺍﳊﻘﻞ ﺍﻟﺜﺎﱐ ﻳﻌﺮﺽ ﻋﺪﺩ ﺍﳌﻮﻇﻔﲔ ﺍﻟﺬﻳﻦ ﻳﺒﻠﻐﻮﻥ ﻛﻞ ﻋﻤﺮ‪ ،‬ﻭﻋﻠﻴﻪ‬
‫ﻓﺎﻟﻨﺘﻴﺠﺔ ﺳﺘﻜﻮﻥ ﻫﻜﺬﺍ‪:‬‬

‫‪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‬‬

‫ﻗﻢ ﺑﺘﺠﺮﻳﺐ ﺍﳌﺜﺎﻝ ﻭﺗﺘﻌﺮﻑ ﻋﻠﻰ ﺍﻟﻜﻠﻤﺔ ‪ HAVING‬ﺃﻛﺜﺮ‪.‬‬

‫‪76‬‬
‫ﺍﻟﺪﻭﺍﻝ ﺍﳊﺴﺎﺑﻴﺔ ‪:Arithmetic Functions‬‬

‫‪ABS‬‬ ‫ﺍﻟﺪﺍﻟﺔ‬
‫ﺍﻟﺪﺍﻟﺔ ‪ ABS‬ﺗﻌﻴﺪ ﻟﻨﺎ ﺍﻟﻘﻴﻤﺔ ﺍﳌﻄﻠﻘﺔ ‪ Absolute Value‬ﻟﻠﺤﻘﻞ ﺍﶈﺪﺩ‪ ،‬ﻭﺻﻴﻐﺘﻬﺎ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬
‫)‪SELECT ABS(-67‬‬

‫ﻫﺬﺍ ﺍﳌﺜﺎﻝ ﺳﻨﺤﺼﻞ ﻋﻠﻰ ﺍﻟﻘﻴﻤﺔ ﺍﳌﻄﻠﻘﺔ ﻟﻠﺮﻗﻢ ‪ ،-67‬ﻭﻫﻲ ‪.67‬‬

‫‪SQRT‬‬ ‫ﺍﻟﺪﺍﻟﺔ‬
‫ﺗﻌﻴﺪ ﻟﻨﺎ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﻗﻴﻤﺔ ﺍﳉﺬﺭ ﺍﳌﺮﺑﻊ ﻟﻠﺮﻗﻢ ﺍﶈﺪﺩ‪ ،‬ﻭﺻﻴﻐﺘﻬﺎ ﻣﺜﻞ ﺍﻟﺪﻭﺍﻝ ﺍﻟﺴﺎﻟﻔﺔ‪.‬‬
‫ﻳﻮﺟﺪ ﺍﳌﺰﻳﺪ ﻣﻦ ﺍﻟﺪﻭﺍﻝ ﺍﻟﺮﻳﺎﺿﻴﺔ‪ ،‬ﻣﺎ ﺃﻭﺭﺩﻧﺎﻩ ﻟﻴﺲ ﻛﻞ ﺷﻲﺀ‪.‬‬

‫ﺍﻟﺪﻭﺍﻝ ﺍﻟﻨﺼﻴﺔ ‪:String Functions‬‬

‫‪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‬‬ ‫;)'‬

‫‪-- Remove Blanks From the left‬‬


‫'(‪SELECT LTRIM‬‬ ‫;)'‪Khalid‬‬

‫ﰲ ﺍﳊﺎﻟﺘﲔ ﻣﻌﺎ ﺳﺘﻜﻮﻥ ﺍﻟﻨﺘﻴﺠﺔ ﻋﺒﺎﺭﺓ ﻋﻦ ﺍﻟﻜﻠﻤﺔ "‪ "Khalid‬ﻣﻦ ﺩﻭﻥ ﻓﺮﺍﻏﺎﺕ‪.‬‬

‫‪LOWER‬‬ ‫ﺍﻟﺪﺍﻟﺘﺎﻥ ‪ UPPER‬ﻭ‬


‫ﺗﻘﻮﻡ ﻫﺎﺗﺎﻥ ﺍﻟﺪﺍﻟﺘﺎﻥ ﺑﺘﻐﻴﲑ ﺣﺎﻟﺔ ﺍﻟﻨﺼﻮﺹ‪ ،‬ﲝﻴﺚ ﲤﻜﻨﻨﺎ ﺍﻟﺪﺍﻟﺔ ‪ UPPER‬ﻣﻦ ﲢﻮﻳﻞ‬
‫ﺃﺣﺮﻑ ﺍﻟﻨﺺ ﺇﱃ ﺃﺣﺮﻑ ﻛﺒﲑﺓ ‪ ،Upper case‬ﻭﺑﺎﳌﻘﺎﺑﻞ ﲤﻜﻨﻨﺎ ﺍﻟﺪﺍﻟﺔ ‪ LOWER‬ﻣﻦ ﲢﻮﻳﻞ‬
‫ﺣﺎﻟﺔ ﺍﻷﺣﺮﻑ ﺇﱃ ﺣﺎﻟﺘﻬﺎ ﺍﻟﺼﻐﲑﺓ ‪ ،Lower case‬ﻭﺻﻴﻐﺔ ﺍﻟﺪﺍﻟﺘﲔ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬
‫‪-- Change Case To Upper case‬‬
‫;'‪SELECT UPPER('Khalid') AS 'UPPER Case‬‬

‫‪-- Change Case To Lower case‬‬


‫;'‪SELECT LOWER('Khalid') AS 'LOWER Case‬‬

‫ﻧﺘﻴﺠﺔ ﺍﻻﺳﺘﻌﻼﻡ ﺍﻷﻭﻝ ﺳﺘﻜﻮﻥ ﻫﻜﺬﺍ‪:‬‬

‫‪80‬‬
‫ﺑﻴﻨﻤﺎ ﺳﺘﻜﻮﻥ ﻧﺘﻴﺠﺔ ﺍﻻﺳﺘﻌﻼﻡ ﺍﻟﺜﺎﱐ ﻫﻜﺬﺍ‪:‬‬

‫‪CHARINDEX‬‬ ‫ﺍﻟﺪﺍﻟﺔ‬
‫ﺗﻌﻴﺪ ﻟﻨﺎ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﺭﺗﺒﺔ ﺍﳊﺮﻑ ﺃﻭ ﺍﻟﻨﺺ ﺍﶈﺪﺩ‪ ،‬ﻭﺻﻴﻐﺘﻬﺎ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬
‫;)'اﻟﻨﺺ اﻟﻜﺎﻣﻞ'‪',‬اﻟﺤﺮف أو اﻟﻨﺺ اﻟﻤﺮاد اﻟﺒﺤﺚ ﻋﻦ رﺗﺒﺘﮫ'(‪SELECT CHARINDEX‬‬

‫ﻭﻫﺬﺍ ﻣﺜﺎﻝ ﻻﺳﺘﻌﻤﺎﻝ ﺍﻟﺪﺍﻟﺔ ‪:CHARINDEX‬‬


‫‪SELECT FullName,‬‬
‫'"‪CHARINDEX('d',FullName) AS 'Position Of "d‬‬
‫‪FROM Employee‬‬

‫ﻳﻘﻮﻡ ﻫﺬﺍ ﺍﳌﺜﺎﻝ ﺑﺎﻟﺒﺤﺚ ﻋﻦ ﺭﺗﺒﺔ ﺍﳊﺮﻑ ‪ d‬ﰲ ﻛﻞ ﺍﻷﲰﺎﺀ‪ ،‬ﺳﺘﻜﻮﻥ ﻧﺘﻴﺠﺔ ﺍﻻﺳﺘﻌﻼﻡ ﻋﻠﻰ‬
‫ﻫﺬﺍ ﺍﻟﺸﻜﻞ‪:‬‬

‫‪LEN‬‬ ‫ﺍﻟﺪﺍﻟﺔ‬
‫ﺗﻌﻴﺪ ﻟﻨﺎ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﻃﻮﻝ ﺍﻟﻨﺺ ﺃﻭ ﺍﳊﻘﻞ ﺍﶈﺪﺩ‪ ،‬ﻭﺻﻴﻐﺘﻬﺎ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬
‫‪81‬‬
‫;)'‪SELECT LEN('Khalid‬‬

‫ﺍﻟﻨﺘﻴﺠﺔ ﻫﻲ ﻋﺪﺩ ﺍﻷﺣﺮﻑ ﺍﳌﻜﻮﻧﺔ ﻟﻠﻜﻠﻤﺔ ‪ ،Khalid‬ﻭﻫﺬﺍ ﻣﺜﺎﻝ ﻟﻠﺘﻮﺿﻴﺢ‪:‬‬


‫‪SELECT FullName,‬‬
‫'‪LEN(FullName) AS 'Length Of FullName‬‬
‫‪FROM Employee‬‬

‫ﰲ ﻫﺬﺍ ﺍﳌﺜﺎﻝ ﺳﺘﻜﻮﻥ ﺍﻟﻨﺘﻴﺠﺔ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬

‫ﺩﻭﺍﻝ ﺍﻟﺘﺎﺭﻳﺦ ‪:Date Functions‬‬


‫ﻗﺒﻞ ﺃﻥ ﻧﺒﺪﺃ ﺍﺳﺘﻌﺮﺍﺽ ﺩﻭﺍﻝ ﺍﻟﺘﺎﺭﻳﺦ‪ ،‬ﺳﻨﻘﻮﻡ ﺑﺈﺿﺎﻓﺔ ﺍﳊﻘﻞ ‪ Date_Of_Working‬ﺇﱃ‬
‫ﺍﳉﺪﻭﻝ ‪ ،Employee‬ﻧﻮﻉ ﻫﺬﺍ ﺍﳊﻘﻞ ﻫﻮ ‪ ،DateTime‬ﳝﻜﻨﻚ ﺇﺿﺎﻓﺘﻪ ﻳﺪﻭﻳﺎ ﻣﻦ ﺧﻼﻝ ﻧﺎﻓﺬﺓ‬
‫ﺇﺿﺎﻓﺔ ﺍﳊﻘﻮﻝ‪ ،‬ﺃﻭ ﻋﱪ ﺗﻨﻔﻴﺬ ﺍﻷﻣﺮ ﺍﻟﺘﺎﱄ‪:‬‬
‫‪ALTER TABLE Employee‬‬
‫‪Add Date_Of_Working DateTime‬‬

‫‪DATEADD‬‬ ‫ﺍﻟﺪﺍﻟﺔ‬
‫ﺍﻟﺪﺍﻟﺔ ‪ DATEADD‬ﺗﻘﻮﻡ ﺑﺈﺿﺎﻓﺔ ﻗﻴﻤﺔ ﺭﻗﻤﻴﺔ ﺇﱃ ﺟﺰﺀ ﻣﻦ ﺣﻘﻞ ﻣﻦ ﻧﻮﻉ ﺗﺎﺭﻳﺦ‪ ،‬ﻛﺈﺿﺎﻓﺔ‬
‫ﺑﻌﺾ ﺍﻷﻳﺎﻡ ﺃﻭ ﺍﻟﺸﻬﻮﺭ ﺃﻭ ﺍﻟﺴﻨﻮﺍﺕ ﺇﱃ ﺗﺎﺭﻳﺦ ﻣﻌﲔ‪ ،‬ﻭﺻﻴﻐﺔ ﺍﻟﺪﺍﻟﺔ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬

‫‪82‬‬
‫)‪DATEADD(Part_of_date, number, date‬‬

‫ﺍﳌﻌﺎﻣﻞ ﺍﻷﻭﻝ ‪ Part_of_date‬ﻳﺄﺧﺬ ﺇﺣﺪﻯ ﺍﻟﻘﻴﻢ ﺍﻟﺜﻼﺛﺔ‪:‬‬


‫‪ :Year ‬ﻹﺟﺮﺍﺀ ﺍﻹﺿﺎﻓﺔ ﻋﻠﻰ ﺍﳉﺰﺀ ﺍﳋﺎﺹ ﺑﺎﻟﺴﻨﻮﺍﺕ‪.‬‬
‫‪ :Month ‬ﻹﺟﺮﺍﺀ ﺍﻹﺿﺎﻓﺔ ﻋﻠﻰ ﺍﳉﺰﺀ ﺍﳋﺎﺹ ﺑﺎﻟﺸﻬﻮﺭ‪.‬‬
‫‪ :Day ‬ﻹﺟﺮﺍﺀ ﺍﻹﺿﺎﻓﺔ ﻋﻠﻰ ﺍﳉﺰﺀ ﺍﳋﺎﺹ ﺑﺎﻷﻳﺎﻡ‪.‬‬
‫ﺍﳌﻌﺎﻣﻞ ﺍﻟﺜﺎﱐ ‪ number‬ﻳﺄﺧﺬ ﺍﻟﻘﻴﻤﺔ ﺍﻟﺮﻗﻤﻴﺔ ﺍﳌﺮﺍﺩ ﺇﺿﺎﻓﺘﻬﺎ‪.‬‬
‫ﺍﳌﻌﺎﻣﻞ ﺍﻟﺜﺎﻟﺚ ‪ date‬ﻫﻮ ﺍﳊﻘﻞ ﺃﻭ ﺍﻟﻘﻴﻤﺔ ﺍﻟﺘﺎﺭﳜﻴﺔ ﺍﳌﺮﺍﺩ ﺇﺟﺮﺍﺀ ﺍﻹﺿﺎﻓﺔ ﺇﻟﻴﻬﺎ‪.‬‬
‫ﻭﻫﺬﺍ ﻣﺜﺎﻝ ﻻﺳﺘﻌﻤﺎﻝ ﺍﻟﺪﺍﻟﺔ ‪ DATEADD‬ﻋﻠﻰ ﺣﻘﻞ ﻣﻦ ﻧﻮﻉ ﺗﺎﺭﳜﻲ‪:‬‬
‫‪SELECT FullName,‬‬
‫‪Date_of_working as 'Date of working',‬‬
‫'‪DATEADD(year,3,Date_of_working) as 'Using DATADD‬‬
‫‪FROM Employee‬‬

‫ﺍﻻﺳﺘﻌﻼﻡ ﺃﻋﻼﻩ‪ ،‬ﻳﻘﻮﻡ ﲜﻠﺐ ﺃﲰﺎﺀ ﺍﳌﻮﻇﻔﲔ ﻭﺗﻮﺍﺭﻳﺦ ﺗﻮﻇﻴﻔﻬﻢ‪ ،‬ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﺣﻘﻞ ﺛﺎﻟﺚ‬
‫ﳛﺘﻮﻱ ﻋﻠﻰ ﺗﺎﺭﻳﺦ ﺍﺷﺘﻐﺎﳍﻢ ﺯﺍﺋﺪ ﺛﻼﺙ ﺳﻨﻮﺍﺕ‪ ،‬ﻭﻋﻠﻴﻪ ﻓﺈﻥ ﺍﻟﻨﺘﻴﺠﺔ ﺳﺘﻜﻮﻥ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬

‫ﺑﻨﻔﺲ ﺍﻟﻄﺮﻳﻘﺔ ﺗﺴﺘﻄﻴﻊ ﺇﺿﺎﻓﺔ ﺍﻷﻳﺎﻡ ﻭﺍﻷﺷﻬﺮ‪.‬‬

‫‪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‬‬

‫ﺗﺬﻛﲑ‬

‫ﺍﻻﲢﺎﺩ ‪ Union‬ﻫﻮ ﻋﻼﻗﺔ ﺗﺮﺑﻂ ﺑﲔ ﳎﻤﻮﻋﺘﲔ ﳍﻤﺎ ﻧﻔﺲ ﺍﳊﻘﻮﻝ ﻭﻧﻔﺲ ﺍﳋﺼﺎﺋﺺ‪،‬‬
‫ﻭﺗﻜﻮﻥ ﺍﻟﻨﺘﻴﺠﺔ ﻋﺒﺎﺭﺓ ﻋﻦ ﳎﻤﻮﻋﺔ ﺗﻀﻢ ﻛﻞ ﻋﻨﺎﺻﺮ ﺍ‪‬ﻤﻮﻋﺘﲔ‪ ،‬ﻭﻳﺮﻣﺰ ﳍﺎ ﺭﻳﺎﺿﻴﺎ‬
‫‪R1  R2‬‬ ‫ﻫﻜﺬﺍ‪:‬‬
‫ﻣﺜﺎﻝ ﻋﻦ ﻋﻤﻴﻠﺔ ﺍﻻﲢﺎﺩ‪:‬‬
‫ﻟﻨﻔﺘﺮﺽ ﺃﻥ ﻟﺪﻳﻨﺎ ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ ﻭﺟﺪﻭﻝ ﺭﺅﺳﺎﺀ ﺍ‪‬ﻤﻮﻋﺎﺕ‪ ،‬ﻭﳘﺎ ﺟﺪﻭﻻﻥ ﻣﺘﺸﺎ‪‬ﺎﻥ ﻣﻦ‬
‫ﺣﻴﺚ ﻋﺪﺩ ﻭ ﻧﻮﻉ ﺍﳊﻘﻮﻝ‪ .‬ﻋﻤﻠﻴﺔ ﺍﲢﺎﺩ ﺍﳉﺪﻭﻟﲔ ﺳﺘﻔﺮﺯ ﻟﻨﺎ ﺟﺪﻭﻻ ﺛﺎﻟﺜﺎ ﻳﻀﻢ ﻛﻞ ﺍﻟﻌﻨﺎﺻﺮ‬
‫ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺍﳉﺪﻭﻟﲔ‪ ،‬ﻭﳝﻜﻨﻨﺎ ﺍﻟﺘﻌﺒﲑ ﻋﻦ ﻋﻤﻠﻴﺔ ﺍﻻﲢﺎﺩ ﺑﻠﻐﺔ ‪ SQL‬ﺑﺎﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ‪:‬‬
‫‪SELECT Id, FullName FROM Employee‬‬
‫‪UNION‬‬
‫‪SELECT Id, FullName FROM Director‬‬

‫‪90‬‬
‫ﺑﻌﺪ ﺗﻨﻔﻴﺬ ﺍﻷﻣﺮ ﺃﻋﻼﻩ‪ ،‬ﺳﻨﺤﺼﻞ ﻋﻠﻰ ﺟﺪﻭﻝ ﻳﻀﻢ ﺃﺭﻗﺎﻡ ﻭﺃﲰﺎﺀ ﻛﻞ ﻣﻦ ﺍﳌﻮﻇﻔﲔ‬
‫ﻭﺍﻟﺮﺅﺳﺎﺀ‪.‬‬

‫)‪: (‬‬ ‫‪Intersection‬‬ ‫ﺍﻟﺘﻘﺎﻃﻊ‬

‫ﺗﺬﻛﲑ‬

‫ﺍﻟﺘﻘ ﺎﻃﻊ ﻫﻮ ﻧﺎﺗﺞ ﺭﺑﻂ ﺟﺪﻭﻟﲔ ﳍﻤﺎ ﻧﻔﺲ ﻋﺪﺩ ﺍﳊﻘﻮﻝ‪ ،‬ﻭﻧﻔﺲ ﺍﻟﺒﻨﻴﺔ‪ ،‬ﻭﻳﺮﻣﺰ ﻟﻪ ﺭﻳﺎﺿﻴﺎ‬
‫‪R1 ‬ﻭﻫﻮ ﻳﻀﻢ ﺍﻟﻌﻨﺎﺻﺮ ﺍﳌﺸﺘﺮﻛﺔ ﺑﲔ ﺟﺪﻭﻟﲔ‪.‬‬ ‫‪R2‬‬ ‫‪‬ﺬﺍ ﺍﻟﺮﻣﺰ‬

‫ﻣﺜﺎﻝ ﻋﻦ ﻋﻤﻴﻠﺔ ﺍﻟﺘﻘﺎﻃﻊ‪:‬‬


‫ﻣﻦ ﻧﻔﺲ ﺍﳌﺜﺎﻝ ﺍﻟﺴﺎﺑﻖ‪ ،‬ﻧﺮﻳﺪ ﺍﺳﺘﺨﺮﺍﺝ ﺟﺪﻭﻝ ﻳﻌﺮﺽ ﻟﻨﺎ ﺍﻷﲰﺎﺀ ﺍﳌﺸﺘﺮﻛﺔ ﺑﲔ ﺟﺪﻭﻟﲔ‪،‬‬
‫ﻭﻃﺮﻳﻘﺔ ﻋﻤﻞ ﺫﻟﻚ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬
‫‪SELECT FullName FROM Employee‬‬
‫‪INTERSECT‬‬
‫‪SELECT FullName FROM Director‬‬

‫ﻧﺘﻴﺠﺔ ﺍﻷﻣﺮ ﺃﻋﻼﻩ‪ ،‬ﻋﺒﺎﺭﺓ ﻋﻦ ﺟﺪﻭﻝ ﻳﻀﻢ ﺍﻷﲰﺎﺀ ﺍﳌﺸﺘﺮﻛﺔ ﺑﲔ ﺍﳉﺪﻭﻟﲔ‪ ،‬ﻣﺜﻼ ﻟﻮ ﻫﻨﺎﻙ‬
‫ﻣﻮﻇﻒ ﺍﲰﻪ "ﻛﺮﱘ" ﻭﰲ ﺟﺪﻭﻝ ﺍﻟﺮﺅﺳﺎﺀ ﻳﻮﺟﺪ ﺭﺋﻴﺲ ‪‬ﺬﺍ ﺍﻹﺳﻢ‪ ،‬ﺳﻴﻈﻬﺮ ﰲ ﺍﻟﻨﺘﻴﺠﺔ‪.‬‬

‫‪91‬‬
‫ﺍﻻﺧﺘﻼﻑ ‪:(-) Difference‬‬

‫ﺗﺬﻛﲑ‬

‫ﺍﻻﺧﺘﻼﻑ ﻫﻮ ﺍﻟﻔﺎﺭﻕ ﺍﻟﻨﺎﺗﺞ ﻋﻦ ﻃﺮﺡ ﳎﻤﻮﻋﺔ ﻣﻦ ﳎﻤﻮﻋﺔ ﺃﺧﺮﻯ‪ ،‬ﻭﻳﺸﺘﺮﻁ ﺃﻥ ﻳﻜﻮﻥ‬


‫ﻟﻠﻤﺠﻤﻮﻋﺘﲔ )ﺍﳉﺪﻭﻟﲔ( ﻧﻔﺲ ﺍﻟﺒﻨﻴﺔ ﻭﻧﻔﺲ ﺍﳊﻘﻮﻝ‪.‬‬

‫ﻣﺜﺎﻝ ﻋﻦ ﻋﻤﻴﻠﺔ ﺍﻻﺧﺘﻼﻑ‪:‬‬


‫ﺩﺍﺋﻤﺎ ﻣﻊ ﻧﻔﺲ ﺍﳌﺜﺎﻝ‪ ،‬ﺳﻨﻘﻮﻡ ﲜﻠﺐ ﺃﲰﺎﺀ ﺍﳌﻮﻇﻔﲔ ﺍﻟﻐﲑ ﻣﻮﺟﻮﺩﺓ ﰲ ﺟﺪﻭﻝ ﺍﻟﺮﺅﺳﺎﺀ‪،‬‬
‫ﻭﳝﻜﻨﻨﺎ ﺍﻻﺻﻄﻼﺡ ﻋﻠﻴﻬﺎ ﺭﻳﺎﺿﻴﺎ ‪‬ﺬﺍ ﺍﻟﺸﻜﻞ‪:‬‬

‫‪Result=Employee-Director‬‬

‫ﺗﺮﲨﺔ ﻫﺬﻩ ﺍﻟﺼﻴﻐﺔ ﺇﱃ ﻟﻐﺔ ‪ SQL‬ﻳﻌﻄﻴﻨﺎ ﺍﻷﻣﺮ ﺍﻟﺘﺎﱄ‪:‬‬


‫‪SELECT FullName FROM Employee‬‬
‫‪WHERE FullName NOT IN‬‬
‫)‪(SELECT FullName FROM Director‬‬

‫ﻗﻢ ﺑﺘﺠﺮﻳﺐ ﻣﺜﺎﻝ ﺁﺧﺮ ﻣﻦ ﻧﺴﺞ ﺃﻓﻜﺎﺭﻙ‪ ،‬ﺟﺮﺏ ﺍﺳﺘﻌﻤﺎﻝ ‪ IN‬ﻟﻮﺣﺪﻫﺎ ﻟﺘﺘﻌﺮﻑ ﻋﻠﻰ ﺩﻭﺭ ﻫﺬﻩ‬
‫ﺍﻟﻜﻠﻤﺔ‪.‬‬

‫‪92‬‬
‫ﻛﻤﺎ ﳝﻜﻨﻨﺎ ﺍﻟﻘﻴﺎﻡ ﺑﻌﻤﻠﻴﺔ ﺍﻹﺧﺘﻼﻑ ﺑﻜﻞ ﺑﺴﺎﻃﺔ ﻋﻦ ﻃﺮﻳﻖ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﻜﻠﻤﺔ ‪،Except‬‬
‫ﻭﺻﻴﻐﺔ ﺍﺳﺘﻌﻤﺎﳍﺎ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬

‫‪SELECT‬‬ ‫‪FullName FROM Employee‬‬


‫‪EXCEPT‬‬
‫‪SELECT‬‬ ‫‪FullName FROM Director‬‬

‫ﺳﻨﺤﺼﻞ ﻋﻠﻰ ﻧﻔﺲ ﺍﻟﻨﺘﻴﺠﺔ ﺍﻷﻭﱃ‪.‬‬

‫ﺍﻻﻧﺘﻘﺎﺀ ‪:(σ) Selection‬‬

‫ﺗﺬﻛﲑ‬

‫ﻣﻌﻴﻨﺔ‪.‬‬ ‫ﻭﺗﻌﲏ ﺍﻧﺘﻘﺎﺀ ﺑﻌﺾ ﺍﻟﻌﻨﺎﺻﺮ‪/‬ﺍﻷﺳﻄﺮ ‪ Rows‬ﻣﻦ ﳎﻤﻮﻋﺔ‬

‫ﻣﺜﺎﻝ ﻋﻦ ﻋﻤﻴﻠﺔ ﺍﻻﻧﺘﻘﺎﺀ‪:‬‬


‫ﻫﺬﻩ ﻫﻲ ﻋﻤﻠﻴﺔ ‪ Select‬ﺍﻟﱵ ﺭﺃﻳﻨﺎﻫﺎ ﻃﻴﻠﺔ ﺍﻟﻔﺼﻮﻝ‪ ،‬ﻭﻣﻦ ﺑﺎﺏ ﺍﻹﻧﺼﺎﻑ ﺳﻨﻌﻄﻲ ﳍﺎ ﻣﺜﺎﻻ‬
‫ﺃﻳﻀﺎ‬
‫ﺗﻄﺒﻴﻖ ﻋﻤﻠﻴﺔ ﺍﻻﻧﺘﻘﺎﺀ ﻋﻠﻰ ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ‪ ،‬ﺗﻌﲏ ﺟﻠﺐ ﺑﻴﺎﻧﺎﺕ ﻛﻞ ﺍﳌﻮﻇﻔﲔ‪ ،‬ﻭﳝﻜﻨﻨﺎ‬
‫ﻛﺘﺎﺑﺘﻬﺎ ﻫﻜﺬﺍ‪:‬‬
‫‪SELECT‬‬ ‫‪* FROM Employee‬‬

‫‪93‬‬
‫ﺍﻻﺳﻘﺎﻁ ‪:(π) Projection‬‬

‫ﺗﺬﻛﲑ‬

‫‪Columns‬‬ ‫ﺍﻟﻔﺮﻕ ﺑﻴﻨﻪ ﻭﺑﲔ ﺍﻻﻧﺘﻘﺎﺀ ﻫﻮ ﻛﻮﻥ ﺍﻻﺳﻘﺎﻁ ﻳﻜﻮﻥ ﺑﻐﺮﺽ ﺍﻧﺘﻘﺎﺀ ﺍﻷﻋﻤﺪﺓ‬
‫ﺍﻷﺳﻄﺮ‪.‬‬ ‫ﻭﻟﻴﺲ‬
‫ﻣﺜﺎﻝ ﻋﻦ ﻋﻤﻴﻠﺔ ﺍﻻﺳﻘﺎﻁ‪:‬‬
‫ﺗﻄﺒﻴﻖ ﻋﻤﻠﻴﺔ ﺍﻹﺳﻘﺎﻁ ﻋﻠﻰ ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ ﻳﻌﲏ ﺇﻇﻬﺎﺭ ﺑﻌﺾ ﺍﳊﻘﻮﻝ ﻓﻘﻂ‪ ،‬ﻣﺜﻼ ‪:‬‬
‫‪SELECT‬‬ ‫‪FullName, Adress FROM Employee‬‬

‫ﺍﻷﻣﺮ ﺃﻋﻼ ﺳﻴﻘﻮﻡ ﺑﺈﻇﻬﺎﺭ ﺃﲰﺎﺀ ﻭﻋﻨﺎﻭﻳﻦ ﺍﳌﻮﻇﻔﲔ ﻓﻘﻂ‪.‬‬

‫ﺍﳉﺪﺍﺀ ﺍﻟﺪﻳﻜﺎﺭﰐ )×(‪:‬‬

‫ﺗﺬﻛﲑ‬

‫ﻭﻳﻜﻮﻥ ﺍﻟﻨﺎﺗﺞ ﻋﻦ ﻫﺬﻩ ﺍﻟﻌﻤﻠﻴﺔ ﻋﺒﺎﺭﺓ ﻋﻦ ﳎﻤﻮﻋﺔ ﺟﺪﻳﺪﺓ‪ ،‬ﺗﻀﻢ ﺧﺎﺭﺝ ﺟﺪﺍﺀ ﻛﻞ‬
‫ﺍﻷﺧﺮﻯ‪.‬‬ ‫ﻋﻨﺼﺮ ﻣﻦ ﺍ‪‬ﻤﻮﻋﺘﲔ ﺑﺒﺎﻗﻲ ﻋﻨﺎﺻﺮ ﺍ‪‬ﻤﻮﻋﺔ‬

‫‪94‬‬
‫ﻣﺜﺎﻝ ﻋﻦ ﻋﻤﻴﻠﺔ ﺍﳉﺪﺍﺀ ﺍﻟﺪﻳﻜﺎﺭﰐ‪:‬‬
‫ﻟﻨﻔﺘﺮﺽ ﺃﻥ ﻟﺪﻳﻨﺎ ﺟﺪﻭﻝ ﻟﻠﺴﻴﺎﺭﺍﺕ ﻳﻀﻢ ﺃﺭﻗﺎﻡ ﻭﺃﻧﻮﺍﻉ ﺍﻟﺴﻴﺎﺭﺍﺕ‪ ،‬ﻭﺟﺪﻭﻝ ﺛﺎﻥ ﻳﻀﻢ ﺧﺼﺎﺋﺺ‬
‫ﺍﻟﺴﻴﺎﺭﺍﺕ‪ ،‬ﻭﳛﺘﻮﻱ ﻋﻠﻰ ﺍﻟﻠﻮﻥ ﻭﺍﻟﺜﻤﻦ‪ ،‬ﻛﻤﺎ ﻳﻠﻲ‪:‬‬

‫ﺟﺪﻭﻝ ﺍﻟﺴﻴﺎﺭﺍﺕ ‪:Car‬‬


‫‪ID‬‬ ‫‪Model‬‬
‫‪1‬‬ ‫‪Mercedes‬‬

‫‪2‬‬ ‫‪Ferrari‬‬

‫ﺟﺪﻭﻝ ﺍﳋﺼﺎﺋﺺ ‪:Descrip‬‬


‫‪Color‬‬ ‫‪Price‬‬
‫‪Black‬‬ ‫‪3 000 000‬‬

‫‪Red‬‬ ‫‪7 000 000‬‬

‫ﺗﻄﺒﻴﻖ ﺍﳉﺪﺍﺀ ﺍﻟﺪﻳﻜﺎﺭﰐ ﻋﻠﻰ ﺍﳉﺪﻭﻟﲔ‪ ،‬ﻳﻌﲏ ﺍﳊﺼﻮﻝ ﻋﻠﻰ ﺟﺪﻭﻝ ﺛﺎﻟﺚ ﻳﻀﻢ ﻛﻞ‬
‫ﺍﻻﺣﺘﻤﺎﻻﺕ ﺍﳌﻤﻜﻨﺔ‪ ،‬ﺃﻱ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬
‫‪ID‬‬ ‫‪Model‬‬ ‫‪Color‬‬ ‫‪Price‬‬
‫‪1‬‬ ‫‪Mercedes‬‬ ‫‪Black‬‬ ‫‪3 000 000‬‬

‫‪1‬‬ ‫‪Mercedes‬‬ ‫‪Red‬‬ ‫‪7 000 000‬‬

‫‪2‬‬ ‫‪Ferrari‬‬ ‫‪Black‬‬ ‫‪3 000 000‬‬

‫‪2‬‬ ‫‪Ferrari‬‬ ‫‪Red‬‬ ‫‪7 000 000‬‬

‫‪95‬‬
‫ﻭﳝﻜﻨﻨﺎ ﺇﳒﺎﺯ ﻫﺬﺍ ﺍﻷﻣﺮ ﰲ ﻟﻐﺔ ‪ SQL‬ﺑﺎﻟﻄﺮﻳﻘﺔ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬
‫‪SELECT Car.ID, Car.Model,‬‬
‫‪Descrip.Color, Descrip.Price‬‬
‫‪FROM Car, Descrip ORDER BY Car.ID‬‬

‫ﺃﻭ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﻜﻠﻤﺔ ‪:Cross Join‬‬


‫‪SELECT Car.ID, Car.Model,‬‬
‫‪Descrip.Color, Descrip.Price‬‬
‫‪FROM Car‬‬
‫‪CROSS JOIN Descrip ORDER BY Car.ID‬‬

‫ﻗﻢ ﺑﺘﺠﺮﻳﺐ ﺃﻣﺜﻠﺔ ﻣﻦ ﺍﺑﺘﻜﺎﺭﻙ ﻟﺘﺘﻌﺮﻑ ﺃﻛﺜﺮ ﻋﻠﻰ ﺍﳉﺪﺍﺀ ﺍﻟﺪﻳﻜﺎﺭﰐ‪.‬‬

‫ﺍﻟﻘﺴﻤﺔ ‪:(÷) Division‬‬

‫ﺗﺬﻛﲑ‬

‫ﻭﻳﻌﲏ ﻗﺴﻤﺔ ﺟﺪﻭﻝ ﻋﻠﻰ ﺟﺪﻭﻝ ﺁﺧﺮ‪ ،‬ﺑﺸﺮﻁ ﺃﻥ ﺗﻜﻮﻥ ﺣﻘﻮﻝ ﺍﳉﺪﻭﻝ ﺍﻟﺜﺎﱐ ﻣﺘﻮﺍﺟﺪﺓ‬
‫ﰲ ﺍﳉﺪﻭﻝ ﺍﻷﻭﻝ‪ ،‬ﻭ ﻳﺮﻣﺰ ﳍﺎ ﰲ ﺍﻟﺮﻳﺎﺿﻴﺎﺕ ﺏ ÷‪ ،‬ﻭﺗﻜﻮﻥ ﺍﻟﻨﺘﻴﺠﺔ ﻋﺒﺎﺭﺓ ﻋﻦ ﺟﺪﻭﻝ‬
‫ﻳﻀﻢ ﻋﻨﺎﺻﺮ ﺍﳉﺪﻭﻝ ﺍﻷﻭﻝ ﺍﻟﱵ ﺗﻀﻢ ﻛﻞ ﻋﻨﺎﺻﺮ ﺍﳉﺪﻭﻝ ﺍﻟﺜﺎﱐ‪ ،‬ﻭﺻﻴﻐﺘﻬﺎ ﺍﻟﺮﻳﺎﺿﻴﺔ‬
‫ﻫﻜﺬﺍ ‪R3=R1÷R2‬‬

‫ﻣﺜﺎﻝ ﻋﻦ ﻋﻤﻴﻠﺔ ﺍﻟﻘﺴﻤﺔ‪:‬‬


‫ﻟﻨﻔﺘﺮﺽ ﺃﻥ ﻟﺪﻳﻨﺎ ﺟﺪﻭﻝ ﻟﻠﻤﱪﳎﲔ ﻭﺃﺭﻗﺎﻡ ﺍﳌﺸﺎﺭﻳﻊ ﺍﻟﱵ ﺷﺎﺭﻛﻮﺍ ﰲ ﺇﳒﺎﺯﻫﺎ‪:‬‬

‫‪96‬‬
‫‪Developer‬‬ ‫‪Project_ID‬‬
‫‪Ahmed Ismaîl‬‬ ‫‪1‬‬
‫‪Younes Khalifa‬‬ ‫‪2‬‬
‫‪Ahmed Ismaîl‬‬ ‫‪2‬‬
‫‪Rachid Kamal‬‬ ‫‪1‬‬
‫‪Younes Khalifa‬‬ ‫‪1‬‬

‫ﻭﻣﻦ ﺟﻬﺔ ﺃﺧﺮﻯ ﻟﺪﻳﻨﺎ ﺟﺪﻭﻝ ﺍﳌﺸﺎﺭﻳﻊ‪:‬‬


‫‪Project_ID‬‬ ‫‪Project_Description‬‬
‫‪1‬‬ ‫‪Inventory System‬‬
‫‪2‬‬ ‫‪Library Management‬‬
‫ﻧﺮﻳﺪ ﻋﺮﺽ ﺍﳌﱪﳎﲔ ﺍﻟﺬﻳﻦ ﺷﺎﺭﻛﻮﺍ ﰲ ﻛﻞ ﺍﳌﺸﺎﺭﻳﻊ‪ ،‬ﻟﻠﻘﻴﺎﻡ ﺑﺬﻟﻚ ﺳﻨﻨﺠﺰ ﻋﻤﻠﻴﺔ ﻗﺴﻤﺔ‬
‫ﺟﺪﻭﻝ ﺍﳌﱪﳎﲔ ﻋﻠﻰ ﺟﺪﻭﻝ ﺍﳌﺸﺎﺭﻳﻊ‪ ،‬ﻭﺍﻟﻨﺘﻴﺠﺔ ﻫﻲ ﺃﲰﺎﺀ ﺍﳌﱪﳎﲔ ﺍﻟﺬﻳﻦ ﺷﺎﺭﻛﻮﺍ ﰲ ﻛﻞ‬
‫ﺍﳌﺸﺎﺭﻳﻊ‪.‬‬
‫ﺃﻱ ﺃﻥ ﺍﻟﻨﺘﻴﺠﺔ ﺳﺘﻜﻮﻥ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬
‫‪Developer‬‬
‫‪Ahmed Ismaîl‬‬
‫‪Younes Khalifa‬‬

‫ﻹﺟﺮﺍﺀ ﻋﻤﻠﻴﺔ ﺍﻟﻘﺴﻤﺔ ﺑﻮﺍﺳﻄﺔ ‪ ،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‬‬

‫ﺭﲟﺎ ﺗﺴﺘﻄﻴﻊ ﻛﺘﺎﺑﺔ ﺻﻴﻐﺔ ﺃﺧﺮﻯ ﺃﺳﻬﻞ ﻣﻦ ﻫﺬﻩ ﻭﺫﻟﻚ ﺣﺴﺐ ﻗﺪﺭﺗﻚ ﺍﻟﻔﻜﺮﻳﺔ‪ ،‬ﳍﺬﺍ ﺿﻊ‬
‫ﻧﺼﺐ ﻋﻴﻨﻴﻚ ﺍﻟﻨﺘﻴﺠﺔ‪ ،‬ﻭﻓﻜﺮ ﰲ ﻃﺮﻳﻘﺔ ﺫﻛﻴﺔ ﻟﻠﻮﺻﻮﻝ ﺇﻟﻴﻬﺎ‪.‬‬

‫ﺍﻟﺮﺑﻂ ‪:( ) Join‬‬

‫ﺗﺬﻛﲑ‬
‫ﻭﻳﻘﺘﻀﻲ ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺟﺪﻭﻻﻥ ﳍﻤﺎ ﺣﻘﻞ ﻣﺸﺘﺮﻙ ﻣﻦ ﻧﻔﺲ ﺍﻟﻨﻮﻉ‪ ،‬ﻭﻳﺴﺘﻌﻤﻞ‬
‫ﺑﻐﺮﺽ ﺍﻟﺒﺤﺚ ﻋﻦ ﺍﻟﻌﻨﺎﺻﺮ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺍﳉﺪﻭﻟﲔ ﻣﻦ ﺧﻼﻝ ﲢﻘﻖ ﺷﺮﻁ ﻭﺟﻮﺩ ﺍﳊﻘﻞ‬
‫ﺍﳌﺸﺘﺮﻙ ﺑﻨﻔﺲ ﺍﻟﻘﻴﻤﺔ ﰲ ﺍﳉﺪﻭﻟﲔ‪ ،‬ﻭﻳﺮﻣﺰ ﻟﻪ ﺭﻳﺎﺿﻴﺎ ﺑﺎﻟﺮﻣﺰ ﺍﻟﺘﺎﱄ‬

‫ﻣﺜﺎﻝ ﻋﻦ ﻋﻤﻴﻠﺔ ﺍﻟﺮﺑﻂ‪:‬‬


‫ﻟﻨﻔﺘﺮﺽ ﺃﻥ ﻟﺪﻳﻨﺎ ﺟﺪﻭﻝ ﺍ‪‬ﻤﻮﻋﺎﺕ ﺑﺎﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ‪:‬‬

‫‪98‬‬
‫‪Group_ID‬‬ ‫‪Group_Name‬‬
‫‪1‬‬ ‫‪Group 1‬‬
‫‪2‬‬ ‫‪Group 2‬‬
‫‪3‬‬ ‫‪Group 3‬‬

‫ﻭﻟﺪﻳﻨﺎ ﺟﺪﻭﻝ ﺍﻷﻋﻀﺎﺀ ﺑﺎﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ‪:‬‬


‫‪Member‬‬ ‫‪Group_ID‬‬
‫‪Khalid Ahmed‬‬ ‫‪1‬‬
‫‪Hamid MAKBOUL‬‬ ‫‪2‬‬
‫‪NABIL ZAKI‬‬ ‫‪1‬‬
‫‪Saîd Morad‬‬ ‫‪8‬‬

‫ﻋﻤﻴﻠﺔ ﺍﻟﺮﺑﻂ ﺑﲔ ﺍﳉﺪﻭﻟﲔ ﺳﺘﺘﻢ ﻣﻦ ﺧﻼﻝ ﺍﳊﻘﻞ ‪ 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‬‬

‫ﰲ ﺍﳌﺜﺎﻝ ﺃﻋﻼﻩ ﻗﻤﻨﺎ ﺑﺎﻹﻋﻼﻥ ﻋﻦ ﻣﺘﻐﲑ ﺭﻗﻤﻲ ﺍﲰﻪ ‪.@myVariable‬‬

‫ﺇﻋﻄﺎﺀ ﻗﻴﻤﺔ ﻟﻠﻤﺘﻐﲑ‪:‬‬


‫ﻹﻋﻄﺎﺀ ﻗﻴﻤﺔ ﻟﻠﻤﺘﻐﲑ‪ ،‬ﻫﻨﺎﻙ ﻃﺮﻳﻘﺘﺎﻥ‪.‬‬
‫ﺍﻟﻄﺮﻳﻘﺔ ﺍﻷﻭﱃ‪:‬‬
‫‪SET @myVariable=4‬‬

‫ﺍﻟﻄﺮﻳﻘﺔ ﺍﻟﺜﺎﻧﻴﺔ‪:‬‬
‫‪SELECT @myVariable=4‬‬

‫‪102‬‬
‫ﺑﺈﻣﻜﺎﻧﻨﺎ ﺇﻋﻄﺎﺀ ﻗﻴﻤﺔ ﺇﺣﺪﻯ ﺣﻘﻮﻝ ﺟﺪﻭﻝ ﻣﺎ ﳌﺘﻐﲑ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬
‫)‪SELECT @myVariable=(SELECT Age FROM Employee WHERE ID=3‬‬

‫ﺇﻇﻬﺎﺭ ﻗﻴﻤﺔ ﻣﺘﻐﲑ‪:‬‬


‫ﻟﻄﺒﺎﻋﺔ ﻗﻴﻤﺔ ﺍﳌﺘﻐﲑ‪ ،‬ﻧﺴﺘﺨﺪﻡ ﺍﻟﻜﻠﻤﺔ ‪ ،PRINT‬ﻛﻤﺎ ﻳﻠﻲ‪:‬‬
‫)‪DECLARE @myName varchar(20‬‬

‫'‪SELECT @myName='Khalid‬‬

‫‪PRINT 'My name is: '+@myName‬‬

‫ﺳﺘﻜﻮﻥ ﺍﻟﻨﺘﻴﺠﺔ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬

‫ﺍﻷﻣﺮ ‪:RETURN‬‬
‫ﻳﺴﺘﺨﺪﻡ ﻟﻠﺨﺮﻭﺝ ﻣﻦ ﻋﻤﻠﻴﺔ ﻣﻌﻴﻨﺔ‪ ،‬ﺃﻭ ﻹﻳﻘﺎﻑ ﺍﻟﱪﻧﺎﻣﺞ‪.‬‬

‫ﺍﻟﺒﻨﻴﺔ ﺍﻟﺸﺮﻃﻴﺔ ‪:IF…ELSE‬‬


‫ﺗﺴﺘﺨﺪﻡ ﻣﻦ ﺃﺟﻞ ﺍﻟﺘﺤﻘﻖ ﻣﻦ ﺷﺮﻁ ﻣﻌﲔ‪ ،‬ﻭﺻﻴﻐﺘﻬﺎ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬

‫‪103‬‬
‫)‪IF (Conditon‬‬
‫‪BEGIN‬‬
‫‪--Do Something‬‬
‫‪END‬‬
‫‪ELSE‬‬
‫‪BEGIN‬‬
‫‪--Do Something‬‬
‫‪END‬‬

‫ﺍﻵﻥ ﺳﻨﻘﻮﻡ ﺑﺈﳒﺎﺯ ﻣﺜﺎﻝ ﻋﻤﻠﻲ‪ ،‬ﻧﺴﺘﻮﻋﺐ ﻣﻦ ﺧﻼﻟﻪ ﻫﺬﻩ ﺍﳌﻔﺎﻫﻴﻢ‪.‬‬


‫‪DECLARE @Count INT‬‬

‫)‪SET @Count=(SELECT COUNT(*) FROM Employee‬‬

‫)‪IF (@Count>3‬‬

‫;'‪PRINT 'Count is more then 3 Employees‬‬

‫‪ELSE‬‬

‫;'‪PRINT 'Count is less then 3 Employees‬‬

‫ﻗﻤﻨﺎ ﺑﺎﻹﻋﻼﻥ ﻋﻦ ﻣﺘﻐﲑ ﺭﻗﻤﻲ ﺍﲰﻪ ‪ ،@Count‬ﰒ ﺃﻋﻄﻴﻨﺎﻩ ﻋﺪﺩ ﻋﻨﺎﺻﺮ ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ‬
‫ﻛﻘﻴﻤﺔ‪ ،‬ﺑﻌﺪﻫﺎ ﲢﻘﻘﻨﺎ ﻣﻦ ﻫﺬﻩ ﺍﻟﻘﻴﻤﺔ‪ ،‬ﺇﻥ ﻛﺎﻧﺖ ﺃﻛﱪ ﻣﻦ ‪ ،3‬ﺃﻇﻬﺮﻧﺎ ﺭﺳﺎﻟﺔ ﺑﺄﻥ ﻋﺪﺩ ﻋﻨﺎﺻﺮ‬
‫ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ ﺃﻛﱪ ﻣﻦ ﺛﻼﺛﺔ‪ ،‬ﻭﺇﻥ ﻛﺎﻥ ﺍﻟﻌﻜﺲ ﺃﻇﻬﺮﻧﺎ ﺭﺳﺎﻟﺔ ﻣﻔﺎﺩﻫﺎ ﺑﺄﻥ ﺍﻟﻌﺪﺩ ﺃﻗﻞ ﻣﻦ ‪.3‬‬

‫‪104‬‬
:Case ‫ﺍﻟﺒﻨﻴﺔ ﺍﻟﺸﺮﻃﻴﺔ ﺑﺎﺳﺘﺨﺪﺍﻡ‬
:‫ﺻﻴﻐﺘﻬﺎ ﻛﻤﺎ ﻳﻠﻲ‬
CASE

WHEN Condition1 THEN Result1

WHEN Condition2 THEN Result2

ELSE ResultN

END

‫ ﰒ ﻧﻈﻬﺮ ﺃﻣﺎ ﻛﻞ ﻣﻮﻇﻒ ﺭﺳﺎﻟﺔ‬،‫ ﻭﻧﺘﺤﻘﻖ ﻣﻦ ﻋﻤﺮ ﻛﻞ ﻣﻮﻇﻒ‬،‫ﺳﻨﻘﻮﻡ ﲜﻠﺐ ﺑﻴﺎﻧﺎﺕ ﺍﳌﻮﻇﻔﲔ‬
:‫ﺣﺴﺐ ﻋﻤﺮﻩ‬

SELECT ID, Fullname, 'Message'=CASE

When Age>20 then

'You are adult'

Else

'You are young'

End

From Employee

:‫ﺳﺘﻜﻮﻥ ﺍﻟﻨﺘﻴﺠﺔ ﻛﻤﺎ ﻳﻠﻲ‬

105
:WHILE ‫ﺍﻟﺒﻨﻴﺔ ﺍﻟﺘﻜﺮﺍﺭﻳﺔ ﺑﺎﺳﺘﻌﻤﺎﻝ‬
،‫ ﻟﺘﻜﺮﺍﺭ ﺃﻣﺮ ﻣﻌﲔ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﳌﺮﺍﺕ ﻭﻓﻖ ﺍﻟﻌﺪﺩ ﺍﶈﺪﺩ ﰲ ﺍﻟﺸﺮﻁ‬WHILE ‫ﺗﺴﺘﺨﺪﻡ ﺍﻟﻜﻠﻤﺔ‬
WHILE Condition
:‫ﻭﺻﻴﻐﺘﻬﺎ ﻛﻤﺎ ﻳﻠﻲ‬
BEGIN

--Do something

END

‫ ﳍﺬﺍ ﻻ ﺗﺮﺗﺒﻚ ﻷﻧﻨﺎ‬،‫ ﻟﻜﻨﻪ ﺳﻴﺒﺪﻭ ﻟﻚ ﻣﻌﻘﺪﺍ ﻣﻦ ﺣﻴﺚ ﺃﻭﺍﻣﺮﻩ‬،‫ﺳﻨﻌﻄﻲ ﻣﺜﺎﻻ ﺳﻬﻼ ﺟﺪﺍ‬
:‫ﺳﻨﺸﺮﺣﻪ ﺟﻴﺪﺍ ﺇﻥ ﺷﺎﺀ ﺍﷲ‬
DECLARE @count INT

DECLARE @ID INT

SET @ID=10

SET @count=(SELECT COUNT(*) FROM employee)

WHILE (@COUNT < 9)

BEGIN

SET @count=(SELECT COUNT(*) FROM employee)

INSERT INTO employee (ID, Fullname) VALUES (@ID,


'Emp'+CONVERT(VARCHAR,@ID))

SET @ID=@ID+1

END

106
‫ﻗﻤﻨﺎ ﺑﺎﻹﻋﻼﻥ ﻋﻦ ﻣﺘﻐﲑﻳﻦ ﺭﻗﻤﻴﲔ‪ ،‬ﺍﻷﻭﻝ ‪ @count‬ﻳﺴﺎﻭﻱ ﻋﺪﺩ ﻋﻨﺎﺻﺮ ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ‪،‬‬
‫ﻭﺍﻟﺜﺎﱐ ‪ @ID‬ﻳﺴﺎﻭﻱ ﺍﺑﺘﺪﺍﺀ ‪ ،10‬ﰒ ﻗﻤﻨﺎ ﺑﺘﻜﺮﺍﺭ ﻋﻤﻠﻴﺔ ﺇﺿﺎﻓﺔ ﺃﺳﻄﺮ ﺟﺪﻳﺪﺓ ﻣﺎﺩﺍﻡ ﺍﻟﺸﺮﻁ‬
‫)ﻋﺪﺩ ﺍﻟﻌﻨﺎﺻﺮ ﺃﻗﻞ ﻣﻦ ﻋﺸﺮﺓ( ﻣﺘﺤﻘﻘﺎ‪ ،‬ﲟﻌﲎ ﺃﻥ ﻫﺬﺍ ﺍﻟﱪﻧﺎﻣﺞ ﻳﻘﻮﻡ ﲝﺴﺎﺏ ﻋﺪﺩ ﻋﻨﺎﺻﺮ‬
‫ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ‪ ،‬ﻓﺈﻥ ﻛﺎﻥ ﺃﻗﻞ ﻣﻦ ﻋﺸﺮﺓ ﺃﺿﺎﻑ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻟﻌﻨﺎﺻﺮ ﻹﻛﻤﺎﻝ ﻋﺸﺮﺓ‬
‫ﻋﻨﺎﺻﺮ‪ ،‬ﻗﻢ ﺑﺎﻟﻌﻮﺩﺓ ﺇﱃ ﺍﳌﺜﺎﻝ ﻭﺗﺄﻣﻠﻪ ﺳﻄﺮﺍ ﺳﻄﺮﺍ‪.‬‬
‫ﻣﺜﻼ ﻟﻮ ﻋﻨﺪﻱ ﰲ ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ ﺳﺘﺔ ﻋﻨﺎﺻﺮ‪ ،‬ﺳﻴﺘﻢ ﺇﺿﺎﻓﺔ ﺃﺭﺑﻌﺔ ﻋﻨﺎﺻﺮ‪.‬‬
‫ﻭﻫﺬﻩ ﺻﻮﺭﺓ ﳉﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ ﺑﻌﺪ ﺗﻨﻔﻴﺬ ﺍﻟﱪﻧﺎﻣﺞ‪:‬‬

‫‪107‬‬
‫ﻗﻢ ﺑﺘﺠﺮﻳﺐ ﺍﳌﺜﺎﻝ‪ ،‬ﻭﻋﺪﻝ ﻋﻠﻴﻪ ﻟﺘﺴﺘﻮﻋﺒﻪ ﺟﻴﺪﺍ‪.‬‬

‫ﺇﺩﺍﺭﺓ ﺍﻟﻌﻤﻠﻴﺎﺕ ‪:Transactions Management‬‬


‫ﺍﻟﻌﻤﻠﻴﺎﺕ ‪ Transactions‬ﲤﻜﻨﻨﺎ ﻣﻦ ﺗﻨﻔﻴﺬ ﺣﺰﻣﺔ ﻣﻦ ﺍﻷﻭﺍﻣﺮ ﺩﻓﻌﺔ ﻭﺍﺣﺪﺓ‪ ،‬ﻭﰲ ﺣﺎﻝ ﻋﺪﻡ‬
‫ﺗﻨﻔﻴﺬ ﺃﻣﺮ ﻣﻦ ﻫﺬﻩ ﺍﻷﻭﺍﻣﺮ ﻳﺘﻢ ﺇﻟﻐﺎﺀ ﺗﻨﻔﻴﺬ ﺍﻷﻭﺍﻣﺮ ﺍﻷﺧﺮﻯ‪ ،‬ﲟﻌﲎ ﺃ‪‬ﺎ ﲡﻤﻊ ﻛﻞ ﺍﻷﻭﺍﻣﺮ‬
‫ﻋﻠﻰ ﺷﻜﻞ ﺃﻣﺮ ﻭﺍﺣﺪ‪ ،‬ﻓﺈﻣﺎ ﺃﻥ ﺗﻨﻔﺬ ﲨﻴﻌﺎ ﺃﻭ ﻻ ﺗﻨﻔﺬ‪.‬‬
‫ﻭﺻﻴﻐﺘﻬﺎ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬
‫]‪BEGIN TRAN [Transaction_Name‬‬

‫)‪IF (Condition‬‬

‫‪--Confirm the transaction‬‬

‫]‪COMMIT TRAN [Transaction_Name‬‬

‫‪ELSE‬‬
‫‪--Cancel the transaction‬‬

‫]‪ROLLBACK TRAN [Transaction_Name‬‬

‫ﻟﻨﻔﺘﺮﺽ ﺃﻥ ﻟﺪﻳﻨﺎ ﺟﺪﻭﻝ ﺍﳌﱪﳎﲔ ﻭﺟﺪﻭﻝ ﺍﳌﺸﺎﺭﻳﻊ‪ ،‬ﻟﻜﻦ ﻫﺬﻩ ﺍﳌﺮﺓ ﻻ ﻳﻮﺟﺪ ﺃﻱ ﺭﺍﺑﻂ ﺑﲔ‬
‫ﺍﳉﺪﻭﻟﲔ‪ ،‬ﻭﻧﺮﻳﺪ ﺣﺬﻑ ﺍﳌﱪﻣﺞ ﺭﻗﻢ ‪ 100‬ﻭﻛﺎﻓﺔ ﺍﳌﺸﺎﺭﻳﻊ ﺍﻟﱵ ﻗﺎﻡ ﺑﱪﳎﺘﻬﺎ‪ ،‬ﺍﻟﻄﺮﻳﻘﺔ‬
‫ﺍﻟﻌﺎﺩﻳﺔ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬
‫'‪DELETE From Programmers WHERE Programmer.Programmer_ID='100‬‬

‫'‪DELETE From Projects WHERE Projects.Programmer_ID='100‬‬

‫‪108‬‬
‫ﻟﻜﻦ ﻧﻔﺘﺮﺽ ﺃﻧﻪ ﺑﻌﺪ ﺗﻨﻔﻴﺬ ﺍﻷﻣﺮ ﺍﻷﻭﻝ‪ ،‬ﺣﺪﺙ ﻣﺸﻜﻞ ﰲ ﺍﻟﱪﻧﺎﻣﺞ‪ ،‬ﺃﻭ ﺍﻧﻘﻄﻊ ﺍﻟﺘﻴﺎﺭ‪ ،‬ﺃﻭ ﻣﺎ‬
‫ﺇﱃ ﺫﻟﻚ ﻣﻦ ﺃﺳﺒﺎﺏ ﲢﻮﻝ ﺩﻭﻥ ﺗﻜﻤﻠﺔ ﺑﺎﻗﻲ ﺍﻷﻭﺍﻣﺮ‪ ،‬ﰲ ﻫﺬﻩ ﺍﳊﺎﻟﺔ ﺳﺘﺘﺒﻌﺜﺮ ﺍﻟﺒﻴﺎﻧﺎﺕ‪،‬‬
‫ﲝﻴﺚ ﺳﻨﺠﺪ ﺍﳌﱪﻣﺞ ﻏﲑ ﻣﻮﺟﻮﺩ ﰲ ﺟﺪﻭﻝ ﺍﳌﱪﳎﲔ ﻟﻜﻦ ﺭﻗﻤﻪ ﺣﺎﺿﺮ ﰲ ﺟﺪﻭﻝ ﺍﳌﺸﺎﺭﻳﻊ‪.‬‬
‫ﺣﺎﻟﺘﻨﺎ ﻫﺬﻩ ﻳﺴﲑﺓ‪ ،‬ﻟﻜﻦ ﺍﻓﺘﺮﺽ ﺃﻧﻚ ﺑﺼﺪﺩ ﺇﳒﺎﺯ ﺑﺮﻧﺎﻣﺞ ﻹﺩﺍﺭﺓ ﺍﻟﺒﻨﻮﻙ ﻭﻳﻠﺰﻡ ﺍﻟﱪﻧﺎﻣﺞ ﺃﻥ‬
‫ﻳﻘﻮﻡ ﺑﺎﺳﺘﻼﻡ ﺍﻷﻣﻮﺍﻝ ﻣﻦ ﺍﻟﺰﺑﻮﻥ ﻭﺇﺿﺎﻓﺘﻬﺎ ﺇﱃ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‪ ،‬ﰒ ﺗﻮﻗﻒ ﺍﻟﱪﻧﺎﻣﺞ ﰲ‬
‫ﻣﺮﺣﻠﺔ ﺣﺮﺟﺔ ﻣﺎﺫﺍ ﺳﻴﻜﻮﻥ ﺭﺩ ﻓﻌﻠﻚ؟‬
‫ﻫﻨﺎ ﺗﺒﺰﻍ ﺃﳘﻴﺔ ﺇﺩﺍﺭﺓ ﺍﻟﻌﻤﻠﻴﺎﺕ ‪ ،Transactions‬ﲝﻴﺚ ﺑﺎﺳﺘﺨﺪﺍﻣﻬﺎ ﺳﺘﻨﻔﺬ ﻛﻞ ﺍﻷﻭﺍﻣﺮ ﺃﻭ‬
‫ﺗﻠﻐﻰ ﻛﻠﻬﺎ‪ ،‬ﻭﻫﻨﺎ ﻧﻄﺒﻖ ﺇﺩﺍﺭﺓ ﺍﻟﻌﻤﻠﻴﺎﺕ ﻋﻠﻰ ﺍﳌﺜﺎﻝ ﺍﻟﺴﺎﺑﻖ‪:‬‬
‫‪BEGIN TRAN‬‬

‫'‪DELETE From Programmers WHERE Programmer.Programmer_ID='100‬‬

‫'‪DELETE From Projects WHERE Projects.Programmer_ID='100‬‬

‫‪COMMIT TRAN‬‬

‫‪Cursors‬‬ ‫ﺍﳌﻤﺮﺭﺍﺕ‬
‫ﺍﳌﻤﺮﺭﺍﺕ ‪ Cursors‬ﻋﺒﺎﺭﺓ ﻋﻦ ﻛﺎﺋﻨﺎﺕ ﲤﻜﻨﻨﺎ ﻣﻦ ﺇﺟﺮﺍﺀ ﺃﻣﺮ ﻣﻌﲔ ﻋﻠﻰ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻟﻌﻨﺎﺻﺮ‬
‫ﺩﻓﻌﺔ ﻭﺍﺣﺪﺓ ﻭﺍﺣﺪﺍ ﺑﻮﺍﺣﺪ‪ ،‬ﺍﻷﻣﺮ ﺍﻟﺬﻱ ﻻ ﳒﺪﻩ ﰲ ﻃﺮﻕ ﺍﻹﺳﺘﻌﻼﻡ ﺍﻟﻌﺎﺩﻳﺔ‪ ،‬ﻭﺻﻴﻐﺔ ﺇﻧﺸﺎﺀ‬
‫ﺍﳌﻤﺮﺭﺍﺕ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬

‫‪109‬‬
‫ﺑﺈﻋﻄﺎﺋﮫ اﺳﻤﺎ و أﻣﺮا ﻟﻠﺘﻨﻔﯿﺬ‪--‬‬ ‫اﻹﻋﻼن ﻋﻦ اﻟﻤﻤﺮر‬

‫‪Declare Cursor_Name Cursor FOR Query‬‬

‫ﻧﻔﺘﺢ اﻟﻤﻤﺮر‪--‬‬

‫‪OPEN Cursor_Name‬‬

‫‪Fetch Cursor_Name into @Var1, @Var2‬‬

‫ﻟﻤﻌﺮﻓﺔ ﻧﮭﺎﯾﺔ اﻟﻤﻤﺮر‪--‬‬

‫‪While @@fetch_status=0‬‬

‫‪BEGIN‬‬

‫اﻟﻤﺮور ﺑﯿﻦ اﻟﻌﻨﺎﺻﺮ واﺣﺪا واﺣﺪا‪--‬‬

‫‪Fetch Cursor_Name into @Var1, @Var2‬‬

‫‪END‬‬

‫ﻧﻐﻠﻖ اﻟﻤﻤﺮر‪--‬‬

‫‪Close Cursor_Name‬‬

‫ﻟﺘﺤﺮﯾﺮ اﻟﻤﻮارد اﻟﻤﺴﺘﺨﺪﻣﺔ ﻣﻦ ﻃﺮف اﻟﻤﻤﺮر‪--‬‬

‫‪Deallocate Cursor_Name‬‬

‫ﻭﺍﻵﻥ ﺗﻌﺎﻝ ﺑﻨﺎ ﻧﺸﺮﺡ ﺍﻟﺼﻴﻐﺔ ﺳﻄﺮﺍ ﺳﻄﺮﺍ‪:‬‬


‫‪Declare Cursor_Name Cursor FOR Query‬‬

‫ﰲ ﻫﺬﺍ ﺍﻟﺴﻄﺮ ﻧﻘﻮﻡ ﺑﺎﻹﻋﻼﻥ ﻋﻦ ﺍﳌﻤﺮﺭ ﻣﻊ ﺇﻋﻄﺎﺋﻪ ﺍﲰﺎ ﻣﻦ ﻧﻮﻉ ‪ ،Cursor‬ﰒ ﺑﻌﺪ ﺍﻟﻜﻠﻤﺔ‬
‫‪ FOR‬ﻧﻜﺘﺐ ﺍﻻﺳﺘﻌﻼﻡ ﺍﳌﺮﺍﺩ ﺗﻨﻔﻴﺬﻩ ﻣﻦ ﻃﺮﻑ ﺍﳌﻤﺮﺭ‪.‬‬

‫‪110‬‬
‫‪OPEN Cursor_Name‬‬

‫ﻧﻘﻮﻡ ﺑﻔﺘﺢ ﺍﳌﻤﺮ ﻟﻴﺒﺪﺃ ﻋﻤﻠﻪ‪.‬‬

‫‪While @@fetch_status=0‬‬

‫ﲤﻜﻨﻨﺎ ﻣﻦ ﻣﻌﺮﻓﺔ ﻣﺎ ﺇﺫﺍ ﻭﺻﻞ ﺍﳌﻤﺮﺭ ﺇﱃ ﺁﺧﺮ ﻋﻨﺼﺮ ﺃﻡ ﻻ‪ ،‬ﻭﻣﺎ‬ ‫‪@@fetch_status‬‬ ‫ﺍﻟﺪﺍﻟﺔ‬
‫ﺩﺍﻣﺖ ﻗﻴﻤﺘﻬﺎ ﺻﻔﺮ ﻓﻬﺬﺍ ﻳﻌﲏ ﺃﻥ ﺍﳌﻤﺮﺭ ﱂ ﻳﺼﻞ ﺑﻌﺪ ﺇﱃ ﺍﻟﻌﻨﺼﺮ ﺍﻷﺧﲑ‪.‬‬

‫‪Fetch Cursor_Name into @Var1, @Var2‬‬

‫ﻟﻠﻤﺮﻭﺭ ﻣﻦ ﻋﻨﺼﺮ ﺇﱃ ﺍﻟﺬﻱ ﻳﻠﻴﻪ‪ ،‬ﺍﺳﺘﻌﻤﻠﻨﺎﻩ ﻗﺒﻞ ﺍﻟﺪﺍﻟﺔ ﻭﺩﺍﺧﻞ ﺍﻟﺪﺍﻟﺔ‪ ،‬ﰲ ﺍﻷﻭﻝ ﻟﺘﺤﺪﻳﺪ‬
‫ﺍﻟﻌﻨﺼﺮ ﺍﻷﻭﻝ‪ ،‬ﻭﰲ ﺍﻟﺜﺎﱐ ﻟﻼﻧﺘﻘﺎﻝ ﺑﲔ ﺍﻟﻌﻨﺎﺻﺮ‪.‬‬

‫ﻣﻊ ﺍﻟﻌﻠﻢ ﺃﻥ ﺍﳌﺘﻐﲑﺍﺕ ‪ @Var1‬ﻭ‪ @Var2‬ﳚﺐ ﺃﻥ ﻧﻌﻠﻦ ﻋﻨﻬﺎ ﻻﺳﺘﻘﺒﺎﻝ ﺍﻟﻘﻴﻢ ﺍﻟﻨﺎﲡﺔ ﻋﻦ‬
‫ﺍﳌﻤﺮﺭ‪ ،‬ﻭﻳﻨﺒﻐﻲ ﺃﻥ ﻳﻜﻮﻥ ﻧﻮﻋﻬﺎ ﻭﺣﺠﻤﻬﺎ ﳑﺎﺛﻼ ﻟﻠﻘﻴﻤﺔ ﺍﻟﻨﺎﲡﺔ‪ ،‬ﺇﻳﺎﻙ ﺃﻥ ﺗﺴﺘﻌﻤﻞ ﻧﻔﺲ‬
‫ﺃﻧﺎ ﺃﲰﻴﺘﻬﺎ ﻫﻜﺬﺍ ﻓﻘﻂ ﻟﻠﺘﻮﺿﻴﺢ‪.‬‬ ‫ﺍﻷﲰﺎﺀ‬

‫‪Close Cursor_Name‬‬

‫ﻫﺬﺍ ﺍﻷﻣﺮ ﻹﻏﻼﻕ ﺍﳌﻤﺮﺭ ﺑﻌﺪ ﺍﻻﻧﺘﻬﺎﺀ ﻣﻨﻪ‪.‬‬

‫‪Deallocate Cursor_Name‬‬

‫‪111‬‬
.‫ﻭﻫﺬﺍ ﺍﻷﻣﺮ ﻟﺘﺤﺮﻳﺮ ﺍﳌﻮﺍﺭﺩ ﺍﳌﺴﺘﺨﺪﻣﺔ ﻣﻦ ﻃﺮﻑ ﺍﳌﻤﺮﺭ‬

‫ ﻭﻟﻴﻜﻦ ﺇﻇﻬﺎﺭ ﺍﳌﻮﻇﻔﲔ ﺑﺎﻟﺸﻜﻞ‬،‫ ﻳﻨﺒﻐﻲ ﺃﻥ ﻧﻌﻄﻲ ﻣﺜﺎﻻ‬،‫ﻭﺍﻵﻥ ﻟﻨﺴﺘﻮﻋﺐ ﺍﳌﻤﺮﺭﺍﺕ ﺑﺸﻜﻞ ﺟﻴﺪ‬
:‫ﺍﻟﺘﺎﱄ‬
Employee ID : XXX, Called : XXX, has :XX Years.

:‫ﻫﺬﺍ ﻫﻮ ﺍﳌﻤﺮﺭ ﻭﳝﻜﻨﻚ ﲡﺮﻳﺒﻪ ﻭﺍﻟﺘﻌﺪﻳﻞ ﻋﻠﻴﻪ‬

Declare @ID varchar(50), @FullName varchar(50), @Age int

Declare Emp_Cur Cursor FOR Select ID, FullName,Age From Employee

OPEN Emp_Cur

Fetch Emp_Cur into @ID, @Fullname,@Age

While @@fetch_status=0

BEGIN

print 'Employee ID: '+@ID+' Called: '+@FullName+' Has:

'+Convert(varchar,@Age)

Fetch Emp_Cur into @ID, @Fullname,@Age

END

Close Emp_Cur

Deallocate Emp_Cur

112
‫ﺃﻋﻠﻨﺎ ﰲ ﺍﻷﻭﻝ ﻋﻠﻰ ﻣﺘﻐﲑﺍﺕ ﺑﻌﺪﺩ ﻭﻧﻮﻉ ﺍﳊﻘﻮﻝ ﺍﻟﱵ ﻧﺮﻳﺪ ﺇﻇﻬﺎﺭﻫﺎ‪ ،‬ﰒ ﺃﻧﺸﺄﻧﺎ ﳑﺮﺭﺍ ﳉﻠﺐ‬
‫ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ‪ ،‬ﻗﻤﻨﺎ ﺑﻔﺘﺤﻪ ﻭﻋﺮﺽ ﺍﻟﻌﻨﺎﺻﺮ ﺑﻮﺍﺳﻄﺔ ‪ Print‬ﻭﺣﻮﻟﻨﺎ ﺍﳌﺘﻐﲑ‬
‫‪ @Age‬ﺇﱃ ‪ Varchar‬ﻷﻧﻪ ﻛﻤﺎ ﻗﻠﻨﺎ ﰲ ﺃﺣﺪ ﺍﻟﻔﺼﻮﻝ ﺍﻟﺴﺎﺑﻘﺔ ﻻ ﻧﺴﺘﻄﻴﻊ ﺩﻣﺞ ﺍﻷﺭﻗﺎﻡ‬
‫ﻭﺍﻟﻨﺼﻮﺹ ﺇﻻ ﺑﻌﺪ ﲢﻮﻳﻞ ﺍﻷﺭﻗﺎﻡ ﺇﱃ ﻧﺼﻮﺹ‪.‬‬
‫ﺑﻌﺪ ﺗﻨﻔﻴﺬ ﻫﺬﺍ ﺍﳌﻤﺮ ﺳﻨﺤﺼﻞ ﻋﻠﻰ ﻧﺘﻴﺠﺔ ﻛﻬﺬﻩ‪:‬‬

‫ﻣﻼﺣﻈﺔ‪:‬‬
‫ﱂ ﻧﺬﻛﺮ ﻛﻞ ﻣﺎ ﻳﺘﻌﻠﻖ ﺑﺎﳌﻤﺮﺭﺍﺕ ﻣﻦ ﺑﺎﺏ ﺍﻻﺧﺘﺼﺎﺭ‪ ،‬ﻭﺗﻔﺎﺩﻳﺎ ﻟﺘﻜﺮﺍﺭ ﺍﻟﺸﺮﻭﺣﺎﺕ ﻷﻥ ﻫﻨﺎﻟﻚ‬
‫ﺑﻌﺾ ﺍﻟﺪﻭﺍﻝ ﻭﺍﻟﻜﻠﻤﺎﺕ ﺍﻟﱵ ﺗﺆﺩﻱ ﻧﻔﺲ ﺍﻷﺩﻭﺍﺭ‪.‬‬

‫‪Stored Procedures‬‬ ‫ﺍﻹﺟﺮﺍﺀﺍﺕ ﺍﳌﺨﺰﻧﺔ‬


‫ﺍﻹﺟﺮﺍﺀﺍﺕ ﺍﳌﺨﺰﻧﺔ ﻫﻲ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻷﻭﺍﻣﺮ ﺍﻟﱵ ﲢﻤﻞ ﺍﲰﺎ‪ ،‬ﻭﺍﻟﱵ ﺑﺈﻣﻜﺎﻧﻨﺎ ﺗﻨﻔﻴﺬﻫﺎ‬
‫ﻓﻘﻂ ﺑﺎﺳﺘﺪﻋﺎﺀ ﺍﲰﻬﺎ‪ ،‬ﻭﺍﳉﻤﻴﻞ ﰲ ﺍﻹﺟﺮﺍﺀ ﺍﺕ ﺍﳌﺨﺰﻧﺔ ﺃ‪‬ﺎ ﺗﺘﻴﺢ ﻟﻨﺎ ﺇﻣﻜﺎﻧﻴﺔ ﺍﻟﺘﻨﻔﻴﺬ ﻋﻦ‬
‫ﺑﻌﺪ‪ ،‬ﻣﺜﻼ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﱵ ﺗﻀﻢ ﺍﻹﺟﺮﺍﺀ ﺍﳌﺨﺰﻥ ﻣﻮﺟﻮﺩﺓ ﻋﻠﻰ ﺟﻬﺎﺯ ﺳﲑﻓﺮ‪ ،‬ﻭﺍﻟﱪﻧﺎﻣﺞ‬
‫ﺍﻟﺬﻱ ﻳﻘﻮﻡ ﺑﺘﻨﻔﻴﺬﻫﺎ ﻭﺍﺳﺘﻐﻼﳍﺎ ﻳﻮﺟﺪ ﻋﻠﻰ ﺟﻬﺎﺯ ﻋﻤﻴﻞ‪ ،‬ﻫﺬﻩ ﺍﻟﺒﻨﻴﺔ ﻫﻲ ﺍﻟﱵ ﺗﺴﺎﻋﺪ ﻛﺜﲑﺍ‬
‫‪113‬‬
‫ﻋﻠﻰ ﺍﻟﺮﻓﻊ ﻣﻦ ﻣﺴﺘﻮﻯ ﺍﻟﱪﺍﻣﺞ ﻣﻦ ﻧﻮﻉ ﺧﺎﺩﻡ ‪ /‬ﻋﻤﻴﻞ‪ ،‬ﻷﻥ ﺍﻟﱪﻧﺎﻣﺞ ﻳﻘﻮﻡ ﻓﻘﻂ ﺑﺎﺳﺘﻼﻡ‬
‫ﻧﺘﻴﺠﺔ ﺍﻹﺟﺮﺍﺀ ﺍﳌﺨﺰﻥ‪ ،‬ﺃﻣﺎ ﻋﻤﻠﻴﺎﺕ ﺍﳌﻌﺎﳉﺔ ﻭﺍﻟﺘﻨﻔﻴﺬ ﻓﻜﻠﻬﺎ ﺗﺘﻢ ﻋﻠﻰ ﻣﺴﺘﻮﻯ ﺍﻟﺴﲑﻓﺮ ﺍﻟﺬﻱ‬
‫ﻳﻜﻮﻥ ﺑﻜﻔﺎﺀﺓ ﻋﺎﻟﻴﺔ‪.‬‬
‫ﺍﺳﺘﻴﻌﺎﺏ ﺍﻹﺟﺮﺍﺀﺍﺕ ﺍﳌﺨﺰﻧﺔ ﻭﺇﺗﻘﺎ‪‬ﺎ ﺳﻴﻌﻴﻨﻚ ﻛﺜﲑﺍ ﺇﺫﺍ ﻛﻨﺖ ﻣﱪﳎﺎ ﻭﺗﺴﻌﻰ ﺇﱃ ﺟﻌﻞ‬
‫ﺑﺮﺍﳎﻚ ﺗﺸﺘﻐﻞ ﺃﺳﺮﻉ ﻭﺃﺟﻮﺩ‪.‬‬
‫ﳝﻜﻦ ﻟﻺﺟﺮﺍﺀ ﺍﳌﺨﺰﻥ ﺃﻥ ﻳﺴﺘﻘﺒﻞ ﺑﺮﺍﻣﺘﺮﺍﺕ‪ ،‬ﻭﺃﻥ ﳚﺮﻱ ﻋﻠﻴﻬﺎ ﻋﻤﻠﻴﺎﺕ ﻣﻌﻴﻨﺔ‪ ،‬ﻭﺃﻥ ﻳﻌﻴﺪ ﻟﻨﺎ‬
‫ﻗﻴﻤﺔ ﻧﺎﲡﺔ ﻋﻦ ﻫﺬﻩ ﺍﻟﻌﻤﻠﻴﺎﺕ‪ ،‬ﺑﺎﺧﺘﺼﺎﺭ ﻟﻮ ﻋﻨﺪﻙ ﺧﻠﻔﻴﺔ ﺑﺮﳎﻴﺔ ﻓﺎﻹﺟﺮﺍﺀ ﺍﺕ ﺍﳌﺨﺰﻧﺔ‬
‫ﺷﺒﻴﺔ ﺟﺪﺍ ﺑﺎﻟﺪﻭﺍﻝ ﻣﻦ ﺣﻴﺚ ﺍﻟﺪﻭﺭ ﻭﺍﻟﺒﻨﻴﺔ‪ ،‬ﻣﻊ ﺍﻹﺷﺎﺭﺓ ﺇﱃ ﺃﻧﻪ ﻳﻮﺟﺪ ﻣﻔﻬﻮﻡ ﺍﻟﺪﻭﺍﻝ ﺃﻳﻀﺎ‬
‫ﰲ ﻟﻐﺔ ‪ SQL‬ﻭﺳﻨﺮﺍﻫﺎ ﺇﻥ ﺷﺎﺀ ﺍﷲ ﻣﺒﺎﺷﺮﺓ ﺑﻌﺪ ﺍﻹﺟﺮﺍﺀ ﺍﺕ ﺍﳌﺨﺰﻧﺔ‪.‬‬
‫ﻭﻳﺘﻢ ﺗﻨﻔﻴﺬﻫﺎ ﳏﻠﻴﺎ ﺑﻮﺍﺳﻄﺔ ﺍﻟﻜﻠﻤﺔ ﺍﶈﺠﻮﺯﺓ ‪ Execute‬ﺃﻭ ‪.Exec‬‬
‫ﺑﺈﻣﻜﺎﻧﻨﺎ ﺇﻧﺸﺎﺀ ﺍﻹﺟﺮﺍﺀ ﺍﺕ ﺍﳌﺨﺰﻧﺔ ﻳﺪﻭﻳﺎ ﻋﻦ ﻃﺮﻳﻖ ﺍﻟﺬﻫﺎﺏ ﺇﱃ ﺍﻟﺘﺒﻮﻳﺐ‬
‫‪ Programmability‬ﰒ ﺍﻟﻀﻐﻂ ﺑﻴﻤﲔ ﺍﻟﻔﺄﺭﺓ ﻋﻠﻰ ‪ Stored Procedures‬ﻭﺍﺧﺘﻴﺎﺭ ‪New‬‬

‫‪ ،Stored Procedure‬ﻛﻤﺎ ﺗﻮﺿﺢ ﺍﻟﺼﻮﺭﺓ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫اﻟﺻورة ﺑﺎﻟﻠﻐﺔ اﻟﻔرﻧﺳﯾﺔ‪ ،‬ﻟﻛن أﻋﺗﻘد اﻟﻣﺳﺄﻟﺔ واﺿﺣﺔ‪.‬‬

‫‪114‬‬
‫ﻹﻧﺸﺎﺀ ﺇﺟﺮﺍﺀ ﳐﺰﻥ‪ ،‬ﻧﺴﺘﻌﻤﻞ ﺍﻟﺼﻴﻐﺔ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬
‫‪CREATE PROC Proc_Name‬‬

‫‪--Parameters‬‬

‫‪As‬‬

‫‪//Do something‬‬

‫ﲝﻴﺚ ‪ Proc_Name‬ﻫﻮ ﺍﺳﻢ ﺍﻹﺟﺮﺍﺀ ﺍﳌﺨﺰﻥ‪.‬‬


‫ﻭﰲ ﺍﳉﺰﺀ ‪ Parameters‬ﻧﻘﻮﻡ ﺑﺎﻹﻋﻼﻥ ﻋﻦ ﺍﻟﱪﺍﻣﺘﺮﺍﺕ ﺍﳌﺮﺍﺩ ﺍﻻﺷﺘﻐﺎﻝ ﻋﻠﻴﻬﺎ ﺩﺍﺧﻞ‬
‫ﺍﻹﺟﺮﺍﺀ‪ ،‬ﻭﳝﻜﻦ ﺗﻘﺴﻴﻢ ﺍﻟﱪﺍﻣﺘﺮﺍﺕ ﺇﱃ ﻧﻮﻋﲔ‪:‬‬
‫ﺑﺮﺍﻣﺘﺮﺍﺕ ﺍﻹﺩﺧﺎﻝ ‪ :Input‬ﻭﻫﻲ ﺑﺮﺍﻣﺘﺮﺍﺕ ﺗﺴﺘﺨﺪﻡ ﳉﻠﺐ ﻣﻌﻠﻮﻣﺎﺕ ﺧﺎﺭﺟﻴﺔ ﻭﺗﻄﺒﻴﻖ ﺑﻌﺾ‬
‫ﺍﻟﻌﻤﻠﻴﺎﺕ ﻋﻠﻴﻬﺎ‪ ،‬ﻛﻤﺎ ﻳﻌﺮﺽ ﻫﺬﺍ ﺍﳌﺜﺎﻝ‪:‬‬
‫‪Create Proc Show_Employee‬‬

‫)‪@ID varchar(50‬‬

‫‪As‬‬

‫‪Select FullName, [Address], Age‬‬

‫‪From Employee‬‬

‫‪Where ID=@ID‬‬

‫ﺍﻟﱪﺍﻣﺘﺮ ‪ @ID‬ﻣﻦ ﻧﻮﻉ ‪ ،Input‬ﻷﻧﻪ ﻳﺘﻄﻠﺐ ﺇﺩﺧﺎﻝ ﻗﻴﻤﺘﻪ ﻟﺘﻨﻔﻴﺬ ﻫﺬﺍ ﺍﻹﺟﺮﺍﺀ ﺍﳌﺨﺰﻥ‪.‬‬
‫ﰲ ﻫﺬﺍ ﺍﳌﺜﺎﻝ ﺳﻨﺠﻠﺐ ﺇﺳﻢ ﻭﻋﻨﻮﺍﻥ ﻭﻋﻤﺮ ﺍﳌﻮﻇﻒ ﺍﻟﺬﻱ ﺭﻗﻤﻪ ﺍﻟﻮﻇﻴﻔﻲ ﻳﺴﺎﻭﻱ ﺍﻟﺮﻗﻢ ﺍﳌﺪﺧﻞ‬
‫ﻣﻜﺎﻥ ﺍﻟﱪﺍﻣﺘﺮ‪ ،‬ﻭﻃﺮﻳﻘﺔ ﺗﻨﻔﻴﺬ ﻫﺬﺍ ﺍﻹﺟﺮﺍﺀ ﺍﳌﺨﺰﻥ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬

‫‪115‬‬
‫)‪declare @ID varchar(50‬‬

‫'‪Set @ID='Emp 2‬‬

‫‪Exec Show_Employee @ID‬‬

‫أو ﺑﻜﻞ ﺑﺴﺎﻃﺔ‪--‬‬

‫'‪Exec Show_Employee 'Emp 2‬‬

‫ﻭﻫﻨﺎﻙ ﻧﻮﻉ ﺛﺎﻥ ﻣﻦ ﺍﻟﱪﺍﻣﺘﺮﺍﺕ ﻭﻫﻮ‪:‬‬


‫ﺑﺮﺍﻣﺘﺮﺍﺕ ﺍﻹﺧﺮﺍﺝ ‪ :Output‬ﻭﻳﺴﺘﺨﺪﻡ ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﺍﻟﱪﺍﻣﺘﺮﺍﺕ ﳊﻔﻆ ﻗﻴﻤﺔ ﻧﺎﲡﺔ ﻋﻦ‬
‫ﺍﻹﺟﺮﺍﺀ ﺍﳌﺨﺰﻥ ﻭﺍﺳﺘﻌﻤﺎﳍﺎ ﰲ ﻣﻜﺎﻥ ﺁﺧﺮ‪ ،‬ﻭﻳﻜﻮﻥ ﺑﺎﺳﺘﻌﻤﺎﻝ ﺍﻟﻜﻠﻤﺔ ‪ Output‬ﺑﻌﺪ ﻧﻮﻉ‬
‫ﺍﻟﱪﺍﻣﺘﺮ‪ ،‬ﻭﻫﺬﺍ ﻣﺜﺎﻝ ﻹﺟﺮﺍﺀ ﳐﺰﻥ ﻳﺴﺘﻌﻤﻞ ﺑﺮﺍﻣﺘﺮ ﻟﻺﺧﺮﺍﺝ ﳌﻌﺮﻓﺔ ﻋﺪﺩ ﺍﳌﻮﻇﻔﲔ‪:‬‬
‫‪Create Proc Count_Employees‬‬

‫‪@Nbr int output‬‬

‫‪As‬‬

‫)‪set @Nbr=(Select Count(*) From Employee‬‬

‫ﻟﺘﻨﻔﻴﺬ ﺍﻹﺟﺮﺍﺀ ﺃﻋﻼﻩ‪ ،‬ﻧﻜﺘﺐ‪:‬‬


‫‪Declare @Number int‬‬

‫‪Exec Count_Employees @Number Output‬‬

‫)‪Print 'The count of employees is : ' + convert(varchar,@Number‬‬

‫ﺑﻌﺪ ﺍﻟﺘﻨﻔﻴﺬ‪ ،‬ﺳﻨﺤﺼﻞ ﻋﻠﻰ ﻧﺘﻴﺠﺔ ﻛﻬﺬﻩ‪:‬‬

‫‪116‬‬
‫ﻭﻫﻨﺎﻙ ﻧﻮﻉ ﺛﺎﻟﺚ ﻣﻦ ﺍﻹﺟﺮﺍﺀﺍﺕ ﺍﳌﺨﺰﻧﺔ‪ ،‬ﻳﻜﻮﻥ ﻣﻦ ﻧﻮﻉ‪:‬‬
‫ﺇﺭﺟﺎﻉ ﺍﻟﻘﻴﻤﺔ ‪ :Return‬ﻭﻳﺴﺘﻌﻤﻞ ﻹﻳﻘﺎﻑ ﺗﻨﻔﻴﺬ ﺍﻹﺟﺮﺍﺀ ﺍﳌﺨﺰﻥ ﺑﻌﺪ ﺃﻣﺮ ﻣﻌﲔ‪ ،‬ﻭﻳﻜﻮﻥ‬
‫ﺍﻟﻨﻮﻉ ﺍﳌﺮﺟﻊ ﺩﺍﺋﻤﺎ ﺭﻗﻤﻴﺎ‪ ،‬ﻭﻫﺬﺍ ﻣﺜﺎﻝ ﻻﺳﺘﺨﺪﺍﻡ ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﺍﻹﺟﺮﺍﺀ ﺍﺕ ﺍﳌﺨﺰﻧﺔ‪ ،‬ﻳﺘﺤﻘﻖ‬
‫ﻣﻦ ﺗﻄﺎﺑﻖ ﺍﺳﻢ ﺍﳌﺴﺘﺨﺪﻡ ﻭﻛﻠﻤﺔ ﺍﳌﺮﻭﺭ ﻣﻊ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺟﺪﻭﻝ ﺍﳌﺴﺘﺨﺪﻣﲔ‪ ،‬ﺇﻥ‬
‫ﲢﻘﻖ ﺍﻟﺘﻄﺎﺑﻖ ﺳﻴﻌﻴﺪ ﻟﻨﺎ ﺍﻟﻘﻴﻤﺔ ‪ 1‬ﻭﻳﻮﻗﻒ ﺍﻟﺘﻨﻔﻴﺬ‪ ،‬ﻭﺇﻥ ﻛﺎﻥ ﻫﻨﺎﻙ ﺗﺒﺎﻳﻦ ﻳﻌﻴﺪ ﻟﻨﺎ ‪0‬‬

‫ﻭﻳﻮﻗﻒ ﺍﻟﱪﻧﺎﻣﺞ ﺃﻳﻀﺎ‪:‬‬

‫]‪Create proc [dbo].[Login‬‬

‫)‪@Id varchar(50),@PWD varchar(50‬‬

‫‪As‬‬

‫)‪if exists(select ID from Accounts where ID=@id and [Password]=@PWD‬‬

‫‪begin‬‬

‫‪return 1‬‬

‫‪End‬‬

‫‪Else‬‬

‫‪Begin‬‬

‫‪return 0‬‬

‫‪end‬‬

‫‪117‬‬
‫ ﺃﻗﻮﻡ ﻓﻘﻂ ﲟﻌﺮﻓﺔ‬،‫ﺷﺨﺼﻴﺎ ﺃﺳﺘﻌﻤﻞ ﻣﺜﻞ ﻫﺎﺗﻪ ﺍﻹﺟﺮﺍﺀﺍﺕ ﰲ ﺑﺮﺍﳎﻲ ﻋﻨﺪ ﻧﻮﺍﻓﺬ ﺍﻟﺪﺧﻮﻝ‬
.‫ﺍﻟﻘﻴﻤﺔ ﺍﳌﺮﺟﻌﺔ ﻭﻣﻦ ﺧﻼﳍﺎ ﺃﺣﺪﺩ ﺣﺎﻟﺔ ﺍﻟﺪﺧﻮﻝ ﺃﻫﻲ ﺳﻠﻴﻤﺔ ﺃﻡ ﻋﻠﻰ ﺧﻼﻑ ﺫﻟﻚ‬

:‫ﺃﻣﺜﻠﺔ ﺗﺪﻋﻴﻤﻴﺔ‬
:‫ﰲ ﻫﺬﺍ ﺍﳉﺰﺀ ﺳﺄﻭﺭﺩ ﺃﺭﺑﻌﺔ ﺃﻣﺜﻠﺔ ﻟﻺﺟﺮﺍﺀ ﺍﺕ ﺍﳌﺨﺰﻧﺔ ﻭﻫﻲ ﻛﻤﺎ ﻳﻠﻲ‬

:‫ﺇﺟﺮﺍﺀ ﳐﺰﻥ ﻳﻘﻮﻡ ﺑﻌﻤﻠﻴﺔ ﺍﻹﺿﺎﻓﺔ‬


Create Proc Insert_Employee
@ID varchar(50), @FullName varchar(50), @Address text, @Age int
as
INSERT INTO [DB_Hotel].[dbo].[Employee]
([ID]
,[FullName]
,[Age]
,[Address])
VALUES
(@ID
,@FullName
,@Age
,@Address)
GO

:‫ﺇﺟﺮﺍﺀ ﳐﺰﻥ ﻳﻘﻮﻡ ﺑﻌﻤﻠﻴﺔ ﺍﻟﺘﻌﺪﻳﻞ‬


Create Proc Update_Employee
@ID varchar(50), @FullName varchar(50), @Address text, @Age int
as
UPDATE [Employee]
SET [FullName] = @FullName
,[Age] = @Age
,[Address] = @Address
WHERE [ID] = @ID
GO

118
‫ﺇﺟﺮﺍﺀ ﳐﺰﻥ ﻳﻘﻮﻡ ﺑﻌﻤﻠﻴﺔ ﺍﳊﺬﻑ‪:‬‬
‫‪Create Proc Update_Employee‬‬
‫)‪@ID varchar(50‬‬
‫‪as‬‬
‫]‪DELETE FROM [Employee‬‬
‫‪WHERE ID=@ID‬‬
‫‪GO‬‬

‫ﺇﺟﺮﺍﺀ ﳐﺰﻥ ﻳﻘﻮﻡ ﺑﻌﻤﻠﻴﺔ ﺍﻻﺳﺘﻌﻼﻡ‪:‬‬


‫‪Create Proc Update_Employee‬‬
‫)‪@ID varchar(50‬‬
‫‪as‬‬
‫]‪SELECT [FullName‬‬
‫]‪,[Age‬‬
‫]‪,[Address‬‬
‫]‪FROM [DB_Hotel].[dbo].[Employee‬‬
‫‪WHERE [ID]=@ID‬‬
‫‪GO‬‬

‫ﺗﻌﺪﻳﻞ ﺍﻹﺟﺮﺍﺀﺍﺕ ﺍﳌﺨﺰﻧﺔ‪:‬‬


‫ﻟﺘﻌﺪﻳﻞ ﺇﺟﺮﺍﺀ ﻣﻌﲔ‪ ،‬ﻧﺬﻫﺐ ﺇﱃ ﺍﻟﺘﺒﻮﻳﺐ ﺍﳋﺎﺹ ﺑﺎﻹﺟﺮﺍﺀ ﺍﺕ ﺍﳌﺨﺰﻧﺔ‪ ،‬ﻭﻧﻀﻐﻂ ﺑﻴﻤﲔ‬
‫ﺍﻟﻔﺄﺭﺓ ﻋﻠﻰ ﺍﺳﻢ ﺍﻹﺟﺮﺍﺀ ﻭﳔﺘﺎﺭ ﺗﻌﺪﻳﻞ ‪ ،Edit‬ﻟﺘﻈﻬﺮ ﻟﻨﺎ ﻧﺎﻓﺬﺓ ﺍﶈﺮﺭ ﻭﻫﻲ ﺗﻀﻢ ﺍﻹﺟﺮﺍﺀ‬
‫ﺍﳌﺨﺰﻥ ﺍﳌﺮﺍﺩ ﺗﻌﺪﻳﻠﻪ‪:‬‬

‫‪119‬‬
‫ﻛﻤﺎ ﻧﺴﺘﻄﻴﻊ ﺗﻌﺪﻳﻞ ﺍﻹﺟﺮﺍﺀ ﺑﺎﻟﺬﻫﺎﺏ ﺇﱃ ﻧﺎﻓﺬﺓ ﺍﻟﺘﺤﺮﻳﺮ ﻭﻛﺘﺎﺑﺔ ﺍﻷﻣﺮ ﺍﻟﺘﺎﱄ‪:‬‬
‫‪ALTER Proc Update_Employee‬‬
‫‪//Edit Content‬‬

‫ﺣﺬﻑ ﺍﻹﺟﺮﺍﺀ ﺍﺕ ﺍﳌﺨﺰﻧﺔ‪:‬‬


‫ﳊﺬﻑ ﺇﺟﺮﺍﺀ ﳐﺰﻥ‪ ،‬ﻧﺴﺘﻌﻤﻞ ﺍﻷﻣﺮ ﺍﻟﺘﺎﱄ‪:‬‬
‫‪DROP PROC Proc_Name‬‬

‫ﲝﻴﺚ ‪ Proc_Name‬ﻫﻮ ﺍﺳﻢ ﺍﻹﺟﺮﺍﺀ ﺍﳌﺨﺰﻥ‪.‬‬


‫ﺃﻭ ﺑﺎﻟﻀﻐﻂ ﺑﻴﻤﲔ ﺍﻟﻔﺄﺭﺓ ﻋﻠﻰ ﺍﺳﻢ ﺍﻹﺟﺮﺍﺀ ﻭﺍﺧﺘﻴﺎﺭ ﺃﻣﺮ ﺍﳊﺬﻑ ‪.Delete‬‬

‫‪120‬‬
‫ﺍﻟﺪﻭﺍﻝ ‪:Functions‬‬
‫ﺍﻟﺪﺍﻟﺔ ﻫﻲ ﳎﻤﻮﻋﺔ ﻣﻦ ﺃﻭﺍﻣﺮ ‪ SQL‬ﺍﻟﱵ ﲢﻤﻞ ﺍﲰﺎ‪ ،‬ﻭﳝﻜﻨﻨﺎ ﺍﺳﺘﺪﻋﺎﺅﻫﺎ ﻣﻦ ﺧﻼﻝ ﻫﺬﺍ‬
‫ﺍﻹﺳﻢ‪ .‬ﻭﻫﻲ ﺷﺒﻴﻬﺔ ﺑﺎﻹﺟﺮﺍﺀ ﺍﺕ ﺍﳌﺨﺰﻧﺔ ﻷ‪‬ﺎ ﺃﻳﻀﺎ ﻗﺪ ﺗﺴﺘﻘﺒﻞ ﺑﺮﺍﻣﺘﺮﺍﺕ‪ ،‬ﺇﻻ ﺃﻥ ﻣﺎ‬
‫ﳝﻴﺰﻫﺎ ﻫﻮ ﺃﻣﺮ ‪ ،Return‬ﻷﻥ ﺍﻟﺪﺍﻟﺔ ﳎﱪﺓ ﻋﻠﻰ ﺇﺭﺟﺎﻉ ﻗﻴﻤﺔ‪ ،‬ﻭﻳﺸﺘﺮﻁ ﰲ ﻫﺬﻩ ﺍﻟﻘﻴﻤﺔ ﺃﻥ‬
‫ﺗﻜﻮﻥ ﺭﻗﻤﻴﺔ ﺃﻭ ﻋﺒﺎﺭﺓ ﻋﻦ ﺟﺪﻭﻝ ‪.Table‬‬

‫ﻭﺻﻴﻐﺔ ﺇﻧﺸﺎﺀ ﺍﻟﺪﻭﺍﻝ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬


‫(‪CREATE FUNCTION Function_Name‬‬

‫‪@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‬‬

‫‪DECLARE @Nbr INT‬‬

‫)‪SELECT @Nbr=(SELECT Count(*) FROM Projects WHERE ProgrammerID=@ID‬‬

‫‪RETURN @Nbr‬‬

‫‪END‬‬

‫ﺍﻟﺪﺍﻟﺔ ﺗﺴﺘﻘﺒﻞ ﺍﻟﺮﻗﻢ ﺍﻟﻮﻇﻴﻔﻲ ﻟﻠﻤﱪﻣﺞ‪ ،‬ﰒ ﺗﻌﻴﺪ ﻟﻨﺎ ﻗﻴﻤﺔ ﺭﻗﻤﻴﺔ ﺗﻀﻢ ﻋﺪﺩ ﺍﳌﺸﺎﺭﻳﻊ ﺍﻟﱵ‬
‫ﺷﺎﺭﻙ ﻓﻴﻬﺎ ﻫﺬﺍ ﺍﳌﱪﻣﺞ‪ ،‬ﳌﺸﺎﻫﺪﺓ ﻧﺘﻴﺠﺔ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ‪ ،‬ﻧﻘﻮﻡ ﻓﻘﻂ ﺑﻜﺘﺎﺑﺔ ﺍﲰﻬﺎ ﻣﻊ ﺗﻌﻮﻳﺾ‬
‫ﺍﻟﱪﺍﻣﺘﺮ ﺑﻘﻴﻤﺔ ﻣﻦ ﻧﻔﺲ ﻧﻮﻋﻪ‪ ،‬ﻛﻤﺎ ﻳﻈﻬﺮ ﻫﺬﺍ ﺍﳌﺜﺎﻝ‪:‬‬
‫)'‪SELECT [dbo].[Count_Projects] ('Dev 1‬‬

‫ﺍﺳﻢ ﺍﳌﺴﺘﺨﺪﻡ ﻟﻘﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﱵ‬ ‫]‪[dbo‬‬ ‫ﻫﻮ ﺍﺳﻢ ﺍﻟﺪﺍﻟﺔ‪ ،‬ﻭ‬ ‫]‪[Count_Projects‬‬ ‫ﲝﻴﺚ‬
‫ﺗﻀﻢ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ‪.‬‬
‫ﺑﻌﺪ ﺗﻨﻔﻴﺬ ﺍﻟﺴﻄﺮ ﺃﻋﻼﻩ‪ ،‬ﺳﺘﺤﺼﻞ ﻋﻠﻰ ﻧﺘﻴﺠﺔ ﻛﻬﺬﻩ‪:‬‬

‫‪122‬‬
‫ﺍﻵﻥ ﺳﻨﺠﺮﺏ ﻣﺜﺎﻻ ﺁﺧﺮ ﻳﻌﻴﺪ ﻟﻨﺎ ﺟﺪﻭﻻ ﻭﻟﻴﺲ ﻗﻴﻤﺔ‪ ،‬ﻫﺬﻩ ﺍﳌﺮﺓ ﺳﻨﺠﻠﺐ ﻻﺋﺤﺔ ﺍﳌﻮﻇﻔﲔ‬
‫ﺍﻟﺬﻳﻦ ﻳﻔﻮﻕ ﺳﻨﻬﻢ ﺍﻟﻌﻤﺮ ﺍﳌﻤﺮﺭ ﻋﱪ ﺍﻟﱪﺍﻣﺘﺮ‪:‬‬
‫)‪CREATE FUNCTION Employees_By_Age(@Age INT‬‬

‫‪RETURNS TABLE‬‬

‫‪AS‬‬

‫‪RETURN (SELECT * FROM Employee‬‬

‫)‪WHERE Age >@Age‬‬

‫ﺍﺳﺘﺪﻋﺎﺀ ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬


‫)‪SELECT * FROM [dbo].[Employees_By_Age] (20‬‬

‫ﺑﻌﺪ ﺗﻨﻔﻴﺬ ﺍﻟﺴﻄﺮ ﺃﻋﻼﻩ‪ ،‬ﺳﺘﺤﺼﻞ ﻋﻠﻰ ﻧﺘﻴﺠﺔ ﳑﺎﺛﻠﺔ ﳌﺎ ﻳﻠﻲ‪:‬‬

‫‪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‬‬

‫ﺇﻧﺸﺎﺀ ﺍﻟﻘﻮﺍﺩﺡ ‪:Triggers‬‬


‫ﻹﻧﺸﺎﺀ ﻗﺎﺩﺡ ﺟﺪﻳﺪ ﻋﻠﻰ ﺟﺪﻭﻝ ﻣﻌﲔ‪ ،‬ﻧﻘﻮﻡ ﺑﺎﻟﻀﻐﻂ ﻋﻠﻰ ﺍﺳﻢ ﺍﳉﺪﻭﻝ ﻓﺘﻈﻬﺮ ﻟﻨﺎ ﳎﻤﻮﻋﺔ‬
‫ﻣﻦ ﺍﳋﻴﺎﺭﺍﺕ ﻣﻦ ﺿﻤﻨﻬﺎ ‪ ،Triggers‬ﻧﻀﻐﻂ ﻋﻠﻴﻬﺎ ﺑﻴﻤﲔ ﺍﻟﻔﺄﺭﺓ ﻭﳔﺘﺎﺭ ‪:New Trigger‬‬
‫‪Database=>Table=>Triggers=>New Trigger‬‬

‫إذا ﻛﺎﻧت ﻋﻧدك ﻧﺳﺧﺔ اﻧﺟﻠﯾزﯾﺔ اﺗﺑﻊ اﻟﺧطوات اﻟﻣﻛﺗوﺑﺔ أﻋﻠﻰ اﻟﺻورة‬
‫‪125‬‬
‫ﺳﻴﻌﻄﻴﻚ ﺍﻟﺼﻴﻐﺔ ﺍﻟﻌﺎﻣﺔ ﻟﻜﺘﺎﺑﺔ ﺍﻟﻘﻮﺍﺩﺡ ﺑﺎﻹﺿﺎﻓﺔ ﺇﱃ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻟﺘﻌﺎﻟﻴﻖ‪:‬‬

‫ﻗﻢ ﲝﺬﻑ ﺍﶈﺘﻮﻯ ﻭﺍﻛﺘﺐ ﻓﻴﻪ ﺃﻭﺍﻣﺮ ﺍﻟﻘﺎﺩﺡ ﺍﳌﺮﺍﺩ ﺇﻧﺸﺎﺅﻩ‪ ،‬ﺻﻴﻐﺔ ﺇﻧﺸﺎﺀ ﺍﻟﻘﻮﺍﺩﺡ ﺑﺎﺧﺘﺼﺎﺭ‬
‫ﻛﻤﺎ ﻳﻠﻲ‪:‬‬
‫‪CREATE TRIGGER Trigger_Name‬‬

‫‪ON Table_Name‬‬

‫‪AFTER | FOR | Instead OF‬‬ ‫‪DELETE, Insert, Update‬‬

‫‪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‬‬

‫ﲝﻴﺚ ‪ Text_Message‬ﻫﻮ ﻧﺺ ﺭﺳﺎﻟﺔ ﺍﳋﻄﺄ‪ ،‬ﻭ ‪ Level_Message‬ﻫﻮ ﺩﺭﺟﺔ ﺍﳋﻄﺄ ﻭﻳﺄﺧﺬ‬


‫ﻗﻴﻤﺔ ﺭﻗﻤﻴﺔ ﺑﲔ ‪ 0‬ﻭ ‪ ،24‬ﺃﻣﺎ ‪ State_Message‬ﻓﻬﻲ ﺣﺎﻟﺔ ﺍﳋﻄﺄ ﻭﻫﻲ ﺃﻳﻀﺎ ﺗﺄﺧﺬ ﻗﻴﻤﺔ‬
‫ﺭﻗﻤﻴﺔ ﳏﺼﻮﺭﺓ ﺑﲔ ‪ 1‬ﻭ ‪.127‬‬
‫ﺍﻵﻥ ﺗﻌﺎﻝ ﺑﻨﺎ ﻧﻨﺸﻰﺀ ﻗﺎﺩﺣﺎ ﺟﺪﻳﺪﺍ ﻳﻘﻮﻡ ﲟﻨﻊ ﻋﻤﻠﻴﺔ ﺍﻟﺘﺤﺪﻳﺚ ﻭﺍﻹﺿﺎﻓﺔ ﰲ ﺟﺪﻭﻝ‬
‫ﺍﳌﻮﻇﻔﲔ‪ ،‬ﻭﻳﻈﻬﺮ ﺭﺳﺎﻟﺔ ﻟﻠﻤﺴﺘﺨﺪﻡ ﲢﺘﻮﻱ ﻧﺼﺎ ﲢﺬﻳﺮﻳﺎ ﺑﺄﻥ ﻋﻤﻠﻴﱵ ﺍﻹﺿﺎﻓﺔ ﻭﺍﻟﺘﻌﺪﻳﻞ‬
‫ﻏﲑ ﻣﺴﻤﻮﺡ ‪‬ﻤﺎ ﻋﻠﻰ ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ‪:‬‬

‫‪CREATE TRIGGER TR_Insert_Update‬‬

‫‪ON Employee‬‬

‫‪FOR INSERT, UPDATE‬‬

‫‪AS‬‬

‫;)‪ ',12,3‬ﻏﯿﺮ ﻣﺴﻤﻮح ﺑﻌﻤﻠﯿﺎت اﻹﺿﺎﻓﺔ واﻟﺘﻌﺪﯾﻞ ﻋﻠﻰ ﺟﺪول اﻟﻤﻮﻇﻔﯿﻦ'(‪RAISERROR‬‬

‫‪ROLLBACK‬‬

‫ﺑﻌﺪ ﺗﻨﻔﻴﺬ ﻫﺬﺍ ﺍﻟﻘﺎﺩﺡ‪ ،‬ﻭﺫﻫﺎﺑﻚ ﺇﱃ ﺟﺪﻭﻝ ﺍﳌﻮﻇﻔﲔ ﻟﻠﻘﻴﺎﻡ ﺑﺈﺿﺎﻓﺔ ﺳﻄﺮ ﺟﺪﻳﺪ ﺃﻭ ﺗﻌﺪﻳﻞ‬
‫ﺳﻄﺮ ﻣﻮﺟﻮﺩ‪ ،‬ﺳﺘﻄﺎﻟﻌﻚ ﻟﺮﺳﺎﻟﺔ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬

‫‪128‬‬
‫ﺣﺬﻑ ﺍﻟﻘﻮﺍﺩﺡ‬
‫ﳊﺬﻑ ﻗﺎﺩﺡ ﻣﻌﲔ‪ ،‬ﳝﻜﻨﻚ ﺍﻟﺬﻫﺎﺏ ﺇﱃ ﺍﻟﺘﺒﻮﻳﺐ ‪ Triggers‬ﺍﳌﻮﺟﻮﺩ ﺿﻤﻦ ﺗﺒﻮﻳﺒﺎﺕ ﺍﳉﺪﻭﻝ‬
‫ﺍﳌﻌﲏ‪ ،‬ﻭﻗﻢ ﲝﺬﻓﻪ ﺑﻜﻞ ﺑﺴﺎﻃﺔ‪ ،‬ﺃﻭ ﺑﻮﺍﺳﻄﺔ ﺗﻨﻔﻴﺬ ﺍﻷﻣﺮ ﺍﻟﺘﺎﱄ‪:‬‬
‫‪DROP TRIGGER Trigger_Name‬‬

‫ﺗﻌﺪﻳﻞ ﺍﻟﻘﻮﺍﺩﺡ‬
‫ﻋﻤﻠﻴﺔ ﺍﻟﺘﻌﺪﻳﻞ ﺃﻳﻀﺎ ﺑﻨﻔﺲ ﺍﻟﻄﺮﻳﻘﺔ‪ ،‬ﺍﺫﻫﺐ ﺇﱃ ﺍﻟﻘﺎﺩﺡ ﻭﺍﺧﺘﺮ ﺃﻣﺮ ﺍﻟﺘﻌﺪﻳﻞ ‪ Edit‬ﺃﻭ‬
‫ﺍﺳﺘﻌﻤﻞ ﺍﻟﻜﻠﻤﺔ ‪ ALTER‬ﻛﻤﺎ ﺭﺃﻳﻨﺎ ﻣﻊ ﺑﺎﻗﻲ ﺍﻟﻜﺎﺋﻨﺎﺕ ﺳﺎﺑﻘﺎ‪.‬‬

‫‪129‬‬
‫ﺍﳋﺎﲤﺔ‬

‫ﰎ ﺑﻔﻀﻞ ﺍﷲ ﻭﻋﻮﻧﻪ ﺍﺳﺘﻌﺮﺍﺽ ﺃﻏﻠﺐ ﻣﻔﺎﻫﻴﻢ ﻟﻐﺔ ‪،SQL‬‬


‫ﺑﻄﺮﻳﻘﺔ ﱂ ﺃﺟﺪ ﺃﻳﺴﺮ ﻣﻨﻬﺎ ﰲ ﺍﻟﺸﺮﺡ ﻭﺍﻟﺘﺒﺴﻴﻂ‪ ،‬ﻭﻣﻊ ﺫﻟﻚ ﻓﻘﺪ‬
‫ﺃﻛﻮﻥ ﻧﺴﻴﺖ ﻣﻔﻬﻮﻣﺎ ﻣﺎ‪ ،‬ﺃﻭ ﺍﻧﺘﻜﺴﺖ ﰲ ﺷﺮﺡ ﺟﺰﺀ ﻣﻌﲔ‪ ،‬ﻟﺬﺍ ﻟﻮ‬
‫ﻋﻨﺪ ﺣﻀﺮﺍﺗﻜﻢ ﺃﻳﺔ ﻣﻼﺣﻈﺎﺕ ﺃﻭ ﺍﻗﺘﺮﺍﺣﺎﺕ ﺃﻭ ﻣﺆﺍﺧﺬﺍﺕ ﺃﻭ‬
‫ﺃﺳﺌﻠﺔ ﻓﻼ ﺗﺘﺮﺩﺩﻭﺍ ﰲ ﻣﺮﺍﺳﻠﱵ ﻋﱪ ﺑﺮﻳﺪﻱ ﺍﻻﻟﻜﺘﺮﻭﱐ‪ ،‬ﻭﺇﻥ ﺷﺎﺀ‬
‫ﺍﷲ ﺳﺄﺭﺩ ﻋﻠﻴﻜﻢ ﻗﺪﺭ ﺍﳌﺴﺘﻄﺎﻉ‪.‬‬

‫‪[email protected]‬‬

‫ﻟﻠﺘﻮﺍﺻﻞ ﺍﳌﺒﺎﺷﺮ ﻣﻊ ﺻﺎﺣﺐ ﺍﻟﻜﺘﺎﺏ‪ ،‬ﺍﻟﺘﺤﻘﻮﺍ ﺑﻨﺎ ﻋﻠﻰ ﺻﻔﺤﺔ‬


‫ﺧﻄﻮﺓ ﺇﱃ ﺍﻷﻣﺎﻡ‪:‬‬

‫‪https://www.facebook.com/Khotwa.Amam‬‬

‫ﺩﺍﻡ ﻟﻜﻢ ﺍﻟﺒﺸﺮ ﻭﺍﻟﻔﺮﺡ ﻭﺍﻟﺴﻼﻡ ﻋﻠﻴﻜﻢ ﻭﺭﲪﺔ ﺍﷲ ﻭﺑﺮﻛﺎﺗﻪ‬

‫‪130‬‬

You might also like