You are on page 1of 465

‫‪Structured Query Language‬‬

‫لغة الستفسارات )‪(SQL‬‬

‫‪Data Retrieval‬‬ ‫‪SELECT‬‬


‫استرجاع البيانات‬

‫‪(Data Manipulation Language (DML‬‬ ‫‪DELETE‬‬ ‫‪UPDATE‬‬ ‫‪INSERT‬‬


‫حذف بيانات‬ ‫تعديل بيانات‬ ‫إضافة بيانات‬

‫‪DROP‬‬ ‫‪ALTER‬‬ ‫‪CREATE‬‬


‫إلغاء‬ ‫تعديل‬ ‫إنشاء‬
‫‪(Data definition Language (DDL‬‬
‫‪TRUNCATE‬‬ ‫‪RENAME‬‬
‫إلغاء أو بتر جزء‬ ‫تغيير السم‬

‫‪Transaction Control‬‬ ‫‪SAVEPOINT‬‬ ‫‪ROLLBACK‬‬ ‫‪COMMIT‬‬


‫الرجوع لنقطة معينة‬ ‫الرجوع عن تثبيت البيانات‬ ‫تثبيت البيانات‬

‫‪(Data Control Language (DCL‬‬ ‫‪REVOKE‬‬ ‫‪GRANT‬‬


‫سحب الصلحيات‬ ‫إعطاء الصلحيات للدخول علي البيانات‬

‫محرر )بيئة( أل ‪SQL*PLUS‬‬


‫ل يوضع بعدها الفاصلة المنقوطة );(‬

‫‪SQL > EDIT or ED‬‬ ‫‪SQL > RUN or R‬‬


‫يستخدم هذا المر لتعديل أخر أمر تم كتابته علي المحرر‬ ‫يستخدم هذا المر لعادة تنفيذ آخر أمر تم كتابته في المحرر‬

‫‪SQL < SAVE filename‬‬ ‫‪SQL < LIST‬‬


‫يستخدم هذا المر لحفظ الوامر في ملف بامتداد )‪( sql‬‬ ‫يستخدم هذا المر لعرض سطور آخر أمر تم كتابته‬
‫‪SQL > SAVE test . sql‬‬ ‫‪SQL > L 1 3‬‬
‫لحفظ أمر ما داخل ملف اسمه ‪test . sql‬‬ ‫لعرض السطور من ‪ 1‬إلي ‪3‬‬

‫‪SQL > GET filename‬‬ ‫‪SQL > SET SERVEROUTPUT ON‬‬


‫يستخدم هذا المر لسترجاع الوامر التي تم حفظها بواسطة المر السابق‬ ‫لرؤية نتائج العمليات‬
‫‪SQL > GET test . sql‬‬
‫لسترجاع الوامر من ملف ‪test . sql‬‬ ‫‪BEGIN‬‬
‫;)'‪DBMS_OUTPUT.PUT_LINE('SQL‬‬
‫‪SQL > START filename or SQL > @ filename‬‬ ‫; ‪END‬‬
‫يستخدم هذا المر لتنفيذ الوامر الموجودة في ملف تم حفظه بامتداد ‪sql‬‬ ‫لرؤية النص )‪ (SQL‬علي الشاشة‬
‫‪SQL > START test . sql‬‬
‫لتنفيذ الوامر الموجودة في ملف ‪test . sql‬‬ ‫‪SQL > VARIABLE v_sal NUMBER‬‬
‫لتعريف متغير الربط‬
‫‪SQL > PRINT v_sal‬‬
‫‪SQL > SPOOL filename‬‬
‫لرؤية القيم التي يحتويها متغير الربط علي الشاشة‬
‫يستخدم هذا المر لحفظ كل ما تم عمله داخل المحرر في ملف نصي بامتداد )‪( LST‬‬
‫‪SQL > SPOOL OUT‬‬
‫يستخدم هذا المر للحصول علي نسخة مطبوعة‬

‫‪1‬‬
‫الصيغة العامة لجملة ‪SELECT‬‬

‫‪[SELECT‬‬ ‫‪* or Columns [alias‬‬


‫‪FROM‬‬ ‫‪Table‬‬
‫‪WHERE‬‬ ‫‪Condition or Conditions‬‬
‫‪; [ORDAE BY Column or Alias [ASC or DESC‬‬

‫‪SELECT‬‬ ‫*‬
‫استرجاع البيانات‬ ‫لسترجاع جميع الحقول من الجدول‬

‫‪Columns‬‬ ‫‪Alias‬‬
‫اسم الحقل أو الحقول المراد استرجاعها من الجدول‬ ‫السماء المستعارة للحقول‬

‫‪FROM‬‬ ‫‪Condition or Conditions‬‬


‫للعلن عن اسم الجدول‬ ‫الشرط أو الشروط اللزمة لحصر البيانات التية من الجدول‬

‫‪ORDAE BY‬‬ ‫‪Column or Alias‬‬


‫للعلن عن كيفية ترتيب البيانات المسترجعة من الجدول‬ ‫اسم الحقل أو الحقول أو السماء المستعارة المراد الترتيب بها‬

‫;‬
‫للعلن عن نهاية المر‬

‫لرؤية جميع الجداول الموجودة‬ ‫لتنفيذ جملة ‪SQL‬‬


‫; ‪SQL > SELECT* FROM TAB‬‬ ‫نضع الفاصلة المنقوطة );( في نهاية الجملة‬
‫‪-1‬‬
‫نضع علمة )‪ (/‬في نهاية الجملة عند مؤشر‬‫‪-2‬‬
‫‪< SQL‬‬
‫نكتب المر )‪ (RUN‬عند مؤشر ‪< SQL‬‬ ‫‪-3‬‬
‫استرجاع الحقول بأسماء مستعارة‬
‫استخدام كلمة )‪ (AS‬بين اسم الحقل والسم المستعار ) تستخدم في ‪( access‬‬ ‫‪-1‬‬
‫استخدام المسافة )‪ (Space‬بين اسم الحقل والسم المستعار‬ ‫‪-2‬‬
‫استخدام علمة التنصيص المزدوجة )" "( عندما يكون السم المستعار اكثر من كلمة ) ‪ [ AS [ Alias‬تستخدم في‬ ‫‪-3‬‬
‫‪( access‬‬
‫;‪SQL>SELECT ename AS name,sal salary,job "employee job" FROM emp‬‬
‫استخدام العمليات الحسابية )الجمع‪،‬الطرح‪،‬الضرب‪ ،‬القسمة( وأولويات تنفيذها‬
‫;‪SQL>SELECT ename,sal,sal*12 "annual salary" FROM emp‬‬
‫‪;SQL>SELECT ename,sal, 12*sal+100 FROM emp‬‬
‫;‪SQL>SELECT ename,sal, 12*(sal+100) FROM emp‬‬
‫; ‪SQL> select empno , sal , comm,(sal - comm) from emp‬‬

‫إظهار البناء الداخلي للجدول باستخدام المر ‪(DESCRIBE (DESC‬‬ ‫استخدام عبارة ‪ DISTINCT‬لمنع تكرار السجلت‬
‫;‪SQL>DESC emp‬‬ ‫;‪SQL>SELECT DISTINCT deptno FROM emp‬‬

‫‪2‬‬
WHERE ‫جملة الشرط‬
‫لحصر الصفوف علي أساس شرط معين‬

‫تعبيرات حسابية‬ ‫قيم ثابتة سواء كانت عددية أو نصية‬ ‫معاملت مقارنة‬ ‫أسماء حقول‬
Comparison Operators Columns

‫عند كتابة جملة الشرط يجب مراعاة التي‬


( ' ' ) ‫في حال استخدام قيم نصية أو تاريخية لبد من وضعها داخل علمة التنصيص الفردية‬ .1
‫في حال استخدم القيم النصية لبد من مراعاة حالة الحرف كبيرة أم صغيرة‬ .2
‫في حال استخدام قيم تعبر عن التاريخ لبد من مراعاة صيغة التاريخ المستخدمة علما بأن الصيغة‬ .3
‫الساسية للتاريخ‬
( YY -MON -DD) ‫ هي كالتالي‬SQL ‫داخل لغة‬
( ORDER BY ) ‫جملة الترتيب‬
‫تستخدم لترتيب الصفوف الناتجة ترتيبا تصاعديا أو تنازليا ويجب مراعاة التي عند كتابتها‬
SELECT ‫يجب أن تكتب في آخر جملة‬ .1
Alias ‫ أو أسماء مستعارة‬Columns ‫تحتوي علي أسماء حقول‬ .2
) ‫( وهي القيمة الفتراضية للترتيب‬Ascending) ‫( وهي اختصار لكلمة‬ASC) ‫للترتيب تصاعديا نكتب‬ .3
(Default

WHERE comm > (1.10*sal) + 500 ; SQL>SELECT ename , job,deptno


WHERE hiredate >= '1/1/2005' + 15 days ; FROM emp
WHERE hiredate >= '1/1/2005 12:00AM ' ; WHERE job ='CLERK'
WHERE hiredate >= dateadd(day,15,'1/1/2005') ; ORDER BY deptno
WHERE hiredate =
to_date( 'jun 1 2005' , 'mon dd yyyy' ) ;
WHERE hiredate > current_date ; ** , (=^ or != or <> ) , => , > , =< , < , =
WHERE sal BETWEEN BETWEEN 1 AND 10
(.80*comm) AND (1.20*comm) ; (IN (1,3,4,10
WHERE sal > comm AND NOT sal <1000 ; 'LIKE 'A%' or '%A' or '99
WHERE ename LIKE ' ja_al % ' ; IS NULL
WHERE ( deptno IN (10 , 20) )
OR (mgr IS NULL AND hiredate >= '1-1-2005') ‫المعاملت المنطقية لتكوين اكثر من شرط في جملة‬
OR (sal > comm AND NOT sal >100000) ; AND , OR , NOT

ACCESS ( ‫التصميم‬
WHERE hiredate ‫استعلم ــ عرض‬
= '01-JAN-99' ; ‫) عند استخدام‬ Column hiredate #1/1/1999#
WHERE sal >=1500 ; Column sal >=1500
WHERE ename = 'JAMAL' ; Column ename "JAMAL"
WHERE sal <= comm ; Column sal <=[comm]
WHERE sal BETWEEN 1500 AND 3000 ; Column sal between 1500 and 3000
WHERE mgr IN (101,102,105) ; Column mgr in (101;102;105)
WHERE ename LIKE 'J%' ; Column ename like "J*"
WHERE hiredate LIKE '%99' ; Column hiredate like "*1999" or "*99"
WHERE ename LIKE '_A%' ; Column ename like '?A*' ;
WHERE mgr IS NULL ; Column mgr is null
WHERE sal >=1500 AND job = 'CLERK' ; Column sal >=1500 AND Column job "CLERK"
WHERE sal >1500 AND comm < 1000 Column sal >1500 AND Column comm<1000
WHERE sal >1500 OR job = 'CLERK' ; Column sal >1500 OR Column job "CLERK"
WHERE sal NOT BETWEEN 1500 AND 3000 ; Column sal not between 1500 and 3000
WHERE job NOT IN ('CLERK', 'MANAGER') ; Column job not in ("CLERK";"MANAGER")
WHERE ename NOT LIKE '%J%' ; Column ename not like "*J*"
WHERE comm IS NOT NULL ; Column comm is not null
ORDER BY sal DESC 3
‫‪SQL FUNCTIONS‬‬
‫أنواع الدوال ) عند استخدام جملة ‪(select‬‬

‫‪SINGLE - ROW FUNCTION‬‬ ‫‪MULTIPLE - ROW FUNCTION‬‬


‫دوال الصف الواحد‬ ‫الدوال التجميعية‬

‫قيمة واحدة‬ ‫صف واحد‬ ‫قيمة واحدة‬ ‫عدة صفوف‬

‫‪Character Functions‬‬ ‫‪SUM‬‬


‫دوال حرفية‬ ‫مجموع عدد من القيم‬

‫‪Number Functions‬‬ ‫‪MAX‬‬


‫دوال رقمية‬ ‫أكبر قيمة من بين مجموعة من القيم‬

‫‪Data Functions‬‬ ‫‪MIN‬‬


‫دوال التاريخ‬ ‫أقل قيمة من بين مجموعة من القيم‬

‫‪Conversion Functions‬‬ ‫‪AVG‬‬


‫دوال التحويل‬ ‫المتوسط الحسابي لمجموعة من القيم‬

‫‪COUNT‬‬
‫عدد القيم أو عدد الصفوف مع تجاهل القيم الفارغة ‪NULL‬‬

‫‪STDDEV‬‬
‫النحراف المعياري لمجموعة من القيم‬

‫‪VARIANCE‬‬
‫مقدار التباين )التشتت( لمجموعة من القيم‬

‫* جميع هذه الدوال تتجاهل القيم الفارغة ‪ NULL‬داخل العمدة‬

‫‪4‬‬
‫‪Character Functions‬‬

‫دوال حرفية‬

‫تتعامل مع البيانات الحرفية وتكون نتيجتها إما حروفا أو أرقاما ويمكن استخدمها في أي جزء من جملة ‪ select‬ما عدا الجزء ‪form‬‬
‫‪Access‬‬

‫)'‪LOWER ('column' \ 'expression‬‬ ‫)‪(Lcase‬‬ ‫تستخدم لتحويل جميع الحروف )عمود أو سلسلة( إلي حروف صغيره‬

‫)'‪UPPER ('column' \ 'expression‬‬ ‫)‪(ucase‬‬ ‫تستخدم لتحويل جميع الحروف )عمود أو سلسلة( إلي حروف كبيرة‬

‫)'‪INITCAP ('column' \ 'expression‬‬ ‫تستخدم لتحويل الحرف الول فقط من )عمود أو سلسلة( إلى حرف كبير‬
‫وباقي الحروف تحول إلى حروف صغيرة‬

‫‪CONCAT ('column1' \ 'expression1' ,‬‬ ‫تستخدم لربط عمودين أو سلسلتين معا وهي مثل أداة الربط ) || (‬
‫‪(''column2' \ 'expression2‬‬ ‫) لوضع فاصل بين العمدة نكتب ||' ' || (‬

‫)‪SUBSTR ('column' \ 'expression1',m,n) (mid‬‬ ‫تستخدم لقطع جزء من عمود أو سلسلة بداية من الحرف رقم ‪m‬‬
‫وعدد الحروف المقطوعة هي ‪n‬‬

‫)‪LENGTH ('column' \ 'expression') (len‬‬ ‫تستخدم ليجاد عدد حروف السلسة أو العمود‬

‫‪('INSTR ('column' \ 'expression1','m‬‬ ‫تستخدم لتحديد مكان حرف معين داخل سلسلة أو عمود والحرف ‪m‬‬
‫يعبر عن الحرف المراد تحديد مكانه‬

‫‪('LPAD ('column' \ 'expression1',n,'string‬‬ ‫تستخدم لضبط بيانات عمود أو سلسة لناحية اليمين وذلك بملء حرف‬
‫معين من اليسار والحرف ‪ n‬لتحديد الطول بعد الضبط‬

‫‪('RPAD ('column' \ 'expression',n,'string‬‬ ‫تستخدم لضبط بيانات عمود أو سلسلة لناحية اليسار وذلك بملء حرف‬
‫معين من اليمين والحرف ‪ n‬لتحديد الطول بعد الضبط‬

‫‪('TRIM ('character' FROM 'column' \ 'expression‬‬ ‫تستخدم لقطع حرف معين من بداية أو نهاية الكلمة فقط‬

‫‪5‬‬
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
`

419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
‫)‪SQL>SELECT LOWER(ename) , UPPER(job) , INITCAP(job) , CONCAT(ename , job‬‬
‫‪FROM emp‬‬
‫; ‪WHERE sal=3000‬‬
‫) '‪SQL>SELECT ename , SUBSTR(ename,2,3) , LENGTH(ename) , INSTR( ename ,'J‬‬
‫‪FROM emp‬‬
‫; '‪WHERE LOWER(job)='manager‬‬
‫‪Number‬‬
‫‪SQL>SELECT ename , TRIM('J' FROM‬‬ ‫)‪ename‬‬‫‪Functions‬‬
‫)'‪, LPAD(ename,10,'*') , RPAD(ename , 10 ,'#‬‬
‫‪FROM emp‬‬
‫; ‪WHERE sal=3000‬‬ ‫دوال رقمية‬

‫‪(ROUND (column \ expression , n‬‬

‫دالة تستخدم لقص عدد معين من الجزء العشري مع تقريب العداد إلي أقرب عدد عشري أو إلي عدد صحيح والحرف ‪ n‬يبين عدد الرقام بعد‬
‫العلمة العشرية ‪ ،‬وتوجد حالت للحرف ‪n‬‬
‫إذا كان )‪ (n=0‬فإن التقريب يكون إلي أقرب عدد صحيح‬ ‫‪.1‬‬
‫إذا كان )‪ (n>0‬أي عدد موجب فإن التقريب يكون في الجزء بعد العلمة العشرية )الجزء العشري(‬ ‫‪.2‬‬
‫إذا كان )‪ (n<0‬أي عدد سالب فإن التقريب يكون في الجزء قبل العلمة العشرية )الجزء الصحيح(‬ ‫‪.3‬‬
‫; ‪SQL>select round(45.923,0) , round(45.923.2) , round(45.923,-1) , round(45.923,-2) from dual‬‬
‫‪46‬‬ ‫‪45.92‬‬ ‫‪50‬‬ ‫‪0‬‬

‫)‪TRUNC (column \ expression , n‬‬

‫دالة تستخدم لقص عدد معين من الجزء العشري بدون تقريب ‪ ،‬وتوجد حالت للحرف ‪n‬‬
‫إذا كان )‪ (n=0‬فأنة يتم قص الجزء العشري كله ويكون الناتج عدد صحيح‬ ‫‪.1‬‬
‫إذا كان )‪ (n>0‬أي عدد موجب فإن القص يكون في الجزء بعد العلمة العشرية )الجزء العشري(‬ ‫‪.2‬‬
‫إذا كان )‪ (n<0‬أي عدد سالب فإن القص يكون في الجزء قبل العلمة العشرية )الجزء الصحيح(‬ ‫‪.3‬‬
‫; ‪SQL>select trunc(45.923,0) , trunc(45.923.2) , trunc(45.923,-1) , trunc(45.923,-2) from dual‬‬
‫‪45‬‬ ‫‪45.92‬‬ ‫‪40‬‬ ‫‪0‬‬
‫‪452‬‬
‫‪(MOD (m ,n‬‬

‫دالة تستخدم ليجاد باقي قسمة العدد ‪ m‬علي العدد ‪n‬‬


‫)‪SQL>select ename , sal , comm , mod( sal , comm‬‬ ‫‪from emp‬‬ ‫; ‪where sal=1600‬‬
‫‪Jamal 1600 300‬‬ ‫‪100‬‬ ‫) ‪( 1600 – 1500 = 100‬‬
‫‪( access‬‬ ‫) ‪sal mod comm‬‬

‫‪Date Functions‬‬

‫دوال التاريخ‬

‫أشهر السنة الميلدية‬

‫‪JAN_FEB_MAR_APR_MAY_JUN_JUL_AUG_SEP_OCT_NOV_DEC‬‬

‫‪SYSDATE‬‬ ‫دالة تستخدم لعرض تاريخ النظام الموجود بجهاز الحاسب اللي )تاريخ اليوم الحالي(‬

‫)‪MONTHS_BETWEEN (date1,date2‬‬ ‫دالة ليجاد عدد الشهر بين تاريخين‬

‫)‪ADD_MONTHS (date,n‬‬ ‫دالة لضافة عدد معين من الشهر علي تاريخ معطي‬

‫)'‪NEXT_DAY (date,'day‬‬ ‫دالة ليجاد تاريخ يوم معين بعد تاريخ معطي‬

‫)‪LAST_DAY (date‬‬ ‫دالة ليجاد آخر يوم في الشهر لتاريخ معطي‬

‫)‪ROUND (date‬‬ ‫دالة تستخدم لتقريب التاريخ لقرب شهر أو سنة‬

‫)‪TRUNC (date‬‬ ‫دالة تستخدم لقص التاريخ لقرب شهر أو سنة‬

‫‪453‬‬
MONTHS_BETWEEN ('01-JAN-95','11-JAN-94')
ADD_MONTHS ('11-JAN-94',6)
NEXT_DAY ('01-SEP-95','FRIDAY')
LAST_DAY ('01-SEP-95')
ROUND ('25-JUL-95','MONTH')
ROUND ('25-JUL-95','YEAR')
TRUNC ('25-JUL-95','MONTH')
TRUNC ('25-JUL-95','YEAR')
SQL>SELECT SYSDATE FROM dual ;

SQL>SELECT empno , hiredate , MONTHS_BETWEEN( sysdate , hiredate )


FROM emp
WHERE hiredate like '%1987' ;

SQL>SELECT empno , hiredate , ROUND (MONTHS_BETWEEN(sysdate,hiredate))‫لتقريب عدد الشهر‬


FROM emp
WHERE hiredate like '%1987' ;

SQL>SELECT empno , hiredate , ADD_MONTHS (hiredate,6) , LAST_DAY(hiredate)


FROM emp
WHERE hiredate like '%1987' ;

SQL>SELECT empno,hiredate, NEXT_DAY(hiredate,'FRIDAY')


FROM emp
WHERE hiredate like '%1987' ;

454
‫‪Conversion Functions‬‬

‫دوال التحويل‬

‫)'‪TO_CHAR (DATE / NUMBER ,'fmt‬‬


‫تستخدم لتحويل البيانات الرقمية أو بيانات التاريخ إلي بيانات حرفية بشكل معين )‪ (FORMAT‬حسب الطلب ‪frm‬‬
‫; ‪SQL>SELECT sysdate, TO_CHAR (sysdate , 'DD/MM/YYYY' ) FROM dual‬‬
‫; ‪SQL>SELECT sysdate, TO_CHAR (sysdate , 'DD "OF" MM/YYYY' ) FROM dual‬‬
‫) '‪SQL>SELECT empno, TO_CHAR (hiredate , 'DAY "OF" MONTH YYYY HH12:MI:SS AM‬‬
‫; )'‪FROM emp WHERE ename = upper('jamal‬‬
‫‪TUESDAY OF NOVEMBER 1981 12:00:00 AM‬‬
‫; ‪SQL>SELECT empno,TO_CHAR (sal ,' $99,999') salary FROM emp WHERE sal>2500‬‬
‫‪SALARY $3,000‬‬

‫‪9‬‬ ‫تكرار هذا الرقم يمثل عدد الخانات التي تظهر‬


‫‪099‬‬ ‫يعني ظهور الرقم وقبلة صفر‬
‫‪990‬‬ ‫يعني ظهور صفرا إذا كانت القيمة معدومة‬
‫‪$99‬‬ ‫إظهار علمة ‪ $‬قبل الرقم‬
‫‪.‬‬ ‫إظهار العلمة العشرية‬
‫‪,‬‬ ‫إظهار فواصل بين كل ثلثة أرقام ) فاصلة اللوف (‬
‫‪MI‬‬ ‫إظهار علمة السالب يمين الرقم إذا كان سالبا‬

‫‪YYYY‬‬ ‫لظهار السنة كاملة بالرقام ) القرن ‪ +‬السنة ( مثل ‪2004‬‬

‫‪YY‬‬ ‫لظهار رقمين فقط من السنة ‪04‬‬

‫‪TO_DATE‬‬ ‫لظهار السنة كاملة كتابة ) ‪ ( TOW THOUSSAND FOUR‬وحالة أحرف الكتابة تتوقف علي)'‪(CHAR ,'fmt‬‬
‫‪YEAR‬‬
‫‪YEAR‬الحرفية إلي بيانات من نوع التاريخ بشكل معين ) ‪ ( FORMAT‬حسب الطلب ‪frm‬‬
‫كلمةالبيانات‬ ‫أحرف‬
‫لتحويل‬ ‫حالة‬
‫تستخدم‬
‫‪SQL>SELECT‬‬
‫‪MM‬‬ ‫‪TO_DATE ('FEBRUARY 22,1981','MONTH DD,YYYY') 01‬‬ ‫‪FROM‬‬ ‫‪dual‬‬
‫شكل رقمين‬ ‫لظهار الشهر ;في‬
‫‪22-FEB-1981‬‬
‫‪MONTH‬‬ ‫لظهار الشهر كتابة ) ‪( JANURY‬‬

‫‪DY‬‬ ‫لظهار الثلث حروف الولي من اليوم ) ‪( JAN‬‬

‫‪DAY‬‬ ‫لظهار اليوم كامل كتابتا ) ‪( FRIDAY‬‬

‫‪HH12:MI:SS AM‬‬ ‫لظهار الوقت بنظام ‪ 12‬ساعة وهل هو صباحا أم مساء ) ‪( PM 04:30:50‬‬

‫)'‪TO_NUMBER (CHAR ,'fmt‬‬


‫تستخدم لتحويل البيانات الحرفية التي تعبر عن رقم إلي بيانات رقمية بشكل معين ) ‪ ( FORMAT‬حسب الطلب ‪frm‬‬
‫حيث إذا كان لدينا عمود ومسجل به بيانات رقمية كنص ونريد إجراء عمليات حسابية علي هذا العمود فيجب تحويل هذه البيانات إلي‬
‫‪ ( ; access‬حيث ‪ val = value‬وذلك للتحويل إلي رقم‬ ‫بيانات رقمية ) ‪select val (column) from table name‬‬

‫‪455‬‬
‫‪MULTIPLE - ROW FUNCTION‬‬
‫الدوال التجميعية‬
‫قيمة واحدة‬ ‫عدة صفوف‬
‫‪GROUP FUNCTIONS‬‬
‫الدوال التجميعية لكثر من صف‬

‫‪SUM‬‬ ‫‪MAX‬‬
‫مجموع عدد من القيم‬ ‫أكبر قيمة من بين مجموعة من القيم‬
‫; ‪SQL>SELECT SUM (sal) FROM emp‬‬
‫‪AVG‬‬
‫المتوسط الحسابي لمجموعة من القيم‬
‫‪MIN‬‬
‫أقل قيمة من بين مجموعة من القيم‬ ‫‪STDDEV DEVIATION‬‬
‫النحراف المعياري لمجموعة من القيم‬

‫‪COUNT‬‬ ‫‪VARIANCE‬‬
‫عدد القيم أو عدد الصفوف مع تجاهل القيم الفارغة ‪NULL‬‬ ‫مقدار التباين )التشتت( لمجموعة من القيم‬

‫; ‪SQL>SELECT SUM(sal) , MAX(sal) , MIN(sal) , AVG(sal) FROM emp‬‬


‫مجموع رواتب الموظفين ‪ ،‬أكبر راتب ‪ ،‬أصغر راتب ‪ ،‬المتوسط الحسابي للرواتب‬
‫; ‪SQL>SELECT MAX(ename) , MIN(ename) FROM emp‬‬
‫أول أسماء الموظفين وآخر أسماء الموظفين حسب الترتيب البجدي‬
‫; ‪SQL>SELECT AVG ( NVL (comm , 0) ) FROM emp‬‬
‫الوسط الحسابي لمكافآت الموظفين وتم استخدام الدالة ‪ NVL‬لحل مشكلة القيم الفارغة ‪ NULL‬الموجودة داخل العامود ‪comm‬‬
‫; ‪SQL>SELECT COUNT(*),COUNT(comm),COUNT(deptno) FROM emp‬‬
‫إجمالي عدد الصفوف داخل ‪ ، emp‬عدد الموظفين الذين يأخذون مكافآت مع تجاهل القيم الفارغة ‪ ، NULL‬عدد الدارات داخل‬
‫‪ deptno‬مع احتساب القيم المكررة‬
‫; ‪SQL>SELECT COUNT(comm) , COUNT(*) FROM emp WHERE deptno=30‬‬
‫عدد الموظفين في الدارة رقم ‪ ، 30‬عدد الموظفين الذين يأخذون عمولة في الدارة رقم ‪30‬‬

‫‪GROUP BY‬‬
‫لتقسيم البيانات إلي مجموعات علي حسب عمود معين أو أكثر‬

‫; ‪SQL>SELECT deptno , MAX(sal) FROM emp GROUP BY deptno‬‬


‫تم تقسيم الموظفين إلي مجموعات حسب رقم الدارة ‪ ،‬وتم إظهار أكبر راتب في كل إدارة‬
‫; )‪SQL>SELECT deptno , AVG(sal) FROM emp GROUP BY deptno ORDER BY AVG(sal‬‬
‫تم عرض المتوسط الحسابي لمرتبات الموظفين في كل إدارة كما تم ترتيب المخرجات تصاعديا حسب المتوسط الحسابي‬
‫; ‪SQL>SELECT deptno , AVG(sal) FROM emp GROUP BY deptno HAVING AVG(sal) > 2000‬‬
‫تم عرض المتوسط الحسابي لمرتبات الموظفين في كل إدارة بشرط أن تكون المتوسطات الحسابية أكبر من ‪2000‬‬
‫‪SQL>SELECT job , SUM(sal) FROM emp WHERE job not like 'SALES' GROUP BY job‬‬
‫; )‪HAVING SUM(sal) > 5000 ORDER BY SUM(sal‬‬
‫تم عرض مجموع رواتب الموظفين حسب كل وظيفة بشرط استبعاد الوظيفة التي تتضمن الحروف )‪ (SALES‬وأيضا استبعاد المجموع‬
‫الصغر من )‪ (5000‬وترتيب المخرجات حسب مجموع الرواتب‬
‫عند كتابة أي عمود داخل قائمة ‪ SELECT‬ل بد من كتابته مع الجزء ‪ GROUP BY‬وذلك لن الدوال التجميعية‬ ‫‪.1‬‬
‫تتعامل مع عدة صفوف‬
‫يمكن استخدام الجزء ‪ ORDER BY‬لترتيب الصفوف مع الدوال التجميعية‬ ‫‪.2‬‬
‫ل يمكن استخدام الدوال التجميعية في الجزء ‪ WHERE‬ولكن نستخدم الجزء ‪ HAVING‬بدل منها‬ ‫‪.3‬‬

‫‪456‬‬
‫‪DISPLAYING DATA FROM MULTIPLE TABLES‬‬
‫عرض البيانات من أكثر من جدول‬

‫‪Types of Joins‬‬
‫أنواع الربط‬

‫الربط بالتساوي ‪Equijoin‬‬


‫يتم ربط جدولين أو أكثر عن طريق عمودين متساويين العامود الول عادة ما يكون مفتاح أساس )‪ (Primary Key‬في الجدول الول‬
‫والعامود الثاني يكون عبارة عن عامود ربط )‪ (Foreign Key‬في الجدول الثاني‬
‫‪SQL>SELECT emp.empno , emp.ename , emp.deptno , dept.deptno , dept.loc FROM emp , dept‬‬
‫; ‪WHERE emp.deptno = dept.deptno‬‬
‫استخدام السماء المستعارة للجداول لتسهيل عملية كتابة العمدة‬
‫‪SQL>SELECT e.empno , e.ename , e.deptno , d.deptno , d.loc FROM emp e , dept d‬‬
‫; ‪WHERE e.deptno = d.deptno‬‬
‫لعرض البيانات السابقة للموظف جمال فقط وبحروف كبيرة‬
‫‪SQL>SELECT e.empno , e.ename , e.deptno , d.deptno , d.loc FROM emp e, dept d‬‬
‫; )'‪WHERE e.deptno = d.deptno AND e.ename = upper('jamal‬‬

‫الربط بعدم التساوي ‪Non-Equijoin‬‬


‫يتم استخدام هذا النوع من الربط عندما ل توجد علقة مباشرة بين الجدولين المراد ربطهما أي إننا ل نستخدم علمة التساوي في الربط‬
‫‪SQL>SELECT e.ename , e.sal , s.grade‬‬ ‫‪FROM emp e , salgrade s‬‬
‫; ‪WHERE e.sal BETWEEN s.losal AND s.hisal‬‬

‫الربط الخارجي ‪Outer Join‬‬


‫يتم استخدام هذا النوع من الربط عندما توجد بيانات في أحد الجداول ولكنها ل تظهر في حالة الربط بالتساوي بين الجدولين آي إنها غير‬
‫مطابقة لشرط التساوي ونريد لهذه البيانات أن تظهر ‪ ،‬هنا نقوم باستخدام الربط بالتساوي ولكن نضيف الجزء )‪ (+‬بجانب العمود الفاقد للبيانات‬
‫‪SQL>SELECT e.empno , e.ename ,d.deptno , d.dname FROM emp e , dept d‬‬
‫; ‪WHERE e.deptno(+) = d.deptno‬‬

‫الربط الداخلي لنفس الجدول ‪Self Join‬‬


‫لعمل هذا الربط لبد من تقسيم جدول الموظفين إلي جدولين أحدهم يمثل جدول الموظفين ونسميه مثل )‪ (WORKER‬والخر جدول المدراء‬
‫ونسميه مثل )‪ (MANAGER‬ونقوم بعد ذلك بربط الجدولين عن طريق الربط بالتساوي‬
‫‪SQL>SELECT WORKER.empno , WORKER.ename , MANAGER.ename manager‬‬
‫; ‪FROM emp worker , emp manager WHERE worker.mgr = manager.empno‬‬

‫الربط بين أكثر من جدولين‬


‫للربط لبد أن تتوفر علقة ما بينهم جميعا علما بأئه لبد أن تكون جمل الشرط المستخدمة في عملية الربط تساوي )عدد الجداول ‪ ، ( 1 -‬أي إذا‬
‫كان لدينا جدولن فلبد من أن يكون هنالك شرط واحد لربطهما ‪ ،‬وإذا كان لدينا ثلثة جداول فيجب أن يتوفر شرطان لربطهما وهكذا ولبد من‬
‫وضع المعامل )‪ (AND‬بين هذه الشروط‬
‫‪SQL>SELECT e.empno , e.ename ,e.sal , d.dname , s.grade FROM emp e , dept d , salgrade s‬‬
‫شرط الربط بين جدول الموظفين وجدول الدارات ‪WHERE e.deptno = d.deptno‬‬
‫; ‪AND e.sal BETWEEN s.losal and s.hisal‬‬ ‫شرط الربط بين جدول الموظفين وجدول الفئات‬

‫‪457‬‬
‫‪SUBQUERIES‬‬
‫الستعلمات الفرعية‬

‫الشكل العام لجملة الستعلمات الفرعية‬


‫الستعلم الخارجي )الرئيسي ‪SQL>SELECT‬‬ ‫)مجموع العمدة المطلوبة‬
‫الجدول ‪FROM‬‬
‫معامل المقارنة ‪WHERE‬‬ ‫الستعلم الداخلي )الفرعي ‪ from‬مجموع العمدة المطلوبة ‪ (select‬العامود‬ ‫)الجدول (‬
‫حيث يقوم نظام الوراكل بتنفيذ الستعلم الداخلي )الفرعي( أول ثم ينفذ الستعلم الخارجي )الرئيسي(‬
‫;)'‪SQL>SELECT ename FROM emp WHERE sal > ( SELECT sal FROM emp WHERE ename ='jamal‬‬
‫‪SQL>SELECT empno , ename , job FROM emp‬‬
‫;) '‪WHERE job =( SELECT job FROM emp WHERE ename = 'jamal‬‬

‫يجب مراعاة التي عند استخدام الستعلم الفرعي‬


‫يجب وضع الستعلم الفرعي بين قوسين‬ ‫‪.1‬‬
‫يجب وضع الستعلم الفرعي يمين معامل المقارنة ) ><‪( > , < , => , =< , = ,‬‬ ‫‪.2‬‬
‫يجب التأكد من استخدام المعاملت الحادية الصف مع الستعلمات الفرعية الحادية الصف )‪(single-row subquery‬‬ ‫‪.3‬‬
‫يجب التأكد من استخدام المعاملت المتعددة الصفوف مع الستعلمات الفرعية المتعددة الصفوف )‪multiple-row‬‬ ‫‪.4‬‬
‫‪(subquery‬‬
‫أنواع معاملت المقارنة المستخدمة مع الستعلم الفرعي‬
‫معاملت أحادية الصف مثل ) >< ‪ (> , < , => , =< , = ,‬وتستخدم مع الستعلمات الفرعية أحادية الصف أي التي ترجع‬ ‫‪.1‬‬
‫بصف واحد ) قيمة واحدة (‬
‫معاملت متعددة الصف مثل) ‪ ( ALL,ANY,IN‬وتستخدم مع الستعلمات الفرعية متعددة الصفوف أي التي ترجع بأكثر‬ ‫‪.2‬‬
‫من صف‬
‫أماكن كتابة الستعلمات الفرعية داخل جملة ‪select‬‬

‫الستعلمات الفرعية الحادية الصف وتكون نتيجتها صف واحد فقط ‪Single-Row Subqueries‬‬
‫‪SQL>SELECT ename , sal , deptno FROM emp‬‬
‫; ) '‪WHERE deptno =( SELECT deptno FROM emp WHERE ename ='jamal‬‬
‫; ) ‪SQL>SELECT ename , job , sal FROM emp WHERE sal =( select MIN(sal) from emp‬‬
‫‪SOL>SELECT deptno , MIN(sal) FROM emp GROUP BY deptno‬‬
‫; ) ‪HAVING MIN(sal) > ( select MIN(sal) from emp where deptno =20‬‬
‫) ‪SQL>SELECT ename,job FROM emp WHERE job =( select job from emp where empno = 2‬‬
‫; ) ‪AND sal > ( select sal from emp where empno = 4‬‬

‫الستعلمات الفرعية المتعددة الصفوف وتكون نتيجتها أكثر من صف ‪multiple-row subqueries‬‬


‫‪SQL>SELECT ename, sal, deptno FROM emp‬‬
‫;)‪WHERE sal IN (select min(sal) from emp group by deptno‬‬
‫‪SOL>SELECT empno , ename , job , sal FROM emp‬‬
‫;'‪WHERE sal < ANY (select sal from emp where job ='clerk') AND job <> 'clerk‬‬
‫‪SQL>SELECT empno , ename , job , sal FROM emp‬‬
‫; )‪WHERE sal > ALL (select AVG(sal) from emp group by deptno‬‬

‫مقارنة قيمة بكل ما هو موجود داخل قائمة‬ ‫‪ALL‬‬ ‫المساواة بأي قيمة داخل قائمة‬ ‫‪IN‬‬
‫معناها أقل من أقل قيمة داخل قائمة‬ ‫>‪ALL‬‬ ‫مقارنة قيمة بأي قيم داخل قائمة‬ ‫‪ANY‬‬
‫معناها أكبر من أعلي قيمة داخل قائمة‬ ‫<‪ALL‬‬ ‫معناها أقل من أكبر قيمة داخل قائمة‬ ‫>‪ANY‬‬
‫معناها أكبر من أقل قيمة داخل قائمة‬ ‫<‪ANY‬‬

‫‪458‬‬
‫‪MULTIPLE – COLUMN SUBQUERIES‬‬
‫الستعلم الفرعي المتعدد العمدة‬

‫الصيغة العامة لجملة الستعلمات الفرعية متعددة العمدة‬


‫‪SQL>SELECT‬‬ ‫العمدة المطلوبة‬
‫‪FROM‬‬ ‫الجدول‬
‫; ) شرط ‪ where‬الجدول ‪,.... from‬عامود ‪,1‬عامود ‪,.....) IN (select 2‬عامود ‪,1‬عامود ‪WHERE (2‬‬
‫حيث أن الستعلم الفرعي يرجع بأكثر من عامود والتي يتم مقارنتها بالعمدة الموجودة في جملة ‪ where‬في الستعلم الرئيسي‬
‫‪SQL>SELECT order_id , product_id , quantity FROM item WHERE ( product_id , quantity ) IN‬‬
‫; ‪( select product_id , quantity from item where order_id = 605) AND order_id <> 605‬‬

‫عندما تكون نتيجة الستعلم الفرعي ‪ NULL‬أي إنه ل توجد نتيجة للستعلم الفرعي في هذه الحالة ل يكون للستعلم الرئيسي أي نتيجة‬
‫ويعطي الرسالة التالية ) ‪ (no rows selected‬وتعني أنه ل يوجد أي صفوف مطابقة للشرط في جملة ‪ where‬الموجودة داخل الستعلم‬
‫الرئيسي‬
‫‪SQL>SELECT order_id , product_id , quantity FROM item WHERE ( product_id , quantity) IN‬‬
‫; ‪( select product_id , quantity from item where order_id = 700 ) AND order_id <> 700‬‬
‫حيث رقم الطلب ‪ 700‬غير مسجل داخل الجدول‬

‫استخدام الستعلم الفرعي في جملة ‪FROM‬‬


‫‪SQL>SELECT e.ename , e.sal , e.deptno , esub.salavg‬‬
‫‪FROM emp e , ( select deptno , avg(sal) salavg from emp group by deptno ) esub‬‬
‫; ‪WHERE e.deptno = esub.deptno AND e.sal > esub.salavg‬‬
‫حيث الستعلم الفرعي هنا يعامل معاملة الجدول ) جدول جديد باسم ‪(esub‬‬
‫‪ = esub.salavg‬المتوسط الحسابي لرواتب الموظفين الذين يأخذون رواتب أعلي من المتوسط الحسابي لداراتهم‬

‫)‪Data Manipulation Language (DML‬‬


‫لغة التعامل مع البيانات‬

‫إضافة سجل أو عدد من السجلت إلي جدول معين )‪(INSERT INTO‬‬


‫الصيغة العامة لضافة سجلت جديدة إلي جدول‬
‫)‪ ,......‬جدول ) عامود ‪ , 1‬عامود ‪ , 2‬عامود ‪SQL>INSERT INTO 3‬‬
‫‪VALUES‬‬ ‫; )‪ ,......‬قيمة ‪ , 1‬قيمة ‪ , 2‬قيمة ‪( 3‬‬
‫القواعد التي يجب التقيد بها عند الضافة‬
‫يجب أن تكون عدد القيم التي سيتم إدخالها مساويا لعدد العمدة المذكورة في جملة ‪INSERT‬‬ ‫‪.1‬‬
‫يجب أن تكون القيم مرتبة بنفس ترتيب العمدة المراد إدخال القيم إليها‪،‬كما يجب أن تكون القيم أيضا من نفس نوع بيانات‬ ‫‪.2‬‬
‫العمدة‬
‫عند إدخال قيم التاريخ والنصوص لبد من وضعها داخل علمتي تنصيص فرديتين ) ' ' (‬ ‫‪.3‬‬
‫يجب إدخال قيما للعمدة التي ل تقبل قيما فارغة )‪ (NULL‬مثل أعمدة المفتاح الساسي )‪ (primary key‬مثل )‬ ‫‪.4‬‬
‫‪(empno‬‬
‫يجوز عدم ذكر أسماء العمدة في جملة )‪ (INSERT‬وفي هذه الحالة لبد من إدخال جميع قيم العمدة الموجودة في‬ ‫‪.5‬‬
‫الجدول مع مراعاة نوع البيانات لكل عامود‬
‫ملحظة ‪ :‬يمكن عرض أسماء العمدة ونوع بياناتها داخل جدول معين باستخدام المر )‪(DESC table‬‬
‫; )'‪SQL>INSERT INTO dept (deptno , dname , loc) VALUES (50 , 'DEVELOPMENT' , 'DETROIT‬‬
‫إضافة قيمة فارغة )‪ (NULL‬إلي عامود‬
‫عدم كتابة العمدة المراد تسجيل القيمة ‪ NULL‬بها في الجزء ‪INSERT‬‬ ‫‪.1‬‬
‫أن نكتب العمدة ولكن نكتب قيمتها ‪ NULL‬داخل الجزء ‪ VALUES‬بشرط أن تقبل العمدة هذه القيمة‬ ‫‪.2‬‬
‫; )'‪SQL>INSERT INTO dept ( deptno , dname) VALUES (60 , 'MIS‬‬
‫; )‪OR SQL>INSERT INTO dept ( deptno , dname , loc) VALUES (60 , 'MIS' , NULL‬‬
‫إضافة تاريخ اليوم الحالي )‪ (SYSDATE‬إلي العامود )‪ (HIREDATE‬الموجود داخل جدول الموظفين وذلك عند إضافة سجل جديد‬
‫)‪SQL>INSERT INTO emp (empno , ename , job,mgr , hiredate , sal , comm , deptno‬‬
‫; (‪VALUES ( 8 , 'ahmed' , 'salesman' ,20 , SYSDATE , 500 , NULL , 10‬‬
‫‪459‬‬
‫إضافة سجلت جديدة عن طريق المتغيرات البديلة ‪Substitution Variables‬‬
‫إضافة إدارة جديدة إلي جدول الدارات باستخدام المتغيرات البديلة‬
‫) ‪SQL> INSERT INTO dept ( deptno ,dname , loc‬‬
‫; ) '‪VALUES ( &dept_id , '&dept_name' , '&dept_loc‬‬
‫‪Enter value for dept_id : 80‬‬
‫‪Enter value for dept_name : education‬‬
‫‪Enter value for dept_loc : atlanta‬‬
‫)‪OR SQL> INSERT INTO dept ( deptno , dname , loc‬‬
‫; ) '‪VALUES ( 80 ,' education' , 'atlanta‬‬
‫إضافة إدارة جديدة إلي جدول الدارات باستخدام المتغيرات البديلة بدل من اسم الجدول أو أسم العامود‬
‫) ‪SQL> INSERT INTO &dept_table (&dept_id , dname , loc‬‬
‫; ) '‪VALUES (80 ,' education' , 'atlanta‬‬
‫‪Enter value for dept_table : dept‬‬
‫‪Enter value for dept_id : daptno‬‬
‫إضافة سجلت جديدة عن طريق نسخها من جدول آخر‬
‫) ‪SQL> INSERT INTO managers ( id , name , salary , hiredate‬‬
‫; '‪Select empno , ename , sal , hiredate from emp where job ='manager‬‬

‫التعديل في بيانات سجل أو سجلت معينة داخل جدول عن طريق استخدام جملة التعديل )‪(UPDATE‬‬
‫الصيغة العامة لتعديل البيانات داخل الجدول‬
‫جدول ‪SQL>UPDATE‬‬
‫‪ .....‬عامود ‪ = 1‬قيمة ‪ , 1‬عامود ‪ = 2‬قيمة ‪SET 2‬‬
‫شرط ; هذا الشرط لختيار سجلت )صفوف( معينة للتعديل فيها وبدون هذا الشرط سوف يتم التعديل في جميع السجلت ‪WHERE‬‬
‫القواعد التي يجب التقيد بها عند التعديل‬
‫يجب أن يكون نوع البيانات الجديدة من نفس نوع بيانات العمدة المطلوب التعديل فيها‬ ‫‪.1‬‬
‫عند تعديل قيم التاريخ أو النصوص يجب وضع القيم الجديدة بين علمتي التنصيص الفردية )' '(‬ ‫‪.2‬‬
‫تعديل أسم الدارة رقم )‪(30‬‬
‫; ‪SQL>UPDATE dept SET dname ='education' WHERE deptno =30‬‬
‫التعديل في أكثر من عامود‬
‫) '‪SQL>UPDATE emp SET ( job , deptno ) = ( select job , deptno from emp where ename = 'ward‬‬
‫; '‪WHERE ename ='blake‬‬

‫حذف سجل أو سجلت معينة داخل جدول عن طريق استخدام جملة الحذف )‪(DELETE FROM‬‬
‫الصيغة العامة لحذف البيانات من الجدول‬
‫جدول ‪SQL>DELETE FROM‬‬
‫بدون هذا الشرط سوف يتم حذف جميع السجلت ) الصفوف ‪WHERE‬‬ ‫) شرط ;‬
‫حذف الدارة رقم )‪ (40‬من جدول الدارات‬
‫; ‪SQL>DELETE FROM dept WHERE deptno = 40‬‬
‫حذف جميع الموظفين من جدول الموظفين ) يمكن استرجاع البيانات المحذوفة عن طريق المر ‪( ROLLBACK‬‬
‫; ‪SQL>DELETE FROM emp‬‬
‫حذف جميع الموظفين المسجلين في الدارة التي لها اسم ) ‪( sales‬‬
‫; )'‪SQL>DELETE FROM emp WHERE deptno = (select deptno from dept where dname ='sales‬‬
‫عند حذف الدارة رقم )‪ (10‬من جدول الدارات‬
‫; ‪SQL>DELETE FROM dept WHERE deptno = 10‬‬
‫‪ERROR at line 1ORA-02292:integrity constraint(USR.EMP_DEPTNO_FK)Vaiolated-child record found‬‬
‫ل يمكن هنا حذف الدارة رقم )‪ (10‬لوجود موظفين مسجلون في هذه الدارة داخل جدول )‪(emp‬‬
‫ملحظة ‪ access :‬قام بحذف الدارة رغم وجود موظفين مسجلين فيها‬

‫عمليات قواعد البيانات )‪(Database Transactions‬‬


‫‪ COMMIT‬يقوم هذا المر بحفظ البيانات التي تم إجراء عمليات الضافة أو التعديل أو الحذف عليها بصورة نهائية‬
‫‪; SQL>COMMIT‬‬ ‫ينفذ هذا المر بمجرد كتابته مباشرة بعد عمليات الضافة أو التعديل أو الحذف كالتالي‬ ‫‪.1‬‬
‫يتم إصدار هذا المر آليا عند الخروج من قاعدة البيانات بكتابة المر)‪(SQL >EXIT‬أو عندما نقوم بإصدار أمر من أوامر‬ ‫‪.2‬‬
‫تعريف‬
‫البيانات)‪(DDL‬أو أمر من أوامر التحكم في البيانات)‪(DCL‬مثل))‪.,CREATE VIEW,CREATE TABLE,DROP TABLE‬‬
‫‪ ROLLBACK‬يقوم هذا المر بالتراجع عن عملية الضافة أو التعديل أو الحذف‬
‫‪460‬‬
‫‪CREATING AND MANAGING TABLES‬‬
‫إنشاء الجداول‬

‫لغة تعريف البيانات ‪(Data Definition Language (DDL‬‬


‫هذه اللغة هي التي تمكننا من إنشاء وتعديل أي كائن داخل قاعدة البيانات حيث إن قاعدة البيانات تتكون من كائنات مختلفة أهمها الجداول ومنها‬
‫‪ : View‬المناظير‪ -‬وهي عبارة عن جزء مؤقت من جدول معين يتكون من عدة صفوف وأعمدة ويستخدم لغرض معين بشكل مؤقت‬
‫‪ : Sequence‬سلسلة‪ -‬وهي عبارة عن سلسلة تستخدم لتوليد أرقام متتالية بشكل معين دون تكرار لذلك يفضل استخدامها لتسجيل بيانات المفتاح‬
‫الساسي داخل الجدول‬
‫‪ : Index‬فهرس‪ -‬يستخدم في عملية فهرست بعض العمدة لتسهيل عملية البحث فيها عن معلومات معينة ولتقليل وقت الستفسارات من الجدول‬
‫‪ : Synonym‬مترادفات‪ -‬تستخدم لعطاء أكثر من اسم علي كائن معين‬

‫أنواع البيانات ‪Data types‬‬


‫‪) Varchar2‬الحجم( ‪ :‬تستخدم مع البيانات الحرفية المتغيرة الطول‬
‫‪) Char‬الحجم( ‪ :‬تستخدم مع البيانات الحرفية الثابتة الطول ولبد من تحديد طول البيانات الحرفية‬
‫‪ : (Number (p,s‬تستخدم مع البيانات الرقمية ويمثل الحرف )‪ (p‬الجزء الصحيح قبل العلمة العشرية والحرف )‪ (s‬يمثل الجزء العشري بعد‬
‫العلمة العشرية‬
‫‪ : Date‬تستخدم مع بيانات التاريخ والوقت‬
‫‪ : Long‬تستخدم لتمثيل البيانات الكبيرة الحجم التي تصل إلي )‪ (2‬جيجا بايت‬
‫‪ : CLOB – BLOB‬تستخدم لتمثيل البيانات الكبيرة مثل الصور والرسومات والتي تصل حجمها إلي أكثر من )‪ (4‬جيجا بايت‬
‫‪ : Bfile‬تستخدم لتخزين الملفات الكبيرة والخارجية والتي يصل حجمها إلي أكثر من )‪ (4‬جيجا بايت‬
‫حيث تستخدم هذه النواع في تحديد نوع البيانات لكل عامود عند إنشاء الجدول‬

‫إنشاء الجداول ‪Create Tables‬‬


‫الصيغة العامة لنشاء الجداول‬
‫( أسم الجدول ‪SQL>CREATE table‬‬
‫‪ ,‬العامود ‪ 1‬نوع البيانات‬
‫‪ ,‬العامود ‪ 2‬نوع البيانات‬
‫‪ ,‬العامود ‪ 3‬نوع البيانات‬ ‫; )‬
‫إنشاء جدول الدارات )‪(dept2‬‬
‫;) )‪SQL>CREATE TABLE dept2 (depno NUMBER(2) , dname VARCHAR2(14) , loc VARCHAR2(13‬‬
‫‪; SQL>DECRIBE dept2‬‬ ‫ولعرض البناء الداخلي للجدول الذي تم إنشاؤه نقوم بكتابة المر التالي‬
‫إنشاء الجداول باستخدام الستعلمات الفرعية‬
‫‪SQL> CREATE TABLE dept30 AS SELECT empno, ename, sal*12 annsal, hiredate‬‬
‫; ‪FROM emp WHERE deptno =30‬‬
‫‪; SQL>SELECT * FROM dept30‬‬ ‫ولعرض بيانات الجدول ‪ dept30‬نقوم بكتابة الصيغة التالية‬
‫‪SQL> CREATE TABLE dept30 ( emp_id , emp_name , salary , start_date ) AS‬‬
‫; ‪SELECT empno , ename , sal , hiredate FROM emp WHERE deptno = 20‬‬

‫التعديل في الجداول باستخدام ‪ALTER TABLE‬‬


‫‪ : ADD‬تستخدم لضافة أعمدة جديدة إلي الجدول‬
‫‪ : MODIFY‬تستخدم للتعديل في نوع البيانات للجدول )حيث يمكن تغيير نوع البيانات بحيث ل يؤثر ذلك في البيانات الموجودة في العمدة‪-‬‬
‫ول يمكن تقليل حجم )طول( العمدة إذا كانت تحتوي علي بيانات(‬
‫‪ : DROP‬تستخدم للغاء عامود معين من الجدول )حيث يجب أن يكون العامود فارغا من البيانات‪ -‬ل يمكن إلغاء أكثر من عامود واحد فقط في‬
‫المر الواحد‪ -‬ل يمكن استعادة العامود بعد إلغائه(‬
‫إضافة عامود جديد باسم )‪ (region‬إلي جدول الدارات ‪dept2‬‬
‫; ) )‪SQL>ALTER TABLE dept2 ADD ( region VARCHAR2(20‬‬
‫التعديل في طول بيانات العامود )‪ (dname‬ليصبح بطول ‪ 20‬بدل من ‪14‬‬
‫; ) )‪SQL>ALTER TABLE dept2 MODIFY (dname VARCHAR2(20‬‬
‫إلغاء العامود المسمي )‪ (region‬من جدول الدارات ‪dept2‬‬
‫; ‪SQL>ALTER TABLE dept2 DROP COLUMN region‬‬
‫إلغاء جدول باستخدام المر ‪) DROP‬حيث ل يمكن استعادة الجدول بعد إلغائه(‬
‫; ‪SQL>DROP TABLE dept30‬‬
‫تغيير اسم جدول معين إلي اسم آخر باستخدام المر ‪RENAME‬‬
‫‪SQL>RENAME dept2 TO department‬‬

‫‪461‬‬
‫أنواع الجداول في بيئة قواعد البيانات أوراكل‬

‫‪ .1‬جداول تنشأ عن طريق المستخدمين ‪ USER TABLES‬وهي مجموعة من الجداول ينشئها المستخدم ويتم التعامل معها من‬
‫خلله‬
‫‪ .2‬جداول يتم إنشاؤها عن طريق خادم أوراكل ‪ ORACLE SERVER‬وهي مجموعة من الجداول تسمي ‪DATA‬‬
‫‪ DICTIONARY‬حيث يتم إنشاؤها بواسطة أوراكل وهي تحتوي علي معلومات عن قاعدة البيانات‬
‫وتنقسم إلي عدة فئات هي‬
‫‪ .1‬الفئة )‪ : (_USER‬وتحتوي علي معلومات حول الكائنات الخاصة بالمستخدمين مثل الجداول‬
‫‪ .2‬الفئة )‪ : (_ALL‬وتحتوي علي معلومات عن كل الجداول والعلقات التي يمكن للمستخدمين الدخول عليها‬
‫‪ .3‬الفئة )‪ : (_DBA‬وتحتوي علي معلومات خاصة بمدير قواعد البيانات )‪ (DBA‬ول يمكن لحد الدخول عليها‬
‫واستخدامها‬

‫عرض معلومات حول الجداول التي يملكها المستخدمون باستخدام ) ‪(DATA DICTIONARY‬‬
‫; ‪SQL>SELECT * FROM user_table‬‬
‫عرض اسم ونوع الكائنات التي يمتلكها المستخدمون‬
‫; ‪SQL>SELECT object_name , object_type FROM user_objects‬‬
‫عرض أسماء ونوع الجداول والكائنات التي أنشأها المستخدم‬

‫‪CONSTRAINTS‬‬
‫القيود علي الجداول‬

‫أنواع القيود‬
‫‪ : NOT NULL‬يمنع هذا القيد ترك عامود معين فارغ ) لبد أن يتم إدخال قيمة للعمود( ‪ ،‬حيث يطبق علي مستوي العمود فقط‬
‫‪ : UNIQUE‬يمنع هذا القيد تكرار القيم داخل العامود ‪ ،‬حيث يطبق علي مستوي العمود أو الجدول‬
‫‪ : PRIMARY KEY‬يستخدم لعمل مفتاح أساسي داخل الجدول ‪ ،‬والمفتاح الساسي يتميز بعدم تكرار القيم ‪ ،‬وعدم ترك القيم فارغة‬
‫حيث يطبق علي مستوي العمود أو الجدول‬
‫‪ : FOREIGN KEY‬يستخدم لعمل مفتاح ربط بين جدولين ‪ ،‬حيث يطبق علي مستوي العمود أو الجدول‬
‫‪ : CHECK‬يستخدم لختبار قيمة عمود بحيث ل يقبل هذا العمود إل قيم حسب شرط معين ‪ ،‬حيث يطبق علي مستوي العمود أو الجدول‬
‫إنشاء القيود ‪Create a Constraint‬‬
‫عمل القيود أثناء إنشاء الجدول‬ ‫‪.1‬‬
‫عمل القيود بعد إنشاء الجدول‬ ‫‪.2‬‬

‫إنشاء القيود أثناء إنشاء جدول الدارات وتطبيقها علي مستوي العمدة‬
‫)‪SQL>CREATE TABLE dept (deptno NUMBER(2‬‬ ‫‪PRIMARY KEY ,‬‬
‫‪dname VARCHAR2(14) NOT NULL‬‬ ‫‪,‬‬
‫‪loc‬‬ ‫)‪VARCHAR2(13‬‬ ‫;)‬
‫إنشاء القيود أثناء إنشاء جدول الدارات وتطبيقها علي مستوي الجدول‬
‫‪SQL>CREATE TABLE dept (deptno NUMBER(2) ,‬‬
‫‪dname VARCHAR2(14) NOT NULL ,‬‬
‫‪loc‬‬ ‫‪VARCHAR2(13) ,‬‬
‫)‪CONSTRAINT dept_deptno_pk PRIMARY KEY (deptno‬‬ ‫;)‬
‫الفرق بين الطريقتين هو أننا نستطيع حذف القيد إذا كان علي مستوي الجدول حيث تم تسمية القيد هنا باسم ) ‪( dept_deptno_pk‬‬
‫إنشاء القيد )‪ (UNIQUE‬أثناء إنشاء جدول الدارات وتطبيقية علي مستوي الجدول‬
‫)‪SQL>CREATE TABLE dept (deptno NUMBER(2‬‬ ‫‪,‬‬
‫‪dname VARCHAR2(14) ,‬‬
‫‪loc‬‬ ‫‪VARCHAR2(13) ,‬‬
‫; ) )‪CONSTRAINT dept_deptno_uk UNIQUE (dname‬‬

‫‪462‬‬
‫( في جدول الموظفين وتطبيقه علي مستوي العمود‬deptno) ‫( علي العمود‬foreign key) ‫إنشاء القيد‬
SQL>CREATE TABLE emp ( empno NUMBER(4) ,
ename VARCHAR2(10) NOT NULL ,
job VARCHAR2(9) ,
mgr NUMBER(4) ,
hiredate DATE ,
sal NUMBER(7,2) ,
comm NUMBER(7,2) ,
deptno NUMBER(2) REFERENCES dept(deptno) ;
‫( في جدول الموظفين وتطبيقه علي مستوي الجدول‬deptno) ‫( علي العمود‬foreign key) ‫إنشاء القيد‬
SQL>CREATE TABLE emp ( empno NUMBER(4) ,
ename VARCHAR2(10) NOT NULL ,
job VARCHAR2(9) ,
mgr NUMBER(4) ,
hiredate DATE ,
sal NUMBER(7,2) ,
comm NUMBER(7,2) ,
deptno NUMBER(2) ,
CONSTRAINT emp_deptno_fk FOREIGN KEY (deptno) REFERENCES dept(deptno) ;
( 10 - 99 ‫( في جدول الدارات وتطبيقة علي مستوي الجدول )هنا تم حصر القيم بين‬deptno) ‫( علي العمود‬CHECK) ‫إنشاء القيد‬
SQL>CREATE TABLE dept (deptno NUMBER(2) ,
dname VARCHAR2(14) ,
loc VARCHAR2(13) ,
CONSTRAINT dept_deptno_ck CHECK (deptno BETWEEN 10 AND 99 ) ) ;

Adding Constraint ‫إضافة قيود علي الجداول‬


‫الصيغة العامة لضافة القيود علي الجدول بعد إنشائه‬
SQL>ALTER TABLE ‫اسم الجدول‬
ADD CONSTRAINT ‫; اسم القيد نوع القيد‬
‫( في جدول الموظفين‬mgr) ‫( علي العامود‬foreign key) ‫إضافة القيد‬
SQL>ALTER TABLE emp
ADD CONSTRAINT emp_mgr_fk
FOREIGN KEY (mgr) REFERENCES emp(empno) ;
(selfjoin) ‫هنا تم ربط رقم المدير لكل موظف برقم الموظف نفسه ونوع الربط هنا‬
‫( في جدول الدارات‬deptno) ‫( علي العامود‬primary key) ‫إضافة القيد‬
SQL>ALTER TABLE dept
ADD CONSTRAINT dept_deptno_pk
PRIMARY KEY (deptno) ;

DROP ‫إزالة القيود من الجداول‬


‫( من جدول الموظفين‬emp_mgr_fk) ‫إزالة القيد المسمي ب‬
SQL> ALTER TABLE emp
DROP CONSTRAINT emp_mgr_fk ;
‫إزالة العلقة بين جدولي الموظفين والدارات عن طريق إزالة المفتاح الساسي من جدول الدارات وإزالة توابعه‬
SQL>ALTER TABLE dept
DROP primary key CASCADE ;
‫( من جدول الموظفين‬foreign key) ‫ هذا اللفظ يقوم بإزالة كل ما يتعلق بالمفتاح الساسي أي يقوم بإزالة‬: CASCADE

463
‫استعراض القيود المطبقة علي جدول معين‬

‫ ومن‬Data Dictionary ‫إن نظام أوراكل يقوم بإنشاء جداول لتسجيل التغييرات التي تتم في قاعدة البيانات وهذه الجداول تسمي‬
‫خللها يمكن عرض القيود المطبقة علي جدول معين‬
‫عرض القيود المختلفة المطبقة علي جدول الموظفين‬
SQL>SELECT constraint_name , constraint_type
FROM user_constraints
WHERE table_name = 'EMP' ;
CONSTRAINT_NAME C
SYS_C00674 C
SYS_C00675 C
EMP_EMPNO_PK P
FK_DEPTNO R
‫( عبارة عن حرف واحد يدل علي نوع القيد ومعني هذه الحروف كما يلي‬constraint_type) ‫إن ناتج عامود أنواع القيود‬
CHECK ‫ يعني أن نوع القيد هو‬C ‫الحرف‬ .1
Primary key ‫ يعني أن نوع القيد هو‬P ‫الحرف‬ .2
Foreign key ‫ يعني أن نوع القيد هو‬R ‫الحرف‬ .3
Unique ‫ يعني أن نوع القيد هو‬U ‫الحرف‬ .4
CHECK ‫ فيظهر مثل القيد‬NOT NULL ‫أما نوع القيد‬ .5
‫عرض أسماء العمدة وأسماء القيود المطبقة عليها‬
SQL>SELECT constraint_name , column_name
FROM user_cons_column
WHERE table_name = 'EMP' ;

Data Definition
Create table Add a new table to the database
Drop table Removes a table from the database
Alter table Changes the structure of an existing table
Create view Add a new view to the database
Drop view Removes a view from the database
Create index Builds an index for a column
Drop index Removes the index for a column
Create schema Add a new schema to the database
Drop schema Removes a schema from the database
Create domain Add a new data value domain
Alter domain Changes a domain definition
Drop domain Removes a domain from the database
Programmatic SQL
Declare Defines a cursor for a query
Explain Describes the data access plan for a query
Open Opens a cursor to retrieve query results
Fetch Retrieves a row of query results
Close Closes a cursor
Prepare Prepares a SQL statement for dynamic execution
Execute Executes a SQL statement dynamically
Describe Describes a prepared query

464
465

You might also like