تحديات الدرس الحادى عشر
التحدى الأول
create table a(ano number check(ano between 20 and 40));
ثم
alter table a add constraint a_ano_ck check(ano between 10 and 99);
الطريقه الثانيه
create table customer (
cno number primary key ,
cname varchar2(10) not null ,
cage number check (cage between 18 and 30 ) );
constraint customer_cname_uk unique(cname) ,
التحدى الثانى
alter table b
modify (bname varchar2(20) not null) ;
ونقوم بالإلغاء هكذا
alter table b
modify (bname varchar2(20) ) ;
الدرس الثانى عشر
التحدي الاول :
الان لاحظ معي جيدا لصياغة المسئلة !!
مثلا .. اريد ان اعرض كل من لهم راتب يساوي راتب أي موظف يدعى WARD
ومهنتهم تساوي مهنة أي موظف يدعى WARD
والمسئلة الثانية
.. اريد ان اعرض كل من لهم راتب يساوي راتب الموظف WARD
ومهنتهم تساوي مهنة الموظف WARD
متشابهة جدا !! لا عليك من اللغويات هذه ... ولا اريد تعقيدك بها .
لكن افهم مالذي اطلبه في المسئلة الاولى والمسئلة الثانية
طبعا يجب ان ترى الجـــــــوابـيـــن !! :
كود:
SQL> select * from emp
where sal IN (select sal from emp where ename='WARD')
and job IN (select job from emp where ename='WARD') ;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
8890 ANY SALESMAN 7698 14/02/06 2800 0 20
7521 WARD SALESMAN 7698 22/02/81 1250 500 30
7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30
8888 JAVA SALESMAN 7698 14/02/06 1250 0 10
8889 WARD MANAGER 7698 14/02/06 2800 0 20
كود:
SQL> select * from emp
where (job,sal) IN (select job , sal from emp where ename='WARD') ;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
8888 JAVA SALESMAN 7698 14/02/06 1250 0 10
7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30
7521 WARD SALESMAN 7698 22/02/81 1250 500 30
8889 WARD MANAGER 7698 14/02/06 2800 0 20
واو ..... متشابهتين في المنطق , مختلفتين في النتائج !!
هيا .. تحرك وافتح ملف الـ WORD واكتب لي شرحك الخاص بك ... لماذا ظهرت هذه النتيجتين المختلفتين !!
وهل صحيح ان الجملتين متشابهتين منطقيا ؟ ولماذا؟
لماذا ظهر الموظف ANY في النتيجة الاولى ولم يظهر في النتيجة الثانية ؟؟
تحدي لا بأس به .... ولكنه مهم جدا !
اذا فهمت وحللت التحدي , فأنت فعلا عبقري .
الحل:-
فى الحاله الأولى فى وجود إستعلامين فرعيين أحدهما للمرتب و الأخر للوظيفه سيقوم بإحضار كل من إسمه (وارد) ثم يأخذ
وظيفته ومرتبه و يحضر كل من يملك وظيفته أو يملك مرتبه
فى الحاله الثانيه عند وجود إستعلام واحد للمرتب مع الوظيفه للمدعو(وارد) سوف يقوم بإحضار من تنطبق عليه شروط ان تكون
وظيفته تساوى وظيفة (وارد) وفى نفس الوقت مرتبه يساوى مرتب (وارد) فى نفس الوقت(أعرف إن شرحى سىء) بمعنى أنه
سيحضر كل من (مرتبه = 2800 و هو مدير) أو يكون (مرتبه = 1250 و هو بائع) أى أن الموظف(أنى) لا تنطبق عليه
الشروط لأنه بائع ولكن مرتبه = 2800
التحدى الثانى
التحدي يقول .... لماذا في جملة التعديل يجب ان يكون الاستعلام الفرعي .... ذو صف واحد ؟؟
الحل:-
لأن التعديل يكون بتغيير قيمة صف واحد فيجب أن يقوم بتعديلها بقيمه واحده فقط
التحدى الثالث
اليك تحدي ... لا بأس به ..
اريد عرض تقرير به الاعمدة التالية :
اسم الموظف , اسم قسمه , درجة راتبه , اسم مديره , درجة راتب المدير
الحل:-
select e.ename , e.sal , es.grade , m.ename , m.sal , ms.grade
from emp e , emp m , salgrade es , salgrade ms
where
e.mgr=m.empno and
e.sal >= es.losal
and e.sal <= es.hisal and
m.sal >= ms.losal
and m.sal <= ms.hisal
;
الدرس الثالث عشر
التحدى الأول
الان تحدي ..... فسر ما الذي حصل في هذه الأوامر التالية :
كود:
SQL> select * from dept1;
DEPTNO DNAME LOC
---------- -------------- -------------
5 6 any
6 8 any
7 10 any
8 12 any
9 0 any
10 2 any
11 4 any
12 6 any
13 8 any
9 rows selected.
SQL> update dept1 set dname=dept1_dname_seq.nextval ;
9 rows updated.
SQL> select * from dept1;
DEPTNO DNAME LOC
---------- -------------- -------------
5 10 any
6 12 any
7 0 any
8 2 any
9 4 any
10 6 any
11 8 any
12 10 any
13 12 any
9 rows selected.
التفسير هو ان اخر قيمه كانت موجوده فى الdname كانت 8 وبوضع dname=dept1_dname_seq.nextval
يكون أول قيمه dname = 10 يستمر التتابع بزيادة 2 كل مره
التحدى الثانى
الان ... جدول الموظفين ... مثلا يوجد به بيانات مهمة جدا ليست قابلة للتعديل من قبل أي شخص الا
Scott , system ..... وهي العمود sal مثلا .. اريد ان لا يعدلها احـد غير scott و system
وهو تحدي !! أي ... يستطيع كل الموظفين التعديل في جدول الموظفين ... ولكن لا يستطيعون التعديل على عمود الرواتب الا
scott , system
الحل
أولاً
grant select
on scott.emp
to public ;
ثم نعمل امر حذف الصلاحيات ..هو revoke لصلاحية ال sal من puplic
حل أخر
هو إعطاء صلاحيه صلاحيه الى الpuplic بدون إعطاء صلاحيه لل sal