الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

إحتراف SQL

مغلق
بدأه عمر باعقيل في 26 سبتمبر 2001 · 19 رد · 3,696 مشاهدة · في قواعد بيانات Oracle
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

الاخوه الافاضل

يوجد لدي اقتراح اتمنى ان ينال اعجابكم

وهو إحتراف إستخدام ال SQL ...

وهو أن يكتب كل منا أمثله عن أوامر في ال SQL وتكون على جداول المستخدم SCOTT

لوجودها في كل قواعد بيانات أوراكل أو على جدول DUAL وطبعا كل شخص يكتب أمر يقوم بشرحه

ولو بكلمات بسيطه جدا لكي نستطيع فهم الامر .

وسوف أذكر بعض الامثلة التوضيحيه وارجوا ان يتفاعل معي الاخوان لانها قد تكون عمليه بسيطه لدي

البعض ولكنها مفيد جدا إن شاء الله للبعض الاخر ونرجوا ان يظهر ابداع الاخوه المحترفين في إستخدام ال SQL

كما ان تعلمنا لل SQL سوف يفيدنا في إستخدامه في إدارة قاعدة البيانات وال Developer ايضا وبطريقه افضل .

مثال :

لعرض إسم الموظف ووظيفته بطريقه مختلفه : -

SQL> SELECT CONCAT( CONCAT(ename, ' is a '), job) "Job"

FROM emp

WHERE empno = 7900;

فيكون الناتج : -

Job

-----------------------

JAMES is a CLERK

مثال أخر :

لجمع كل أنواع الوظائف الموجوده في جدول EMP :-

SQL> SELECT COUNT(DISTINCT job) "Jobs" FROM emp;

الناتج :-

Jobs

---------

5

مثال :

لاظهار الحروف الاولي لجمله the soap بالحروف الكبير ( Capital ) :-

SQL> SELECT INITCAP('the soap') "Capitals" FROM DUAL;

الناتج : -

Capitals

--------

The Soap

وهكذا .....

كما يمكن أن يقوم الاخوه بعمل عدة أوامر عن طريق الSQL لاظهار نتيجه واحده ولكن كل على حسب

فكره وإبداعه وخبرته في إستخدام ال SQL .

وارجوا من الاخ honest أو الاخ السني شرح طريقه كتابه الكود داخل ذلك المستطيل وذلك لكي

يظهر الكود بالطريقه الصحيح ولكي نستطيع اخذ نسخه منه وتنفيذها في ال SQL مباشرة .

عمر محمد باعقيل

المدينه المنوره

baaqeel@onebox.com

#2

فكرة ممتازة أخ عمر , ولكن نحب منك ـ وهذا رأي ولاأدري مارأيكم ـ أن تكمل لنا المشوار في المثال الذي بدأته وفيه عدة مواضيع:

ـ1ـ عند إدخال رقم العامل فإن كان موجودا أظهر لنا رسالة "العامل مسجل سابقا .." مثلا وأظهر بياناته ولم يقبل متابعة التسجيل بل أظهر Buttom التعديل فقط وأخفى الباقي.

ـ2ـ يمكن أن نعمل Form ثاني لنكتب رقم الإدارة فيظهر كل العاملين الموجودين في هذه الإدارة.

ـ3ـ طباعة Report ومايتفرع عنه من ريبورتات مثلا حسب رقم الإدارة على مستوى رقم العامل وملخص مجموع الرواتب في كل إدارة على مستوى رقم الإدارة ....الخ

ـ4ـ تصميم فورم يجمع هذه الفورمات السابقة

ومن خلال هذه البرامج يمكن أن نتعرض إلى أفكار كنت أنت قد طرحتها سابقا مثل الـCursor وغيرها ...

مع تقديري الكبير واحترامي لجهودك .. ووأرجو أن لاتمل فإننا لن نمل حتى تمل.

وعلى كلٍ ـ أخي عمر ـ فما تراه نحن معك به ...

أخوكم / فايز

#3

أعتذر من الأخ honest حول موضوع الـCursor فقد وجدت ومن خلال مراجعة المشاركات أن الأخ honest هو الذي شرح موضوع الـCursor على دفعتين ..

مرة أخرى .. آسف أخي honest ..

أخوكم / فايز

#4

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

الاخ العزيز فايز

انا اقصد هنا أن يكتب كل من يريد أوامر تستخدم في ألSQL

ربما موضوعك على حسب ماأعتقد يخص موضوع دروس في النماذج

ارجوا ان تتاكد او ان تصحح خطائي

اخوك

عمر باعقيل

المدينه المنوره

baaqeel@onebox.com

#5

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

الاخ العزيز فايز

انا اقصد هنا أن يكتب كل من يريد أوامر تستخدم في ألSQL

وعرض نتيجه الامر وشرح بسيط عنه فقط

ربما موضوعك على حسب ماأعتقد يخص موضوع دروس في النماذج

ارجوا ان تتاكد او ان تصحح خطائي

اخوك

عمر باعقيل

المدينه المنوره

baaqeel@onebox.com

#6

الأخ العزيز عمر ...

تحية طيبة مباركة ...

إذا كان قصدك أن تفتح خط ثاني في الـSQL إضافة إلى الخط الأول وهو الـFORMS فحياك الله وجهد مبارك إن شاء الله , لأني فهمت ـ واعذرني على سوء فهمي ـ بأنك أغلقت الخط الأول لذا وقع قلبي ..

فعذرا ...

أخوكم / فايز

#7

السلام عليكم..

select ename||' is an employee and his job is a '||job||' and his manager is '||mgr example from emp;

select '100/50 = '||100/50 sample from dual;

select 'curren user is '|| user from dual;

select 'system date is '|| sysdate from dual;

#8

الاخوه الافاضل

سوف اكتب لكم بعض من أوامر SQL كنت جمعتها أثناء دراستي

وممارستي للأوراكل وقد إستفدت منها كثيرا سواء في الDBA أو Developer

أرجوا ان تستفيدوا منها وهي : -

لعرض أخر يوم بالشهر الذي نحن فيه الان :-

 
 SELECT LAST_DAY (SYSDATE)"LAST DAY" FROM DUAL;

لعرض كلمه LOWER بالحروف الصغيره :-

 
 SELECT LOWER('LOWER') FROM DUAL;

لمعرفة عدد الشهور بين تاريخ اليوم وتاريخ تعيين الموظفين في جدول EMP :-

 
SELECT MONTHS_BETWEEN(SYSDATE,HIREDATE) FROM EMP;

لعرض التاريخ بعد شهر من تاريخ تعيين الموظف SMITH :-

 
select TO_CHAR(ADD_MONTHS(hiredate,1)) from emp where ename = 'SMITH';

لاعطاء إسم مؤقت للحقل ENAME :-

" لايمكن الاستعلام أو إدخال بيانات أو التعديل على هذا الحقل بهذا الاسم المؤقت , فقط بالاسم الاصلى له "

 
COLUMN ENAME HEADING EMPLOYEE;

لتحويل التاريخ من ميلادي الى هجري :-

 
ALTER SESSION SET NLS_CALENDAR = 'ARABIC HIJRAH';

ولتحويل التاريخ من هجري الى ميلادي :-

 
ALTER SESSION SET NLS_CALENDAR = 'GREGORIAN';

لاظهار تاريخ يوم الثلاثاء الذي يلي هذا التاريخ 22/9/2001 :-

SELECT NEXT_DAY('22/9/2001','TUESDAY') "NEXT DAY" FROM DUAL;

لاظهار إسماء الموظفين وعمولاتهم الموجودين في دائره 30 ولكن من كان حقل عمولته

فارغا " NULL " فيجب ان تظهر كلمة NO APPLICABLE بدل من فارغ :-

 SELECT ename, NVL(TO_CHAR(COMM),'NOT APPLICABLE') "COMMISSION"
 FROM emp
 WHERE deptno = 30;

لإظهار تاريخ أول يوم في السنه الاقرب الى هذا التاريخ 13/9/2001 :-

SELECT ROUND(TO_DATE('13/9/2001'),'YEAR')
"FIRST OF THE YEAR" FROM DUAL;

لعرض كلمة ما بعد خذف حرف واحد منها ويتم حذف الحرف الاول أو

الاخير فقط " الحذف يتم عند العرض فقط " :-

< هذا الامر لايعمل في قاعدة بيانات أوراكل الاصدار 7 >

SELECT TRIM ('O' FROM 'OLDMAN') FROM DUAL;

لتعديل صيغه ظهور وعرض التاريخ :-

 ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY MM DD HH24:MI:SS';

وشكرا للاخ سين ميم على أمثلته وارجوا منه المزيد

كما ارجوا ان يضيف شرحا بسيطه على كل أمر يكتبه هنا :)

كما أرجوا من الاخوان الافاضل أن يكتبوا لنا بعض من أوامر SQL لنستفيد منها .

أخوكم

عمر محمد باعقيل

المدينة المنورة

baaqeel@onebox.com

#9

السلام عليكم....

لعرض اسم الموضف مع بعض التفاصيل،

(سكوت) هو موظف وعمله (كذا) و مديره (فلان)

 select ename||' is an employee and his job is a '||job||' and his manager is '||mgr example from emp;

ناتج عملية ضرب، مع نص:

select '100/50 = '||100/50 sample from dual;

المستخدم الحالي:

select 'curren user is '|| user from dual;

التاريخ:

select 'system date is '|| sysdate from dual;

ملاحظة اخيرة:

|| تستخدم لاضافة نص او اسم حقل او ماشابه
#10

السلام عليكم...يبدو ان الموضوع غير مهم؟؟مافي تفاعل من الشباب!

كود لكتابة اسم الموظف واسم مديره بجانبه،بدل الرقم:

select e1.ename "employee",e2.ename "his_manager" from emp e1,emp e2 where e1.mgr=e2.empno;

كود لكتابة اسم المدير فقط وعدد موظفيه:

 select e1.ename "manager",count(e2.ename) "his employees" from emp e1,emp e2 where e1.empno=e2.mgr group by e1.ename;

.....

#11

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

الاخ سين ميم

شكرا لك على كل مشاركاتك

وإن شاء الله حيكون في تفاعل

عمر محمد باعقيل

المدينه المنوره

baaqeel@onebox.com

#12

الله يعطيكم العافيه والله اتحفتونا بهل فوائدالعضيمه

وارجو ان لا تتوقفوعن هذا الموضوع لما لهو اهميه كبيره عندي ونحن في انتضاركم

وتقبلو خالص تحياتي واحتراماتي

اخوكم الصغير

شبيه الريح

#13

بعد التحية

هذه بعض الأكواد الجاهزة أتمنى ان تكون مفيدة ولكن بعضها لن يعمل إلا عند الدخول بإسم المستخدم sys او system او أي مستخدم آخر لديه صلاحيات ال dba ...

هذا الكود لمعرفة أعلى خمسة رواتب في حميع الدوائر

 
SELECT e1.ename, e1.sal
FROM emp e1
WHERE 5 > (SELECT COUNT(*) FROM emp e2 WHERE e2.sal > e1.sal)
ORDER BY sal DESC

أحيانا نريد ان ننشئ مجموعة من المستخدمين قد بصل عددهم إلى أكثر من 500 مستخدم لذك يكون اسهل طريقة هي ان ننشئ جدول نخزن فيه أسمائهم وكلمات السر ونستخدم الكود التالي لكي يسهل علينا عملية انشاء المستخدمين الجدد مع إعطاء الصلاحيات لهم

 

select 'create user ' || USERNAME || ' identified by ' || PASSWORD || ';'
from your_table;
select 'grant connect to ' || username || ';' 
from your_table;

لجعل الأرقام تظهر كتابة

 
SELECT TO_CHAR(TO_DATE('700','J'),'JSP') FROM DUAL

أحينا نريد ان نسجل جميع العمليات التي قمنا بها في شاشة sql plus هذه طريقة ممتازة حيث يتم حفظ جميع العمليات بواسطة

hyper text markup language بحيث يتم تخزين جميع العمليات على هيئة صفحة انترنت ....

 
SQL>SPOOL C:EXIT.HTML 
SQL>set markup html on 
SQL> select * from dept; 
لإيقاف هذه الخاصية نكتب التالي 
SQL>set markup html off

أحيانا نريد ان نقوم بطباعة سطر فارغ بين سطرين بإستخدام (pl/sql) هذه الطريقة قد تكون مفيدة

 
begin 
 dbms_output.put_line(sysdate); 
 dbms_output.put(CHR(10)); 
 dbms_output.put_line(sysdate); 
 end;

أستخدام FUNCTION الـ (DECODE)

 
SELECT job,
                sum(decode(deptno,10,sal)) DEPT10,
                sum(decode(deptno,20,sal)) DEPT20,
                sum(decode(deptno,30,sal)) DEPT30,
                sum(decode(deptno,40,sal)) DEPT40
           FROM scott.emp
       GROUP BY job

لمعرفةالتعليقات الموضوعة على الجداول

 
select * from user_tab_comments;

للتعامل مع ملفات المساعدة من خلال ال SQL

 
select info
from   system.help
where  upper(topic) LIKE '%&your_topic%'

معرفة عدد الجداول في SCHEMA الحالية

 
SELECT COUNT(*) FROM USER_TABLES

هذه الكود لتعريف نوع جديد من البيانات

 
CREATE OR REPLACE TYPE vcarray AS VARRAY(10) OF VARCHAR2(128);
--إنشاء جدول مع النوع الجديد من البيانات
CREATE TABLE varray_table (id number, col1 vcarray);
--إدراج البيانات
INSERT INTO varray_table VALUES (1, vcarray('A'));
INSERT INTO varray_table VALUES (2, vcarray('B', 'C'));
INSERT INTO varray_table VALUES (3, vcarray('D', 'E', 'F'));
--أسترداد البيانات من الجدول اللذي أنشأناه مسبقا
SELECT * FROM varray_table;
--لمعرفة الأنواع التي قام بإنشائها المستخدمين
SELECT * FROM USER_VARRAYS;

أصدار قاعدة البيانات التي تعمل عليها

 
select banner from   sys.v_$version;

الخيارات التي تحديدها عند تنزيل أوراكل

 
select '   With the '||parameter||' option'
from   sys.v_$option
where  value = 'TRUE';

الخيارات التي لم يتم تنزيلها

 
select '   The '||parameter||' option is not installed'
from   sys.v_$option
where  value <> 'TRUE

طباعة جدول ال (ASCI CODE)

 
declare
   i number;
   j number;
   k number;
begin
   for i in 2..15 loop
       for j in 1..16 loop
           k:=i*16+j;
           dbms_output.put((to_char(k,'000'))||':'||chr(k)||'  ');
           if k mod 8 = 0 then
              dbms_output.put_line('');
           end if;
       end loop;
   end loop;
end;

لمعرفة أسم الجهاز اللذي تعمل عليه

 
elect host_name from v$instance

هذا الكود لعمل زيادة على عدد معين

 
SELECT deptno, SUM(deptno) OVER (ORDER BY deptno RANGE UNBOUNDED PRECEDING) running_summary
FROM dept

هذا الكود لكتابة جدول الضرب

 
declare
a number:=1;
b number:=1;
begin
while aB);
exit when b>=12;
b:=b+1;
end loop;
a:=a+1;
end loop;
end;

هذا الكود لمعرفة اسم قاعدة البيانات التي تعمل عليها

 
SELECT * FROM V$DATABASE
#14

الأخ الفاضل / عمر باعقيل

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

أنت بدأت هذا الأمر و بعون الله يجب أن تداوم على متابعته و تنشيطه

و لي المشاركة البسيطه هذه لمجرد التذكرة بالموضوع

لعرض ثاني أعلى مرتب بكل إدارة

select deptno , max(sal) from emp

(where sal not in ( select max(sal

(from emp group by deptno

;group by deptno

لعرض ثاني أعلى مرتب و أسم الموظف صاحب هذا المرتب بكل إدارة

select deptno , ename , sal from emp

where sal in (select max(sal) from emp

where sal not in ( select max(sal) from emp

(group by deptno

(group by deptno

order by deptno

و السلام عليكم

#15

الأخوة الأعزاء

آسف لأني لم أستطع قراءة جميع الردود لهذا الموضوع قد يعود السبب لوجود مشكلة في المتصفح ..

المهم لدي اقتراح لنصل الى حد الاحتراف في SQL وأيضاً لكي يصبح الموضوع أكثر تشويقاً .. مارأيكم لو عمل الأمر على هيئة أسئلة يتم طرحها بحيث تكون فيها أفكار جديدة ونحاول جميعاً الإجابة على هذه الأسئلة?

أنا أرى أن هذه الطريقة مفيدة جداً وتجعل الكل متحمس لهذا الأمر .

مثلاً أبدأ ببعض الأسئلة - البسيطة - من عندي :

س1 : تخيل جدول فيه حقلين تاريخ مثلاً ( من تاريخ ، الى تاريخ )

كيف يمكن استعراض التواريخ التي فيها تعارض .

س2 : كيف يمكن استعراض أعلى n من المرتبات في جدول emp حيث أن قيمة n متغيرة تطلب منك عند تنفيذ جملة select .

.

.

.

* ملاحظة : كيف يمكن حل كل سؤال بجملة select واحدة ؟

أرجو أن تعم الفائدة الجميع

#16

أخي العبدلي

جميع الأخوة

كل عام و أنت بخير بمناسبة شهر رمضان الكريم

1 - إن كان المقصود بالتعارض في التواريخ هو أن يكون ( إلى تاريخ ) أصغر من ( من تاريخ ) فيكون الكود هو :

select from_date , to_date from test_date

; where from_date > to_date

2 - أما لإستعراض المرتبات فيكون الكود هو :

select no, sal from (

select rownum no,sal from (

select sal from emp order by sal desc ) )

where no <= &nn

;

#17

أخي العزيز / العبدلي

تحية طيبة

أرسلت ردا سريعا على تساؤلاتك

دون ان انتبه لشرطك و هو بإستخدام جملة select واحدة

فأعدت التفكير بالنسبة لأعلى المرتبات و لم أصل لسوى جملتين متداخاتين ل select و هي :

SELECT ROWNUM NO , SAL FROM ( SELECT SAL FROM EMP ORDER BY SAL DESC ) WHERE NO <= &N;

البركة فيك . . . أنا في إنتظار حلولك و شكرا

أسامة

(g)

#18

الأخ Usama Mostafa

الأخوة الأعزاء جميعاً

شهر مبارك وكل عام وانتم بخير.

كان مقترحي أن يتم بيننا تنافس في طرح الأسئلة والإجابة عليها لتعم الفائدة الكل لا أدري هل اعجبتكم الفكرة أم لا.

اما بالنسبة للأخ Usama Mostafa

فبالنسبة للسؤال الأول المطلوب التداخل بين التاريخين يعني تداخل الفترات .

المطلوب عرض الفترات المتداخلة مثل :

1/1/2001-1/3/2001

1/2/2001-1/5/2001

تلاحظ التاريخ الثاني متداخل مع التاريخ الأول في الفترة.

أرجو إرسال أسئلة من قبلك لتعم الفائدة الجميع .(g)

#19

الأخوة الأعزاء

الأخ الفاضل العبدلي

تحية طيبة مباركة و بعد

لو أدخلنا مجموعة من السجلات إلى الجدول تمثل جميع الإحتمالات و الحالات مثال :

1 - 1/1/2001 - 1/2/2001

2 - 1/12/2000 - 1/2/2001

3 - 1/2/2001 - 1/3/2001

4 - 1/4/2001 - 1/5/2001

5 - 1/1/2001 - 1/3/2001

نجد أن التداخل بين السجلات الآتية :

1 و 2

1 و 3

1 و 5

2 و 3

3 و 5

2 و 5

و على هذا اذكر هذا الإجتهاد الأولي و ليس النهائي :

select a.from_dt, a.to_dt , b.from_dt , b.to_dt

from test_dt a , test_dt b

where (a.from_dt between b.from_dt and b.to_dt) and

(a.rowid <> b.rowid)

و أتمنى أن تكتب حلك يا أخي العبدلي

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

أقصد لفترة زمنية معينة و إن لم يرد احد يعرض صاحب الأسئلة الحل من وجهة نظره ولا تترك العملية مفتوحة

تحياتي

أسامة

(f) (f)

#20

الأخ / Usama Mostafa

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

يعطيك العافية .. فإجابتك موفقة في السؤالين بنفس الفكرة التي عندي بالضبط.

على فكرة شكلك الوحيد المقتنع بفكرتي .. ولذلك أنا منتظر منك أسئلة لنستفيد منها .

ونعطيك سؤال عا الطاير

سؤال في ال forms

تخيل أن عندك حقل text item المطلوب أنه إذا كانت القيمة المدخلة قيمة محددة مثلا 2 فإن الحدث WHEN-VALIDAT-ITEM ينقل المؤشر الى BLOCK آخر بدون حدوث EXCEPTION.

** ملاحظة لازم يكون الحدث في WHEN-VALIDAT-ITEM

وتقبلوا تحياتي ..

وانا منتظر منكم أسئلة لكي نفكر في حلها ونستفيد جميعاً

هذا الموضوع مغلق.

مواضيع مشابهة