Upload
russell-scott
View
228
Download
4
Embed Size (px)
Citation preview
SQL 5فصل
شرکتIBM دهه داده 1970در پایگاه مدیریت سیستم درSystem R نمود اسفاده زبان این از بار اولین برای
به نیاز شد استفاده زیادی های شرکت توسط که زمانیکرد پیدا شدن استاندارد
:استانداردها◦SQL-86◦SQL-89◦SQL-92◦SQL-99◦SQL-2003
جوی و پرس SQLزبان
مثال
sid sname rating age
22 dustin 7 45.0
31 lubber 8 55.558 rusty 10 35.0
sid sname rating age28 yuppy 9 35.031 lubber 8 55.544 guppy 5 35.058 rusty 10 35.0
sid bid day
22 101 10/10/9658 103 11/12/96
R1
S1
S2
ها قایقران جدول
CREATE TABLE "Sailors"( sid INTEGER NOT NULL, sname CHARACTER VARYING(30), age INTEGER, rating INTEGER, PRIMARY KEY (sid ))
ها قایق جدول
CREATE TABLE "Boats"( bid INTEGER NOT NULL, color CHARACTER VARYING(10), bname CHARACTER VARYING(10), PRIMARY KEY (bid ))
قایقران ) ارتباط رزرو جدول) ها قایق و ها
CREATE TABLE "Reserves"( sid INTEGER NOT NULL, bid INTEGER NOT NULL, date DATE NOT NULL, PRIMARY KEY (sid , bid , date ), FOREIGN KEY (bid) REFERENCES "Boats" (bid), FOREIGN KEY (sid) REFERENCES "Sailors" (sid))
relation-list: ) نظر ) مورد رابطه جداول اسامیtarget-list: نظر مورد های صفت یا ها ستون لیستqualification: انواع با خاص سطرهای انتخاب برای شرایط
یا ORیا ANDترکیبات وDISTINCT ) کار: ) به خروجی جدول رابطه در ها تکراری حذف برای
. در اما نیست، الزامی کلیدی کلمه این رود بر SQLمی عادی حالت در. کند نمی حذف را ها تکراری ای رابطه عملگرهای عکس
ساده SQLمثالSELECT [DISTINCT] target-listFROM relation-listWHERE qualification
, , , , ,
ساده جمله یک استراتژی SQLمفهوم یک با توان می را: نمود بیان زیر شکل به مفهومی
◦ Compute the cross-product of relation-list.◦ Discard resulting tuples if they fail qualifications.◦ Delete attributes that are not in target-list.◦ If DISTINCT is specified, eliminate duplicate rows.
. در کند نمی عمل بهینه اجرا برای استراتژی این البتهبرای هایی استراتژی از اجرا برای داده پایگاه های سیستم
. گردد می استفاده اجرا نمودن بهینه
Conceptual Evaluation Strategyمفهومی ارزیابی استراتژی
مفهومی ارزیابی استراتژیSELECT S.snameFROM Sailors S, Reserves RWHERE S.sid=R.sid AND R.bid=103
(sid) sname rating age (sid) bid day
22 dustin 7 45.0 22 101 10/ 10/ 96
22 dustin 7 45.0 58 103 11/ 12/ 96
31 lubber 8 55.5 22 101 10/ 10/ 96
31 lubber 8 55.5 58 103 11/ 12/ 96
58 rusty 10 35.0 22 101 10/ 10/ 96
58 rusty 10 35.0 58 103 11/ 12/ 96
یا باشند داشته نام هم های صفت رابطه دو که زمانیقسمت در بار چند رابطه باشد FROMیک آمده
A Note on Range Variables
SELECT S.snameFROM Sailors S, Reserves RWHERE S.sid=R.sid AND bid=103
SELECT snameFROM Sailors, Reserves WHERE Sailors.sid=Reserves.sid AND bid=103
It is good style,however, to userange variablesalways!OR
Would adding DISTINCT to this query make a difference?
What is the effect of replacing S.sid by S.sname in the SELECT clause? Would adding DISTINCT to this variant of the query make a difference?
Find sailors who’ve reserved at least one boat
SELECT S.snameFROM Sailors S, Reserves RWHERE S.sid=R.sid
Find sid’s of sailors who’ve reserved a red or a green boat
UNION: Can be used to compute the union of any two union-compatible sets of tuples (which are themselves the result of SQL queries).
If we replace OR by AND in the first version, what do we get?
Also available: EXCEPT (What do we get if we replace UNION by EXCEPT?)
SELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bid AND (B.color=‘red’ OR B.color=‘green’)
SELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’UNIONSELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘green’
Find sid’s of sailors who’ve reserved a red and a green boat
INTERSECT: Can be used to compute the intersection of any two union-compatible sets of tuples.
Included in the SQL/92 standard, but some systems don’t support it.
Contrast symmetry of the UNION and INTERSECT queries with how much the other versions differ.
SELECT S.sidFROM Sailors S, Boats B1, Reserves R1, Boats B2, Reserves R2WHERE S.sid=R1.sid AND R1.bid=B1.bid AND S.sid=R2.sid AND R2.bid=B2.bid AND B1.color=‘red’ AND B2.color=‘green’
SELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’INTERSECTSELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘green’
Key field!
اشتراک INTERSECTمعادل اجتماع UNIONمعادل تفاضل EXCEPTمعادل
در ای مجموعه SQLعملگرهای
A very powerful feature of SQL: a WHERE clause can itself contain an SQL query! (Actually, so can FROM and HAVING clauses.)
To find sailors who’ve not reserved #103, use NOT IN. To understand semantics of nested queries, think of a
nested loops evaluation: For each Sailors tuple, check the qualification by computing the subquery.
تودرتو ) جوی و NestedپرسQuery)
SELECT S.snameFROM Sailors SWHERE S.sid IN (SELECT R.sid FROM Reserves R WHERE R.bid=103)
Find names of sailors who’ve reserved boat #103:
EXISTS is another set comparison operator, like IN. If UNIQUE is used, and * is replaced by R.bid, finds
sailors with at most one reservation for boat #103. (UNIQUE checks for duplicate tuples; * denotes all attributes. Why do we have to replace * by R.bid?)
Illustrates why, in general, subquery must be re-computed for each Sailors tuple.
Nested Queries with Correlation
SELECT S.snameFROM Sailors SWHERE EXISTS (SELECT * FROM Reserves R WHERE R.bid=103 AND S.sid=R.sid)
Find names of sailors who’ve reserved boat #103:
We’ve already seen IN, EXISTS and UNIQUE. Can also use NOT IN, NOT EXISTS and NOT UNIQUE.
Also available: op ANY, op ALL, op IN Find sailors whose rating is greater than that of
some sailor called Horatio:
More on Set-Comparison Operators
, , , , ,
SELECT *FROM Sailors SWHERE S.rating > ANY (SELECT S2.rating FROM Sailors S2 WHERE S2.sname=‘Horatio’)
Similarly, EXCEPT queries re-written using NOT IN. To find names (not sid’s) of Sailors who’ve
reserved both red and green boats, just replace S.sid by S.sname in SELECT clause. (What about INTERSECT query?)
Rewriting INTERSECT Queries Using IN
Find sid’s of sailors who’ve reserved both a red and a green boat:
SELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’ AND S.sid IN (SELECT S2.sid FROM Sailors S2, Boats B2, Reserves R2 WHERE S2.sid=R2.sid AND R2.bid=B2.bid AND B2.color=‘green’)
Division in SQL
Let’s do it the hard way, without EXCEPT:
SELECT S.snameFROM Sailors SWHERE NOT EXISTS ((SELECT B.bid FROM Boats B) EXCEPT (SELECT R.bid FROM Reserves R WHERE R.sid=S.sid))
SELECT S.snameFROM Sailors SWHERE NOT EXISTS (SELECT B.bid FROM Boats B WHERE NOT EXISTS (SELECT R.bid FROM Reserves R WHERE R.bid=B.bid AND R.sid=S.sid))
Sailors S such that ...
there is no boat B without ...
a Reserves tuple showing S reserved B
Find sailors who’ve reserved all boats.
(1)
(2)
تجمیع عمگرهایAggregate Operators
در چشمگیر افزایشای رابطه جبر قابلیت های
COUNT (*)COUNT ( [DISTINCT] A)SUM ( [DISTINCT] A)AVG ( [DISTINCT] A)MAX (A)MIN (A)
SELECT AVG (S.age)FROM Sailors SWHERE S.rating=10
SELECT COUNT (*)FROM Sailors S
SELECT AVG ( DISTINCT S.age)FROM Sailors SWHERE S.rating=10
SELECT S.snameFROM Sailors SWHERE S.rating= (SELECT MAX(S2.rating) FROM Sailors S2)
ستون یک نام فقط
SELECT COUNT (DISTINCT S.rating)FROM Sailors SWHERE S.sname=‘Bob’
قایقران پیرترین سن و نام) قایقران ها)
اشتباه اول جوی و پرسبحث! ) در GROUP BYاست
) چرا که دید خواهیم دوم و سوم جوی و پرس
در و هستند هم معادلپیش SQL/92استاندارد
. از برخی ولی شده اند بینیجوی و پرس ها سیستم
. کنند نمی پشتیبانی را سوم
SELECT S.sname, MAX (S.age)FROM Sailors S
SELECT S.sname, S.ageFROM Sailors SWHERE S.age = (SELECT MAX (S2.age) FROM Sailors S2)
SELECT S.sname, S.ageFROM Sailors SWHERE (SELECT MAX (S2.age) FROM Sailors S2) = S.age
برای را تجمیع توابع بخواهیم است ممکن مواردی درباشیم داشته مجزا صورت به مختلف گروه های
:ورودی هر برای داده پایگاه درس نمرات میانگین مثال( :امتیاز سطح هر برای جوانترین( rating levelمثال
. کنید پیدا را قایقران◦ : را قایقران جوانترین امتیاز سطح هر ازای به سریع حل راه
می یابیمداریم؟؟؟ ◦ امتیاز سطح چند که نمی دانیم اما
Motivation for Grouping
SELECT MIN (S.age)FROM Sailors SWHERE S.rating = i
For i = 1, 2, ... , 10:
target-listنظر ◦ مورد ستون های لیستتجمیع )◦ عملیات با (MIN(S.age)ترم هایی
از زیرمجموعه یک باید ستون ها سطر grouping-listلیست و باشد . ) که ) کرد دقت باید است خاص گروه یک به مربوط پاسخ خروجی
در که مقدار target-listمواردی یک باید گروه هر ازای به آید می . باشد داشته
از یک هر می تواند می آید تجمیع عملیات یک داخل که ستونی ناماز که نیست الزامی باشد جدول باشد. grouping-listستون های
A group is a set of tuples that have the same value for all attributes in grouping-list.
با HAVINGو GROUP BYپرس وجو
SELECT [DISTINCT] target-listFROM relation-listWHERE qualificationGROUP BY grouping-listHAVING group-qualification
The cross-product of relation-list is computed, tuples that fail qualification are discarded, `unnecessary’ fields are deleted, and the remaining tuples are partitioned into groups by the value of attributes in grouping-list.
The group-qualification is then applied to eliminate some groups. Expressions in group-qualification must have a single value per group!◦ In effect, an attribute in group-qualification that is not
an argument of an aggregate op also appears in grouping-list. (SQL does not exploit primary key semantics here!)
One answer tuple is generated per qualifying group.
Conceptual Evaluation
rating minage 3 25.5 7 35.0 8 25.5
قایقران جوان گروه های قایقران ترینحداقل 18باالی که هم 2سال آنها نفر
هستند امتیاز
SELECT S.rating, MIN (S.age) AS minage
FROM Sailors SWHERE S.age >= 18GROUP BY S.ratingHAVING COUNT (*) > 1
sid sname rating age
22 dustin 7 45.0
29 brutus 1 33.0
31 lubber 8 55.5
32 andy 8 25.5
58 rusty 10 35.0
64 horatio 7 35.0
71 zorba 10 16.0
74 horatio 9 35.0
85 art 3 25.5
95 bob 3 63.5
96 frodo 3 25.5
Answer relation:
Sailors instance:
rating minage 3 25.5 7 35.0 8 25.5
Find age of the youngest sailor with age>=18, for each rating with at
least 2 such sailors.rating age
7 45.0
1 33.0
8 55.5
8 25.5
10 35.0
7 35.0
10 16.0
9 35.0
3 25.5
3 63.5
3 25.5
rating age
1 33.0
3 25.5
3 63.5
3 25.5
7 45.0
7 35.0
8 55.5
8 25.5
9 35.0
10 35.0
rating minage 7 35.0 8 25.5
Find age of the youngest sailor with age>=18, for each rating with at least 2 such sailors and with
every sailor under 60.
rating age
7 45.0
1 33.0
8 55.5
8 25.5
10 35.0
7 35.0
10 16.0
9 35.0
3 25.5
3 63.5
3 25.5
rating age
1 33.0
3 25.5
3 63.5
3 25.5
7 45.0
7 35.0
8 55.5
8 25.5
9 35.0
10 35.0
HAVING COUNT (*) > 1 AND EVERY (S.age <=60)
What is the result of changing EVERY toANY?
rating minage 3 25.5 7 35.0 8 25.5
Find age of the youngest sailor with age>=18, for each rating with at least 2
sailors between 18 and 60.
SELECT S.rating, MIN (S.age) AS minage
FROM Sailors SWHERE S.age >= 18 AND S.age <= 60GROUP BY S.ratingHAVING COUNT (*) > 1
sid sname rating age
22 dustin 7 45.0
29 brutus 1 33.0
31 lubber 8 55.5
32 andy 8 25.5
58 rusty 10 35.0
64 horatio 7 35.0
71 zorba 10 16.0
74 horatio 9 35.0
85 art 3 25.5
95 bob 3 63.5
96 frodo 3 25.5
Answer relation:
Sailors instance:
Grouping over a join of three relations. What do we get if we remove
B.color=‘red’ from the WHERE clause and add a HAVING clause with this condition?
What if we drop Sailors and the condition involving S.sid?
For each red boat, find the number of reservations for
this boatSELECT B.bid, COUNT (*) AS scountFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’GROUP BY B.bid
قسمتHAVING( پرس وجو زیر شامل تواند ( subqueryمیشود
قسمت اتفاق HAVINGاگر چه کنیم جایگزین زیر عبارت با را: افتاد خواهد
◦HAVING COUNT(*) >1
Find age of the youngest sailor with age > 18, for each rating with at least 2
sailors (of any age)SELECT S.rating, MIN (S.age)FROM Sailors SWHERE S.age > 18GROUP BY S.ratingHAVING 1 < (SELECT COUNT (*) FROM Sailors S2 WHERE S.rating=S2.rating)
. گردد استفاده تو در تو نمی تواند تجمیع اشتباه:عملیات
Find those ratings for which the average age is the minimum
over all ratings
SELECT S.ratingFROM Sailors SWHERE S.age = (SELECT MIN (AVG (S2.age)) FROM Sailors S2)
SELECT Temp.rating, Temp.avgageFROM (SELECT S.rating, AVG (S.age) AS avgage FROM Sailors S GROUP BY S.rating) AS TempWHERE Temp.avgage = (SELECT MIN (Temp.avgage) FROM Temp)
Correct solution (in SQL/92):
SELECT * FROM "Sailors" JOIN "Reserves" ON "Sailors".sid = "Reserves".sid ;
SELECT COUNT(*),sname FROM "Sailors" JOIN "Reserves" ON "Sailors".sid = "Reserves".sid GROUP BY "Sailors".sid;
SELECT COUNT(*),sname FROM "Sailors" JOIN "Reserves" ON "Sailors".sid = "Reserves".sid GROUP BY "Sailors".sid;
JOIN
Equi-Join: A special case of condition join where the condition c contains only equalities.
Natural Join: Equijoin on all common fields.
SELECT * FROM "Sailors" NATURAL JOIN "Reserves" ;
Equi or Natural Join
S Rsid
1 1
11 RS
SELECT * FROM "Sailors" LEFT OUTER JOIN "Reserves" ON "Sailors".sid = "Reserves".sid ;
SELECT COUNT(*),sname FROM "Sailors" LEFT OUTER JOIN "Reserves" ON "Sailors".sid = "Reserves".sid GROUP BY "Sailors".sid;
LEFT OUTER JOIN
Field values in a tuple are sometimes unknown (e.g., a rating has not been assigned) or inapplicable (e.g., no spouse’s name). ◦ SQL provides a special value null for such situations.
The presence of null complicates many issues. E.g.:◦ Special operators needed to check if value is/is not null. ◦ Is rating>8 true or false when rating is equal to null?
What about AND, OR and NOT connectives?◦ We need a 3-valued logic (true, false and unknown).◦ Meaning of constructs must be defined carefully. (e.g.,
WHERE clause eliminates rows that don’t evaluate to true.)
◦ New operators (in particular, outer joins) possible/needed.
Null Values
An IC describes conditions that every legal instance of a relation must satisfy.◦ Inserts/deletes/updates that violate IC’s are
disallowed.◦ Can be used to ensure application semantics (e.g., sid
is a key), or prevent inconsistencies (e.g., sname has to be a string, age must be < 200)
Types of IC’s: Domain constraints, primary key constraints, foreign key constraints, general constraints.◦ Domain constraints: Field values must be of right
type. Always enforced.
Integrity Constraints (Review)
محدودیت های عمومی
General Constraints
بیان برایمحدودیت های
بر عالوه جامعیتیکار به کلیدها
می رود محدودیت ها برای
نیز queryاز استفاده می توان
نمود
CREATE TABLE Sailors( sid INTEGER,sname CHAR(10),rating INTEGER,age REAL,PRIMARY KEY (sid),CHECK ( rating >= 1
AND rating <= 10 ) CREATE TABLE Reserves
( sname CHAR(10),bid INTEGER,day DATE,PRIMARY KEY (bid,day),CONSTRAINT noInterlakeResCHECK (`Interlake’ <>
( SELECT B.bnameFROM Boats BWHERE B.bid=bid)))
General Constraints: CHECK
Syntax: CHECK conditional-expression. The conditional expression captures more
general ICs than keys. The conditional expressions can use queries. The conditional expressions required to hold
only if the associated table is nonempty. A CHECK constraint may be expressed over
several tables; however, it is often expressed over one single table.
باشد داشته نیز نام می تواند محدودیت هر◦ CONSTRAINT MyConstraint
CHECK conditional-expression
CHECK Constraints: Examples
Constraint: Rating must be in the range 1 to 10
CREATE TABLE Sailors( sid INTEGER,sname CHAR(10),rating INTEGER,age REAL,PRIMARY KEY (sid),CHECK ( rating >= 1 AND rating <= 10 ))
CHECK Constraints: Examples
CREATE TABLE Reserves( sname CHAR(10),bid INTEGER,day DATE,PRIMARY KEY (bid,day),CONSTRAINT noInterlakeResCHECK (`Interlake’ <>
( SELECT B.bnameFROM Boats BWHERE B.bid=bid)))
Constraint: Interlake boats cannot be reserved
Constraints Over Multiple Relations
CREATE TABLE Sailors( sid INTEGER,sname CHAR(10),rating INTEGER,age REAL,PRIMARY KEY (sid),CHECK ( (SELECT COUNT (S.sid) FROM Sailors S)+ (SELECT COUNT (B.bid) FROM Boats B) < 100 )
CREATE ASSERTION smallClubCHECK ( (SELECT COUNT (S.sid) FROM Sailors S)+ (SELECT COUNT (B.bid) FROM Boats B) < 100 )
ها به عالوه تعداد قایقها باید رانتعداد قایق
باشد100کمتر از
General Constraints: ASSERTION
This solution is awkward and wrong:◦ It is wrongfully associated only with Sailors, though it
involves both Sailors and Boats.◦ If Sailors is empty, the number of Boats tuples can be
anything, since the conditional expression is not required to hold in such case!
CREATE TABLE Sailors( sid INTEGER,sname CHAR(10),rating INTEGER,age REAL,PRIMARY KEY (sid),CHECK ( (SELECT COUNT (S.sid) FROM Sailors S)+ (SELECT COUNT (B.bid) FROM Boats B) < 100 )
Constraint: Number of boats plus number of sailors is < 100
General Constraints: ASSERTION
The assertion is not associated with any one of the tables involved.
ASSERTION is the right solution; not associated with either table.
CREATE ASSERTION smallClubCHECK ( (SELECT COUNT (S.sid) FROM Sailors S)+ (SELECT COUNT (B.bid) FROM Boats B) < 100 )
Constraint: Number of boats plus number of sailors is < 100
General Constraints: Further Examples
Write SQL integrity constraints (domain, key, foreign key, or CHECK constraints; or assertions) for given requirements:◦ Students must have a minimum cgpa of 5.◦ Every TA must also be a student.◦ The total percentage of all assignments to projects for a
given student must be at most 100%.◦ A TA must have a cgpa higher than any student that she
coaches.
Schema: Students(sid: int, sname: string, age: int, cgpa: real)
Works(sid: int, pid: int, pct_time: int) Projects(did: int, budget: real, ta: int)
General Constraints: Further Examples (1)
Constraint: Students must have a minimum cgpa of 5. CREATE TABLE Students
( sid INTEGER,sname CHAR(10),age REAL,
cgpa REAL,PRIMARY KEY (sid),CHECK ( cgpa >= 5))
Constraint: Every TA must also be a student.
CREATE ASSERTION TAisStudentCHECK ( (SELECT COUNT (*) FROM Projects P WHERE P.ta_id NOT IN (SELECT sid
FROM Students)) =0 )
General Constraints: Further Examples (2)
Constraint: The total percentage of all assignments to
projects for a student must be at most 100%.
CREATE TABLE Works( sid INTEGER,pid INTEGER,pct_time INTEGER,PRIMARY KEY (sid,pid),
FOREIGN KEY (sid) REFERENCES Students, FOREIGN KEY (pid) REFERENCES Projects,
CHECK ((SELECT COUNT (W.stid) FROM Works W
GROUP BY W.stid HAVING SUM(pct_time) > 100) = 0)
General Constraints: Further Examples (3)
CREATE ASSERTION TAHigherCGPACHECK ((SELECT COUNT(S.stid) FROM Students S, Students TA, Works W, Projects P WHERE S.sid=W.sid AND W.pid=P.pid AND P.ta=TA.sid AND S.cgpa > TA.cgpa) =0)
Constraint: A TA must have a cgpa higher than any student that she coaches.
Trigger :) زمانی ) که عملیات از مجموعه ای تفنگ ماشهدر مشخصی تغییر که شود می .DBMSاجرا شود ایجاد
: اصلی قسمت سه◦Event : ) ( که سازد Triggerواقعه ای می فعال را◦Condition :)( باشد قرار بر .Triggerاگر می گردد اجرا◦Action :)( شوند اجرا باید که عملیاتی
Triggers
BEFORE :داخل از triggerعملیات eventاجرای قبلمی شود اجرا اصلی
AFTER :داخل از triggerعملیات اصلی eventاجرای بعدمی شود اجرا
INSTEAD :داخل جای triggerعملیات eventاجرای به . یعنی می شود اجرا و Eventاصلی نمی شود اجرای اصلی
داخل می شود triggerعملیات اجرا Row-level trigger: executed once per modified
row (that satisfies the trigger condition). Statement-level trigger: executed once per
modifying statement. Transition variables: NEW, OLD, NEW TABLE, OLD
TABLE.
Triggers
CREATE TRIGGER incr_count AFTER INSERT ON Sailors
WHEN (new.age < 18)FOR EACH ROWBEGIN
count:=count+1;END
Triggers: Example (SQL:92)
برای دسترسی با داده های اضافه شده NEWاز یک رابطه شود اخیر یا مقادیر جدید به روز شده استفاده می
Increment a count for each newly inserted sailor whose age < 18.
CREATE TRIGGER youngSailorsUpdateAFTER INSERT ON Sailors
REFERENCING NEW TABLE AS NewSailorsFOR EACH STATEMENT /* This is the default */
INSERTINTO YoungSailors(sid, name, age, rating)SELECT sid, name, age, ratingFROM NewSailors NWHERE N.age <= 18
Triggers: Example (SQL:1999)
Save newly inserted sailors aged < 18 in a special table.
Illustrates use of NEW TABLE to refer to a set of newly inserted tuples Exists since SQL:1999
CREATE TRIGGER bumpTAcgpaAFTER UPDATE ON Students
WHEN OLD.cgpa < NEW.cgpaFOR EACH ROWBEGIN UPDATE Students S SET S.cgpa = NEW.cgpa WHERE S.cgpa < NEW.cgpa AND S.sid IN (SELECT P.ta
FROM STudents S1, Works W, Projects P WHERE S1.sid = NEW.sid
AND S1.sid = W.sid AND W.sid = P.sid);END
Triggers: More Elaborated Example
Whenever a student is given a (bonus) raise on his cgpa, the TA’s cgpa must be increased to be at least as high.
Illustrates use of Oracle PL/SQL syntax in the action part.
آشنايي با يک زبان رابطه SQLاي :
انواع زبانهاي رابطه اي
SQUARESEQUELSQLQUELQBEDATALOG
SQLامكانات مهم زبان
دستورات تعريف داده ها• دستورات مجازشماري• دستورات پردازش داده ها• دستورات پردازش داده ها به طور ادغام شدني• دستورات نوشتن ماژول و رويه• دستورات كنترل جامعيت• دستورات كنترل تراكنشها•
دستورات تعريف 1.داده ها
- تعريف شما :1- 1
CREATE SCHEMA
AUTHORIZATION USER
{base – table definition , view definition , grant-operation }
دستورات تعريف 1.داده ها
- انواع داده اي:2- 1CHARACTER[(length)]
INTEGER
DECIMAL [(precision[,scale])]
SMALLINT
DOUBLE PRECISION
REAL
FLOAT [(precision)]
NUMERIC [(precision[,scale])]
- دستور ايجاد جدول :3- 1
CREATE SCHEMA
AUTHORIZATION …
CREATE TABLE …
دستورات تعريف 1.داده ها
- دستور حذف جدول:4- 1
DROP TABLE table-name
دستورات تعريف 1.داده ها
- دستور ايجاد و حذف ديد:5- 1
CREATE VIEW …
DROP VIEW …
دستورات تعريف 1.داده ها
- دستور مجاز شماري:6- 1GRANT , REVOKE
با اين دستور حق انجام يك يا بيش از يك عمل به كاربر (كاربراني) داده مي شود.
دستورات تعريف 1.داده ها
- دستورات پردازش 2داده ها
):SELECT - دستور بازيابي (1- 2
SELECT [ALL | DISTINCT] item(s)-list
FROM table(s)-name
[WHERE condition(s)]
[GROUP BY column(s)]
[HAVING conditions(s)]
توابع جمعي (گروهي)
• COUNT.تعداد مقادير اسكالر را به دست مي دهد :
• SUM حاصل جمع مقادير اسكالر در يك ستون را :به دست مي دهد.
• AVG ميانگين مقادير اسكالر در يك ستون را به :دست مي دهد.
• MAX بيشترين مقدار اسكالر در يك ستون را به :دست مي دهد.
• MIN كمترين مقدار اسكالر در يك ستون را به :دست مي دهد.
يك مثال در مورد استفاده از توابع جمعي
SELECT MIN(GRADE) , MAX(GRADE)
FROM STCOT
WHERE TR=‘2’
AND
YRYR=’78-79’
AND
COID=‘COM222’;
در ترم COM222باالترين و پايين ترين نمره در درس را بازيابي مي كند.79-80دوم
و LIKEامكان NOTLIKE
با اين دو امكان مي توان داده هاي مورد نظر را با دادن يك رشته كاراكتري به عنوان نشانوند جستجو و بيان شرايط مورد نظر، بازيابي كرد.
SELECT*
FROMPROF
WHEREPRNAMELIKE‘AR%’;
مثال: مشخصات استاداني را بدهيد كه نام آنها با AR.شروع شده باشد
آزمون تست وجود هيچمقدار در يك ستون
وجود هيچ ISNULLمي توان با امكان مقدار در يك ستون را تست كرد.
مثال: شماره دانشجوياني را بدهيد كه نمره آنها در درس SOC333 هنوز اعالم نشده است؟78-79 در ترم دوم
SELECT STID
FROM STCOT
WHERE COID=‘SOC333’
AND
TR=‘2’
AND
YRYR=’78-79’
AND
GRADE IS NULL
UNION و UNIONامكان ALL
با اين امكان، مي توان عملكرد عملگر UNION جبري را برنامه سازي كرد. حاصل
اين عملكرد، جدولي است كه سطرهاي استفاده ALLتكراري ندارد. اگر از گزيدار
شود، سيستم ديگر سطرهاي تكراري را در صورت وجود، حذف نمي كند.
: GROUP BYامكان (گروه بندي)
با اين امكان مي توان سطرهاي جدول را حسب مقادير يك ستون ساده گروه بندي كرد به نحوي كه در هر گروه، مقدار آن ستون يكسان باشد.
را برحسب مقادير ستون STCOTمثال: جدول COID.منطقا گروه بندي كنيد
SELECTCOID,AVG(GRADE)ASAVGGR
FROMSTCOT
GROUPBYCOID;
HAVINGامكان
با اين امكان مي توان شرط (شرايطي) ناظر به گروه سطرها اعالن كرد. نقش اين امكان
در سطر است. WHEREدر واقع همان نقش هميشه با HAVINGتوجه داشته باشيد كه
GROUPBY.مي آيد
-79مثال: شماره درسهايي را بدهيد كه در ترم دوم دانشجو در آنها ثبت نام كرده باشند.10 كمتر از 78
SELECTSTCOT.COID
FROMSTCOT
WHERETR=‘2’
AND
YRYR=’78-79’
GROUPBYCOID
HAVINGCOUNT(*)<10
BETWEENامكان
شكل كلي اين امكان چنين است:Scalar-expression[NOT]BETWEENScalar-expressionANDScalar-expression
مثال: شماره دانشجوياني را بدهيد كه نمره آنها در 19 و 15 بين 77-78 در ترم اول HIS444درس SELECTSTCOT.STIDباشد.
FROMSTCOT
WHERETR=‘1’
AND
YRYR=’78’79’
AND
GRADEBETWEEN’15’AND’19’
- دستورات پردازش 2داده ها
- دستورات عمليات 2- 2ذخيره سازي :
براي انجام عمليات سه گانه ذخيره سازي سه وجود UPDATE و DELETE، INSERTدستور
دارد.
دستور UPDATE
شكل كلي اين دستور چنين UPDATEtable-nameاست:
SETassignment-commalist
[WHERECondition(s)]
مثال: تعداد واحد درسهاي عملي را يك واحد UPDATECOTكاهش دهيد.
SETCREDIT=CREDIT-1
WHERECOTYPE=‘p’;
دستور DELETE
شكل كلي اين دستور چنين DELETEاست:
FROMtable-name
[WHERECond(s)]
را در 78110555مثال: درسهاي دانشجوي با شماره حذف كنيد78-79ترم دوم سال
DELETE
FROMSTCOT
WHERESTID=‘78110555’
AND
TR=‘2’
AND
YRYR=’78-79’;
دستور INSERT
اين دستور دو شكل كلي INSERTINTOtable-nameدارد:
Values(onerow);
INSERTINTOtable-name
Subquery;
در شكل دوم، تعدادي سطر در جدول درج مي شوند.
مثال: اطالعات درسي زير را در <COM888,2,78-79,12,78110888>جدول درج نمائيد.
INSERTINTOSTCOT
VALUES<‘78110888’,‘COM888’,2,78-79,12>;
جمع بندي در مورد امكانات SQL1نسخه
- نارويه اي است.1
- داراي كمال ساختاري است.2
- زبان استانده سيستم هاي رابطه اي موجود 3است.
- تمام انواع داده اي ساده را دارد.4
- عملگرهاي بسيار قوي دارد.5
- يادگيري آن ساده است.6
- استقالل داده اي را تامين مي كند.7
- هم به صورت مستقل و هم به صورت 8ادغام شده قابل استفاده است.
SQL2دستوراتي كه در نسخه تغيير كردند يا به آن اضافه
شدند: دستور تعريف 1.
داده ها
دستور تعريف 2.ميدان
انواع داده اي3.
دستور تغيير 4.ميدان
دستور حذف 5.ميدان
دستور ايجاد 6.جدول
دستور تغيير 7.جدول
. دستور حذف جدول8
. تعريف جدول موقت9
. دستور بازيابي10
امكانات جامعيتي11.
امكانات ايمني12.
.13 SQLپويا
امكانات جامعيتي
كاربر مي تواند زمان وارسي جامعيت پايگاه را (براساس محدوديتها و قواعد داده شده) خود مشخص كند. مي تواند درخواست كند كه اين وارسي بالفاصله باشد يا با تاخير. براي اين
SETCONSTRAINTS(constraint-name)منظور از امكان زير استفاده مي شود:
{DEFERRED|IMMEDIATE}
امكانات ايمني
كاربر مي تواند امتياز دستيابي به اشياء تعريف شده در شما را به منظور انجام عمل
مشخص، به كاربر ديگري بدهد. و براي GRANTبراي اعطاي امتياز از دستور
استفاده مي شود.REVOKEلغو آن از دستور
امتيازهايي كه يك كاربر مي تواند به يك كاربر ديگر بدهد:
• USAGEاجازه استفاده از يك ميدان :• SELECTاجازه دستيابي به تمام ستونهاي يك جدول :• INSERT(X) اجازه درج يك مقدار در ستون :Xاز يك جدول • INSERTاجازه درج تمام ستونهاي يك جدول :• UPDATE(X) اجازه بهنگام سازي ستون :Xاز يك جدول • UPDATEاجازه بهنگام سازي تمام ستونهاي يك جدول :• DELETEاجازه حذف سطر(ها) از يك جدول :• REFRENCES(X) اجازه ارجاع به ستون :X از يك جدول در
تعريف محدوديتهاي جامعيتي
امتيازها
SQL3دستوراتي كه در نسخه تغيير كردند يا به آن اضافه
شدند: تعريف نوع داده مجرد1.تعريف زيرنوع2.امكان تعريف زيرجدول و زبرجدول3.امكان ارث بري ستونهاي جدول جديد از ستونهاي 4.
جدول نامدار موجودرويه اي شدن زبان5.رهانا6.نوشتن رويه7..8SQLادغام شده واسط درخواست فراخوان9.
دستورات كنترل تراكنشها10.
هدفهاي كلي: آشنايي با ديد در مدل رابطه اي
هدفهاي رفتاري: دانشجو در پايان اين جلسه مي تواند:
مرتبت با آن را SQL ديد را تعريف كند و دستورات •بكار برد.
مزاياي استفاده از ديد را برشمارد.•
عمليات قابل انجام روي ديد را شرح دهد.•
انواع ديد از لحاظ پذيرا و ناپذيرا را نام ببرد.•
ديدهاي رابطه اي
ديد در مدل رابطه اي نوعي رابطه است، بنابراين مي توان آن را به كمك
يك عبارت جبر رابطه اي يا حساب رابطه اي به شكل زير تعريف كرد:
Viewname=Relationalexpression
ديد در SQL
دستور ايجاد CREATEVIEWViewname[(Column-name(s))]ديد
ASSubquery
.
.
.
[WITH[CASCADE|LOCAL]CHECKOPTION];
مثالCREATEVIEWMAPHSTUD(STNUM,STLEV,STAREA)
ASSELECTSTID,STDEG,STMJR
FROMSTT
WHERESTMJR=‘Math’ORSTMJR=‘Phys’
WITHLOCALCHECKOPTION;
SQLديد در
دستور حذف ديد
DROPVIEWViewname{restrict|cascade}
مثال:
DROPVIEWMAPHSTUDCASCADE;
مزاياي ديد
تامين كننده محيط انتزاعي براي كاربران سطح 1.خارجي
تامين كننده پويايي باال در تعريف پايگاه توسط 2.كاربر
تسهيل كننده واسط كاربر برنامه ساز با پايگاه3.
امكاني است براي كوتاه نويسي يا ماكرونويسي 4.پرسشها
تامين كننده اشتراك داده اي5.
تامين كننده نوعي مكانيسم خودكار ايمني داده ها6.
تامين كننده استقالل داده اي فيزيكي و منطقي7.
امكان تعريف شيئ با اندازه هاي مختلف8.
معايب ديد
ايجاد فزونكاري در سيستم براي انجام 1.تبديل خارجي/ادراكي و احيانا
خارجي/خارجي
عدم امكان انجام عمليات ذخيره سازي 2.در بسياري از گونه هاي ديد و در نتيجه
ايجاد محدوديت براي كاربر
عمليات در ديدهاي رابطه اي
بازيابي از ديد رابطه اي
چون ديد خود نوعي رابطه است، پس براي بازيابي از ديد هم يك عبارت
جبري يا حسابي مي نويسيم
مثال بازيابي از يك ديد با استفاده از SQLCREATEVIEWدستورات
ASSELECTSTID,STDEG
FROMSTT
WHERESTPROG=‘Math’
1V
SELECTSTID
FROM
WHERESTDEG=‘bs’;1V
عمليات در ديدهاي رابطه اي
عمليات ذخيره سازي در ديدهاي رابطه اي
براي انجام عمليات ذخيره سازي در ديد از INSERT، UPDATEهمان دستورات سه گانه
استفاده مي شود.DELETEو
ديدها از نظر پذيرش عمليات ذخيره سازي
ديدهاي 1.پذيرا
ديدهاي 2.ناپذيرا
ديدهاي پذيرا
ديدهاي گزينشي1.
ديد گزينش – پرتوي داراي كليد 2.رابطه مبنا
CK-CKديد پيوندي 3.
CK-FKديد پيوندي 4.
ديد حاصل اجتماع، اشتراك و 5.تفاضل دو رابطه
ديد گزينشي حاصل عملگر گزينش در يك رابطه است.
در ديد ”گزينش-پرتوي داراي كليد رابطه مبنا“ عالوه بر گزينش
تاپلهايي از رابطه مبنا، عملگر پرتو نيز اعمال شده است. اين نوع ديد
را اصطالحا ديد داراي كليد با تاپلهاي ناقص مي گوئيم.
، حاصل پيوند CK-CKديد پيوندي دو رابطه روي كليد كانديد مشترك
آنها است و در عمليات ذخيره سازي مشكلي ندارد
، حاصل پيوند روي CK-FKديد پيوندي كليد كانديد يك رابطه و كليد خارجي رابطه ديگر است. اين ديد در حذف
مشكل دارد، زيرا با حذف يك تاپل از اين ديد، در هريك از دو رابطه مبنا، يك تاپل حذف مي شود و چنانچه كاربر بخواهد
محتواي ديد خود را نمايش دهد، تاپلهاي ديگر هم از ديد او حذف مي شوند كه
درخواست نكرده است.
ديد حاصل اجتماع، اشتراك و تفاضل دو رابطه در عمليات
ذخيره سازي مشكلي ندارد، به شرط آنكه سيستم بتواند تشخيص دهد كه عمل درخواست شده، در كداميك از دو رابطه مبنا انجام
شود.
مشكالت مهمتر ديدهاي پذيرا
بروز عارضه جانبي در خود •ديد
بروز عارضه جانبي در ديدهاي •ديگر
نقض قاعده جامعيت•
بروز فزونكاري در سيستم•
تغيير ماهيت عمل درخواست •شده
تعدد تبديالت و مشكل •تصميم گيري
ديدهاي ناپذيرا
ديد پرتوي يا گزينشي فاقد كليد 1.رابطه مبنا
NK-NK ديد پيوندي 2.
FK-FK ديد پيوندي 3.
ديد حاوي صفت مجازي4.
ديد حاصل تقسيم5.
ويژگيهاي ديدهاي قابل بهنگام سازي
SELECTعبارت تعريف كننده محدوده ديد، يك عبارت معتبر 1.باشد.
، فقط يك جدول وجود داشته SELECT، عبارت FROMدر كالز 2.باشد.
، يك جدول مبنا يا يك ديد قابل FROMجدول قيدشده در كالز 3.بهنگام سازي باشد.
، ستونهاي مورد نظر بايد در جدول SELECT عبارت item-listدر 4.مبنا متناظر باشد.
و گزينه HAVING و GROUPBY نبايد كالز SELECTدر عبارت 5.DISTINCT.وجود داشته باشد
FROM نبايد عبارتي حاوي كالز SELECT عبارت WHEREدر كالز 6.باشد، به گونه اي كه در آن به همان جدولي ارجاع داده شده
قبلي به آن ارجاع شده است.FROMباشد كه در كالز