إنتقال للمحتوى

  • تسجيل الدخول عبر الفيس بوك تسجيل الدخول عبر تويتر Log In with LinkedIn Log In with Google      تسجيل دخول    
  • إنشاء حساب

صورة
- - - - -

شرح بالتفصيل للأمر SELECT مع بعض الدوال الهامة


34 رد (ردود) على هذا الموضوع

#1 الماضي

الماضي

    مشترك

  • الأعضــاء
  • 63 مشاركة

تاريخ المشاركة 17 July 2004 - 07:02 AM

بسم الله الرحمن الرحيم



السلام عليكم ورحمة الله وبركاته،،,
كيف الحال اخواني و اخواتي في المنتدى حبيت ابداء بعض الدروس في SQL وهيء للمبتدئين فيها وان شاء الله تحوز على رضاكم وما نريد الا الدعاء و بسم الله نبداء:


المحاضرة الأولى

اختيار جدول باستخدام جملة SELECT

SQL> select * from emp;

EMPNO 	NAME      JOB              MGR 	HIREDATE       SAL      COMM   DEPTNO                     
----------- ---------- --------- --------- ------------------ ------ ---------- ------------
7369 SMITH CLERK 7902 17/12/80 800 20
7499 ALLEN SALESMAN 7698 20/02/81 1600 300 30
7521 WARD SALESMAN 7698 22/02/81 1250 500 30
7566 JONES MANAGER 7839 02/04/81 2975 20
7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30
7698 BLAKE MANAGER 7839 01/05/81 2850 30
7782 CLARK MANAGER 7839 09/06/81 2450 10
7788 SCOTT ANALYST 7566 19/04/87 3000 20
7839 KING PRESIDENT 17/11/81 5000 10
7844 TURNER SALESMAN 7698 08/09/81 1500 0 30
7876 ADAMS CLERK 7788 23/05/87 1100 20
7900 JAMES CLERK 7698 03/12/81 950 30
7902 FORD ANALYST 7566 03/12/81 3000 20
7934 MILLER CLERK 7782 23/01/82 1300 10
تم اختيار 14 صف


اختيار عمود باستخدام جملة SELECT
SQL> select ename from emp;


ENAME                                                                                               
------
SMITH
ALLEN
WARD
JONES
MARTIN BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
تم اختيار 14 صف

اختيار عمود باستخدام SELECT مع وضع عنوان للعمود (ALIASES)

SQL> select ename employee from emp;


EMPLOYEE                                                                                            
----------
SMITH
ALLEN
WARD
JONES
MARTIN BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
تم اختيار 14 صف

إجراء عمليات حسابية ( + و - و * و / )على عدة أعمدة
SQL> select sal+comm salary from emp;


SALARY                                                                                           
-------

1900
1750

2650




1500




تم اختيار 14 صف


الأماكن الخالية (التي ليس فيها قيمة) تسوي NULL وذلك لأنه عند إجراء أي عملية على الـNULL يكون الناتج هو NULL وقيمة الـNULL موجودة في حقل COMM وللتغلب على هذه المشكلة لابد أولا من تحويل قيمة الـNULL إلى قيمة عددية تستخدم في العمليات الحسابية ولا تؤثر على قيمة الناتج النهائي للراتب وهو الصفر وذلك باستخدام دالة nvl وتأخذ الشكل NVL(COLUMN_NAME , VALUE )

SQL> select ename,sal+nvl(comm,0) from emp;


ENAME      SAL+NVL(COMM,0)                                                                          
---------- ----- -------
SMITH 800
ALLEN 1900
WARD 1750
JONES 2975
MARTIN 2650
BLAKE 2850
CLARK 2450
SCOTT 3000
KING 5000
TURNER 1500
ADAMS 1100
JAMES 950
FORD 3000
MILLER 1300
تم اختيار 14 صف


لاحظ القيم بعد تغيير قيمة الـNULL إلى صفر
ولاختيار صف أو عدة صفوف تستخدم جملة WHERE مع جملة SELECT لتحديد الشرط الذي بناءاً عليه سيتم اختيار الصفوف .

SQL> select * from emp where sal=800;


EMPNO 	ENAME      JOB 	MGR 	HIREDATE       SAL      COMM    	DEPTNO                     
7369 SMITH CLERK 7902 17/12/80 800 20


SQL> select * from emp where sal > 800;


EMPNO 	NAME      JOB              MGR 	HIREDATE       SAL      COMM    DEPTNO                     
----------- ---------- --------- --------- ------------------ ------ ---------- ------------
7499 ALLEN SALESMAN 7698 20/02/81 1600 300 30
7521 WARD SALESMAN 7698 22/02/81 1250 500 30
7566 JONES MANAGER 7839 02/04/81 2975 20
7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30
7698 BLAKE MANAGER 7839 01/05/81 2850 30
7782 CLARK MANAGER 7839 09/06/81 2450 10
7788 SCOTT ANALYST 7566 19/04/87 3000 20
7839 KING PRESIDENT 17/11/81 5000 10
7844 TURNER SALESMAN 7698 08/09/81 1500 0 30
7876 ADAMS CLERK 7788 23/05/87 1100 20
7900 JAMES CLERK 7698 03/12/81 950 30
7902 FORD ANALYST 7566 03/12/81 3000 20
7934 MILLER CLERK 7782 23/01/82 1300 10
تم اختيار 13 صف


ولعرض الصفوف مرتبة يستخدم لذلك جملة ORDER BY ويمكن أن يكون الترتيب تصاعديا ASC أو ترتيب تنازلياً DESC بعد تحديد العمود الذي سيتم الترتيب بناءا عليه .
SQL>  select * from emp where sal > 800
order by sal;


EMPNO 	ENAME      	JOB             	MGR 	HIREDATE       	SAL      COMM    DEPTNO                     
7900 JAMES CLERK 7698 03/12/81 950 30
7876 ADAMS CLERK 7788 23/05/87 1100 20
7521 WARD SALESMAN 7698 22/02/81 1250 500 30
7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30
7934 MILLER CLERK 7782 23/01/82 1300 10
7844 TURNER SALESMAN 7698 08/09/81 1500 0 30
7499 ALLEN SALESMAN 7698 20/02/81 1600 300 30
7782 CLARK MANAGER 7839 09/06/81 2450 10
7698 BLAKE MANAGER 7839 01/05/81 2850 30
7566 JONES MANAGER 7839 02/04/81 2975 20
7788 SCOTT ANALYST 7566 19/04/87 3000 20
7902 FORD ANALYST 7566 03/12/81 3000 20
7839 KING PRESIDENT 17/11/81 5000 10
تم اختيار 13 صف


ولترتيب الصفوف تنازليا كما يلي :
SQL>   select * from emp where sal > 800
order by sal desc;


EMPNO 	ENAME      JOB             MGR 	HIREDATE       	SAL      COMM    DEPTNO                     
7839 KING PRESIDENT 17/11/81 5000 10
7788 SCOTT ANALYST 7566 19/04/87 3000 20
7902 FORD ANALYST 7566 03/12/81 3000 20
7566 JONES MANAGER 7839 02/04/81 2975 20
7698 BLAKE MANAGER 7839 01/05/81 2850 30
7782 CLARK MANAGER 7839 09/06/81 2450 10
7499 ALLEN SALESMAN 7698 20/02/81 1600 300 30
7844 TURNER SALESMAN 7698 08/09/81 1500 0 30
7934 MILLER CLERK 7782 23/01/82 1300 10
7521 WARD SALESMAN 7698 22/02/81 1250 500 30
7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30
7876 ADAMS CLERK 7788 23/05/87 1100 20
7900 JAMES CLERK 7698 03/12/81 950 30

تم اختيار 13 صف


ولحساب الراتب السنوي يكون بالجملة التالية :
SQL> select ename,(sal+nvl(comm,0))*12 “ANNUAL SALARY ” , ename EMPLOYEE
from emp;


ENAME      ANNUAL SALARY 		EMPLOYEE                                                              
SMITH 9600 SMITH
ALLEN 22800 ALLEN
WARD 21000 WARD
JONES 35700 JONES
MARTIN 31800 MARTIN BLAKE 34200 BLAKE
CLARK 29400 CLARK
SCOTT 36000 SCOTT
KING 60000 KING
TURNER 18000 TURNER
ADAMS 13200 ADAMS
JAMES 11400 JAMES
FORD 36000 FORD
MILLER 15600 MILLER
تم اختيار 14 صف


SQL> select * from emp where job='CLERK';


EMPNO 	ENAME      JOB             MGR 	HIREDATE      	 SAL      COMM    DEPTNO                     
7369 SMITH CLERK 7902 17/12/80 800 20
7876 ADAMS CLERK 7788 23/05/87 1100 20
7900 JAMES CLERK 7698 03/12/81 950 30
7934 MILLER CLERK 7782 23/01/82 1300 10


تطبيق شرطين بعد جملة WHERE باستخدام المعامل AND
SQL> SELECT * FROM EMP WHERE JOB='CLERK' AND SAL>1000;


EMPNO 	ENAME      JOB             MGR 	HIREDATE       	SAL      COMM    DEPTNO                     
7876 ADAMS CLERK 7788 23/05/87 1100 20
7934 MILLER CLERK 7782 23/01/82 1300 10

استخدام دالة BETWEEN AND حيث يتم كتابة الحد الأصغر قبل AND وكتابة الحد الأصغر بعد AND ويتم أخذ الحدين الأصغر والأكبر في البيانات وإظهارهما حيث أن فترة BETWEEN مغلقة
SQL> SELECT * FROM EMP WHERE SAL BETWEEN 1000 AND 1200;


EMPNO 	ENAME      JOB             MGR 	HIREDATE       	SAL      COMM    DEPTNO                     
7876 ADAMS CLERK 7788 23/05/87 1100 20


استخدام NOT مع دالة BETWEEN AND لا يتم أخذ الحدين الأصغر والأكبر في البيانات
SQL> SELECT * FROM EMP WHERE SAL NOT BETWEEN 800 AND 1200;


EMPNO 	ENAME      JOB                   MGR 	HIREDATE       	SAL      COMM    DEPTNO                     
7499 ALLEN SALESMAN 7698 20/02/81 1600 300 30
7521 WARD SALESMAN 7698 22/02/81 1250 500 30
7566 JONES MANAGER 7839 02/04/81 2975 20
7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30
7698 BLAKE MANAGER 7839 01/05/81 2850 30
7782 CLARK MANAGER 7839 09/06/81 2450 10
7788 SCOTT ANALYST 7566 19/04/87 3000 20
7839 KING PRESIDENT 17/11/81 5000 10
7844 TURNER SALESMAN 7698 08/09/81 1500 0 30
7902 FORD ANALYST 7566 03/12/81 3000 20
7934 MILLER CLERK 7782 23/01/82 1300 10
تم اختيار 11 صف


استخدام علامة % مع دالة LIKE لتحل محل عدة حروف لتطبيق شرط محدد على حقل حرفي أو رقمي أو تاريخ بينما استخدام علامة ( _ ) لتحل محل حرف واحد فقط . مثلاً في المثال التالي يتم استعراض كل الصفوف التي حقل الاسم فيها يبدأ بحرف A وتم التعبير عن ذلك بـ WHERE ENAME LIKE 'A%'
SQL> SELECT * FROM EMP WHERE ENAME LIKE 'A%';


EMPNO 	ENAME      JOB             	MGR 	HIREDATE       SAL      COMM    DEPTNO                     
7499 ALLEN SALESMAN 7698 20/02/81 1600 300 30
7876 ADAMS CLERK 7788 23/05/87 1100 20

وفي المثال التالي يتم عرض الصفوف التي تتكون من خمسة حروف وتبدأ بحرف A وتم التعبير عن ذلك بكتابة حرف A ثم أربع علامات من العلامة ( _ ) .


SQL> SELECT * FROM EMP WHERE ENAME LIKE 'A____';


EMPNO 	ENAME          JOB             MGR 	HIREDATE       SAL      COMM    DEPTNO                     
7499 ALLEN SALESMAN 7698 20/02/81 1600 300 30
7876 ADAMS CLERK 7788 23/05/87 1100 20

ولعرض كل الصفوف التي يكون فيها حقل COMM له القيمة NULL تستخدم دالة IS NULL كما يلي :-
SQL> SELECT * FROM EMP WHERE COMM IS NULL;


EMPNO 	ENAME      	JOB            	 MGR 	HIREDATE       	SAL      COMM    DEPTNO                     
7369 SMITH CLERK 7902 17/12/80 800 20
7566 JONES MANAGER 7839 02/04/81 2975 20
7698 BLAKE MANAGER 7839 01/05/81 2850 30
7782 CLARK MANAGER 7839 09/06/81 2450 10
7788 SCOTT ANALYST 7566 19/04/87 3000 20
7839 KING PRESIDENT 17/11/81 5000 10
7876 ADAMS CLERK 7788 23/05/87 1100 20
7900 JAMES CLERK 7698 03/12/81 950 30
7902 FORD ANALYST 7566 03/12/81 3000 20
7934 MILLER CLERK 7782 23/01/82 1300 10
تم اختيار 10 صف


ولنفي جملة IS NULL تستخدم دالة IS NOT NULL كما في المثال التالي :
SQL> SELECT * FROM EMP WHERE COMM IS NOT NULL;


EMPNO 	ENAME      JOB             	MGR 	HIREDATE       	SAL      COMM    DEPTNO                     
7499 ALLEN SALESMAN 7698 20/02/81 1600 300 30
7521 WARD SALESMAN 7698 22/02/81 1250 500 30
7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30
7844 TURNER SALESMAN 7698 08/09/81 1500 0 30


استخدام دالة IN(list) للسؤال هل بيانات الحقل المراد السؤال عنه موجودة في القائمة داخل IN وهذه القائمة يمكن أن تكون رقمية أو حرفية بناءً على نوع الحقل المراد السؤال عنه .

SQL> SELECT * FROM EMP WHERE DEPTNO IN(10,20);


EMPNO 	ENAME      JOB             	MGR 	HIREDATE       	SAL      COMM    DEPTNO                     
7369 SMITH CLERK 7902 17/12/80 800 20
7566 JONES MANAGER 7839 02/04/81 2975 20
7782 CLARK MANAGER 7839 09/06/81 2450 10
7788 SCOTT ANALYST 7566 19/04/87 3000 20
7839 KING PRESIDENT 17/11/81 5000 10
7876 ADAMS CLERK 7788 23/05/87 1100 20
7902 FORD ANALYST 7566 03/12/81 3000 20
7934 MILLER CLERK 7782 23/01/82 1300 10
تم اختيار 8 صف


استخدام المعامل OR وهو يتطلب فقط تنفيذ أحد الشرطين الموجودين مع المعامل .
SQL> SELECT * FROM EMP WHERE DEPTNO=10 OR DEPTNO=20;


EMPNO 	ENAME      JOB             	MGR 	HIREDATE       	SAL      COMM    DEPTNO                     
7369 SMITH CLERK 7902 17/12/80 800 20
7566 JONES MANAGER 7839 02/04/81 2975 20
7782 CLARK MANAGER 7839 09/06/81 2450 10
7788 SCOTT ANALYST 7566 19/04/87 3000 20
7839 KING PRESIDENT 17/11/81 5000 10
7876 ADAMS CLERK 7788 23/05/87 1100 20
7902 FORD ANALYST 7566 03/12/81 3000 20
7934 MILLER CLERK 7782 23/01/82 1300 10
تم اختيار 8 صف



استخدام دالة NOT مع المعامل OR أي نفي الشرط المطبق في المثال السابق وذلك بوضع دالة OR وشرطيها داخل قوسين ثم دالة NOT قبل القوسين ليتم تطبيق النفي على الشرطين .


SQL>  SELECT * FROM EMP WHERE NOT(DEPTNO=10 OR DEPTNO=20);


EMPNO 	ENAME      	JOB             	MGR 	HIREDATE       	SAL      COMM    DEPTNO                     
7499 ALLEN SALESMAN 7698 20/02/81 1600 300 30
7521 WARD SALESMAN 7698 22/02/81 1250 500 30
7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30
7698 BLAKE MANAGER 7839 01/05/81 2850 30
7844 TURNER SALESMAN 7698 08/09/81 1500 0 30
7900 JAMES CLERK 7698 03/12/81 950 30
تم اختيار 6 صف


ويمكن النفي بطريقة أخرى وذلك بتطبيق دالة NOT بتطبيق على العوامل الموجودة داخل القوسين أي تحويل علامة يساوي (=) إلى لا يساوي (=!) وكذلك نفي المعامل OR إلى المعامل AND وإلغاء القوسين .
SQL> SELECT * FROM EMP WHERE DEPTNO!=10 AND DEPTNO!=20;


EMPNO 	ENAME      JOB             	MGR 	HIREDATE       	SAL      COMM    DEPTNO                     
7499 ALLEN SALESMAN 7698 20/02/81 1600 300 30
7521 WARD SALESMAN 7698 22/02/81 1250 500 30
7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30
7698 BLAKE MANAGER 7839 01/05/81 2850 30
7844 TURNER SALESMAN 7698 08/09/81 1500 0 30
7900 JAMES CLERK 7698 03/12/81 950 30
تم اختيار 6 صف


وللخروج من SQL/PLUS يستخدم أمر الخروج EXIT .
SQL> EXIT

ملاحظات :
الفرق بين يأخذ الحقل قيمة الـ NULL أو يأخذ قيمة الصفر هو أن الحقل الذي يأخذ قيمة الـNULL لا يمكن تغيير هذه القيمة أي أنها له لا تتغير أما قيمة الصفر فيمكن أن تتغير إلى قيمة أخرى مثال ذلك حقل COMM في جدول EMP فإن الموظف الذي يأخذ في حقل COMM قيمة NULL فهو أن طبيعة عمله لا يأخذ أي نسبة (COMMISION) على الإطلاق أما الموظف الذي يأخذ قيمة الصفر فهو أن الموظف لم يحقق النسبة ولم يحقق أي COMMISION ويمكن أن يحقق فيما بعد فتتغير قيمة الصفر إلى القيمة المحققة .
عند استخدام دالة NOT مع دالة IN فإن ذلك يتطلب من ORACLE SERVER أن يبحث في كافة صفوف الجدول وبالتالي يتم تضييع وقت كبير جداً أثناء تنفيذ هذه الدالة خاصة اذا كان هناك صفوف كثيرة جداً لذلك لا ينصح بها برمجياً .
استخدام المعامل != بدلاً من المعامل <> وذلك لأن المعامل != عبارة عن عملية واحدة فقط أما المعامل <> عبارة عن معاملين ولذلك فاستخدام المعامل الأول.

وبهذا نكون انتهينا من المحاضرة الاولى

اتمنى عدم نقل الموضوع الى منتديات اخرى الى بوضع الوصله في اي منتدى

تحياتي،،،

تم التعديل بواسطة الماضي, 25 July 2004 - 03:31 PM.

  • MohamedHasan و ibrahematia معجبون بهذا

#2 TALAL

TALAL

    عضو

  • الأعضــاء
  • 29 مشاركة

تاريخ المشاركة 17 July 2004 - 08:31 AM

شكرا ياأخى على هذا الدرس الرائع والذى أوضحت به الكثير وأتمنى استكمال هذه الحلقات وجزاء الله عنا خير الجزاء
لى سؤالين لو تكرمت الاجابه عنهم
1- هل توجد داله انتاج رقم عشوائي يمكن استخدامها فى الاوراكل
2- هل يمكن اختيار سجل معين عشوائيا أو بناء على رقم السجل (الثالث ،العشرين ، الخمسون)
يعنى تطبيقا على الجمله الاخيره والذى انتج 6 سجلات هل يمكن عرض او اختيار سجل واحد منهم فقط عشوائيا


وجزاكم الله خيرا ، واللام عليكم ورحمه الله وبركاته ،،

#3 الماضي

الماضي

    مشترك

  • الأعضــاء
  • 63 مشاركة

تاريخ المشاركة 17 July 2004 - 10:25 PM

العفو اخوي طلال وانا ماسويت الى الواجب
واجبتك هي
1- انت تقصد في هذي SEQUENCE اتوقع انشاء الله جايه بالدروس
2- ابشوفلك الفكره بس ماتوقع فيه امر لهشيء هذا

تحياتي،،،

#4 الماضي

الماضي

    مشترك

  • الأعضــاء
  • 63 مشاركة

تاريخ المشاركة 18 July 2004 - 10:57 PM

بسم الله الرحمن الرحيم



السلام عليكم ورحمة الله وبركاته،،

الأخت نوير
العفو اختي العزيزة وانشاء الله يفيدك في دراستك :D

تقبلي تحياتي,,,
====================================
الأخ Oracle
العفو اخوي العزيز :D

تقبل تحياتي,,,
====================================
الأخ عمر باعقيل
وعليكم السلام ورحمة الله وبركاته،،
العفو اخوي وانا لا اريد الا الدعاء لي بتوفيق و ان يستفيد الجميع منها واشكرك على مرورك
تقبل تحياتي,,,
====================================


تحياتي للجميع,,,

#5 AL®NE

AL®NE

    عضو

  • الأعضــاء
  • 14 مشاركة

تاريخ المشاركة 19 July 2004 - 08:57 AM

مشكور أخوي الماضي مجهود ممتاز وشرح واضح ,,,,,,

لكن عندي سوال ... أنت تقول


عند استخدام دالة NOT مع دالة IN فإن ذلك يتطلب من ORACLE SERVER أن يبحث في كافة صفوف الجدول وبالتالي يتم تضييع وقت كبير جداً أثناء تنفيذ هذه الدالة خاصة اذا كان هناك صفوف كثيرة جداً لذلك لا ينصح بها برمجياً

سوالي هو أن كل عمليات الاستعلام تتطلب البحث في جميع الصفوف ,,,, ممكن توضح لي أكثر ولا عليك أمر :D

شكرا لك

#6 الماضي

الماضي

    مشترك

  • الأعضــاء
  • 63 مشاركة

تاريخ المشاركة 21 July 2004 - 01:46 PM

اخي العزيز AL®NE العفو اخوي وهذا واجبي

والجواب على سؤلك هو اذا استخدمنا جملة NOT IN هذه الجمله تسبب التئخير في الاستعلام عن المطلوب اذا كانت السجلات كثيرة فيفضل التحديد على الامر المطلوب ولكن الجمله صحيحه ويمكن استخدامها هذا المقصود واذا كان احد من الاخوان يعرف السبب الاكيد فئتمنا ان يفيدنا بهذه النقطه

تحياتي،،،

#7 الماضي

الماضي

    مشترك

  • الأعضــاء
  • 63 مشاركة

تاريخ المشاركة 26 July 2004 - 04:07 PM

تـــــــــــابــــــــــــــــــع


معليه اخواني ما دريت انه انقطع الشرح :D


===========================================================



دالة القطع( SUBSTR(Column_name , start , number of character وهي اختصار لـ SUBstitute STRing تستخدم هذه الدالة لقطع عدد من حروف العمود أو النص, بداية من الحرف رقم start وبعدد حروف برقم number of character وهذه الدالة هامة جدا عندما تحتاج إلى قطع عدد محدد من حروف العمود كله بأمر واحد وهذا عندما يوجد خطأ في بيانات عمود محدد وتحتاج إلى تعديله بقطع جزء محدد من حروف العمود كما في المثال التالي فإنه سيتم قطع ثلاثة حروف من عمود الإسم اعتباراً من الحرف رقم 2 من اليسار اذا كان رقم البداية موجب والثاني من اليمين اذا كان رقم البداية سالب والقطع من اليسار أيضاً .

SQL> SELECT SUBSTR(ENAME,2,3) FROM EMP;

SUB                                                                                                 
MIT
LLE
ARD
ONE
ART
LAK
LAR
COT
ING
URN
DAM
AME
ORD
ILL
تم اختيار 14 صف


في هذا المثال عدد البداية سالب لذلك بدأ العد من اليمين وقطع إلى اليسار .

SQL> SELECT ENAME,SUBSTR(ENAME,-2,3) FROM EMP;

ENAME      	SU                                                                                       
SMITH TH
ALLEN EN
WARD RD
JONES ES
MARTIN IN BLAKE KE
CLARK RK
SCOTT TT
KING NG
TURNER ER
ADAMS MS
JAMES ES
FORD RD
MILLER ER
تم اختيار 14 صف


في المثال التالي سيتم القطع بداية من الحرف رقم 3 من اليمين وقطع فقط حرفين .

SQL> SELECT ENAME,SUBSTR(ENAME,-3,2) FROM EMP;

ENAME      	SU                                                                                       
SMITH IT
ALLEN LE
WARD AR
JONES NE
MARTIN TI
BLAKE AK
CLARK AR
SCOTT OT
KING IN TURNER NE
ADAMS AM
JAMES ME
FORD OR MILLER LE
تم اختيار 14 صف


دالة البحث عن حرف أو حروف متتالية(INSTR(Column_name , string وهي اختصار لـ IN STRing وهي تستخدم للبحث عن حرف أو حروف string في العمود أو النص المكتوب . ويتم عرض رقم الحرف او رقم الحروف في العمود من اليسار.

SQL> SELECT INSTR('ABCD','B') FROM DUAL;

INSTR('ABCD','B')                                                                                   
2


ويمكن البحث عن أكثر من حرف (سلسلة حرفية)

SQL> SELECT INSTR('ABCD','BC') FROM DUAL;

INSTR('ABCD','BC')                                                                                  
2

SQL> SELECT INSTR('ABCD','BD') FROM DUAL;

INSTR('ABCD','BD')                                                                                  
0


في المثال السابق تم البحث عن حرفي BD ككلمة واحدة وبالتالي لا يوجد فكان الناتج 0 .

في المثال التالي سيتم البحث عن العلامة ( _ ) داخل السلسلة الحرفية (XYZ-ABC) وذلك باستخدام دالة INSTR ثم أخذ ناتج هذه الدالة وهو ترتيب هذا الرمز وإضافة عليه الرقم 1 ثم تطبيق دالة SUBSTR والقطع بدءاً من الرقم الناتج +1 .

SQL> SELECT SUBSTR('XYZ-ABC',INSTR('XYZ-ABC','-')+1) FROM DUAL;

SUB                                                                                                 
ABC


ويمكن تحديد عدد الحروف التي يتم قطعها وهنا عدد الحروف المراد قطعها هو ثلاثة حروف .

SQL> SELECT SUBSTR('XYZ-ABC',INSTR('XYZ-ABC','-')+1,3) FROM DUAL;

SUB                                                                                                 
ABC

========================================

SQL> SELECT SUBSTR('XYZ-ABC',INSTR('XYZ-ABC','-')+1,2) FROM DUAL;

SU                                                                                                  
AB


في دالة INSTR بعد كتابة الرمز المراد البحث عنه اذا كتبنا الرقم (1) فهذا يعني أن البحث يبدأ من اليسار إلى اليمين أما اذا كان سالب فإن البحث سيبدأ من اليمين إلى اليسار أما الرقم بعد (1) فهو يعني هل الرمز الأول أو الثاني أو الثالث وهكذا لأنه يمكن أن يكون هناك اكثر من رمز . كما في المثال التالي فإن البحث بدأ من اليسار إلى اليمين والرمز الثاني الذي بعده مباشرة حروف MNO .

SQL>SELECT SUBSTR('XYZ-ABC-MNO',INSTR('XYZ-ABC-MNO','-',1,2)+1,3) FROM DUAL;

SUB
MNO


في هذا المثال البحث بدأ من اليمين إلى اليسار لأن الرقم (1) أمامه إشارة سالبة والرمز الثاني من اليمين ولكن قطع الحروف من اليسار إلى اليمين وهنا الحروف المقطوعة هي ABC .

SELECT SUBSTR('XYZ-ABC-MNO',INSTR('XYZ-ABC-MNO','-',-1,2)+1,3) FROM DUAL;

SUB
ABC


دالة ROUND(Column_name/number , digit) تقوم هذه الدالة بتقريب محتويات العمود الرقمية أو الرقم المكتوب في الدالة إلى الرقم المكتوب بعد الفاصلة . واذا كان هذا الرقم سالب فإن التقريب سيطبق على ما قبل العلامة أي أن التقريب سيكون لأقرب عشرة أو لأقرب مائة أو لأقرب ألف وهكذا .

SQL> SELECT ROUND(55.623,1) FROM DUAL;

ROUND(55.623,1)                                                                                     
55.6

SQL> SELECT ROUND(55.623,2) FROM DUAL;

ROUND(55.623,2)                                                                                     
55.62

SQL> SELECT ROUND(55.623,0) FROM DUAL;

ROUND(55.623,0)                                                                                     
56

SQL> SELECT ROUND(55.623,-1) FROM DUAL;

ROUND(55.623,-1)                                                                                    
60


تقوم دالة TRUNC بقطع التقريب فإذا كان الرقم المراد التقريب إليه موجب سيكون التقريب للأرقام بعد العلامة (الأجزاء العشرية) واذا كان الرقم بالسالب فإن القطع سيكون لأقرب عشرة أو مائة أو ألف .

SQL> SELECT ROUND(55.623,-1),TRUNC(55.623) FROM DUAL;

ROUND(55.623,-1) 	TRUNC(55.623)                                                                      
60 55

SQL> SELECT ROUND(55.623,-1),TRUNC(55.623,-1) FROM DUAL;

ROUND(55.623,-1) 	TRUNC(55.623,-1)                                                                   
60 50

SQL> SELECT ROUND(55.623,-2),TRUNC(55.623,-2) FROM DUAL;

ROUND(55.623,-2) 	TRUNC(55.623,-2)                                                                   
100 0

SQL> SELECT ROUND(49.623,-2),TRUNC(49.623,-2) FROM DUAL;

ROUND(49.623,-2) 	TRUNC(49.623,-2)                                                                   
0 0

SQL> SELECT ROUND(55.623,0),TRUNC(55.623,0) FROM DUAL;

ROUND(55.623,0) 	TRUNC(55.623,0)                                                                     
56 55

SQL> SELECT ROUND(55.623,1),TRUNC(55.623,1) FROM DUAL;

ROUND(55.623,1) 	TRUNC(55.623,1)                                                                     
55.6 55.6

SQL> SELECT ROUND(55.623,-1),TRUNC(55.623,-1) FROM DUAL;

ROUND(55.623,-1) 	TRUNC(55.623,-1)                                                                   
60 50


دالة MOD تقوم بحساب باقي قسمة رقم أو عمود على رقم أو عمود آخر.

SQL> SELECT MOD(8,3) FROM DUAL;

MOD(8,3)                                                                                           
2

SQL> SELECT MOD(8,4) FROM DUAL;

MOD(8,4)                                                                                           
0


أمر DESC table_name يقوم هذا الامر بعرض توصيف للبرنامج وعرض لأنواع الحقول في هذا الجدول .

SQL> DESC EMP;

Name                               Null?      Type
--------------------------- ---------------- -------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)


دالة TO_NUMBER تقوم هذه الدالة بتحويل الأرقام التي في صورة حرفية إلى أرقام في صورة عددية يمكن إجراء جميع العمليات الحسابية عليها .

SQL> SELECT TO_NUMBER('12')+10 FROM DUAL;

TO_NUMBER('12')+10                                                                                  
22


دالة TO_CHAR تقوم هذه الدالة بتحويل الأرقام التي في صورة رقمية إلى أرقام في صورة حرفية .

SQL> SELECT TO_CHAR(TO_NUMBER('12')+10) FROM DUAL;

TO                                                                                                  
22

SQL> SELECT TO_CHAR(TO_NUMBER('12')+10)+10 FROM DUAL

TO_CHAR(TO_NUMBER('12')+10)+10                                                                      
32

SQL> SELECT TO_CHAR(TO_NUMBER('12')+10)+10 FROM DUAL;

TO_CHAR(TO_NUMBER('12')+10)+10                                                                      
32



اذا اردنا تغيير شكل الاستعلام لتاريخ توجد طريقة لهذه وهي كما يلي

SQL> select sysdate from dual;

SYSDATE
---------
23-JUL-04


في المثال السابق استعلامنا عن تاريخ اليوم سوف نغير في شكل التاريخ في المثال القادم

ALTER SESSION SET NLS_DATE_FORMAT='DD/MM/YYYY';

SQL> select sysdate from dual;

SYSDATE
----------
23/07/2004


طريقة اخرى

SQL> SELECT TO_CHAR(SYSDATE,'DD.MM.YYYY') FROM DUAL;

TO_CHAR(SY
----------
25.07.2004

SQL> SELECT HIREDATE,TO_CHAR(HIREDATE,'DD.MONTH.YYYY') FROM EMP; HIREDATE   TO_CHAR(HIREDATE,
---------- -----------------
17/12/1980 17.DECEMBER .1980
20/02/1981 20.FEBRUARY .1981
22/02/1981 22.FEBRUARY .1981
02/04/1981 02.APRIL .1981
28/09/1981 28.SEPTEMBER.1981
01/05/1981 01.MAY .1981
09/06/1981 09.JUNE .1981
19/04/1987 19.APRIL .1987
17/11/1981 17.NOVEMBER .1981
08/09/1981 08.SEPTEMBER.1981
23/05/1987 23.MAY .1987
03/12/1981 03.DECEMBER .1981
03/12/1981 03.DECEMBER .1981
23/01/1982 23.JANUARY .1982

SQL> SELECT HIREDATE,TO_CHAR(SYSDATE,'DD-MON-YYYY') FROM EMP;

HIREDATE   TO_CHAR(SYS
---------- -----------
17/12/1980 23-JUL-2004
20/02/1981 23-JUL-2004
22/02/1981 23-JUL-2004
02/04/1981 23-JUL-2004
28/09/1981 23-JUL-2004
01/05/1981 23-JUL-2004
09/06/1981 23-JUL-2004
19/04/1987 23-JUL-2004
17/11/1981 23-JUL-2004
08/09/1981 23-JUL-2004
23/05/1987 23-JUL-2004
03/12/1981 23-JUL-2004
03/12/1981 23-JUL-2004
23/01/1982 23-JUL-2004


وبهذا نكون انتهينا من المحاضرة الثانية

اتمنى عدم نقل الموضوع الى منتديات اخرى الى بوضع الوصله في اي منتدى

وتقبلو تحياتي،،،
  • ibrahematia معجب بهذا

#8 wad_altayeb

wad_altayeb

    عضو

  • الأعضــاء
  • 36 مشاركة

تاريخ المشاركة 19 September 2004 - 01:20 PM

بسم الله الرحمن الرحيم

الاخ الماضي

الله يجزيك خير الجزاء ومشكور علي هذه المحاضرات القيمة
wad_altayeb

#9 Mohamedzara

Mohamedzara

    عضو

  • الأعضــاء
  • 7 مشاركة

تاريخ المشاركة 01 December 2004 - 11:06 AM

السلام عليكم و رحمة الله و بركاته
شكرا ياخي على هذه المعلومات القيمة انا عندي سؤال ممكن اجد اجابة عليه من اي اخ له دراية بالموضوع
انا عندي مجموعة سجلات بها بيانات و اريد عرض هذه السجلات من تاريخ معين الى تاريخ اخر او عدد السجلات بين تاريخين؟
set get_sum_vote=conn.execute(" select count(*) as total_poll from cathodic_cables where cath_date between # to_date('" & Request.Form("startdate") & "', 'dd/mm/yyyy') & # and # to_date('" & Request.Form("enddate") & "', 'dd/mm/yyyy') # " )

#10 mido128

mido128

    عضو

  • الأعضــاء
  • 32 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 05 December 2004 - 08:04 PM

بسم الله الرحمن الرحيم


مشكور علي هذة المعلومات.... وربنا يحتسبها في ميزان حسناتك ان شاء الرحمن

#11 ابو مهند

ابو مهند

    عضو

  • الأعضــاء
  • 5 مشاركة

تاريخ المشاركة 10 December 2004 - 02:30 PM

شكرا على هذه المعلومات المهمة، وبارك الله في القائمين على المنتدى :unsure: :huh:

#12 سوزان حاتم

سوزان حاتم

    عضو

  • الأعضــاء
  • 3 مشاركة

تاريخ المشاركة 13 December 2004 - 09:17 PM

فعلا جهودكم مشكورة
شكرا كثير

#13 أحمد الطيار

أحمد الطيار

    عضو

  • الأعضــاء
  • 7 مشاركة

تاريخ المشاركة 24 December 2004 - 02:57 AM

شكرا لك أيها الاخ الكريم ..

ولكن هل لي باستفسار بسيط ...

في دالة التاريخ .. عند طرح hiredate من sysdate ستأتي النتيجة في صورة أيام ..

هل من سبيل لعرضها بالشكل التالي ..

ان تكون المدة المنقضية هي كذا سنة , كذا شهر , كذا يوم ؟؟؟

وكل الشكر ...

#14 TheMastar

TheMastar

    عضو

  • الأعضــاء
  • 1 مشاركة

تاريخ المشاركة 24 December 2004 - 07:02 AM

مشكور اخى على الموضوع

ولكن عندما جربت الداله NVL ظهرتلى رساله تقول Undefiend function 'Nvl' ex

مع العلم انى استخدمت اكسيس 2000 ...

انا قمت بالبحث فى البرنامج عن الداله التى تجعل NULL بقيمه ادخلها بنفسى

فوجدت داله باسم NZ وصيغه كتابتها

Nz([Subtotal],0+Nz([Freight],0) .. ok

ولكنى لا استطيع استخدامها

ارجو المساعده بأى داله تحول Null لقيمه اقوم بادخالها سواء كانت NVL او NZ او غيرهم

شكرا مقدما

#15 sadiq

sadiq

    مشترك

  • الأعضــاء
  • 54 مشاركة

تاريخ المشاركة 09 January 2005 - 12:08 PM

جزيت عنا خيرا .