لا تعرف ؟؟ انك تعرف انني اعرف انك لا تعرف ذلك
,,,,
خذ الحل ..
كود:
Select hiredate A, SUBSTR(hiredate,0,4) B, SUBSTR(hiredate,5,2)C
, SUBSTR(hiredate,0,1) D,sal E ,SUBSTR(sal,2,1) F from emp ;
لاحظ انني سميت الأعمدة بالحروف
A B C D ....
A هو التاريخ كما هو عليه
B
التاريخ مقصوص منه اول اربع حروف .. لاحظ بإمكاننا ان نضع الرقم 1 بدلا من 0 ... جربتها وستجدها نفس النتيجة
C
مقصوص من الحرف الخامس الى السادس ... يعني ابدأ من الخامس .. واعرض حرفين الخامس والسادس....
D
عرض اول حرف من التاريخ .. لاحظ اننا لو وضعنا 1 بدلا من 0 .. فستأتي نفس النتيجة ....
E
عرض الراتب كما هو عليه ...
F
عرض الرقم الثاني من اليسار .. للراتب .. لاحظ اننا لا نحتاج هذه الدالة مع الأرقام .. في اغلب الأحيان
ولكن وضعتها انا هنا لكي ترى ان الدالة ذكية قليلا .. وغبية قليلا ... وبنت حلال ... ولم تعمل مشاكل ,,,
الان اريد ان اعرض اسماء الموظفين بالحالة الاحرف الصغيرة .. ومقصوص من الحرف الأول الى الثالث ...
ماذا اعمل ؟؟
فكر فكر فكر فكر ....
اليك الحل ....
...
..
.
كود:
select SUBSTR(lower(ename),1,3) , ename from emp ;
لاحظ .... اننا استخدمنا الدالتين ...
وهذه حلاوة استخدام الدوال ...
بإمكانك مزج احدها مع الأخرى ... بالطريقة التي تعجبك ,,,
اليك الناتج ....
كود:
SUB ENAME
--- ------
smi SMITH
all ALLEN
war WARD
jon JONES
mar MARTIN
bla BLAKE
cla CLARK
sco SCOTT
kin KING
tur TURNER
ada ADAMS
SUB ENAME
--- ------
jam JAMES
for FORD
mil MILLER
- دالة
LENGTH (Length = الطول !!)
العمل : توجد عدد احرف الكلمة ... او النص (طول النص ^^)
الأمثلة :
كود:
Select LENGTH('GOOD By') from dual;
كم تتوقع يوجد حرف ؟؟
اذا قلت 6 حروف .. فقد أخطأت!! .. لماذا لا تحسب المسافة ؟؟
المسافة تعتبر حرف كما أسلفنا
الناتج هو :
كود:
LENGTH('GOODBY')
----------------
7
هل فهمت ؟؟
لا أرى فيها صعوبة ...
لكن لو جربناها مع الراتب مثلا ....وهو رقم .. فمالذي يحدث ؟؟
كود:
Select LENGTH ( sal ) from emp ;
مالناتج ؟؟ ولماذا ؟؟
كود:
LENGTH(SAL) SAL
----------- ----------
3 800
4 1600
4 1250
4 2975
4 1250
4 2850
4 2450
4 3000
4 5000
4 1500
4 1100
3 950
4 3000
4 1300
عرض عدد الخانات للأرقام ؟
اعتقد انه في جملة
Select .. سوف تحولالأرقام والتواريخ الى نصوص للعرض ...
لا اعتقد .. بل اجزم بذلك ...
اذا لم تفهم ما معنى تحويل الأرقام لحروف .. فسأشرح لك الان بعض الأمور ...
يوجد هناك نوعين من الأرقام ...
رقم رقمي
ورقم حرفي
..
الرقم الرقمي .. يستخدم للعمليات الحسابية كالضرب والجذر وغيرها
....
والرقم الحرفي .. للعرض عادة ... فمثلا اسم ملف ما ..
ABC123 .... الارقام 1 و 2 و 3 ... هي احرف شكلها أرقام !! ..
اذا كنت تعرف شيء اسمه الأعداد الثنائية ... فهذا جميل ...
الأعداد الثنائية هي 0 و 1 .. وهي التي يفهمها الحاسب ..
والأعداد العشرية هي 0 و 1 و 2 و....
...9 والتي نستخدمها نحن كبشر عادة ...
العدد الثنائي = مايناسبه بالعشري
1 =1
10 =2
11 =3
100= 4
101=5
وهلم جر ,,,
سوف نغطي هذه الدروس فيما بعد ان شاء الله ....
المهم هذه الأرقام هي ارقام رقمية .. تستخدم للحسابات كما اسلفنا ..
الأرقام الحرفية .. هي حروف على شكل ارقام .. تستخدم للعرض ...
فمثلا ... في نظام الحروف .. وليس الأرقام ... لاحظ!! نظام الحروف وليس الأرقام !!
0010000 = 1
0010001 = 2
0010010 = 3
......
......
1000001 = A
1000010 = B
....
وهكذا ...
طبعا الثلاثة الرقمي والذي شكله (11) غير الثلاثة الحرفي والذي شكله (0010010 )
فأنا كنت أقول ان جملة الاستعلام
select تعمل العمليات الحسابية والمنطقية وكل شيء ..
وفي النهاية تحول الناتج ... الى حروف (حروف=نصوص)
فائدة هذا التحويل هي العرض فقط على الشاشة ,,
لم تفهم ؟؟
سوف تفهم بشكل منطقي ومرتب اكثر في المستقبل البعيد ان شاء الله ,,,
محترف ؟؟ ذكي ؟؟ عبقري ؟؟ تحب التحديات ؟؟
تحدي للمحترفين فقط !! اكرر للمحترفين ,,
...
اريد ان اعرض أسماء الموظفين في عمود
وأريد عرض
أسماء الموظفين ماعدا الحرف الأخير مقصوص منه في عمود اخر
وأريد عرض الحرف الأخير من أسماء الموظفين في عمود ثالث !!
يعني اريد الناتج بهذه الصورة :
كود:
A B C
---------- - -------
SMIT H SMITH
ALLE N ALLEN
WAR D WARD
JONE S JONES
MARTI N MARTIN
BLAK E BLAKE
CLAR K CLARK
SCOT T SCOTT
KIN G KING
TURNE R TURNER
ADAM S ADAMS
JAME S JAMES
FOR D FORD
MILLE R MILLER
صعب هاه ؟؟
اريد تصعيبه اكثر وأكثر
..
اريد عرضه بهذا الشكل !! :
كود:
ALL_OF_THEM
--------------------
SMIT + H = SMITH
ALLE + N = ALLEN
WAR + D = WARD
JONE + S = JONES
MARTI + N = MARTIN
BLAK + E = BLAKE
CLAR + K = CLARK
SCOT + T = SCOTT
KIN + G = KING
TURNE + R = TURNER
ADAM + S = ADAMS
JAME + S = JAMES
FOR + D = FORD
MILLE + R = MILLER
في عمود واحد يدعى
all_of_them !! وهو التحدي الثاني
.. انا شخصيا .. لا اعتقد ان أحدكم سيحله اصلا ..
ولا اعتقد ان احدكم سيفكر اصلا ان يقرأ كل سطر ,, هل تعرف لماذا ؟
لأنه لا يوجد إلا واحد فقط الان .. يحل التحديات أول بأول !! ما شاء الله عليه ,,
كانوا 25 .. وصاروا 7 ... و قبل أيام
2 ... والآن واحد فقط .. يحل معي ,,
انا صراحة اعتبرها مصيبة ,, لو ما بتعرف مش مشكلة ...
لان التحديات عادة صعبة ولم اشرحها وتحتاج لاستنتاج منك ...
لذا .. فليكن ما يكن ,,
- الدالة
INSTR
العمل : تحدد مكان حرف .. في أي نص ... أي تدخل نص .. وتدخل الحرف الذي تريد معرفة مكانه
..
وفي النهاية سوف ترجع (ترجع=تخرج) الدالة رقم وهو ترتيب الحرف في النص ,,
الأمثلة :
كود:
Select INSTR('GOOD GOOD','D') from dual ;
ومعناه .. في النص
GOOD GOOD ماهو ترتيب اول D يواجهنا ؟؟
سوف يكون الحرف الرابع صحيح ؟؟
كود:
INSTR('GOODGOOD','D')
---------------------
4
لو وضعنا مثلا النص
GOOD , ثم وضعنا حرف S مثلا ..
بالله عليك اين الحرف S ؟؟ هي يوجد حرف S في النص GOOD ؟؟؟
طبعا لا ,, لذا فسوف يكون الناتج .... صفر ’,’,’,’,’,’
اريد تعقيد الأمور اكثر واكثر ,, اريد ان أتفنن في كل ما أخذناه !! مع العلم انني اعقد الأمور من رأسي , ولا يوجد منهج في العالم يعلمني كيف اعقد الأمور على نفسي , فأتوقع منك ان تعقد الأمور انت اكثر وذلك بالتمرس والتجريب , طبعا اذا لم تتمرس كثيرا وتجرب كثيرا , فلن تتعلم بشكل قوي , انا لا اريد تعقيد الأمور اكثر , ولكن اريد ان افهم فهم عميق لماذا مطورو لغة الـ SQL وضعوا هذه الدوال ؟؟ لماذا فكروا في وضعها اصلا ؟
الان لدي سؤال غبي , اريد ان تعرض لي أسماء الموظفين بحالة الحروف الصغيرة , ومقصوصة عند حد الحرف a
فمثلا
blake يحتوي على الحرف a يعني نقص حده فيصبح bla
ومثلا
allene فيكون اسمه a
ومثلا
king فيكون فارغ , لانه لا يحتوي على الحرف a
اليك الناتج الذي اقصده
كود:
ENAME B
---------- ---
SMITH
ALLEN a
WARD wa
JONES
MARTIN ma
BLAKE bla
CLARK cla
SCOTT
KING
TURNER
ADAMS a
ENAME B
---------- ---
JAMES ja
FORD
MILLER
طبعا لا اعتقد انك تحتاج لمثل هذا الغباء , ولكن اريدك ان تفكر فقط ,
سواء فكرت ام لم تفكر , اليك الناتج :
كود:
select ename , substr(lower(ename),1,instr(lower(ename),'a')) B from emp ;
استخدمت instr داخل دالة القص substr ,
لو كان اسم الموظف
blake ..
يعني قص لي من اول حرف (الرقم واحد) , وعدد الحروف اللازمة هي ثلاثة .. لماذا ثلاثة ؟؟
لان ترتيب الحرف
a هو الثالث من الاسم blake , يعني الدالة instr ترجع الرقم ثلاثة فتبدو الجملة هكذا :
Substr(lower(ename) , 1 , 3 )
لم تفهم ؟؟
طيب اليك ذلك لاحظ الحل بالتدرج ,’,’,’,’,’
Substr(lower('BLAKE'),1,instr(lower('BLAKE'),'a') )
Substr(lower('BLAKE'),1,instr('blake','a') )
Substr(lower('BLAKE') , 1 , 3 )
Substr('blake' , 1 , 3 )
bla
وهو الناتج الاساسي
لم تفهم ؟ ممممم اعتقد أنها صعبة عليك في هذا الوقت , لذا اتركها الان وراسلني لو عندك استفسار
.
- الدالة
LPAD
العمل : تنظيم من اليسار
.
الأمثلة :
كود:
Select LPAD('AHMED',10,'*') from dual ;
كأن لسان حال هذه الدالة يقول :
"حدد المدخل الأول(المدخل الأول=
AHMED في مثالنا هذا) بعدد المدخل الثاني( عشرة ) حروف ... اذا زاد .. قص منه الزائد , اذا نقص اكمل الحروف المتبقية بالمدخل الثالث (علامة النجمة) "
انظر الناتج :
كود:
LPAD('AHME
----------
*****AHMED
لم تفهم ؟
ادخلنا الحد 10 حروف صح ؟؟
ادخلنا حرف * صح ؟
لو ادخلنا في المدخل الأول
ABC , فسوف يكون الناتج *******ABC (عشر حروف لاحظ من أي جهة النجوم)
لو ادخلنا المدخل الأول
ABCDEFGHI فسوف يكون الناتج *ABCDEFGHI (عشر حروف لاحظ من أي جهة النجوم )
لو ادخلنا
THE_ORACLE_COURSE فسوف يكون الناتج مقصوص لانه اطول من عشر , يعني هكذا : THE_ORACLE (عشر حروف)
لو كان المدخل لا شيء ؟؟ فسوف يكون الناتج **********
لماذا هذه الدالة ؟ للتنظيم فقط لا غير ,
اسم الدالة LPAD , وحرف الـ L يعني Left أي يسار (يعني وضع النجوم في اليسار في مثالنا )
تكره الشرح المفصل ؟؟
اليك مثال اخر ,,,
كود:
Select LPAD(ename,10,'-') from emp ;
كود:
LPAD(ENAME
----------
-----SMITH
-----ALLEN
------WARD
-----JONES
----MARTIN
-----BLAKE
-----CLARK
-----SCOTT
------KING
----TURNER
-----ADAMS
-----JAMES
------FORD
----MILLER
سوف تظهر لك النتائج بشكل منسق اكثر على برنامج
SQL PLUS , لو طبقت الجملة السابقة طبعا !!