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

اسئلة تتحدى ذكاءك

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

حاول حل هذة الأسئلة العشرة متدرجة المستوى

تذكر زز الحل فى جملة sqlواحدة

1. Find the employee(s) who earn the highest salary in each job type Sort in descending salary order..

JOB        ENAME            SAL

PRESIDENT  KING        5 008.013 

ANALYST    SCOTT       3 000.00 

ANALYST    FORD        3 000.00 

MANAGER    JONES        2 975.00

SALESMAN   ALLEN        1 600.00

CLERK      MILLER       1 300.00



6 records selected.

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

2. Find the employees who earn the minimum salary for their job. Displav the result in ascending order of salary.

ENaMe      JOB              SAL

SMITH	CLERK 800 

.

...

7 records selected.

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

3. Find the most recently hired employees in each department. Order by hire date.

DEFTNO ENflHE      HI REBATE

20 ADAHS      04-JUN-84 10 

KING       09-JUL-84 30 

JAMES      23-JUL-B4

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



4. Show the following details for any employee who earns a salary greater than the average for their department. Sort in department number order.

EnaME          SALARY DEFTNO

KING             5009     19 

JONES            2975     29 

SCOTT            3909     20 

FORD             3999     20 

ALLEN            1609     30 

BLAKE            2859     39

6 records selected.

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

5. List all the departments where there are no employees. (Using a subquerv this time.)



DEPTNO DNftME

40 OPERATIONS

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

6. Display the following information for the department with the HIGHEST annual remuneration bill.

DEPTNO COMPENSATION 

20       130500



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



7. Who are the top 3 earners in the company? Display their name and salary.

ENAME             SaL

SCOTT        3,000.00

 KING         5,000.09

 FORD         3,900.00



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

8. In which year did most people join the company? Display the year and number of employees.

YEAR NUMBER OF EMPS 

1984            8

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



9. Modify question 4 to also display the average salary figure for the department.

NAmE	SAL depTNO	dEPTAVG

ALLEN	L600	30	1566.66o6 

.

..



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

10. Write a query to display an '*' against the row of the most recently hired employee. 

Display ENAME, HIREDATE and column (maxdate) showing ""'.
#2

الأخ / عثمان

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

في : احتراف SQL .

واليك محاولة لحل الأسئلة التي عرفتها

1-

select job,ename,sal

from emp e

where sal=(select max(sal) from emp where job =e.job)

order by sal desc

2-

select ename,job,sal

from emp e

where sal=(select min(sal) from emp where job =e.job)

order by sal

3-

select deptno,ename ,hiredate

from emp e

where hiredate=(select max(hiredate) from emp where deptno=e.deptno)

order by hiredate

4-

select ename,sal,deptno

from emp e

where sal>(select avg(sal) from emp where deptno=e.deptno)

order by deptno;

5-

select d.deptno,dname

from dept d,emp e

where d.deptno = e.deptno(+)

and e.deptno is null;

6-

select deptno,sum(sal*12) compention

from emp

group by deptno

having sum(sal*12) = (select max(sum(sal*12)) from emp group by deptno)

7-

SELECT ename, SAL

FROM ( SELECT ename,SAL FROM EMP ORDER BY SAL DESC ) WHERE rownum <=3

8-

select to_char(hiredate,'yyyy') ,count(*)

from emp

group by to_char(hiredate,'yyyy')

having count(*) = (select max(count(*)) from emp group by to_char(hiredate,'yyyy'))

#3

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

1

select job,ename,substr(sal,1,1)||' '||to_char(substr(sal,2,6),'000.000') as sal

from emp

where sal in

(select max(sal)

from emp

group by job)

order by sal desc

/

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

2

select job,ename,sal

from emp

where sal in

(select min(sal)

from emp

group by job)

order by sal

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

3

select deptno,ename,hiredate

from emp

where hiredate in

(select max(hiredate)

from emp

group by deptno

)

order by hiredate

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

4

select ename,sal,deptno

from emp

where sal>any

(select avg(sal)

from emp

group by deptno

)

order by deptno

/

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

5

select ename,sal,deptno,avg(sal)

from emp

having sal > avg(sal)

order by deotno

----------------------------------------------------------------------6

select distinct d.dname,d.deptno

from emp e,dept d

where d.deptno not in (select deptno

from emp )

/

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

7

select ename,sal

from (select ename,sal from emp order by sal desc)

where rownum<4

/

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

8

select ee "TOTAL",cc "DATE"

from

(select count(empno)ee,to_char(hiredate,'YYYY')cc

from emp

group by to_char(hiredate,'YYYY')

ORDER BY EE DESC

)

WHERE ROWNUM<2

/

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

9

select e.ename,e.sal,e.deptno,avg(d.sal)

from emp e,emp d

where e.deptno=d.deptno

and e.sal>any

(select avg(sal)

from emp

group by deptno

)

group by e.ename,e.sal,e.deptno

order by deptno

/

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

10

select '** '||ename "ENAME",hiredate

from (select ename,hiredate from emp order by hiredate desc)

where rownum<2

/

أخوكم محمد الشنقيطي

#4

جيد يا جماعة

و ان كنت غير سعيد تماما بالأجابات

خاصة السئوال الثامن - انا اعتبر هذا السؤال هو الأصعب بين الأسئلة -

المشكلة يا جماعة انه لا يمن استخدام order by

الا فى الأستعلام الخارجى فقط (لا ادرى ان كان ذلك قد تغير بعد الاصدارة 8 من اوراكل ) فان كان الأمر قد تغير فارجوا اعلامى لانى اعتبر نفسى "موضة قديمة " نوعا ما

كما ارجوا من الأخوة تجربة الاجابة و التأكد من انها تخرج نفس النتائج التى وضعت مع الأسئلة

إن شاء الله الإجابات الصحيحة سارسلها قبل العيد و أرجوا من الجميع زيادة المحاولة والتجربة وانتظروا المزيد قريبا

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

#5

يمكن إستخدام order by داخليا

ولكن على ما أظن إبتداء من oracle 8.6 و الله الموفق

تحياتي

أسامة

#6

شكرا لكل المشاركين و اتمنى ان تعم الفائدة

-- الثلاثة اسئلة الأولى لها نفس الفكرة

-- وتعتمد على استخدام in مع subquery

--1 ------------------------------

select job,ename,sal

from emp

where (job ,sal )in (select job,max(sal)

from emp

group by job)

order by sal desc;

-- 2 ------------------------------

select job,ename,sal

from emp

where (job ,sal )in (select job,min(sal)

from emp

group by job)

order by sal asc;

-- 3 ------------------------------

select deptno, ENAME,hiredate

from emp

where (deptno ,hiredate )in (select deptno,max(HIREDATE)

from emp

group by DEPTNO)

order by HIREDATE asc;

-- 4 ------------------------------

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

--هذا النوع يسمى

--corelated subquery

--عادة نجد فى السؤال كلمة their

-- و ينفذ هكذا

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

select ENAME,SAL ,DEPTNO

from emp e1

where (sal)> (select avg(sal)

from emp e2

where e2.DEPTNO=e1.DEPTNO)

order by deptno asc;

--5 ------------------------------

--

--هذا نوع شائع أخر وله أكثر من حل

-- الطريقة الأولى استخدام set operations "minus"

-- الطريقة الثانية استخدام subquery

-- الطريقة الأولى استخدام outer join

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

select DEPTNO,DNAME

from DEPT

minus

select emp.DEPTNO,DNAME

from emp,dept

where emp.DEPTNO = dept.DEPTNO

or

select DEPTNO,DNAME

from DEPT d

where not exists (

select emp. DEPTNO

from emp

where emp.DEPTNO = d.DEPTNO)

or

select D.DEPTNO,D.DNAME

from DEPT D , emp E

where E.DEPTNO(+) = D.DEPTNO

and E.DEPTNO is null

--6------------------------------------------------------------

-- الحل يعتمد على having

select d.DEPTNO,sum(sal*12+nvl(comm,0))

from dept d ,emp e

where d.deptno =e.deptno

group by d.DEPTNO

having sum(sal*12+nvl(comm,0)) in

(select max(sum(sal*12+nvl(comm,0)))

from emp

group by deptno)

--7------------------------------------------------------------

--هناك طريقتين للحل

-- الأولى معقدة نوعا ما و لكنها تعمل لجميع اصدارات اوراكل

-- وتعتمد على منطوق الأستعلام

-- ابحث على الموظف الذى لو بحثت عن عدد كل من راتبه يزيد عنه

-- لكان الناتج أقل من 3

-------

select ename , sal

from emp e1

where(select count (*)

from emp e2

where e1.sal

<3

-- الحل الثانى لم أكن أعلم ان اوراكل تسمح به الا من ردود الزملاء

--ويعتمد على استخدام order by مع rownum

-- فى استعلام داخلىو هى غير مدعومة فى اللأصدارات 8 وما قبلها

-- اضطررت لتثبيت اوراكل

-- 8i كى اتمكن من استخامه !!

-------

SELECT ename, SAL

FROM ( SELECT ename,SAL FROM EMP ORDER BY SAL DESC ) WHERE rownum <=3

--8------------------------------------------------------------

-- يفضل استعمال count('any string ')

-- بدلا من count (*)

-- لانها أسرع فى الأداء

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

select to_char(hiredate,'YYYY'),count ('nothing')

from emp

group by to_char(hiredate,'YYYY')

having count ('nothing') in (select max (count ('nothing') )

from emp

group by to_char(hiredate,'YYYY')

)

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

-- كانت اجابة الأخ محمد الشنقيطي

-- مبتكرة لانه تغلب على مشكلة عدم امكانية وضع

-- where rownum

--فى اى استعلام به جملة

-- group by

--وذلك بأضافتها الى استعلام حارجى جديد

select ee "TOTAL",cc "DATE" -- استعلام جديد

from

(select count(empno)ee,to_char(hiredate,'YYYY')cc

from emp

group by to_char(hiredate,'YYYY')

ORDER BY EE DESC

)

WHERE ROWNUM<2 -- الان يمكن وضع هذه الجملة

--بهذه الفكرة يمكن وضع اجابة حديدة للسؤال السادس

select * from (

select deptno,sum(sal*12+nvl(comm,0))

from emp

group by deptno

order by sum(sal*12+nvl(comm,0)) desc )

where rownum<2

--9------------------------------------------------------------

-- هذا سؤال بالغ الكلكعه

-- المطلوب فيه وضع avg() group function

--مع مجموعة اخرى من الأعمد التى لا تخضع لنفس ال group by

-- لاحظ ما يأتى

-- استخدمنا الجدول مرتين لعلاج المشكلة السابقة

-- جميع الأعمدة التى هى ليست group function (avg , sum , count max ,..)

-- لابد من ظهورها فى جملة group by

select E1.EMPNO, E1.DEPTNO , E1.ENAME , E1.SAL , AVG(E2.SAL)

from EMP E1 , EMP E2

where E1.SAL >

(select AVG(E3.SAL)

from EMP E3

where E3.DEPTNO=E1.DEPTNO

group by E3.DEPTNO)

and E2.DEPTNO=E1.DEPTNO

group by E1.EMPNO, E1.DEPTNO , E1.ENAME , E1.SAL

order by deptno

--10-------------------------------------------------------------

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

-- انه ابط كثيرا من سابقيه

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

select '' , ename , hiredate

from emp

where hiredate < any (select max(hiredate ) from emp)

union

select '*' , ename , hiredate

from emp

where hiredate in (select max(hiredate ) from emp)

#7

[gl]

والان اخوانى

عليكم بالجزء الثانى من الأسئلة

هذه المرة ان اضع الحلول كاملة ولكن على الجميع المحاولة ووضع مالديهم مهما كان بسيطا

و معا سوف نستخدم ما خرجنا به من الجزء الثانى لعمل مشروع رائع و مفيد بإذن الله

[/gl]

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

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…