جميع اوامر sql مع الشرح
نقدم لكم اليوم تعلم sql من الصفر حتى الاحتراف بشكل مبسط وبأسلوب مختصر وسلس، تحتوي هذه الدورة على جميع أوامر sql. البداية لا بد ان نعلم ان قاعدة البيانات (Database) هي عبارة عن ملف كبير يعمل على ترتيب المعلومات المخزنة بشكل منظم بحيث نستطيع استرجاع المعلومات المخزنة مع إمكانية التعديل عليها في أي وقت، اذا فان لغة sql تعتبر نظام لإدارة قواعد البيانات الذي سوف يعتمد على التعامل معه على هذه اللغة وهي تعتبر من لغة الاستعلامات البنائية.
ان هذه التدوينة خاصة بتعلم اساسيات قواعد البيانات sql عبر شرح متضمن فيه جميع الأمثلة التي سوف تحتاجها من اجل اتقان تعلم لغة ال اس كيو ال وسوف تجد جميع هذه الأوامر مرتبة لسهولة الحفظ والتعلم.
SQL SIMPLE TUTORIAL
--:
Types of SQL statement
DML (Data
manipulation language)
.Select -
.Insert -
.Update
-
.Delete -
.Merge -
DML (Data definition
language)
.Create
.Alter
.Drop
.Rename
.Truncate
.Comment
DCL ( Data control
language)
.Grant
.Revoke
TC
(Transaction control)
.Commit
.Rollback
.Save point
-- إرجاع البيانات كاملة من جدول الأقسام
Select * from
department;
-- إرجاع البيانات كاملة من جدول الموظفين
Select * from employees;
-- إرجاع حقول محددة من جدول الموظفين
Select employee_id,
first_name from employees ;
-- إرجاع حقل الراتب مع عمليات حسابية
Select salary, sala
ry+100, salary*2, salary/2, salary+(salary*0.5) from employees;
-- إرجاع حقول مع وضع أسماء بديلة للحقول
select first_name as FN,
last_name Ln, salary "SalArY" from employees ;
-- ربط حقلين أو أكثر و إرجاع البيانات
select first_name,
last_name, first_name ||' '|| last_name "Full Name" from employees;
-- ربط بين عدة حقول وإسناد نص للعرض بداخل البيانات
select first_name ||'
'|| last_name ||' را تبة هو: '|| salary "Emp
info" from employees;
-- ربط حقول مع وضع علامات بداخل النص بعد حرف
select first_name ||'
'|| last_name ||q'[ Sa'l'Y ]'|| salary "Emp info" from employees;
-- إرجاع حقل رقم الاقسام بدون تكرار
select distinct
department_id from employees;
-- إرجاع حقلين رقم الأقسام رقم الوظيفة بدون تكرار
select distinct
department_id,job_id from employees
-- إرجاع بيانات من الجدول مع تحديد رقم موظف محدد
select
first_name,last_name from employees where department_id = 90 ;
-- إرجاع بيانات من الجدول مع تحديد اسم موظف محدد
select
first_name,last_name from employees where first_name = 'Steven';
-- إرجاع بيانات الراتب مع عمليات رياضية
select first_name,salary
from employees where salary > 100;
-- إرجاع بيانات الراتب مع عمليات رياضية
select first_name,salary
from employees where salary = 2500;
-- ارجاع بيانات الراتب مع عمليات رياضية
select first_name,salary
from employees where salary < 1500;
-- إرجاع بيانات الراتب مع عمليات رياضية
select first_name,salary
from employees where salary != 2600 ;
-- ارجاع بيانات الراتب مع عمليات رياضية
select first_name,salary
from employees where salary <> 2600;
-- إرجاع بيانات الراتب مع عمليات رياضية
select first_name,salary
from employees where salary >= 10000;
-- ارجاع بيانات الراتب مع عمليات رياضية
select first_name,salary
from employees where salary <= 4000;
-- ارجاع بيانات الراتب بين قيمتين
select first_name,salary
from employees where salary between 1000 and 10000;
-- إرجاع بيانات اسم الموظف بين قيمتين
select first_name,salary
from employees where first_name between 'A' and 'D' ;
-- ارجاع بيانات لأكثر من قيمة
select first_name,salary
from employees where salary IN (10000,15000,13000);
-- ارجاع بيانات الراتب لا تساوي القيم المدخلة
select first_name,salary
from employees where salary NOT IN (10000,15000,13000);
-- ارجاع بيانات لاكثر من قيمة
select
first_name,last_name from employees where first_name IN
('Michael','Peter','Harrison');
-- ارجاع بيانات لاسم الموظف التي تبدأ اسمائهم بحرف معين
select first_name from
employees where first_name like 'S%';
-- ارجاع بيانات لاسم الموظف التي تنتهي اسمائهم بحرف معين
select first_name from
employees where first_name like '%l';
-- ارجاع البيانات لاسم الموظف التي يبدأ من الحرف الثاني بحرف
معينselect first_name from employees where first_name like '_a%';
-- ارجاع بيانات لاسم الموظف التي يبدأ من الحرف الثالث بحرف معين
select first_name from
employees where first_name like '__a';
-- ارجاع بيانات لاسم الموظف بتحديد 3 احرف من الاسم وكذلك تحديد
الحرف الوسط والاستغناء عن الباقي
select first_name from
employees where first_name like '_a_';
-- ارجاع بيانات الوظائف بتحديد _ بعد اسم الوظيفة سيتم ارجاع البيانات كاملة سواء كانت بــ _ او لا
select job_id from jobs
where job_id like 'AC
-- ارجاع بيانات الوظائف التي لديها (_) فقط
select job_id from jobs
where job_id like 'AC/_%' escape
-- ارجاع اسم الموظف والذي اسمة لا يبدأ بحرف الــ اس
select first_name from
employees where first_name not like 'S%';
-- إرجاع بيانات موظف بحسب تاريخ معين |
DD-MON-YYYY القيمة الافتراضية لصيغة التواريخ في
الجداول هي
select * from employees
where hire_date = '03-FEB-2008';
-- ارجاع بيانات الموظفين ومن هم الموظفين الذي ليس لهم نسبة
مئوية
select * from employees
where commission_pct is null;
-- ارجاع بيانات الموظفين ومن هم الموظفين الذي لهم نسبة مئوية
select * from employees
where commission_pct is not null;
-- ارجاع اسم الموظف وراتبة واسمة يبدأ بحرف الــ دي وراتبة 2600
select first_name,salary
from employees where salary = 2600 and first_name like 'D';
-- ارجاع اسم الموظف واسم الوظيفة الذي يبدأ بحرفي الــ إس اتش او
الراتب يساوي 2000
select
first_name,job_id,salary from employees where job_id like 'SH_%' or salary =
2000;
-- ارجاع اسم الموظف وراتبة ووظيفتة وراتبة اكبر من 10000 او اسمة
يبدأ بحرف الــ إس ووظيفتة يبدأ بحرف الــ أي
select
first_name,salary,job_id from employees where salary > 10000 or (first_name
like 'S%' and job_id like 'A%')
-- ارجاع اسم الموظف وراتبة ووظيفتة واسمة يبدأ بحرف الــ أس او وظيفتة يبدأ بحرف الــ أي وراتبة اكبر
من 20000
select
first_name,salary,job_id from employees where (first_name like 'S%' or job_id
like 'A%') and salary > 20000
-- ارجاع اسم الموظف بالترتيب التصاعدي
select first_name from
employees order by first_name asc;
-- ارجاع اسم الموظف بالترتيب التنازلي
select first_name from
employees order by first_name desc;
-- ارجاع اسم الموظف مع العمولة وترتيب العمولة بحسب البيانات
الفارغة
select
first_name,commission_pct from employees order by commission_pct nulls first;
-- ارجاع اسم الموظف بالترتيب التنازلي بأسم مستعار لاسم الموظف
select first_name N from
employees order by N;
-- ارجاع اسم الموظف وراتبه واضافة الى راتبة ب 500 وترتيب بحسب
الزيادة في الراتب
select first_name NAME ,
salary SAL , salary+500 ADDITIONAL from employees order by ADDITIONAL
-- ارجاع اسم الموظف وترتيبة بحسب رقم الادارة
select first_name from
employees order by department_id;
-- ارجاع اسم الموظف وراتبه ورقم الادارة وترتيب البيانات بحسب
رقم الادارة واسم الموظف
select
first_name,salary,department_id from employees order by department_id,first_name;
-- ارجاع اسم الموظف وراتبه ورقم الادارة وترتيب البيانات بحسب
رقم الادارة واسم الموظف
select
first_name,salary,department_id from employees order by department_id asc ,
first_name desc;
-- ارجاع اسم الموظف وراتبه وترتيب البيانات برقم 2 ويعني حقل
الراتب في الاستعلام
select first_name,salary
from employees order by 2;
-- ارجاع اسم الموظف وراتبه وترتيب البيانات برقم 2 ويعني حقل
الراتب ورقم 1 يعني اسم الموظف في الاستعلام
select first_name,salary
from employees order by 2 desc , 1 asc;
-- ارجاع اول خمسة موظفين فقط
select first_name from
employees order by first_name fetch first 5 rows only;
-- ارجاع 50% من اسماء الموظفين
select first_name from
employees order by first_name fetch first 50 percent rows only;
-- ارجاع اسماء الموظفين بعد اول 5 اسماء
select first_name from
employees order by first_name offset 5 rows fetch next 5 rows only;
-- ارجاع 50 % من اسماء الموظفين بعد اول 5 اسماء
select first_name from
employees order by first_name offset 5 rows fetch next 50 percent rows only;
-- ارجاع اسماء ورواتب اعلى 2
موظفين
select first_name ,
salary from employees order by salary desc fetch first 2 rows with ties;
-- ارجاع اسم الموظف وراتبه بحسب المدخل الذي يدخلة المستخدم في
المتغير &empno
select first_name ,
salary from employees where employee_id = &empno;
-- ارجاع بيانات الموظف بحسب المدخلات في المتغيرين رقم القسم
واسم الوظيفة الذي يدخلة المتسخدم
select * from employees
where department_id = &deptid and job_id like '&jobid
-- ارجاع حقلين يحددهم المستخدم وبحث بالحقل الاول بقيمة كذلك
يقوم بادخالها المستخدم وترتيبها بحسب الحقل الثاني تنازلي
select
&fname,&sal from employees where &fname like '&a%' order by 2
desc;
RUN IN SQL*PLUS OR SQL DEVELOPER
-- لتعريف متغير لرقم الموظف وينتهي هذا المتغير عند انتهاء
الجلسة
DEFINE emp_no=101;
-- ارجاع اسم المستخدم بحسب رقمة الذي تم تعريفة مسبقاً emp_no
select first_name from
employees where employee_id = &emp_no
-- لتغيير الرسالة التي تظهر للمستخدم للمتغير fname
accept fname prompt
'Enter First Name'
-- ارجاع اسم الموظف بحسم المدخل
select first_name from
employees where first_name like '&fname%';
-- ارجاع اسم الموظف ومتغير يقوم بادخالة المستخدم بشكل دائم مع
ترتيب تنازلي للحقل الذي قام بادخالة مسبقاً
select first_name ,
&&sal from employees order by &sal desc
-- لعرض الاستعلام قبل التنفيذ وبعد التنفيذ
set verify on;
-- ارجاع اسم المستخدم وراتبة والمستخدم يقوم بادخال رقم الموظف
في المتغير
select first_name,salary
from employees where employee_id = &empno;
6 Single row function
1--- character دوال النصوص
--
lower(exp) دالة تعيد الحروف الذي في النص الى صغير
--
upper(exp) دالة تعيد الحروف الذي في النص الى كبير
--
initcap(exp) دالة تعيد الحرف الاول في النص الى
كبير
--
concat(exp1,exp2) دالة دمج النصوص
--
substr(exp1,exp1 ... expn) دالة استقطاع من النص
--
length(exp) دالة لحساب طول النص
--
instr(exp1,exp2 ... expn) دالة لتحديد موقع الحرف
او الرقم
--
lpad(exp1,exp2,exp3) دالة لاضافة نص من الجهة
اليسرى
--
rpad(exp1,exp2,exp3) دالة لاضافة نص من الجهة
اليمنى
--
trim(exp1 from exp2) دالة قص جزء من النص
--
replace(exp1,exp2,exp3) دالة لتبديل نص بنص اخر
2--- Numbers دالة الارقام
--
round(exp1 'or' exp2) دالة تقريب الرقم الى اقرب
رقم صحيح
--
trunc(exp1 'or' exp2) دالة تقوم بقص الرقم ووضع
بدلة صفر
--
mod(exp1,exp2) دالة ارجاع باقي القسمة
3--- General دوال عامة
--
nvl(exp1,exp2) دالة تحويل الحقل الذي يحتوي على نل
الى قيمة
--
nvl2(exp1,exp2,exp3) دالة تحويل الحقل الذي يحتوي
على نل الى قيمة في حالة اذا رجع لنا القيمة نوت نل بيتحقق الشرط الاول وفي حالة
رجع لنا قيمة نل سيتحقق الشرط الثاني
--
nullif(exp1,exp2) دالة لفحص اذا كانت القيمتين نل
سيرجع قيمة نل واذا ماكانت متساوية سيرجع القيمة الاولى
--
coalese(exp1,exp2 ... expn) دالة لفحص القيم التي
هي نل حتى يجد قيمة نوت نل
--
decode() دالة شرطية
--
CASE exp1 WHEM compertion_exp1 THEN return_exp1
exp2
WHEM compertion_exp2 THEN return_exp2
expn
WHEM compertion_expn THEN return_expn
ELSE
exp
END دالة شرطية
4--- Convertion دوال التحويل
--
to_date(exp1,format) دالة لتحويل صيغة التاريخ
--
to_char(exp1,exp2) دالة لتحويل حقل الرقم لنص
--
to_number(exp1,exp2) دالة لتحويل حقل الى رقم
5--- Date دوال التاريخ
--
month_between(exp1,exp2) دالة لفحص عدد الاشهر بين
تاريخين
--
add_month(exp1,exp2) دالة اضافة شهر
--
next_day(exp1,exp2) دالة لمعرفة التاريخ ليوم معين
--
last_day(exp1) دالة لمعرفة اخر يوم في الشهر
--
round(exp1) دالة تقريب التاريخ
--
trunc(exp1) دالة قص التاريخ
6--- Multi
Functions دوال الجمع
--
avg([DISTINCT] expn) دالة القيمة الحسابية
المتوسطة
--
count(exp1) دالة لعد او احصاء
--
max([DISTINCT] exp1) دالة اعلى قيمة
--
min([DISTINCT] exp1) دالة اقل قيمة
--
sum([DISTINCT] exp1) دالة الجمع
--
listagg(exp1) دالة تجميع قيم وترتيبها
--
stddev([DISTINCT] expn) دالة الانحراف المعياري
--
variance([DISTINCT] expn) دالة التباين
*/
select upper(first_name)
, lower(last_name) , initcap(job_id) from employees; -- ارجاع الاسم الاول للمستخدم بالحروف الكبيرة والاسم الاخير بالحروف
الصغيرة واسم القسم باول حرف كبير
select upper(first_name)
from employees where lower(first_name) like 'a%'; -- ارجاع الاسم الاول بحروف كبيرة والبحث عن الاسم الاول بحرف الأي بشكل صغير
select first_name from
employees where upper(first_name) = upper('adAm'); -- ارجاع الاسم الاول مع تحويل بيانات الاسم الاول الى حروف كبيرة والبحث عن
اسم موظف وتحويلة لحروف كبيرة
select concat(first_name,last_name)
Fullname from employees; -- ارجاع الاسم الاول
والاسم الاخير ودمجها بالدالة ولكنا يمكن ان ندمج اكثر من حقلين عكس
(| ' ' |) الدمج العادي يقبل اكثر من دمج
ولدية مرونة افضل
select first_name ,
substr(first_name,2) from employees; -- ارجاع
الاسم الاول مع استقطاع اول حرفين من الاسم
select first_name ,
substr(first_name,2,4) from employees; --
ارجاع الاسم الاول مع استقطاع اول حرفين والاسم يكون من اربعة حروف
فقط
select first_name ,
substr(first_name,-2) from employees;
-- ارجاع الاسم الاول مع استقطاع جميع الحروف ويبقى اخر حرفين فقط
select first_name ,
length(first_name) from employees;
-- ارجاع الاسم الاول مع حساب طول النص
select first_name ,
instr(first_name,'e'), instr(first_name,'e',2), instr(first_name,'e',3,2) from
employees; -- ارجاع الاسم الاول وتحديد موقع حرف
معين
select salary ,
lpad(salary,7,'#') from employees;
-- ارجاع الراتب ونقوم باستخدام الدالة وادراج رمز # بــ 7 رموز
من الجهة اليسرى
select salary ,
rpad(salary,7,'#') from employees;
-- ارجاع الراتب ونقوم باستخدام الدالة وادراج رمز # بــ 7 رموز من الجهة اليمنى
select first_name ,
replace(first_name,'a','*') from employees;
-- ارجاع اسم الموظف وتبديل حرف الأي برمز * للاسم الاول
select first_name ,
replace(first_name,'av','*') from employees;
-- ارجاع اسم الموظف وتبديل حرفين الأي والفي برمز * للاسم الاول
select trim(' ' from '
Mohammed ') A from dual;
-- ارجاع نص وحذف المسافات من جميع الجهات
select trim(leading ' '
from ' Mohammed ') A from dual;
-- ارجاع نص وحذف المسافة من البداية فقط
select trim(trailing ' '
from ' Mohammed ') A from dual;
-- ارجاع نص وحذف المسافة من النهاية فقط
select trim(both ' '
from ' Mohammed ') A from dual;
-- ارجاع نص وحذف المسافات من جميع الجهات
select trim('M' from
'Mohammed') A from dual;
-- ارجاع نص وحذف الحرف إم
select trim(' Mohammed
ali ') A from dual;
-- ارجاع نص مع حذف المسافات افتراضي دون الحاجة تحديد المسافة
بداخل الاستعلام
select round(95.55) from
dual;
-- ارجاع رقم وتقريبة الى رقم صحيح في حالة اكبر او يساوي خمسة
select round(95.45) from
dual;
-- ارجاع رقم وتقريبة الى رقم صحيح في حالة اكبر او يساوي خمسة
اذا كان الرقم العشري اصغرمن 5 فسوف يرجع الرقم دون تقريب الرقم العشري
select round(95.45,1)
from dual;
-- ارجاع رقم وتحديد كم عدد الارقام العشرية للظهور
select round(95.5514,3)
from dual;
-- ارجاع رقم وتحديد كم عدد الارقام العشرية للظهور
select round(95.55,-1)
from dual;
-- ارجاع رقم وتحديد كم عدد الارقام العشرية للظهور
select round(94.542,-1)
from dual;
-- ارجاع رقم وتحديد كم عدد الارقام العشرية للظهور
select round(95.55,-2)
from dual;
-- ارجاع رقم وتحديد كم عدد الارقام العشرية للظهور
select round(545.55,-3)
from dual;
-- ارجاع رقم وتحديد كم عدد الارقام العشرية للظهور
select round(495.55,-3)
from dual;
-- ارجاع رقم وتحديد كم عدد الارقام العشرية للظهور
select round(1295.55,-2)
from dual; -- ارجاع رقم وتحديد كم عدد الارقام
العشرية للظهور
select trunc(125.1566)
from dual; -- ارجاع رقم وقص العلامة العشرية
select trunc(125.1566,2)
from dual; -- ارجاع رقم واظهار رقمين بعد العلامة
العشرية
select trunc(125.1566,
-2) from dual; -- ارجاع رقم وتغيير رقمين الى
أصفار من قبل النقطة العشرية
select mod(15,2) from
dual; -- ارجاع باقي القسمة للرقم 15
select first_name ,
hire_date from employees; -- ارجاع اسم المستخدم
وتاريخ تعيينة
select sysdate from
dual; -- ارجاع تاريخ ووقت السيرفر الان
select sysdate , sysdate
+ 1 from dual; -- ارجاع تاريخ ووقت السيرفر الان
مع زيادة يوم في التاريخ
select sysdate , sysdate
- 5 from dual; -- ارجاع التاريخ والوقت وتنقيص من
التاريخ 5 ايام
select sysdate + 5/24
from dual; -- ارجاع تاريخ ووقت السيرفر الان مع
زيادة 5 ساعات
select first_name ,
hire_date , round(sysdate - hire_date) days from employees; -- ارجاع اسم الموظف وتاريخ توظيفة واحتساب تاريخ اليوم ناقص
تاريخ توظيفة يظهر لنا اجمالي ايام التوظيف الى الان
select first_name ,
hire_date , (sysdate-hire_date)/7 weeks_work from employees; -- ارجاع اسم الموظف وتاريخ توظيفة واحتساب عدد اسابيع دوامة لحد
الان
select first_name ,
round(months_between(sysdate , hire_date)) from employees; -- حساب الاشهر بين تاريخين
select first_name ,
hire_date , add_months(hire_date , 4) from employees; -- ارجاع اسم الموظف وتاريخ توظيفة واضافة 4 اشهر لتارخ توظيفة
select first_name ,
hire_date , add_months(hire_date , -4) from employees; -- ارجاع اسم الموظف وتاريخ توظيفة ناقص 4 اشهر لتارخ توظيفة
select sysdate , next_day(sysdate,'MONDAY')
from dual; -- ارجاع التاريخ وتحديد تاريخ يوم
الاثنين المقبل
select next_day(sysdate
, 1) from dual; -- ارجاع تاريخ يوم الاثنين
بالارقام لان رقم 1 هو يوم الاثنين بشكل افتراضي
select last_day(sysdate)
from dual; -- ارجاع اخر تاريخ في الشهر
select round(sysdate ,
'MONTH') from dual; -- ارجاع التاريخ مع تقريب
الشهر
select round(sysdate ,
'YEAR') from dual; -- ارجاع التاريخ مع تقريب
السنة
select trunc(sysdate ,
'MONTH') from dual; -- ارجاع التاريخ مع اقتصاص
الشهر
select trunc(sysdate ,
'YEAR') from dual; -- ارجاع التاريخ مع اقتصاص
السنة
select
substr(upper(first_name),2) from employees; -- ارجاع
اسم الموظف مع قص حرفين وعرض الاسم بالحروف الكبيرة
select
to_char(sysdate,'DD-MM-YYYY') from dual; -- ارجاع
تاريخ السيرفرالان بصيغة معينة
select
to_char(sysdate,'DAY*MON*YYYY') from dual; -- ارجاع
تاريخ السيرفرالان بصيغة معينة
select first_name ,
to_char(hire_date,'DD-MON-YYYY') as hire_date from employees; -- ارجاع اسم الموظف وتاريخ توظيفة بصيغة معينة
select
to_char(sysdate,'DD-MM-YYYY HH:MI AM') from dual; -- ارجاع التاريخ والوقت بصيغة معينة
select
to_char(sysdate,'DAY-MONTH-YEAR HH24:MI:SS') "date" from dual;
-- ارجاع التاريخ والوقت بصيغة معينة
select to_char(sysdate
,'DD " OF " MM') from dual; -- ارجاع
التاريخ بصيغة معينة ودراج نص بداخل التاريخ
select to_char(sysdate
,'ddth "of" MON') from dual; -- ارجاع
التاريخ بصيغة معينة ودراج نص بداخل التاريخ
select to_char(sysdate ,
'DDSP MON YYYY') from dual; -- ارجاع التاريخ
والوقت بصيغة معينة
select first_name ,
hire_date from employees where to_char(hire_date,'YYYY') = '2008'; -- ارجاع اسم الموظف وتاريخ توظيفة مع البحث في التاريخ بصيغة
معينة
select first_name ,
salary , to_char(salary,'99,999') from employees; -- ارجاع اسم الموظف والراتب وتحويل صيغة عرض الراتب بشكل معين
select first_name ,
salary , to_char(salary,'99999.99') from employees; -- ارجاع اسم الموظف والراتب وتحويل صيغة عرض الراتب بشكل معين
select first_name ,
salary , to_char(salary,'99999D99') from employees; -- ارجاع اسم الموظف والراتب وتحويل صيغة عرض الراتب بشكل معين
select first_name ,
salary , to_char(salary,'99999$') from employees; -- ارجاع اسم الموظف والراتب وتحويل صيغة عرض الراتب بشكل معين
select first_name ,
salary , to_char(salary,'L99999') from employees; -- ارجاع اسم الموظف والراتب وتحويل صيغة عرض الراتب بشكل معين للعملة
المحلية
select first_name ,
salary , to_char(salary,'09999') from employees; -- ارجاع اسم الموظف والراتب وتحويل صيغة عرض الراتب بشكل معين واضافة صفر
select first_name ,
salary , to_char(salary,'99G999') from employees; -- ارجاع اسم الموظف والراتب وتحويل صيغة عرض الراتب بشكل معين
select first_name ,
salary , to_char(salary,'99,999') from employees; -- ارجاع اسم الموظف والراتب وتحويل صيغة عرض الراتب بشكل معين
select
to_char(189.53,'99,999') from dual; -- ارجاع رقم
عشري وتم تقريب الرقم العشري الى رقم صحيح تلقائي
select
to_number('1520','9999') from dual; -- ارجاع رقم
وتحويلة من نص الى رقم
select
to_number('1,520','9,999') from dual; -- ارجاع
رقم وتحويلة من نص الى رقم
select
to_number('$1,520','$9,999') from dual; -- ارجاع
رقم وتحويلة من نص الى رقم
select
to_date('10-MAR-1993','DD-MON-YYYY') from dual; -- ارجاع تاريخ معين بالصيغة الافتراضية للسيرفر
select
to_date('10-MAR- 1993','DD-MON-YYYY')
from dual; -- ارجاع تاريخ معين وتقوم اوراكل
بازالة المسافات كاملة تلقائياً
select
to_char(to_date('10-MAR-1993','DD-MON-YYYY'),'yyyy') from dual; -- ارجاع تاريخ معين وتم تحويلة ليظهر الى سنوات فقط
select first_name ,
nvl(COMMISSION_PCT , 0) from employees; -- ارجاع
اسم الموظف والزيادة المئوية وتحويل الصفوف التي لها قيمة نل الى الصفر
select first_name ,
nvl(job_id , 'لا يوجد لدية وظيفة') from employees;
-- ارجاع اسم الموظف واسم الوظيفة وتحويل الصفوف
التي لها قيمة نل الى نص
select first_name ,
nvl(to_char(COMMISSION_PCT),'لا يوجد لة نسبة')
from employees; -- ارجاع اسم الموظف والزيادة
المئوية وتحويل الصفوف التي لها قيمة نل الى نص
select first_name ,
nvl2(commission_pct , commission_pct , 0) from employees; -- رجاع اسم الموظف والزيادة المئوية وتحويل الصفوف التي لها قيمة
نل الى الصفر
select first_name ,
nvl2(commission_pct , 'لدية نسبة' , 'لا يوجد لة نسبة')
income from employees; -- رجاع اسم الموظف
والزيادة المئوية وتحويل الصفوف التي لها قيمة نل الى لا يوجد له نسبة والذي لدية
نسبة يظهر نص لدية نسبة
select first_name ,
last_name , length(first_name) , length(last_name) ,
nullif(length(first_name),length(last_name))
result from employees; -- ارجاع الاسم الاول
والاخير وحساب طول الاسم الاول مع طول الاسم الاخير اذا تساوى الطول يرجع القيمة
نل ماعدا ارجاع القيم الاولى
select first_name ,
commission_pct , manager_id , department_id ,
coalesce(commission_pct,manager_id,department_id)
result from employees; -- ارجاع الاسم الاول
والنسبة المئوية ورقم المدير ورقم القسم ويتم فحص النسبة المئوية اذا كان هناك
قيمة نل يرجع رقم المدير واذا
كان هناك قيمة نل يرجع رقم قسم
select first_name ,
salary , job_id,
case job_id WHEN
'SH_CLERK' THEN 1.15*salary
WHEN
'MK_MAN' THEN 1.18*salary
ELSE
salary
END Result
from employees; -- ارجاع الاسم الاول وراتبة واسم الادارة وتحديد اذا كان
الموظفين في الادارات المحددة اضف الى راتبهم زيادة معينة
select first_name ,
salary , job_id,
case WHEN
job_id='SH_CLERK' THEN 1.15*salary
WHEN
job_id='MK_MAN' THEN 1.18*salary
ELSE
salary
END Result
from employees; -- ارجاع الاسم الاول وراتبة واسم الادارة وتحديد اذا كان
الموظفين في الادارات المحددة اضف الى راتبهم زيادة معينة
select first_name ,
salary , case when salary = 2800 then salary+1000 end new_add_sal
from employees; -- ارجاع اسم الموظف وراتبه ومن هو
راتبة الذي يساوي 2800 قم باضافة 1000 الى راتبة
select first_name ,
salary , case
when salary between 5000
and 15000 then salary - 1000
when salary between 1000
and 4500 then salary + 500
else 0 end subs from
employees;
-- ارجاع اسم الموظف وراتبة ومن هم رواتبهم ما بين 5000 و 15000
يتم خصم 1000 من راتبه ومن هم الموظفين الذي رواتبهم مابين 1000 و 4500 يتم زيادة
500 فوق رواتبهم
select first_name ,
salary ,
DECODE(salary , 2000
,salary + 1000,
2500
,salary + 1000,
2800
,salary + 1000,0) AD from employees; -- ارجاع اسم
الموظف وراتبة ومن هم الموظفين الذي رواتبهم تساوي 2000 و 2500 و 2800 ويقوم
بزيادة لهم ب 1000 فوق رواتبهم
select first_name ,
salary ,
DECODE(salary , 13000,
salary-0.05*salary,0) Subs from employees; -- ارجاع
اسم الموظف وارتبة ومن هو الموظف الذي راتبة 13000 ويتم خصم 5% من راتبة
select max(salary) ,
min(salary) from employees; -- ارجاع اعلى راتب
واقل راتب
select max(first_name) ,
min(first_name) from employees; -- اعلى ترتيب
لاسم الموظف واقل ترتيب لاسم الموظف من ناحية الحروف الهجائية
select max(hire_date) ,
min(hire_date) from employees; -- اعلى تاريخ
توظيف واقل تاريخ توظيف
select sum(salary) ,
avg(salary) from employees; -- ارجاع اجمالي
الرواتب ومجموع كل الرواتب وتقسيمة بعدد الموظفين
select count(*) from
employees; -- ارجاع عدد السجلات في جدول الموظفين
select count(1) from
employees; -- ارجاع عدد السجلات في جدول الموظفين
select
count(commission_pct)from employees; -- ارجاع عدد
السجلات لحقل النسبة المئوية دون حساب القيمة نل
select
count(department_id) from employees; -- ارجاع عدد
السجلات لحقل الاقسام من جدول الموظفين
select count(distinct
department_id) from employees; -- ارجاع عدد
السجلات لحقل الاقسام من جدول الموظفين دون تكرار
select
count(nvl(commission_pct,0)) from employees; -- ارجاع
عدد السجلات لحقل النسب المئوية وحساب القيم الفارغة
select
count(department_id) from employees where department_id = 90; -- ارجاع عدد سجلات لحقل الاقسام وتحديد رقم قسم معين
select
listagg(upper(first_name),' | ') within group (order by first_name) list_emp
from employees where department_id = 30; -- ارجاع
اسماء الموظفين الذ هم في القسم رقم 30 في سطر واحد وترتيبهم بحسب اسم الموظف
تنازلي
select department_id ,
sum(salary) from employees group by department_id; -- ارجاع رقم القسم ومجموع الرواتب لكل قسم
select department_id DD
, sum(salary) from employees group by department_id order by DD; -- ارجاع رقم القسم ومجموع الرواتب لكل قسم
select department_id DD
, sum(salary) from employees where department_id < 50 group by department_id
order by DD; -- ارجاع رقم القسم ومجموع الرواتب
للاقسام التي هي اصغر من 50
select department_id ,
sum(salary) from employees
group by department_id
having sum(salary) > 152225 order by department_id; -- ارجاع رقم القسم ومجموع الرواتب لكل قسم مع تحديد من هم
الاقسام التي رواتبهم اكبر من 152225
select max(sum(salary))
from employees group by department_id; -- ارجاع
اعلى ومجموع الرواتب للاقسام
select
employees.first_name , DEPARTMENTS.DEPARTMENT_NAME from employees , departments
where
employees.DEPARTMENT_ID = departments.DEPARTMENT_ID; -- ارجاع اسم الموظف من جدول الموظفين واسم القسم من جدول الاقسام وفين رقم
القسم الذي في جدول الموظفين يساوي رقم القسم في جدول الاقسام
select emp.first_name ,
dept.department_name , loc.city from employees emp ,
departments dept ,
locations loc where
emp.DEPARTMENT_ID =
dept.DEPARTMENT_ID and loc.LOCATION_ID = dept.LOCATION_ID order by
emp.EMPLOYEE_ID; -- ارجاع اسم الموظف واسم القسم
واسم المدينة من الجداول الموظفين والاقسام والمدن
select * from job_grade
order by grades; -- ارجاع كل السجلات في جدول
الدرجة الوظيفية
select e.EMPLOYEE_ID,
e.first_name , e.salary , g.grades from employees e ,
job_grade g where
e.salary between g.LOWSAL and g.HIGHTSAL; -- ارجاع
اسم الموظف وراتبة والبحث في جدول الدرجة الوظيفية بحسب راتبة
select
employees.first_name , DEPARTMENTS.DEPARTMENT_NAME from employees , departments
where
employees.DEPARTMENT_ID = departments.DEPARTMENT_ID(+); -- ارجاع اسم الموظف من جدول الموظفين واسم القسم من جدول الاقسام
وفين رقم القسم الذي في جدول الموظفين يساوي رقم القسم في جدول الاقسام والموظف
الذي لا ينتمي لأي قسم || Outer Join
select
employees.first_name , DEPARTMENTS.DEPARTMENT_NAME from employees , departments
where
employees.DEPARTMENT_ID(+) = departments.DEPARTMENT_ID; -- ارجاع اسم الموظف من جدول الموظفين واسم القسم من جدول الاقسام
وفين رقم القسم الذي في جدول الموظفين يساوي رقم القسم في جدول الاقسام والاقسام
التي لا يتنتمي لاي موظف || Outer Join
select w.employee_id ,
w.first_name , w.manager_id , e.first_name
from employees w ,
employees e where w.manager_id = e.employee_id(+) order by w.employee_id;
-- ارجاع رقم واسم الموظف ورقم واسم المسؤول عن
الموظف ومن هة الموظف الذي ليس لدية مسؤول || Outer Join
select emp.employee_id ,
emp.first_name , dept.department_id , dept.department_name , loc.location_id ,
loc.city
from employees emp ,
departments dept , locations loc where
emp.department_id =
dept.department_id(+)
and
dept.LOCATION_ID =
loc.LOCATION_ID(+); -- ارجاع رقم الموظف واسم
الموظف ورقم واسم القسم ورقم واسم المدينة ومن هو الموظف الذي ليس لدية بيانات في
الجداول || Outer Join
select emp.first_name ,
dept.department_name from employees emp cross join departments dept; -- ارجاع اسم الموظف واسم القسم مع تكرار البيانات ||
New Syntax for table join 1999
select department_id ,
department_name , city , location_id from departments natural join locations;
-- ارجاع رقم القسم اسم القسم المدينة رقم المدينة
من جدولين || New Syntax for table join 1999
select e.first_name ,
d.department_name from employees e join departments d using(department_id);
-- ارجاع اسم الموظف واسم الاقسام من جدولين
الموظفين والاقسام || New Syntax for table join 1999
select e.first_name ,
d.department_name from employees e
join departments d on
(e.DEPARTMENT_ID = d.DEPARTMENT_ID); -- ارجاع اسم
الموظف واسم الاقسام من جدولين الموظفين والاقسام || New Syntax
for table join 1999 يعتبر من اهم الاستخدامات في
الاستعلامات عن اكثر من جدول
select e.first_name ,
d.department_name , l.city from employees e join departments d
on d.DEPARTMENT_ID =
e.DEPARTMENT_ID join locations l on d.LOCATION_ID = l.LOCATION_ID; -- ارجاع اسم الموظف واسم الموظف واسم المدينة من 3 جداول ||
New Syntax for table join 1999
select e.first_name ,
d.department_name , l.city from employees e left outer join departments d
on d.DEPARTMENT_ID =
e.DEPARTMENT_ID left outer join locations l on d.LOCATION_ID = l.LOCATION_ID;
-- ارجاع اسم الموظف واسم الموظف واسم المدينة من 3
جداول وراجاع الموظف الذي ليس لدية بيانات || New Syntax
for table join 1999
select e.first_name ,
d.department_name
from employees e left
outer join departments d on(e.DEPARTMENT_ID = d.DEPARTMENT_ID); -- ارجاع اسم الموظف واسم القسم وارجاع الموظف الذي لا ينتمي لاي
قسم || New Syntax for table join 1999
select e.first_name ,
d.department_name
from employees e right
outer join departments d on(e.DEPARTMENT_ID = d.DEPARTMENT_ID); -- ارجاع اسم الموظف واسم القسم وارجاع الاقسام التي لا تنتمي لاي
موظف || New Syntax for table join 1999
select e.first_name ,
d.department_name
from employees e full
outer join departments d on(e.DEPARTMENT_ID = d.DEPARTMENT_ID); -- ارجاع اسم الموظف واسم القسم وارجاع الموظف والاقسام التي لا
تنتمي لاي منهم || New Syntax for table join 1999
/* الاستعلامات المتداخلة
main query = outer query
-- same meaning
sub query = inner query
-- same meaning
top in = using groups
function like min , max , round ....
*/
select first_name ,
salary from employees where
salary > (select
salary from employees where first_name = 'Hermann'); -- ارجاع اسم الموظف وراتبة ومن هم الموظفين الذين رواتبهم اكبر
من الموظف هارمن وترجع عمود واحد فقط وتستخدم الاشارات التالية ||
- | + | > | < | >= | <= | <>
select first_name ,
salary , job_id from employees where job_id =
(select job_id from
employees where first_name = 'Girard') and
salary < (select
salary from employees where first_name = 'Girard'); -- ارجاع اسم الموظف وراتبة والمسمى الوظفي وماهو المسمى الوظيفي للموظف
جيرارد ومن هم الموظفين الذين رواتبهم اقل من الموظف جيرارد بنفس قسمة
select first_name ,
salary , job_id from employees where salary = (select min(salary) from
employees); -- ارجاع اسم الموظف وراتبة والمسمى
الوظيفي واقل راتب من بين الموظفين
select * from employees
where salary = (select max(salary) from employees); -- ارجاع جميع بيانات الموظف ومن هو الموظف الذي لدية اعلى راتب
select department_id ,
count(employee_id) from employees group by department_id
having
count(employee_id) > (select count(*) from employees where department_id =
90); -- ارجاع رقم القسم ومجموع عدد الموظفين وماهي
اجمالي عدد الموظفين الذي اكبر من الادارة 90
select * from employees
where department_id in (select department_id from employees where department_id
= 90); -- ارجاع جميع بيانات الموظف ومن هم
الموظفين الذي ينتمو للادارة 90
select * from employees
where department_id in (30,40); -- ارجاع جميع
بيانات الموظف ومن هم الموظفين الذي ينتمو للقسمين 30 و 40
select * from employees
where salary >= any (select salary from employees where department_id = 90);
-- ارجاع جميع بيانات الموظف ومن هم الموظفين الذي
رواتبهم اعلى رواتب او تساوي بداخل القسم 90
-- (17000 >= 24000)
or (17000 >= 24000) or (24000 >= 24000)
select * from employees
where salary >= all (select salary from employees where department_id = 90);
-- ارجاع جميع بيانات الموظف ومن هم الموظفين الذي
رواتبهم اعلى رواتب و تساوي بداخل القسم 90
-- (17000 >= 24000)
and (17000 >= 24000) and (24000 >= 24000)
/* معنى any
< any = اقل قيمة من اعلى قيمة
> any = اعلى قيمة من اقل قيمة
= any = بنفس استخدام الــ IN
< all = اقل من اقل قيمة
> all = اعلى من اعلى قيمة
= all = null
*/
select * from employees
where department_id < any (30,40); -- ارجاع
جميع بيانات الموظف ومن هم الموظفين الذي ينتمو الى الادارات التي اقل من 30 و 40
select * from employees
where department_id = any (30,40); -- ارجاع جميع
بيانات الموظف ومن هم الموظفين الذي ينتمو للقسمين 30 و 40
select * from employees
where department_id < all (30,20);
-- ارجاع جميع بيانات الموظف ومن هم الموظفين الذي ينتمو اقل من
رقم القسم 20 و 30
select * from employees
where department_id > all (60,80);
-- ارجاع جميع بيانات الموظف ومن هم الموظفين الذي ينتمو اعلى من
رقم القسم 60 و 80
/* الاستعلامات المدمجة Compound
Queries:
--
Union دمج استعلامين او اكثر وحذف البيانات المكررة
من الاستعلامات
-- Union
all دمج استعلامين او اكثر وادراج البيانات المكررة
من الاستعلامات
--
Minus السجلات الموجودة في الاستعلام الاول وليست
موجودة في الاستعلام الثاني
--
Intersect السجلات المشتركة بين الاستعلامات
-- ملاحظات مهمة
-- يجب ان يكون الجدول الاول مساوي لعدد الحقول للجدول الاول
-- يجب ان يكون انواع بيانات الحقول للجدول الاول مساوي للجدول
الثاني
-- لا يمكن اهمال القيمة نل (الفارغة)
-- تقوم اوراكل بترتيب البيانات تلقائياً ما عدا الــ (union
all)
-- اسماء الحقول سوف تكون من الجدول الاول
-- Dummy
Coloum حقل اضافي يتم اضافتة يدوي مؤقت في حالة لم
تساوي الحقول في الجدولين الذي تم العمل لهم دمج
*/
select * from a union
select * from b; -- ارجاع البيانات كاملة من
الجدول الاول والجدول الثاني وعدم اظهار البيانات المتكررة
select * from a union
all select * from b; -- ارجاع البيانات كاملة من
الجدول الاول والجدول الثاني مع السجلات المتكررة
select * from a
intersect select * from b; -- ارجاع البيانات
كاملة من الجدول الاول والجدول الثاني مع استرجاع البيانات المشتركة في الجدولين
select * from a minus
select * from b; -- ارجاع البيانات كاملة من
الجدول الاول والجدول الثاني مع ارجاع البيانات الموجودة في الجدول الاول وليست في
الجدول الثاني
select employee_id ,
job_id , first_name||' '||last_name "Full Name" from employees
union
select hist.employee_id
, hist.job_id , emp.first_name||' '||emp.last_name from job_history hist
join employees emp on
(emp.employee_id=hist.employee_id);
/*
ارجاع رقم الموظف والوظيفة ودمج الاسم الاول والاخير من جدول
الموظفين
ارجاع رقم الموظف والوظيفة واضافة اسم الموظف كامل من جدول تاريخ
تغيير الوظيفة
ربط جدول الموظفين مع تاريخ تغيير الوظيفة لكي يتم دمج الاسم الاول
والاخير في جدول تاريخ تغيير الوظيفة
*/
select employee_id ,
job_id , salary from employees
union
select employee_id ,
job_id , 0 sal from job_history order by employee_id desc; -- ارجاع رقم الموظف والوظيفة وراتبة من جدول الموظفين ودمج
الجدول الثاني بحسب رقم الموظف وراتبة واضافة صفر للحقل الراتب لان الحقل ليس
موجود في الجدول الثاني
select * from emp for
update; -- ارجاع بيانات جدول الموظفين وحجزها
للجلسة حتى لا يتمكن اي شخص التعديل عليها ولفك حجز بيانات الجدول يا بحفظ او
تراجع
select * from emp for
update nowait; -- ارجاع بيانات جدول الموظفين
وحجزها للجلسة حتى لا يتمكن اي شخص التعديل عليها واذا كانت محجوزة لا تنتظر اظهر
رسالة خطأ
select * from emp for
update wait 10; -- ارجاع بيانات جدول الموظفين
وحجزها للجلسة حتى لا يتمكن اي شخص التعديل عليها اذا كانت محجوزة من شخص اخر
انتظر 10 ثوان مالم اظهر رسالة خطأ
select
employees.first_name , departments.department_name
from employees ,
departments where employees.department_id = departments.department_id for
update; -- ارجاع اسم الموظف والادارة من الجدولين
الموظفين والادارات وحجزها للجلسة
select
employees.first_name , departments.department_name
from employees ,
departments where employees.department_id = departments.department_id for
update of salary; -- ارجاع اسم الموظف والادارة من
الجدولين الموظفين والادارات وحجز جدول الموظفين فقط لتعديل رواتبهم
select table_name from
user_tables; -- لعرض جميع الجداول التي انشئها
المستخدم من الــ DATA DICTIONARY
insert into jobs
(job_id,job_title,min_salary,max_salary) values ('DBA','Database
administrator',18000,35000); -- ادراج سجل جديد
لجدول الوظائف
insert into employees
(employee_id,first_name,last_name,email,phone_number,hire_date,job_id,salary,commission_pct,manager_id,department_id)
values
(210,'Mohammed','Almahfadi','Orelbase','776462030',to_date('01/21/2019','MM/DD/YYYY'),'DBA',20000,0.3,210,null);
-- ادراج سجل جديد لجدول الموظفين
insert into departments
(department_id,department_name,manager_id,location_id) values
(280,'DATABASE',210,2400); -- ادراج سجل جديد
لجدول الاقسام
insert into a
(fname,lname) values ('&firstName','&lastName'); -- يقوم المستخدم ادراج سجل جديد للجدول
insert into b
(fname,lname) select fname,lname from a; -- ادراج
سجلات الجدول الف للجدول باء
update employees set
salary = 18000 where employee_id = 210; -- تعديل
راتب الموظف 210 من 20000 الى 18000
update employees set
salary = 19000 , commission_pct = 0.4 where employee_id = 210; -- تعديل راتب والزيادة المئوية للموظف 210
update employees set
department_id = 280 where employee_id = 210; -- تعديل
رقم ادارة الموظف التي ينتمي لها الى 280
update employees set
manager_id = null where employee_id = 210; -- تعديل
رقم المدير الذي ينتمي له الموظف 210 الى فارغ
update employees set
salary = 1000; -- تم تعديل جميع رواتب الموظفين
الى 1000 ويعتبر هذا من الاخطاء الفادحة من الضرور استخدام شرط في التعديل
update employees set
salary = (select salary from employees where employee_id = 100) where
employee_id = 210; -- تعديل راتب الموظف 210 بنفس
راتب الموظف 100
update employees set
(salary,commission_pct) = (select salary,commission_pct from employees where
employee_id = 100)
where employee_id = 210;
-- نعديل راتب والنسبة المئوية للموظف 210 بنفس
راتب والنسبة المئوية للموظف 100
update employees set
salary = (select salary from employees where employee_id = 100) ,
commission_pct = (select
commission_pct from employees where employee_id = 100) where employee_id = 210;
-- نعديل راتب والنسبة المئوية للموظف 210 بنفس
راتب والنسبة المئوية للموظف 100
savepoint s0; -- نقطة استعادة قبل عملية الحفظ او التراجع
update emp set salary =
0; -- تم تعديل رواتب الموظفين الى صفر وهذا خطأ
فادح
savepoint s1; -- نقطة استعادة قبل عملية الحفظ او التراجع
update emp set salary =
1000; -- تم تعديل رواتب الموظفين الى 1000 وهذا
خطأ فادح
savepoint s2; -- نقطة استعادة قبل عملية الحفظ او التراجع
rollback to savepoint
s1; -- الرجوع الى نقطة الاستعادة
update emp set salary =
(select salary from employees where emp.employee_id = employees.employee_id);
/*
استرجاع رواتب الموظفين من جدول الاول الى جدول
الموظفين الذي رواتبهم صفر ولكن اذا لم يتساوى عدد سجلات الجدول الاول مع الجدول
الثاني سوف يعديل رواتب الجدول
الثاني الى فارغ ويعتبر هذا خطأ فادح
*/
update emp set salary =
(select salary from employees where emp.employee_id = employees.employee_id)
where exists (select *
from employees where emp.employee_id = employees.employee_id); -- استرجاع رواتب الموظفين من الجدول الاول الى الجدول الثاني
بإستثناء رواتب الموظفين الجدد الذي تم اضافتهم بعد تغيير رواتبهم الى صفر
delete from emp where
employee_id = 210; -- تم حذف سجل الموظف رقمة 210
delete emp where
employee_id = 210; -- تم حذف سجل الموظف رقمة 210
delete from emp where
salary < 2500; -- تم حذف سجلات الموظفين الذي
رواتبهم اقل من 2500
delete from emp where
employee_id in (select employee_id from emp where first_name like 'A%');
-- تم حذف سجلات الموظفين الذي يبدأ اسمهم الاول
بحرف الــ A
delete from emp where
not exists (select * from employees where emp.employee_id =
employees.employee_id); -- تم حذف سجلات الموظفين
من الجدول الثاني والذين هم غير موجودين في الجدول الاول
delete from emp;
-- تم حذف جميع بيانات الجدول
delete emp; -- تم حذف جميع بيانات الجدول
truncate table emp;
-- حذف جميع السجلات مع اعادة ترقيم الجدول
/* Diffrent Between Delete
and Truncate
Delete Truncate
--
DML
Statment --
DDL Statment
--
You Can Rollback -- You Can't Rollback
--
Fire the trigger -- Not fire the
trigger
--
You can use where -- No where clause
--
Not recover space -- Recover space
*/
/* Data Types أنواع البيانات
--
Varchar2(size) = 32767 bytes(max_sql_string_size = Extended) OR 4000
bytes(max_sql_string_size = Legacy) Change these parameters by DBA
--
Char(size) = 2000 bytes || Default 1
--
Number(p,s) = -84 to 127 | example number(5,2) the result show like 99999.99 |
Default MAX
--
Date = 31-12-9999
--
Long = same like varchar but up to 2GB
--
Clob = bigger than long (4GB - 1) * DB_BLOCK_SIZE
--
Nclob = bigger than long (4GB - 1) * DB_BLOCK_SIZE || The (N) letter it's mean
you can use a unicode like arabic words or france ...
--
Raw(size) = for binary data | 32767 bytes(max_sql_string_size = Extended) OR
4000 bytes(max_sql_string_size = Legacy) Change these parameters by DBA
--
Long raw = for binary data same like Raw but up to 2GB
--
Blob = for binary data | (4GB - 1) * DB_BLOCK_SIZE
--
Bfile = for binary data to store external files (up to 4GB)
--
Rowid = for store address of row
--
Timestamp
--
interval year to month
--
interval day to secound
*/
/* Constraints القيود
--
Primary key
--
Foreign Key
--
Unique
--
Check
--
Not null
*/
create table tst(
emp_id number(2),
-- رقم الموظف من نوع بيانات رقمي
emp_name varchar2(50),
-- اسم الموظف من نوع بياتات نصي
emp_gender char (1),
-- جنس الموظف من نوع بيانات نصي
emp_mail clob, -- ايميل الموظف من نوع بيانات نصي بمساحة كيبيرة
emp_sal number(8,2),
-- راتب الموظف من نوع بيانات رقمي وعدد المسموح به
8 و 2 تعني القيمة العشرية
emp_img blob, -- صورة الموظف من نوع بيانات بيناري
emp_date date default
sysdate -- تاريخ دخول الموظف من نوع بيانات تاريخ
مع قيمة افتراضية وهي تاريخ ووقت السيرفر الان
); -- انشاء جدول اسمة تست ولدية حقول رقم واسم وجنس وايميل وراتب
وصورة الموظف
create table tst1(
emp_id number(2),
-- رقم الموظف من نوع بيانات رقمي
emp_name varchar2(50),
-- اسم الموظف من نوع بياتات نصي
emp_gender char (1),
-- جنس الموظف من نوع بيانات نصي
emp_mail varchar2(150),
-- ايميل الموظف من نوع بيانات نصي بمساحة كيبيرة
emp_sal number(8,2) not
null, -- راتب الموظف من نوع بيانات رقمي وعدد
المسموح به 8 و 2 تعني القيمة العشرية ولا يقيل قيمة فارغة
emp_img blob, -- صورة الموظف من نوع بيانات بيناري
emp_date date default
sysdate, -- تاريخ دخول الموظف من نوع بيانات تاريخ
مع قيمة افتراضية وهي تاريخ ووقت السيرفر الان
emp_status char,
-- حالة الموظف : ملاحظة لم يتم تحديد حجم نوع
البيانات فهذا النوع يأخذ القيمة 1 افتراضياً
department_id number,
-- حقل لرقم القسم لجدول الاب لم يتم تحديد حجم نوع
البيانات فهذا النوع يأخذ القيمة القصوى له
constraint emp_id_pk
primary key (emp_id), -- قيد رقم الموظف بان لا
يتكرر ولا يكون فارغ
constraint emp_name_ck
check(emp_name > 3), -- قيد للاسم فحص عدد حروف
المدخل اكبر من 3 حروف
constraint emp_gen_ck
check(emp_gender in ('F','M')), -- قيد الجنس فحص
المدخل بين الحرفين F و M
constraint emp_email_unq
unique(emp_mail), -- قيد الايميل بأن لا يتكرر
ويقبل القيمة الفارغة
constraint dept_id_fk
foreign key(department_id) references departments (department_id) -- قيد رقم القسم الذي هو من يعود للحقل رقم القسم للجدول الاب
); -- انشاء جدول اسمة تست ولدية حقول رقم واسم وجنس وايميل وراتب
وصورة الموظف مع القيود تعتبر افضل طريفة لانشاء الجدزول مع القيود
/* ----------------مثال مهم--------------- */
/*إنشاء جدولين الاقسام والموظفين وربط رقم القسم في جدول الموظفين وعمل لهم
قيود وكذلك قيود في حالة حذف البيانات من جدول الابن ولدية بيانات في جدول الاب*/
-- example 1
create table sec (
sec_id number(2) primary key, sec_name varchar(15) unique); -- انشاء جدول الاقسام مع حقلين
insert into sec
(sec_id,sec_name) values (1,'DBA'); -- ادخال
بيانات لجدول القسم
insert into sec
(sec_id,sec_name) values (2,'WEB'); -- ادخال
بيانات لجدول القسم
insert into sec
(sec_id,sec_name) values (3,'IT'); -- ادخال
بيانات لجدول القسم
insert into sec
(sec_id,sec_name) values (4,'HR'); -- ادخال
بيانات لجدول القسم
select * from sec;
-- ارجاع جميع بيانات القسم
create table emp_tst (
emp_id number(2) primary
key, emp_name varchar(20),
sec_id number,
constraint sec_id_fk foreign key (sec_id) references sec on delete cascade
); -- انشاء جدول موظفين مع حقلين وعمل قيد مع جدول الاقسام
insert into emp_tst
(emp_id,emp_name,sec_id) values (1,'MOHAMMED',1); -- ادخال بيانات لجدول الموظفين
insert into emp_tst
(emp_id,emp_name,sec_id) values (2,'SARAH',3); -- ادخال بيانات لجدول الموظفين
insert into emp_tst
(emp_id,emp_name,sec_id) values (3,'ALI',2); -- ادخال
بيانات لجدول الموظفين
insert into emp_tst
(emp_id,emp_name,sec_id) values (4,'AHMED',2); -- ادخال بيانات لجدول الموظفين
select * from emp_tst;
-- ارجاع جميع بيانات الموظفين
delete sec where sec_id
= 1;
-- حذف بيانات قسم 1 واذا كان هناك بيانات مربوطة بهذا القسم
سيفوم بحذفها نظراً لوجود قيد في جدول الابن بحذف البيانات اجباري
-- on delete
cascade والقيد هو في جدول الموظفين
drop table sec;
drop table emp_tst;
-- example 2
create table section (
sec_id number(2) primary key, sec_name varchar(15) unique); -- انشاء جدول الاقسام مع حقلين
insert into sec
(sec_id,sec_name) values (1,'DBA'); -- ادخال
بيانات لجدول القسم
insert into sec
(sec_id,sec_name) values (2,'WEB'); -- ادخال
بيانات لجدول القسم
insert into sec
(sec_id,sec_name) values (3,'IT'); -- ادخال
بيانات لجدول القسم
insert into sec
(sec_id,sec_name) values (4,'HR'); -- ادخال
بيانات لجدول القسم
select * from sec;
-- ارجاع جميع بيانات القسم
create table emp (
emp_id number(2) primary
key, emp_name varchar(20),
sec_id number,
constraint sec_id_fk foreign key (sec_id) references sec on delete set null
); -- انشاء جدول موظفين مع حقلين وعمل قيد مع جدول الاقسام
insert into emp_tst
(emp_id,emp_name,sec_id) values (1,'MOHAMMED',1); -- ادخال بيانات لجدول الموظفين
insert into emp_tst
(emp_id,emp_name,sec_id) values (2,'SARAH',3); -- ادخال بيانات لجدول الموظفين
insert into emp_tst
(emp_id,emp_name,sec_id) values (3,'ALI',2); -- ادخال
بيانات لجدول الموظفين
insert into emp_tst
(emp_id,emp_name,sec_id) values (4,'AHMED',2); -- ادخال بيانات لجدول الموظفين
delete sec where sec_id
= 1;
-- حذف بيانات قسم 1 واذا كان هناك بيانات مربوطة بهذا القسم
سيقوم بعمل قيمة فارغة للبيانات المربوطة بجدول الابن
-- on delete set
null والقيد هو في جدول الموظفين
select * from emp_tst;
-- ارجاع جميع بيانات الموظفين
/* ----------------مثال مهم--------------- */
create table employees1
as select * from employees; -- تم انشاء جدول من
جدول الموظفين الموجود مسبقاً دون عمل له قيود وادراج البيانات من الجدول
create table emp
(emp_id, emp_fname)
as select employee_id ,
first_name from employees; -- تم انشاء جدول
بتحديد حقلين من جدول الموظفين
-- ملاحظة :: لا يمكن عمل انواع بيانات للحقول الجديدة ويمكنك عمل
قيمة افتراضية فقط
create table emp3 (id
number(2) , name varchar2 (50)); -- إنشاء جدول من
حقلين دون قيود
create table emp11 as
select * from employees where department_id = 90; -- تم انشاء جدول من جدول الموظفين مع تحديد البيانات المدخلة وهي الادارة 90
alter table employees2
add emp_lastname varchar(20); -- تم تعديل على
هيكل الجدول واضافة حقل جديد
alter table employees2
add (emp_lastname varchar(20), phone number(2)); -- تم تعديل على هيكل الجدول واضافة حقلين جديدين
alter table employees2
modify emp_lastname varchar(200); -- نم نعديل على
حقل وتوسيع نوع البيانات الى 200
alter table employees2
modify (emp_lastname varchar(200), phone number(6)); -- نم نعديل على الحقلين الاسم الاخير والرقم
alter table employees2
modify emp_fname default 'NAME'; -- تم تعديل على
حقل الاسم واضافة له قيمة افتراضية
alter table employees2
drop column emp_lastname; -- تم حذف حقل معين من
الجدول
alter table employees2
drop (emp_lastname,phone); -- تم حذف
اكثر من حقل
alter table employees2
set unused (emp_lastname); -- تم تعديل حقل الاسم
الاخير الى غير مستخدم ولا يمكنك ادحال اي بيانات له
select * from
user_unused_col_tabs; -- استرجاع الحقول الغير
مستخذمة من الجداول
alter table employees2
drop unused columns; -- تم حذف الحقول التي ليست
مستخدمة
alter table employees2
read only; -- تم تعديل الجدول للقراءة فقط ولا
يمكنك ادخال او تعديل وا حذف على البيانات
alter table employees2
read write; -- نم تعديل الجدول لوضعة السابق قراءة
وكتابة
alter table employees2
rename column emp_id to employee_id; -- تم تعديل
اسم الحقل
rename employees2 to
emp2; -- تم تعديل اسم الجدول
drop table employees2;
-- نقل الجدول الى سلة المحذوفات الخاصة بمحرك
اوراكل
drop table employees2
purge; -- حذف الجدول نهائياً من اوراكل
select * from
employees2; -- الاستعلام من الجدول الذي تم انشائة
من جدول الموظفين
alter table emp3 add
constraint id_pk primary key (id); -- تم انشاء
قيد جديد للجدول الذي ليس له قيود
alter table emp3 disable
constraint id_pk; -- id_pk تم تعطيل القيد
alter table emp3 enable
constraint id_pk; -- id_pk تم تفعيل القيد
alter table emp3 drop
constraint id_pk; -- id_pk تم حذف القيد
select * from
user_constraints; -- اظهار جميع القيود التي
انشئها المستخدم
/*----------------------------------------------- تمارين عامة ----------------------------------------------------*/
-- Note1: INTERVAL (YEAR
TO MONTH / DAY TO SECOND)
-- Year() = تقبل ارقام موجبة وسالبة
-- Month = تقبل من 00 الى 11
-- Day() = تقبل ارقام موجبة وسالبة
-- Hour() = تقبل من 00 الى 23
-- Second = تقبل من 00 لى 59.9
select * from employees
order by commission_pct; -- استرجاع بيانات الموظف
بحسب ترتيب النسب المئوية تنازلي
select * from employees
order by commission_pct nulls first; -- استرجاع
بيانات الموظف بحسب ترتيب النسب المئوية الفارغة اولاً
select * from employees
order by commission_pct nulls last; -- استرجاع
بيانات الموظف بحسب ترتيب النسب المئوية الفارغة اخيراً
select * from employees
order by salary+100; -- استرجاع بيانات الموظف
وترتيبها بحسب الراتب + 100
select first_name fname
from employees order by fname; -- استرجاع بيانات
الموظف وترتيبها بالاسم المستعار الذي تم اضافتة
select interval '5-2'
year to month from dual; -- استرجاع القيمة 2-5
وتعني خمس سنوات وشهرين
select interval '153-10'
year(3) to month from dual; -- استرجاع القيمة
10-153 وتعني مئة وثلاثة وخمسون سنه وعشرة اشهر في حالة كان رقم السنة اكبر من 2
فضروري تحديد لمتغير السنة قيمة بعدد المدخل
select interval '532'
month from dual; -- استرجاع القيمة 532 دون تحديد
السنةفسيتم تحويلها للسنة وستظهر القيمة 04-44 وتعني اربعة واربعين سنة واربعة
اشهر
select interval '22'
year from dual; -- استرجاع القيمة 22 وتعني اثنان
وعشرون سنة وصفر شهر
select interval '25
15:12:25' day to second from dual; -- استرجاع عدد
الايام والساعة مع الدقائق والثواني واجزاء من الثانية
select interval '2552
15:12:25' day(4) to second from dual; -- استرجاع
عدد الايام والساعة مع الدقائق والثواني واجزاء من الثانية
select interval '54'
hour from dual; -- استرجاع عدد الساعات بالايام
والوقت
select interval '5456'
hour(3) from dual; -- استرجاع عدد الساعات بالايام
والوقت
-- مثال لاستعلامات ترجع نفس القيمة
select avg(salary) sal
from employees where department_id = 90; -- استرجاع
متوسط رواتب الادارة 90
select
avg(decode(department_id,90,salary,null)) sal from employees; -- استرجاع متوسط رواتب الادارة 90
select avg(case when
department_id = 90 then salary else null end) sal from employees; -- استرجاع متوسط رواتب الادارة 90
select
to_char(hire_date, 'YYYY') , count(employee_id) from employees group by
to_char(hire_date, 'YYYY'); -- استرجاع اجمالي عدد
الموظفين الذين تم قبولهم في جميع السنوات
select
count(employee_id) from employees group by department_id; -- استرجاع عدد الموظفين لكل ادارة
select
count(employee_id) from employees group by (salary-commission_pct); -- استرجاع اجمالي عدد الموظفين ومجموع راتبة ناقص النسبة المئوية
select
to_char(1231.5,'9,999.9') from dual; -- استرجاع
الرقم وتحويلة لنص مع تغيير الصيغة
select
to_char(1231.5,'0,000.0') from dual; -- استرجاع
الرقم وتحويلة لنص مع تغيير الصيغة
select
to_char(1231.5,'9G999D9') from dual; -- استرجاع
الرقم وتحويلة لنص مع تغيير الصيغة
select
to_char(1231.5,'9G909D9') from dual; -- استرجاع
الرقم وتحويلة لنص مع تغيير الصيغة
select
to_char(1231.5,'09G909D9') from dual; -- استرجاع
الرقم وتحويلة لنص مع تغيير الصيغة واذا اضفنا رقم صفر في البداية سيظهرها واذا
اضفنا نسعة لن يظهر اي شيء
select
to_char(1231.5,'99G909D9') from dual; -- استرجاع
الرقم وتحويلة لنص مع تغيير الصيغة واذا اضفنا رقم صفر في البداية سيظهرها واذا
اضفنا نسعة لن يظهر اي شيء
select first_name ,
nvl(commission_pct,0) from employees; -- استرجاع
اسم الموظف والنسب المئوية والذين ليس لديهم نسب ضع القية 0
select first_name ,
nvl(to_char(commission_pct),'No commission') from employees; -- استرجاع اسم الموظف والنسب المئوية والذين ليس لديهم نسب ضع نص
بداخل الحقل
select employee_id ,
decode(department_id , 90 ,'dept 90',20 , 'dept 20',30,'dept 30',department_id)
dept from employees; -- استرجاع رقم الموظف ورقم
القسم وضع امام القسم 90و 20و30 نص بحسب الشرط
select employee_id , decode(department_id,90,to_char(salary+1000),30,to_char(salary+500),'N/A')
sal_plus from employees; -- استرجاع اسم الموظف
ورقم الادارات مع زيادة للادارة 90 و 30 واظهر بدل رقم الادارة نص
select 'Yello''s' text
from dual; -- استرجاع نص مع فاصلة بداخل النص
select first_name||'
Work in |--| '||job_id from employees; -- استرجاع
اسم الموظف ووظيفتة وربطهم بحقل واحد
select first_name||q'[
Work In' ]'||job_id from employees; -- استرجاع
اسم الموظف ووظيفتة وربطهم بحقل واحد
select first_name||q'(
Work In' )'||job_id from employees; -- استرجاع
اسم الموظف ووظيفتة وربطهم بحقل واحد
select first_name||q'/
Work In' /'||job_id from employees; -- استرجاع
اسم الموظف ووظيفتة وربطهم بحقل واحد
select first_name||q''
Work In' ''||job_id from employees; -- استرجاع
اسم الموظف ووظيفتة وربطهم بحقل واحد
select first_name||q'|
Work In' |'||job_id from employees; -- استرجاع
اسم الموظف ووظيفتة وربطهم بحقل واحد
select first_name||q'7
Work In' 7'||job_id from employees; -- استرجاع
اسم الموظف ووظيفتة وربطهم بحقل واحد
select first_name||q'a
Work In' a'||job_id from employees; -- استرجاع
اسم الموظف ووظيفتة وربطهم بحقل واحد
select * from employees
where hire_date = '21-jan-2019'; -- استرجاع
بيانات الموظف ومن هو الموظف الذي تقدم للوظيفة بتاريخ معين
select * from employees
where hire_date = '21-january-2019'; -- استرجاع
بيانات الموظف ومن هو الموظف الذي تقدم للوظيفة بتاريخ معين
select * from employees
where hire_date = '21-jan-19'; -- استرجاع بيانات
الموظف ومن هو الموظف الذي تقدم للوظيفة بتاريخ معين
select * from employees
where to_char(hire_date,'DD/MM/YYYY') = '21/01/2019'; -- استرجاع بيانات الموظف ومن هو الموظف الذي تقدم للوظيفة بتاريخ معين
select * from employees
where salary is not null order by salary desc fetch first 3 rows only; -- استرجاع بيانات الموظفين لاعلى 3 رواتب وترتيبها تنازلي
select * from employees
where salary is not null order by salary desc fetch first 3 /*rows*/ row only;
-- استرجاع بيانات الموظفين لاعلى 3 رواتب وترتيبها
تنازلي
select * from employees
where salary is not null order by salary desc fetch first 3 rows with ties;
-- استرجاع بيانات الموظفين لاعلى 3 رواتب ومن هم
مشتركين بنفس الراتي وترتيبها تنازلي
select * from employees
where salary is not null order by salary desc fetch first 20 percent row only;
-- استرجاع بيانات الموظفين لاعلى 20 في المئة من
البيانات وترتيبها تنازلي
select * from employees
where salary is not null order by salary desc fetch first 20 percent row with
ties; -- استرجاع بيانات الموظفين لاعلى 20 في
المئة من البيانات وترتيبها تنازلي ومن هم مشتركين بالرواتب
create table tst2 (id
number primary key , note long unique); -- انشاء
جدول بحقلين ولكن الحقل الثاني لا يقبل اي قيد لان نوع البيانات لاتقبل فستظهر خطأ
في انشاء الجدول
create table e as select
* from employees where 1=2; -- انشاء جدول من جدول
الموظفين بنفس اسماء الحقول وانواع البيانات دون ادراج البيانات
/*---------------------------------------------------------------------------------------------------*/
SELECT * FROM DICTIONARY
/*or DICT */; -- استرجاع جميع اسماء قاموس
البيانات Data Dictionary
select * from dict where
table_name like 'USER_%'; -- استرجاع جميع اسماء
قاموس البيانات Data Dictionary
select * from tabs /* or
user_tables*/; -- استرجاع الجداول الخاصة
بالمستخدم
comment on table section
is ' This table like departments table'; -- انشاء
تعليق نصي على جدول ويمكنك ان تكتب نص لحد 4000 حرف
comment on column
section.sec_id is 'This is section id column'; -- انشاء تعليق نصي على حقل بداخل جدول
select * from
user_tab_comments; -- استرجاع جميع التعليقات من
الجداول الخاصة بالمستخدم
select * from
user_col_comments; -- استرجاع جميع التعليقات من
الحقول الخاصة بالجداول الخاصة بالمستخدم
select * from
user_objects; -- اسنرجاع جميع انواع الكائنات
للمستخدم
select * from
all_tables; -- استرجاع جميع الجداول الخاصة
بالمستخدم والجداول التي لدية الصلاحيات عليها
select * from
all_objects; -- استرجاع جميع الكائنات الخاصة
بالمستخدم والكائنات التي لدية الصلاحيات عليها
select * from
user_catalog; -- استرجاع بيانات مختصرة عن جميع
الكائنات
select * from
user_tab_columns; -- استرجاع اسماء الحقول لجميع
الجداول الخاصة بالمستخدم
select * from
user_constraints; -- استرجاع جميع القيود للجداول
الخاصة بالمستخدم
select
a.owner,a.constraint_name,a.r_constraint_name,b.table_name
from user_constraints a
, user_constraints b where a.r_constraint_name = b.constraint_name(+); -- استرجاع المالك واسم القيد واسم مصدر القيد واسم الجدول من
جدول عرض جميع القيود الغرض منه معرفة القيود مع اي من الجداول مرتبطة
select * from
user_cons_columns; -- استرجاع جميع البيانات
ومعرفة ماهي الحقول التي عليها قيود
select
a.owner,a.constraint_name,a.table_name,b.constraint_name,b.COLUMN_NAME from
user_constraints a ,
user_cons_columns b where a.CONSTRAINT_NAME = b.CONSTRAINT_NAME; -- استرجاع بيانات لاسماء القيود المربوطة بالجداول لكل حقل من
جدولين القيود على مستوى الجدول وجدول القيود على مستوى الحقل
/* The Sequences
-
increment by n = default value 1
-
start with n = default value 1
-
maxvalue
-
nomaxvalue = default
-
minvalue n
-
nominvalue = default
-
order
-
noorder = default
-
cycle = do not use when you use a primary key constraint
-
nocycle = default
-
cache n = default value 20
-
nocache
*/
create sequence tst_seq;
-- انشاء مسلسل لارقام مع القيم الافتراضية
create sequence tst_seq1
increment by -20 start with -1000 maxvalue -500 nocache nocycle; -- إنشاء مسلسل لارقام بقيم مخصصة
select tst_seq.nextval
from dual; -- لاستخدام المسلسل وعرض الرقم
select tst_seq.currval
from dual; -- عرض الرقم الحالي للمسلسل
insert into tst (id)
values (tst_seq.nextval); -- إدراج حقل للجدول
بالمسلسل
select * from tst;
-- استرجاع جميع بيانات الجدول
alter sequence tst_seq
increment by 2 maxvalue 30; -- تم تعديل المسلسل
بتزايد ب 2 واعلى قيمة 30
drop sequence tst_seq1;
-- حذف المسلسل
desc tst_seq; -- إسترجاع هيكل المسلسل tst_seq
truncate table tst; --
ROWID حذف بيانات الجدول وتصفير ال
select * from
user_sequences; -- إسترجاع جميع المسلسل التي
انشئها المستخدم
create table tst1 (id
number default tst_seq.nextval , name varchar2(100)); -- إنشاء جدول واسناد للحقل قيمة افتراضية وهي المسلسل ولا ينصح استخدام
المسلسل كقيمة افتراضية بداحل الجدول
insert into tst1 (name)
values ('Ali'); -- ادخال بيانات الاسم دون الحاجة
لادخال في حقل الرقم لاننا اعطينا حقل الرقم قيمة افتراضية وهي المسلسل
select * from tst1;
-- استرجاع جميع البيانات التي تم ادخالها في الامر
السابق
/* سؤال: قم بإدخال ادارة جديدة باستخدام المسلسل وكذلك قم بإدخال
3 موظفين من النفس الادارة التي قمت ادخالها بالمسلسل*/
create table tst_dept
(id number primary key, deptname varchar2(20)); -- انشاء جدول بحقلين للادارات
create table tst_emp (id
number primary key, empname varchar2(20), deptname varchar2(20)); -- انشاء جدول بثلاثة حقول للموظفين
create sequence
tst_seq1; -- انشاء مسلسل
insert into tst_dept
(id, deptname) values (tst_seq1.nextval, 'DBA'); -- ادخال بيانات لجدول الادارات باستخدام المسلسل
insert into tst_emp (id,
empname, deptname) values (100, 'Mohammed', tst_seq1.currval); -- ادخال بيانات
لجدول الموظفين واستخدام المسلسل للقيمة الحالية في حق الاقسام
insert into tst_emp (id,
empname, deptname) values (101, 'Ali', tst_seq1.currval); -- ادخال بيانات
لجدول الموظفين واستخدام المسلسل للقيمة الحالية في حق الاقسام
insert into tst_emp (id,
empname, deptname) values (102, 'Ahmed', tst_seq1.currval); -- ادخال بيانات
لجدول الموظفين واستخدام المسلسل للقيمة الحالية في حق الاقسام
select * from tst_emp;
create synonym test for
tst_emp; -- tst_emp انشاء اسم مستعار لجدول
select * from test; --
tst_emp إسترجاع جميع البيانات من جدول بالاسم
المستعار الذي تم انشائة
select * from
user_synonyms; -- استرجاع جميع الاسماء الاستعارة
التي انشئها المستخدم
drop synonym test;
-- حذف الاسم المستعار
create public synonym
glop for employees; -- create public synonym انشاء
اسم مستعار عام لجدول الموظفين يستطيع جميع المستخدمين الاستعلام عنه || ولا يمكن
انشاء هذا النوع من الاسماء المستعارة الا اذا كان لدى المستخدم صلاحيات
drop public synonym
glop; -- حذ ف الاسم المستعار العام
create table emp (id
number constraint id_emp primary key, fname varchar2(100) constraint fn_uq
unique, lname varchar2(100), email varchar2(100), status char(1)); -- انشاء جدول موظفين واسناد قيود لبعض الحقول
select * from
user_indexes where table_name = upper('emp'); -- استرجاع
جميع بيانات الفهرس لجدول الموظفين الذي انشئناه ونلاحظ انه تم انشاء فهرسين
تلقائيين للحقلين واخذ نفس اسماء القيود
select * from
user_ind_columns where table_name = upper('emp'); -- استرجاع جميع بيانات الفهرس لجدول الموظفين الذي انشئناه ونلاحظ انه تم
انشاء فهرسين تلقائيين للحقلين واخذ نفس اسماء القيود
insert into emp
(id,fname) values (1, 'Mohammed'); -- إدخال
بيانات لجدول الموظفين
insert into emp (id,fname)
values (2, 'Ali'); -- إدخال بيانات لجدول الموظفين
insert into emp
(id,fname) values (3, 'Ahmed'); -- إدخال بيانات
لجدول الموظفين
insert into emp
(id,fname) values (4, 'NASER'); -- إدخال بيانات
لجدول الموظفين
select * from emp where
id = 1; -- استرجاع جميع البيانات للموظف رقم 1
فأفضل طريقة للبحث بداخل الجدول استخدام شرط لكي يتم استخدام الفهرس
create index ln_ind on
emp(lname); -- إنشاء فهرس للحقل الثالث في جدول
الموظفين لتسريع البحث بداخل الجدول
create unique index
email_ind_uq on emp(email); -- إنشاء فهرس فريد لا
يمكن تكرار البيانات للحقل الرابع ويفضل انشاء قيد فريد للحقل وبذلك سيتم انشاء
فهرس تلقائياً
create index uppr_ind on
emp (upper(fname)); -- انشاء فهرس لحقل الاسم مع
فانكشن الحروف الكبيرة لاستخدامها في البحث بشكل متكرر
select * from
user_ind_expressions; -- استرجاع بيانات من جدول
الفهرس التعبيرات لاستعلام عن الحقل الذي تم علية استخدام الفانكشن
drop table emp; -- حذف جدول الموظفين
create table emp (id
number constraint id_ind_pk primary key using index (create index id_index on emp(id)));
-- انشاء جدول الموظفين مع حقل بقيد معين وكذلك تم
انشاء فهرس بإسم مختلف يدوياً
create index ind_dual on
emp(lname,email); -- إنشاء فهرس واحد لحقلين
create bitmap index
status_ind on emp(status); -- انشاء فهرس بيت ماب
ويستخدم للبيانات الصغير
drop index ind_dual;
-- حذف الفهرس
/* The Views
-
or replace = اذا كان هناك فيو (عرض) بنفس الاسم قم
بإستبدالة بالجديد
-
force = اذا كنت اريد انشاء فيو لجدول ليس موجود
وسوف انشأ الجدول لاحقاً
-
noforce = defaukt value
-
view = العرض
-
alias = اسم المستعار للعرض
-
subquery = الاستعلام
-
with check option = نستطيع ادخال او تعديل او حذف
بيانات للعرض بس بشرط فحص القيود التي تضعها في العرض(فيو)
-
constraint = القيود
-
with read only = لعمل استعلام عن هذا العرض (فيو)
فقط
*/
create or replace view
emp_dept_10 as select employee_id,first_name,salary from employees where
department_id = 10; -- انشاء عرض (فيو) لثلاثة
حقول من جدول الموظفين للادارة 10
select * from
emp_dept_10; -- استرجاع جميع البيانات من العرض
(فيو)
create or replace view
emps as select employee_id ID_NO, first_name FNAME, last_name LNAME, salary+100
ADDITIONAL from employees; -- انشاء عرض (فيو)
لبعض الحقول من جدول الموظفين وتغيير اسماء الحقول وعمل زيادة 100 في حق الراتب
create or replace view
emps (ID_NO,FNAME,LNAME,ADDITIONAL) as select employee_id, first_name,
last_name, salary+100 from employees; -- انشاء
عرض (فيو) لبعض الحقول من جدول الموظفين وتغيير اسماء الحقول وعمل زيادة 100 في حق
الراتب
create or replace view
emps (deptname, minsal, maxsal, avgsal) as select d.department_name,
min(e.salary), max(e.salary), avg(e.salary)
from employees e join
departments d on (e.department_id = d.department_id) group by
d.department_name; -- انشاء عرض (فيو) للحقل اسم
القسم من جدول الاقسام واعلى واقل ومتوسط الراتب من جدول الموظفين وربط الجدولين
مع بعض لاسترجاع اسماء الادارات
create or replace view
emps as select employee_id id, first_name fname, salary sal from employees
where department_id = 20
with check option constraint dept20; -- انشاء عرض
(فيو) لرقم الموظف واسمة وراتبة للادارة 20 وتم انشاء قيد على العرض بأن لا يمكن
اضافة او تعديل او حذف الى ع الادارة 20
create or replace view
emps as select employee_id id, first_name fname, salary sal from employees
where department_id = 20
with read only; -- انشاء عرض (فيو) لرقم الموظف
واسمة وراتبة للادارة 20 مع قيد للقراءة فقط
create or replace view
emps as select * from tst_emp with read only constraint read_view;
create or replace force
view emps as select * from notable; -- انشاء عرض
(فيو) لجدول غير موجود وهذا العرض نادر الاستخدام
desc emps; -- استرجاع هيكل الجدول من العرض (فيو)
insert into emps (id,
empname, deptname) values (1, 'Mohammed Aref', 'DBA'); -- ادخال بيانات لجدول عن طريق العرض (فيو) مراعاة القيود
الموجودة في الجدول
select * from emps;
-- استرجاع جميع البيانات من العرض (فيو)
drop view emps; -- حذف العرض (فيو)
select * from
user_views; -- استرجاع جميع بيانات العرض (فيوز)
select * from
user_constraints where table_name = 'EMPS'; -- استرجاع
جميع بيانات العرض (فيو) التي هي من نوع للقراءة فقط من جدول القيود
create table emps as
select * from employees; -- انشاء جدول من جدول
الموظفين بجميع بياناته
alter table emps modify
employee_id primary key; -- انشاء قيد على حقل رقم
الموظف
select * from
user_constraints where table_name = 'EMPS'; -- استرجاع
جميع البيانات من جدول القيود واين معلومات الجدول المحدد
alter table emps drop
constraint EMP_ID_PK; -- حذف قيد محدد من الجدول
الذي تم انشائة مسبقاً
alter table emps modify
employee_id constraint emp_id_pk primary key; -- انشاء
قيد لحقل رقم الموظف مع اضافة اسم للقيد
alter table emps add
constraint EMP_ID_PK primary key(employee_id); -- انشاء قيد لحقل رقم الموظف مع اضافة اسم للقيد
alter table emps add
constraint DEPTS_ID_FK foreign key(department_id) references
departments(department_id); -- انشاء قيد لرقم
الادارات الموجود في جدول الموظفين مع اضافة الاسم لهذا القيد
alter table emps modify
first_name not null; -- تعديل على الحقل وجعلة لا
يقبل قيمة فارغة
select * from emps;
-- استرجاع جميع البيانات من الجدول الذي تم انشائة
مسبقاً
create table depts as
select * from departments; -- انشاء جدول من جدول
الادارات بجميع بياناتة
alter table depts add
constraint DEPTS_ID_PK primary key(department_id); -- انشاء قيد لحقل رقم الادارة مع اضافة اسم للقيد
alter table depts drop
primary key; -- لحذف القيد الرئيسي من جدول
الادارات واذا كان هذا الحقل لدية بيانات مربوطة بجدول اخر لا نستطيع حذف هذا
القيد
alter table depts drop
primary key cascade; -- لحذف القيد الرئيسي من
جدول الادارات اجباري حتى وان كان لدية بيانات مربوطة بجدول اخر مع البيانات
المربوطة
alter table depts drop
column department_id; -- لحذف حقل معين من جدول
واذا كان في الحقل بيانات مربوطة بجداول اخرى لا يمكن الحذف
alter table depts drop
column department_id cascade constraint; -- لحذف
حقل معين اجباري حتى وان كان هناك بيانات مربوطة
alter table depts rename
column department_id to dept_id; -- تعديل اسم
الحقل
alter table depts rename
constraint depts_id_pk to depts_pk; -- تعديل اسم
القيد
select * from depts;
-- استرجاع جميع البيانات من الجدول الذي تم انشائة
مسبقاً
/* Deferrable
constraint القيود المؤجلة
-
Deferrable = NOT DEFERRABLE || Default value غير
مؤجل
-
Deferred = أجل عمل القيد ولا تظهر أي خطأ حتى قيام
المستخدم بالحفظ
-
immediate = قيد غير مؤجل واظهر رسالة خطأ في الحال
*/
create table mark (id
number constraint id_pk primary key, prod varchar2(100) constraint prod_uq
unique
, bonus number
constraint bon_chk check(bonus>0)); -- انشاء
جدول من ثلاثة حقول مع القيود
insert into mark
(id,prod,bonus) values (1,'CD',0); -- ادخال
بيانات للجدول السابق مع كسر القيد للحقل الثالث فستظهر رسالة خطأ لان القيد غير
مؤجل
alter table mark drop
constraint bon_chk; -- bon_chk حذف القيد
alter table mark add
constraint bon_chk check(bonus>0) deferrable initially deferred; -- انشاء قيد على حقل معين مع امكانية تأجيل عملية القيد للحفظ
alter table mark add
constraint bon_chk check(bonus>0) deferrable initially immediate; -- انشاء قيد على حقل معين دون تأجل اي عملية خطأ على القيد
insert into mark
(id,prod,bonus) values (1,'CD',0); -- ادخال
بيانات للجدول السابق مع كسر القيد للحقل الثالث فسيقبل البيانات لان القيد من نوع
مؤجل لحين الحفظ
set constraint bon_chk
deferred; -- تحويل قيد معين الى مؤجل على مستوى
الجلسة ولا يمكن استخدام هذا الامر الا اذا كان القيد مخصص انه مؤجل او غير مؤجل
set constraint bon_chk
immediate; -- تحويل قيد معين الى غير مؤجل على
مستوى الجلسة ولا يمكن استخدام هذا الامر
الا اذا كان القيد مخصص انه مؤجل او غير مؤجل
/* Global Temporary
table الجداول المؤقتة
- تحفظ البيانات بشكل مؤقت وتنتهي هذه البيانات عند انتهاء
الجلسة
*/
create global temporary
table cart (id number primary key, prod varchar2(1223)) on commit delete rows;
-- انشاء جدول مؤقت يحتفظ بالبيانات لمدة الجلسة
فقط او عند الحفظ سيحذف البيانات
insert into cart
(id,prod) values (1,'CD'); -- ادخال بيانات للجدول
المؤقت
insert into cart
(id,prod) values (2,'DVD'); -- ادخال بيانات
للجدول المؤقت
insert into cart
(id,prod) values (3,'BLURAY'); -- ادخال بيانات
للجدول المؤقت
select * from cart;
-- استرجاع جميع البيانات من الجدول
commit; -- Cart بعد عمل حفظ او الانتهاء من الجلسة ستحذف البيانات من جدول
create global temporary
table cart1 (id number primary key, prod varchar2(1223)) on commit preserve
rows; -- انشاء جدول مؤقت يحتفظ بالبيانات لمدة
الجلسة كامة حتى وان استخدمنا حفظ لا يحذفها
insert into cart1
(id,prod) values (1,'CD'); -- ادخال بيانات للجدول
المؤقت
insert into cart1
(id,prod) values (2,'DVD'); -- ادخال بيانات
للجدول المؤقت
insert into cart1
(id,prod) values (3,'BLURAY'); -- ادخال بيانات
للجدول المؤقت
select * from cart1;
-- استرجاع جميع البيانات من الجدول
commit; -- Cart1 بعد عمل حفظ لا
يحذف البيانات من جدول لاننا استخدمنا جدول مؤقت يحفظ البيانات لمدة الجلسة كاملة
/* SQL LOADER
-
Sql loader اداة اضافية تأتي مع تحميل أوراكل ||
sqllder.exe
- سنقوم بادخال بيانات خارجية على شكل جدول من ملف اكسيل لداخل
قاعدة البيانات
-
pwrusg.csv اسم الملف
-
Control file لكي يتم نقل ملفات خارجية قم بإنشاء
كنترول فايل بنفس اسم الاكسل او الملف بنفس مسار الملف المراد رفعة ||
pwrusg.ctl
- قم بكتابة هذا الامر بداخل ملف الكنترول فايل الذي تم انشائة
load
data
infile
'D:\load\pwrusg.csv'
append
into
table pwr_usg
fields
terminated by ','
(id,
postion,
watts
)
-
cmd --> sqlldr control=D:\load\pwrusg.ctl log=D:\load\pwrusg.log قم بتنفيذ هذا الامرعلى الشاشة السوداء
video
89
*/
create table pwr_usg (id
number, postion varchar2(20), watts number); -- انشاء
جدول بنفس ملف الاكسيل الخارجي
select * from pwr_usg
order by id; -- استرجاع جميع البيانات التي تم
ادخالها من الملف الاكسيل بنجاح
/* External Tables الجداول الخارجية
- هي عبارة عن جداول خارجية للقراءة فقط لا يمكن التعديل عليها
- البيانات التي تم تخزينها في هذه الجداول ليست موجودة على
قاعدة البيانات انما موجودة بداخل ملفات في الهارد ديسك
- فائدة الجداول الخارجية انها تخفف من الضغط على قاعدة البيانات
مثلا لدينا بيانات ما قبل 5 سنوات فاصبحت قاعدة البيانات بطيئة يقوم مسؤول قواعد
البيانات بنقلها
vid
90 - 91
*/
create or replace
directory pwr_ext as 'D:\exttable\'; -- انشاء
مسار خارجي يستطيع المستخدم الوصول له
select * from
all_directories where directory_name = 'PWR_EXT'; -- استرجاع جميع البيانات من جدول المسارات بحسب اسم مسار معين
CREATE TABLE olds (num
char(5), postion char(20), watts char(5)) -- انشاء
جدول مطابق للملف الاكسيل الخارجي
ORGANIZATION EXTERNAL
-- نوع الجدول خارجي
(TYPE ORALCE_LOADER /*
or ORACLE_DATAPUMP */ -- نوع البرنامج المستخدم
DEFAULT DIRECTORY
pwr_ext -- اقرأ الملف من هذا المسار
ACCESS PARAMETERS
(RECORDS DELIMITED BY
NEWLINE -- ينتهي السجل بسطر جديد
FIELDS TERMINATED BY
',') -- ينتهي الحقل بفاصلة
LOCATION
('oldpwrusg.csv') -- اسم الملف المراد استخدامة
)
REJECT LIMIT UNLIMITED;
/* or nubmer ex: reject limit 5 || تجاوز الاخطاء
لحد خمسة واخرج*/ -- تجاوز الاخطاء كاملة المهم ترجع لي بيانات
select * from olds;
-- استرجاع جميع البيانات من ملف الاكسيل لداخل
الجدول الخارجي
CREATE TABLE oldemps
(num, fname, sal) -- انشاء جدول خارجي وملف دمب
ORGANIZATION EXTERNAL
-- نوع الجدول خارجي
(TYPE ORACLE_DATAPUMP
-- نوع البرنامج المستخدم
DEFAULT DIRECTORY
pwr_ext -- اقرأ الملف من هذا المسار
LOCATION ('emp.dmp')
-- انشئ ملف خارجي وخزن البيانات بداحلة
)
as select
employee_id,first_name,salary from employees; -- البيانات
التي سينم اخراجها للجدول الخارجي
select * from oldemps;
-- استرجاع جميع البيانات من الملف الخارجي
CREATE TABLE oldempsread
(num number, fname varchar2(100), sal number) -- انشاء
جدول خارجي لملف دمب موجود مسبقاً
ORGANIZATION EXTERNAL
-- نوع الجدول خارجي
(TYPE ORACLE_DATAPUMP
-- نوع البرنامج المستخدم
DEFAULT DIRECTORY
pwr_ext -- اقرأ الملف من هذا المسار
LOCATION ('emp.dmp')
-- انشئ ملف خارجي وخزن البيانات بداحلة
);
select * from
oldempsread; -- استرجاع البيانات من الملف الخارجي
للقراءة فقط
/*---------------------------------------------------------------------تمارين مهمة-------------------------------------------------------------------------------*/
-- vid 92 - 96
select location_id, city
from locations; -- استرجاع رقم المدينة واسم
المدينة من جدول المناطق
select department_id,
department_name, location_id from departments; -- استرجاع رقم القسم واسم القسم ورقم المدينة
select d.department_id,
d.department_name, d.location_id, l.city from departments d ,
(select location_id,
city from locations) l where d.location_id = l.location_id; -- استرجاع رقم الادارة واسم الادارة ورقم المدينة واسم المدينة
باستخدام ربط بالاستعلامات
create table students
(std_id number constraint std_id_pk primary key, std_name varchar2(50));
-- انشاء جدول بحقلين للطلاب
insert into students
(std_id,std_name) values (1,'Mohammed Aref'); -- ادخال
بيانات لجدول الطلاب
insert into students
(std_id,std_name) values (2,'Rafat Aref'); -- ادخال
بيانات لجدول الطلاب
insert into students
(std_id,std_name) values (3,'Diana Aref'); -- ادخال
بيانات لجدول الطلاب
insert into students
(std_id,std_name) values (4,'Ali Aref'); -- ادخال
بيانات لجدول الطلاب
create table stud_major
(term_no varchar2(10),std_id number,std_maj varchar2(50),
constraint std_mjr_pk
primary key(term_no,std_id),
constraint std_id_fk
foreign key(std_id) references students(std_id)); -- انشاء جدول تخصصات الطلاب مربوط بجدول الطلاب
insert into stud_major
(term_no,std_id,std_maj) values (20201,1,'DBA'); -- ادخال بيانات لجدول التخصصات
insert into stud_major
(term_no,std_id,std_maj) values (20202,1,'SECURITY'); -- ادخال بيانات لجدول التخصصات
insert into stud_major
(term_no,std_id,std_maj) values (20191,4,'IT'); -- ادخال بيانات لجدول التخصصات
insert into stud_major
(term_no,std_id,std_maj) values (20192,4,'IT'); -- ادخال بيانات لجدول التخصصات
insert into stud_major
(term_no,std_id,std_maj) values (20201,2,'Engineer'); -- ادخال بيانات لجدول التخصصات
insert into stud_major
(term_no,std_id,std_maj) values (20212,2,'Doctor'); -- ادخال بيانات لجدول التخصصات
select
s.std_id,s.std_name,m.std_maj from students s, stud_major m
where term_no =(select
max(term_no) from stud_major m where s.std_id = m.STD_ID); -- استرجاع رقم الطالب واسم الطالب وتخصصة وماهو اخر تخصص يدرسة
في الترم
select * from employees
where first_name = 'John'; -- استرجاع جميع بيانات
الموظفين الذي اسمائهم الاولى جون
select * from employees
where manager_id = 108 and department_id = 100 and first_name !=
'John'
union all
select * from employees
where manager_id = 100 and department_id = 80 and first_name !=
'John'
union all
select * from employees
where manager_id = 123 and department_id = 50 and first_name !=
'John'
; -- استرجاع الموظفين الذين مديرهم واداراتهم بنفس مدير وادارات
الموظفين الذي اسمهم الاول جون وتسمى مقارنة زوجية
select * from employees
where (department_id,manager_id) in
(select
department_id,manager_id from employees where first_name = 'John') and
first_name <> 'John'; -- استرجاع الموظفين
الذين مديرهم واداراتهم بنفس مدير وادارات الموظفين الذي اسمهم الاول جون وتسمى
مقارنة زوجية
select * from employees
where department_id in(100,80,50) and manager_id in(108,100,123) and first_name
<> 'John'; -- استرجاع الموظفين
الذين يعملون بنفس ادارة الموظفين الذي اسمائهم جون ومديرهم بنفس الموظفين الذي
اسمائهم جون وتسمى مقارنة غير زوجية
select * from employees
where department_id in (select department_id from employees where first_name =
'John')
and manager_id in
(select manager_id from employees where first_name = 'John') and first_name
<> 'John'; -- استرجاع الموظفين الذين يعملون
بنفس ادارة الموظفين الذي اسمائهم جون ومديرهم بنفس الموظفين الذي اسمائهم جون
وتسمى مقارنة غير زوجية
select
e.department_id,e.first_name,e.last_name,e.salary,e.hire_date,d.department_name
from
employees e ,
departments d where e.DEPARTMENT_ID = d.department_id; -- استرجاع رقم الادارة واسم الموظف وراتبة وتاريخ توظيفة واسم
الادارة من جدول الموظفين والادارات طريقة 1
select
e.department_id,e.first_name,e.last_name,e.salary,e.hire_date,nvl((select
d.department_name
from departments d where
e.department_id = d.department_id),'No Dept') department_name from employees e;
-- استرجاع رقم الادارة واسم الموظف وراتبة وتاريخ
توظيفة واسم الادارة من جدول الموظفين والادارات طريقة 2
select e.first_name, e.department_id,
e.salary from employees e where salary >
(select
round(avg(salary)) from employees c where c.department_id = e.department_id)
order by department_id; -- استرجاع اسم ورقم وراتب
الموظفين ومتوسط الراتب لكل ادارة ومن هو الموظف الذي راتبة اكبر من المتوسط رواتب
القسم
select e.first_name,
e.department_id, salary, (select round(avg(salary)) from employees c where
e.department_id = c.department_id) avrg
from employees e where
salary > (select round(avg(salary)) from employees c where c.department_id =
e.department_id) order by department_id; -- استرجاع
اسم ورقم وراتب الموظفين ومتوسط الراتب لكل ادارة ومن هو الموظف الذي راتبة اكبر
من المتوسط رواتب القسم
select * from employees
a where exists (select * from employees b where a.department_id = b.department_id);
-- استرجاع جميع البيانات للموظفين الذين ينتمون
للادارات طريقة 1
select * from employees
a where a.department_id in (select department_id from employees b); -- استرجاع جميع البيانات للموظفين الذين ينتمون للادارات طريقة 2
select * from employees
a where not exists (select * from employees b where a.department_id =
b.department_id); -- استرجاع جميع البيانات
للموظفين الذين لا ينتمون للادارات طريقة 1
select * from employees
a where a.department_id not in (select department_id from employees b); -- استرجاع جميع بيانات الموظفين الذين لا ينتمون لاي ادارة
وسيظهر الجدول فارغ لان (نوت ان) لا ترجع القية نل (فارغة)
select department_name ,
cnt from departments d,
(select department_id,
count(*) cnt from employees group by department_id) de where d.department_id =
de.department_id; -- استرجاع اسم الادارة وعدد
الموظفين لكل ادارة من جدولي الموظفين والادارة
select
d.department_name, sum(e.salary) sal from employees e join departments d on
(e.DEPARTMENT_ID=d.department_id) group by d.department_name; -- استرجاع مجموع رواتب لكل ادارة
create table emps (fname
varchar2(20),salary number,status varchar2(20) default 'Active'); -- انشاء جدول بثلاثة حقول ولدى الحق الثالث قيمة افتراضية
insert into emps
(fname,salary) values ('Mohammed',15232); -- ادخال
بيانات للحقلين من الجدول والحقل الثالث بيأخذ القيمة الافتراضية
insert into emps
(fname,salary,status) values ('Ali',65456,default); -- ادخال بيانات لجميع الحفول مع تحديد المدخل للحقل الثالث بالقيمة
الافتراضية
insert into emps
(fname,salary,status) values ('Ahmed',54241,null); -- ادخال البيانات لجميع الحقول مع تحديد المدخل للحقل الثالث بقيمة فارغة
insert into emps
(fname,salary) select first_name,salary from employees; -- ادخال جميع اسماء ورواتب من جدول الموظفين
select * from emps;
-- استرجاع جميع البيانات من الجدول
update emps set status =
default where fname = 'Ahmed'; -- تعديل بيانات
الحقل الثالث بالقيمة الافتراضية للموظف احمد
-- قم بإنشاء جدولين لمعلومات الموظف والراتب وجدول معلومات
الموظف والمدير وقم بإدخال البيانات من جدول الموظفين للجدولين بإستعلام واحد بنفس
الوقت vid 107-108
create table sal_info
(ids number, fname varchar2(20), salary number); -- انشاء جدول معلومات الموظف والراتب
create table man_info
(mid number, fname varchar2(20)); -- انشاء جدول
معلومات رقم المدير واسم الموظف
insert all
into sal_info
(ids,fname,salary) values (employee_id,first_name,salary)
into man_info
(mid,fname) values (manager_id,first_name)
select
employee_id,first_name,salary,manager_id from employees; -- ادخال رقم واسم وراتب الموظف ورقم المدير واسم الموظف للجدولين
من دون اي شروط
insert all
when salary > 6000
then
into sal_info
(ids,fname,salary) values (employee_id,first_name,salary)
when manager_id is not
null then
into man_info
(mid,fname) values (manager_id,first_name)
select
employee_id,first_name,salary,manager_id from employees; -- ادخال رقم واسم وراتب الموظفين الذي رواتبهم اكبر من 6000
وادخال ارقام المدراء الذين يحملون
ارقام ادارات للجدولين وهذه العملية بشروط
insert first
when salary > 6000
then
into sal_info
(ids,fname,salary) values (employee_id,first_name,salary)
when manager_id is not
null then
into man_info
(mid,fname) values (manager_id,first_name)
select
employee_id,first_name,salary,manager_id from employees; -- ادخال رقم واسم وراتب الموظفين الذي رواتبهم اكبر من 6000
وادخال ارقام المدراء الذين يحملون
ارقام ادارات للجدولين واذا تحقق الشرط الاول لا يتحقق باقي الشروط
select * from sal_info;
-- استرجاع جميع البيانات من جدول معلومات الراتب
select * from man_info;
-- استرجاع جميع بيانات من جدول معلومات المدير
create table sales
(week_id number, sat number, sun number, mon number, tue number, wed number,
thu number, fri number); -- انشاء جدول مبيعات
الاسبوع
insert into sales values
(1,542,213,2315,5642,6421,6654,4565); -- ادخال
لجميع الحقول لجدول المبيعات
select * from sales;
-- استرجاع جميع البيانات
create table
sales_vertical (week_id number,sale number,day varchar2(20)); -- انشاء جدول مبيعات الاسبوع بطريقة منظمة للبيانات
insert all
into sales_vertical
values (week_id,sat,'sat')
into sales_vertical
values (week_id,sun,'sun')
into sales_vertical
values (week_id,mon,'mon')
into sales_vertical
values (week_id,tue,'tue')
into sales_vertical
values (week_id,wed,'wed')
into sales_vertical
values (week_id,thu,'thu')
into sales_vertical
values (week_id,fri,'fri')
select
week_id,sat,sun,mon,tue,wed,thu,fri from sales; -- ادخال جميع البيانات من جدول المبيعات لكل يوم سجل منفصل
select * from
sales_vertical; -- استرجاع جميع البيانات
drop table sales;
-- نقل الجدول لسلة المحذوفات
select * from
recyclebin; -- استرجاع جميع بيانات سلة المحذوفات
flashback table sales to
before drop; -- استعادة الجدول المبيعات من سلة
المحذوفات
/*---------------------------------------------------------------------تمارين مهمة-------------------------------------------------------------------------------*/
/* With clause vid 96 */
insert into (select
std_id,std_name from students) values (5,'Mohammed ali'); -- ادحال بيانات لجدول الطلاب عن طريق استعلام
insert into (select
department_id, department_name from departments where department_id = 10)
values (215,'AKA'); -- ادحال بيانات لجدول الاقسام
عن طريق استعلام
insert into (select
department_id, department_name from departments where department_name like
'OREL%' with check option) values (512,'OREL1'); -- ادخال بيانات لجدول الاقسام مع وضع شرط ان يبدأ اسم الجديد بنص معين
update (select * from
employees where department_id = 20) set salary=salary+salary; -- تعديل راتب الموظفين الذي ينتمون للادارة 20 عن طريق الاستعلام
create table emp as
select * from employees; -- انشاء جدول من جدول
الموظفين
select * from emp;
-- استرجاع جميع بيانات الموظفين من الجدول الجديد
update emp set salary =
0; -- تعديل رواتب الموظفين الى صفر وهذا خطأ فادح
insert into (select
employee_id, first_name, last_name, email, phone_number, hire_date, job_id,
salary, manager_id, department_id from emp) values
(165,'TEST','TASS','A@A>COM',56423215,sysdate,'DBA',23555,100,90);
-- ادخال موظف جديد لجدول الموظفين وراتبة 23555
بعد تصفير رواتب الموظفين
update emp set salary =
(select e.salary from employees e where e.employee_id = emp.employee_id);
-- تعديل رواتب الموظفين بعد تصفيرها من الجدول
الاساسي ولكن سيتم التعديل حتى على الموظف الذي لدية راتب فهذا يعتبر خطأ لان
البيانات ليست متساوية في الجدولين
update emp set salary =
(select salary from employees e where e.employee_id = emp.employee_id)
where exists (select 1
from employees e where e.employee_id = emp.employee_id); -- تعديل رواتب الموظفين التي تم تصفيرها من الجدول الاساسي
باستثناء الموظفين الذين تم ادخالهم بعد التصفير
select * from emp;
-- استرجاع جميع بيانات الموظفين من الجدول الجديد
delete from emp where
exists(select 1 from employees e where e.employee_id = emp.employee_id);
-- حذف جميع البيانات من الجدول الجديد بحسب عدد
سجلات الجدول القديم
/* Managing users ادارة المستخدمين */
alter session set
container = orelpdb; -- orelpdb تعديل الجلسة
والدخول لقاعدة بيانات
select * from
session_privs; -- استرجاع جميع الصلاحيات التي
يملكها المستخدم
select * from all_users;
-- استرجاع جميع البيانات من جدول المستخدمين
لقاعدة البيانات
select * from
user_tab_privs_recd; -- استرجاع جميع البيانات
وماهي الجداول الممنوحة للمستخدم استخدامها
select * from
user_col_privs_recd; -- استرجاع جميع البيانات
وماهي الحفول الممنوحة للمستخدم استخدامها
create user demo
identified by demo; -- انشاء مستخدم جديد مع كلمة
المرور بشكل عادي
alter user demo
identified by dd; -- demo تعديل كلمة المرور
للمستخدم
grant create session to
demo; -- demo منح صلاحية اتصال لقاعدة البيانات
للمستخدم
grant unlimited
tablespace to demo; -- منح مساحة لانهائية في
النطاق للمستخدم
grant create table to
demo; -- منح صلاحية انشاء جدول للمستخدم
grant create view to
demo; -- منح صلاحية اشاء عرض للمستخدم
grant select on
hr.employees to demo; -- hr منح صلاحية استرجاع
بيانات من جدول المستخدمين الخاص بالمستخدم
grant insert on
hr.employees to demo; -- hr منح صلاحية ادخال
بيانات لجدول الموظفين الحاص بالمستخدم
grant update on
hr.employees to demo; -- hr منح صلاحية تعديل
بيانات لجدول الموظفين الحاص بالمستخدم
grant update (email) on
hr.employees to demo; -- hr منح صلاحية تعديل
بيانات الراتب فقط من جدول الموظفين الخاص بالمستخدم
grant delete on
hr.employees to demo; -- hr منح صلاحيةحذف بيانات
لجدول الموظفين الحاص بالمستخدم
grant select on
hr.employees to public; -- منح صلاحية استرجاع
بيانات جدول الموظفين الخاص بمستخدم معين لجميع المستخدمين
revoke create session,
unlimited tablespace, create table, create view from demo; -- demo سحب صلاحية انشاء اتصال والمساحة التخزينة وانشاء جدول وانشاء
عرض من المستخدم
revoke select, insert,
update, delete on hr.employees from demo; -- hr سحب
صلاحية استرجاع وادخال وتعديل وحذف من جدول الموظفين الخاص بالمستخدم
create role man;
-- انشاء قاعدة لوضع داخلها عددت صلاحيات
grant create session to
man; -- منح صلاحية اتصال للقاعدة
grant create table,
create view, create any index to man; -- منح
صلاحية انشاء جدول انشاء عرض انشاء فهرس للقاعدة
grant man to demo; --
demo منح القاعدة بجميع الصلاحيات الموجودة داخلها
للمستخدم
select * from
role_sys_privs where role = 'MAN'; -- استرجاع
جميع البيانات والصلاحيات التي بداخل قاعدة محددة
drop user demo /* or
cascade */; -- حذف المستخدم مع جميع بياناتة
rollback; -- لعمل تراجع عن التغييرات او الاضافات الجديدة لجدول قبل
استخدام امر الحفظ
commit; -- لحفظ التغييرات او الاضافات الجديدة
يبحث الزوار عن: جميع اوامر
sql, تعلم sql من الصفر حتى الاحتراف, أوامر لغة
sql, لغة sql قواعد البيانات pdf, شرح
sql بالعربي pdf, تعلم لغة
sql