Department of Computer Science University of Cyprus EPL342 Databases Lecture 15: SQL DML II SQL Structured Query Language (Chapter 8.4-8.5, Elmasri-Navathe 5ED) Demetris Zeinalipour http://www.cs.ucy.ac.cy/courses/epl342 15-1
Πεξηερόκελν Γηάιεμεο Κεθάιαην 8.4-8.5.4: SQL DML I Σύγθξηζε Σπκβνινζεηξώλ κε LIKE Γηάηαμε Απνηειεζκάησλ κε ORDER-BY Σπγθξίζεηο κε NULLS (IS NULL), Εκθσιεπκέλεο Επεξσηήζεηο κε Σπζρέηηζε / Χσξίο Σπζρέηηζε (Correlated/Uncorrelated Nested Queries) Σύγθξηζε Σπλόισλ / Πνιύζπλόισλ ζε Επεξσηήζεηο SQL (EXIST, IN, op-all, op-any), Διαίρεση κε ρξήζε NOT EXISTS... EXCEPT 15-2
Σύγθξηζε Σπκβνινζεηξώλ κε LIKE Γηα ηελ ζύγθξηζε ζπκβνινζεηξώλ (substring matching) ζε SQL γίλεηαη ρξήζε ηνπ LIKE. WHERE Attribute [ NOT ] LIKE Pattern Attribute: Γλώξηζκα ή νπνηαδήπνηε έγθπξε έθθξαζε. Pattern: Σπκβνινζεηξά (ππό κνξθή «Καλνληθήο Έθθξαζεο») ε νπνία πξέπεη λα αλαδεηεζεί ζην attribute. To Pattern κπνξεί λα πεξηέρεη ραξαθηήξεο wildcard (next slide) Τν pattern κπνξεί λα είλαη κέρξη 8,000 bytes ζηελ TSQL Παξάδεηγκα SELECT FirstName, LastName, Phone FROM Person.Contact WHERE phone LIKE '415%' 15-3
Σύγθξηζε Σπκβνινζεηξώλ κε LIKE Wildcard character Πεξηγξαθή Παξάδεηγκα % Σπκβνινζεηξά 0 ή πεξηζζνηέξσλ ραξαθηήξσλ WHERE title LIKE '%computer%' finds all book titles with the word 'computer' anywhere in the book title. _ (underscore) Οπνηνζδήπνηε Φαξαθηήξαο WHERE name LIKE '_ean finds all four-letter first names that end with ean (Dean, Sean, and so on). [ ] Οπνηνζδήπνηε ραξαθηήξαο ζε εύξνο ([a-f]) ή ζύλνιν ([abcdef]). WHERE name LIKE '[C-P]arsen' finds author last names ending with arsen and starting with any single character between C and P, for example Carsen, Larsen, Karsen, and so on.. [^] Οπνηνζδήπνηε ραξαθηήξαο πνπ ΓΔΝ είλαη ζε επξνο ([^af]) ή ζύλνιν ([^abcdef]). WHERE name LIKE 'de[^l]%' all author last names starting with de and where the following letter is not l. 15-4
Σύγθξηζε Σπκβνινζεηξώλ κε LIKE Query 12: Βξεο ηνπο ππαιιήινπο πνπ γελλήζεθαλ θαηά ηελ δεθαεηία ηνπ 1950s. Θεσξήζηε όηη ε εκεξνκελία έρεη ηελ κνξθνπνίεζε: MMDDYYYY Σπλεπώο, ςάρλνπκε ην BDATE κε ηηκή 1 9 5_', όπνπ ην underscore ππνδειώλεη έλα απζαίξεην ραξαθηήξα. Q12: SELECT FNAME, LNAME FROM EMPLOYEE WHERE BDATE LIKE 1 9 5_ 15-5
Πξάμεηο ζε Απνηειέζκαηα ηεο Select Σηα πιαίζηα ηεο Σρεζηαθήο Άιγεβξαο είρακε δεη ηελ γεληθεπκέλε πξνβνιή ε νπνία επέηξεπε εθηέιεζε πξάμεσλ ζε απνηειέζκαηα ηεο SQL. π.ρ., Π Ταπηόηεηα, Μηζζόο-Απνθνπέο, 2000*Φξόληα_Υπεξεζίαο, 0.25*Μηζζόο (EMPLOYEE) Κάηη ηέηνην κπνξεί λα γίλεη θαη ζηα πιαίζηα ηεο SQL. Τέηνηεο πξάμεηο κπνξεί λα είλαη Σπλαξηήζεηο Σπκβνινζεηξώλ (Substring, θηι) Σπλαξηήζεηο Ηκεξνκεληώλ (Datediff, Getdate, θηι) Αξηζκεηηθέο πξάμεηο ('+', '-'. '*', and '/ ) Μαζεκαηηθέο θαη άιιεο Πξάμεηο (sqrt, PI, θηι.) Γείηε ην manual ηεο TSQL γηα παξαδείγκαηα 15-6
Πξάμεηο ζε Απνηειέζκαηα ηεο Select Παξαδείγκαηα Πξάμεσλ ζηελ SELECT 1. SELECT LastName,SUBSTRING(FirstName, 1, 1) AS Initial 2. SELECT FNAME, LNAME, 1.1*SALARY 3. SELECT SOUNDEX(Name) Επηζηξέθεη έλα θσδηθό 4 ραξαθηήξσλ πνπ κπνξεί λα αμηνπνηεζεί γηα λα απνηηκεζεί εάλ 2 strings αθνύγνληαη ην ίδην Π.ρ., SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe'); Επηζηξέθεη S530 S530 4. SELECT DIFFERENCE(Name, Surname) Βξίζθεη ηελ νκνηόηεηα δπν γλσξηζκάησλ βάζεη ηνπ SOUNDEX code. Λακβάλεη ππόςε κόλν ηα πξώηα 8000 bytes ησλ char, varchar ή text Παίξλεη ηηκέο από 0 (θακία νκνηόηεηα).. 4 (ίδηα) 15-7
Γηάηαμε Απνηειεζκάησλ κε ην ORDER BY Η όξνο ORDER BY ρξεζηκνπνηείηαη ζε κηα έθθξαζε SQL γηα λα ηαμηλνκνύληαη νη πιεηάδεο κηαο επεξώηεζεο βάζεη θάπνηνπ/σλ γλσξηζκάησλ πνπ δειώλνληαη. ORDER BY <attribute-list> [ASC DESC] Query 15: Τύπσζε ηα ζηνηρεία όισλ ησλ employees ηνπ department 5 ηαμηλνκεκέλα αλά επίζεην θαη κεηά αλά όλνκα Q15: SELECT * FROM EMPLOYEE E WHERE Δ.Dno=5 ORDER BY Δ.LNAME, E.FNAME Δπηζεκάλζεηο Γελ ρξεζηκνπνηείηαη γηα ntext, text, image, θηι. To ORDER BY κπνξεί λα αλαθέξεηαη ζε γλσξίζκαηα πνπ ΓΔΝ εκθαλίδνληαη ζην SELECT list Π.ρ., SELECT E.age FROM Emp E ORDER BY E.lname OK Γελ ηζρύεη κε SELECT DISTINCT ή GROUP BY ζε TSQL. Π.ρ., SELECT EPL342: DISTINCT Databases E.age - Demetris FROMZeinalipour Emp E ORDER (University BY of E.lname; Cyprus) WRONG default 15-8
NULLS ζε Δπεξσηήζεηο SQL Σε ηππηθέο γιώζζεο πξνγξακκαηηζκνύ, νη ινγηθέο εθθξάζεηο απνηηκνύληαη ζε TRUE ή FALSE. Σηελ SQL σζηόζν, ε ύπαξμε NULL ηηκώλ επηβάιεη ηελ ρξήζε ηεο Λνγηθήο Τξηώλ Τηκώλ (Three-value logic 3VL) Σπγθεθξηκέλα, κηα ινγηθή έθθξαζε κπνξεί λα απνηηκεζεί ζε TRUE, FALSE ή UNKNOWN Π.ρ., NULL AND TRUE απνηηκάηαη ζε UNKNOWN Η απνηίκεζε ινγηθώλ εθθξάζεσλ γίλεηαη κε βάζεη ησλ αθόινπζσλ πηλάθσλ αιεζείαο: 15-9
NULLS ζε Δπεξσηήζεηο SQL Παξάδεηγκα CREATE TABLE test ( id INTEGER PRIMARY KEY, age INTEGER CHECK (age < 0 AND age = 0 AND age> 0) ); Τη ζα γίλεη εάλ πξνζπαζήζνπκε λα εηζάγνπκε ην age=null; Θα απαγνξέςεη ηελ εηζαγσγή νπνηαζδήπνηε ηηκήο σζηόζν κπνξεί λα εηζαρζεί ην NULL Γηα λα απνθύγσ θαη ηα NULL πιήξσο: CREATE TABLE test (id INTEGER PRIMARY KEY, age INTEGER NOT NULL CHECK (.) ); 15-10
NULLS ζε Δπεξσηήζεηο SQL Μηα έθθξαζε ηνπ ηύπνπ WHERE Attribute=NULL, είλαη ΛΑΝΘΑΣΜΔΝΗ ζηελ SQL. Γηα ζύγθξηζε ελόο γλσξίζκαηνο κε NULL ζηελ SQL ρξεζηκνπνηείηαη ε έθθξαζε IS NULL ή IS NOT NULL. Δπηζεκάλζεηο ANSI: Γπν NULL ηηκέο είλαη αλεμάξηεηεο (δηαθνξεηηθέο) MSSQL: ΓΥΟ NULL ηηκέο είλαη νη ίδηεο (εμ νξηζκνύ). Δπνκέλσο ζε UNIQUE πεδίν δελ κπνξνύκε λα έρνπκε δπν εγγξαθέο κε ηηκή NULL. Απηό, επεηδή ππάξρεη ε εμ νξηζκνύ ξύζκηζε ANSI_NULLS OFF (ζηηο ξπζκίζεηο κηαο βάζεο) Δάλ ελεξγνπνηεζεί ε ελ ιόγσ κεηαβιεηή, κε SET ANSI_NULLS ON, ηόηε δπν δηαθξηηέο NULL ηηκέο ζα ζεσξνύληαη δηαθνξεηηθέο όπσο άιισζηε πξνβιέπεη θαη ην ANSI πξόηππν. 15-11
NULLS ζε Δπεξσηήζεηο SQL Relation CREATE TABLE test ( id int PRIMARY KEY, age INTEGER CHECK (age < 0 AND age = 0 AND age> 0 ) ); Query SELECT CASE FROM test; END WHEN age IS NULL THEN 'Null Result' -- when age is NULL WHEN age < 0 THEN Less than 0' WHEN age > 0 THEN Greater than 0' WHEN age = 0 THEN Equal 0' Δελ εθηεινύληαη πνηέ εάλ ε CHECK ζπλζήθε εθαξκόζηεθε από ηελ δεκηνπξγία ηεο ζρέζεο test. test: 1, NULL 2, NULL. Query Returns: 1, Null Result 2, Null Result. 15-12
NULLS ζε Δπεξσηήζεηο SQL Query 14: Βξεο ηα νλόκαηα όισλ ησλ ππαιιήισλ πνπ ΓΔΝ έρνπλ πξντζηάκελνπο (supervisors). Q14: SELECT FNAME, LNAME FROM EMPLOYEE WHERE SUPERSSN IS NULL Θπκεζείηε όηη εάλ ε ζπλζήθε κηαο ζπλέλσζεο παξνπζηάζεη NULL ηηκέο ηόηε απηέο νη πιεηάδεο ΓΔΝ πεξηιακβάλνληαη ζην απνηέιεζκα Π.ρ., (ssn=12345, dno=null) *(dno=1,dname= A ) Σην απνηέιεζκα πεξηιακβάλνληαη κόλν πιεηάδεο γηα ηηο νπνίεο ε ζπλζήθε ζπλέλσζεο απνηηκάηαη ζε TRUE To πην πάλσ ΓΔΝ ηζρύεη γηα Δμσηεξηθέο Σπλελώζεηο (LEFT/RIGHT/FULL OUTER JOIN) ηηο νπνίεο ζα δνύκε ζηελ εξρόκελε δηάιεμε. 15-13
Απαξηζκεηά Σύλνια ζε SQL (Enumerated Sets) Αληί γηα ινγηθή ζπλζήθε ζην WHERE ηεο SQL, κπνξνύκε λα θάλνπκε ηελ ζύγθξηζε-βάζεη-πξνζδηνξηζκέλνπζπλόινπ, π.ρ., Query 13: Αλάθηεζε ην SSN όισλ ησλ employees πνπ δνπιεύνπλ ζηα projects 1, 2, ή 3. Q13: SELECT DISTINCT ESSN FROM WORKS_ON WHERE PNO IN (1, 2, 3) Τν (1,2,3) απνηειεί έλα απαξηζκεηό (enumerated) ζύλνιν βάζεη ηνπ νπνίνπ ζα γίλεη ε ζύγθξηζε. Τν ΙΝ έρεη αληίζηνηρε ινγηθή κε ηνλ ηειεζηή ζπλόισλ Θα δνύκε θαη άιινπο όξνπο ζύγθξηζεο κε ζύλνια (ΑΝΥ, ALL, EXISTS, θηι.). 15-14
Δκθσιεπκέλεο Δπεξσηήζεηο (Nested Queries) Οη επεξσηήζεηο πνπ είδακε κέρξη ηώξα ήηαλ ζε έλα (1) SELECT-FROM-WHERE κπινθ. Σηελ SQL είλαη δπλαηό λα εκθσιεύνληαη ηα κπινθ θαηά αληίζηνηρν ηξόπν πνπ εκθσιεύνπκε ηηο επαλαιήςεηο ζε κηα γιώζζα πξνγξακκαηηζκνύ. Query1: Βξεο ην όλνκα θαη ηελ δηεύζπλζε όισλ ησλ ππαιιήισλ πνπ δνπιεύνπλ γηα ην 'Research' department. Q1: SELECT E.FNAME, E.LNAME, E.ADDRESS FROM EMPLOYEE E WHERE E.DNO IN ( SELECT D.DNUMBER FROM DEPARTMENT D WHERE D.DNAME='Research') Outer Query Inner Query 15-15
Δκθσιεπκέλεο Δπεξσηήζεηο (Nested Queries) ΚΑΘΔ Δκθσιεπκέλε Δπεξώηεζε κπνξεί λα αλαπαξαζηαζεί από Δπεξώηεζε 1-κπινθ (ζπλδπάδνληαο ηα ελδερνκέλσο κε πξάμεηο ζπλόισλ (UNION, EXCEPT, θηι) Θα δνύκε παξάδεηγκα ζε ιίγν Η Δκθώιεπζε κπνξεί λα γίλεη γηα όζα επίπεδα θάησ επηζπκνύκε (ζηελ TSQL κέρξη 32). Ωζηόζν ε βάζε δεδνκέλσλ δπζθνιεύεηαη λα βειηηζηνπνηήζεη ηέηνηεο επεξσηήζεηο, γηα απηό ε εκθώιεπζε πξέπεη λα ρξεζηκνπνηείηαη κε πξνζνρή. Γεληθά είλαη θαιή πξαθηηθή λα εθθξάδνπκε ηηο επεξσηήζεηο απιά ρσξίο βαζηέο εκθσιεύζεηο 15-16
Δκθσιεπκέλεο Δπεξσηήζεηο θαη Δκβέιεηα Γλσξηζκάησλ SELECT E.FNAME, E.LNAME, E.ADDRESS FROM. EMPLOYEE E WHERE E.DNO IN ( SELECT D.DNUMBER FROM DEPARTMENT D Γλώξηζκα Σύγθξηζεο WHERE D.DNAME='Research') Δκβέιεηα Γλσξηζκάησλ Φσξίο Πξόζεκα: Σεκεηώζηε όηη εάλ δελ θάλακε ρξήζε ησλ πξνζεκάησλ D, E ηόηε ε αλαθνξά ζε θάπνην γλώξηζκα ζα αλαθεξόηαλ ζην Inner Loop. Γηα ηελ εκβέιεηα ησλ κεηαβιεηώλ (scope), ρξεζηκνπνηνύληαη νπζηαζηηθά νη ίδηνη θαλόλεο πνπ ρξεζηκνπνηνύληαη ζηηο γιώζζεο πξνγξακκαηηζκνύ. Τν Γνώρισμα Σύγκρισης κπνξεί λα είλαη δηαηεηαγκέλε λ- άδα π.ρ., (E.DNO, E.ESSN) εθόζνλ ην INNER Block είλαη ζπκβαηό-σο-πξνο-ηνλ-ηύπν κε ην γλώξηζκα ζύγθξηζεο. 15-17
Δκθσιεπκέλεο Δπεξσηήζεηο (Φξήζε op-any, op-all) Οη εληνιέο op-any, op-all, όπνπ op είλαη έλαο ηειεζηήο ζύγθξηζεο (>, <, >=, <=, <>), ρξεζηκνπνηνύληαη γηα λα επεθηείλνπλ ηελ εθθξαζηηθή δύλακε ηεο SQL. Πξνϋπ: Σπκβαηόηεηα πξνο-ηύπν κεηαμύ Γλσξίζκαηνο-Inner Block Παξαδείγκαηα ΙΝ >= ALL IN (9) (εθόζνλ max=9) > ΑΝΥ IN (2, 4, 5, 6, 8, 9) (εθόζνλ min=1) <= ALL ΙΝ (1) (εθόζνλ min=1) 1, 2, 4, 5, 6, 8, 9 < ΑΝΥ IN (8, 6, 5, 4, 2, 1) (εθόζνλ max:9) Παξάδεηγκα ζε SQL: Βξεο ηνπο ππαιιήινπο πνπ έρνπλ ςειόηεξν κηζζό από θάζε ππάιιειν ζην ηκήκα 5 SELECT E.FNAME, E.LNAME Πξνζέμηε όηη κπνξνύκε λα FROM EMPLOYEE E ρξεζηκνπνηνύκε δπν θνξέο WHERE E.Salary > ALL ( ηελ δήισζε E (overriding). Σηνλ inner βξνρν SELECT E.Salary ρξεζηκνπνηείηαη ην inner-e FROM EMPLOYEE E ζην outer βξόρν ην outer-e EPL342: WHERE Databases E.Dno=5) - Demetris Zeinalipour (University of Cyprus) 15-18
Δκθσιεπκέλεο Δπεξσηήζεηο (Φξήζε op-any, op-all) Παξάδεηγκα ζε SQL: Βξεο ηνπο ππάιιεινπο πνπ έρνπλ ηνλ ςειόηεξν κηζζό από ην ηκήκα 5 κε ρξήζε ησλ ηειεζηώλ op-any, op-all SELECT E.FNAME, E.LNAME FROM WHERE EMPLOYEE E E.Dno=5 AND E.Salary >= ALL ( SELECT E.Salary FROM EMPLOYEE E WHERE E.Dno=5) Αξγόηεξα ζα δνύκε ηελ ίδηα Δπεξώηεζε κε ζπλαξζξνηζηηθή ζπλάξηεζε. SELECT E.FNAME, E.LNAME FROM EMPLOYEE E WHERE E.Dno=5 AND E.Salary = ( SELECT MAX(E.Salary) FROM EMPLOYEE E WHERE E.Dno=5) Δάλ INNER=(1000, 3000, 2000, 3000) ηόηε ην >=ALL query επηζηξέθεη 2 employees Δάλ ην query ήηαλ > ALL κε βάζεη ην πην πάλσ INNER ζα επέζηξεθε 0 employees Δάλ ην query ήηαλ = ALL κε βάζεη ην πην πάλσ INNER ζα επέζηξεθε 0 employees 15-19
Σπζρεηηδόκελεο Δκθσιεπκέλεο Δπεξσηήζεηο (Correlated Nested Queries) Όηαλ κηα ζπλζήθε ζην WHERE ηνπ Outer-block αλαθέξεηαη ζε θάπνην γλώξηζκα ηνπ Inner-block ηόηε νη δπν επεξσηήζεηο ιέγεηαη όηη είλαη Σπζρεηηδόκελεο (Correlated) Σεκείσζε: Η πξνεγνύκελε επεξώηεζε δελ ήηαλ ζπζρεηηδόκελε Query 12: Βξεο ην όλνκα θάζε employee πνπ έρεη έλα dependent κε ην ίδην όλνκα κε ηνλ employee. Q12: SELECT E.FNAME, E.LNAME FROM EMPLOYEE E Outer block WHERE E.SSN IN (SELECT D.ESSN FROM DEPENDENT D WHERE D.ESSN=E.SSN AND E.FNAME=D.DEPENDENT_NAME) Inner block 15-20
Δκθσιεπκέλεο Δπεξσηήζεηο vs. Δπεξσηήζεηο 1 Μπινθ ΚΑΘΔ Δκθσιεπκέλε Δπεξώηεζε κπνξεί λα αλαπαξαζηαζεί από Δπεξώηεζε 1-κπινθ (ζπλδπάδνληαο ηα ελδερ. κε πξάμεηο ζπλόισλ (UNION, EXCEPT, θηι) Κάπνηε ε εκθώιεπζε είλαη πην βνιηθή (δελ ηζρύεη πην θάησ) Αο δνύκε πσο αλαπαξηζηάηαη ε πξνεγνύκελε επεξώηεζε Query 12: Βξεο ην όλνκα θάζε employee πνπ έρεη έλα dependent κε ην ίδην όλνκα κε ηνλ employee. Φσξίο Δκθώιεπζε Q12A: SELECT E.FNAME, E.LNAME FROM EMPLOYEE E, DEPENDENT D WHERE E.SSN=D.ESSN AND E.FNAME=D.DEPENDENT_NAME Με Δκθώιεπζε Q12: SELECT E.FNAME, E.LNAME FROM EMPLOYEE E WHERE E.SSN IN (SELECT D.ESSN FROM DEPENDENT D WHERE D.ESSN=E.SSN AND E.FNAME = D.DEPENDENT_NAME) 15-21
Δκθσιεπκέλεο Δπεξσηήζεηο θαη ε Δληνιή EXISTS Η εληνιή EXISTS επηζηξέθεη TRUE εάλ ην απνηέιεζκα κηαο εκθσιεπκέλεο επεξώηεζεο ππάξρεη (ΓΔΝ είλαη θελό) WHERE [ΝΟΤ] EXISTS subquery Μηα επεξώηεζε κε EXISTS κπνξεί λα δηαηππώλεηαη θαη κε άιινπο ηξόπνπο (π.ρ., κε IN, Δλόο-block, θηι). Query 12b: Βξεο ην όλνκα θάζε employee πνπ έρεη έλα dependent κε ην ίδην όλνκα κε ηνλ employee. Q12B: SELECT E.FNAME, E.LNAME FROM EMPLOYEE E WHERE EXISTS (SELECT * FROM DEPENDENT D WHERE E.SSN=D.ESSN AND E.NAME = D.DEPENDENT_NAME) Τν EXISTS έρεη αληίζηνηρε ινγηθή κε ηνλ ππαξμηαθό πνζνδείθηε x: P(x) πνπ EPL342: ρξεζηκνπνηείηαη Databases - Demetris ζηνλ Zeinalipour νξηζκό (University ζπλόισλ of { Cyprus) x } 15-22
Δκθσιεπκέλεο Δπεξσηήζεηο θαη ε Δληνιή ΝΟΤ EXISTS Query 6 (Παξάδεηγκα NOT EXISTS): Βξεο ηα νλόκαηα ησλ employees πνπ ΓΔΝ έρνπλ dependents. Q6: SELECT E.FNAME, E.LNAME FROM EMPLOYEE E WHERE NOT EXISTS Δπηζεκάλζεηο: (SELECT * FROM DEPENDENT D WHERE E.SSN=D.ESSN) Πξνζέμηε όηη ε EXISTS αλαθέξεηαη ζπλήζσο ζε ζπζρεηηδόκελεο εκθσιεπκέλεο επεξσηήζεηο. 15-23 Δλαιιαθηηθά EPL342: ε Databases ζπλζήθε - Demetris απνηίκεζεο Zeinalipour (University ζα ήηαλ of Cyprus) θάηη ζηαζεξό.
Δκθσιεπκέλεο Δπεξσηήζεηο θαη ε Δληνιή EXISTS Query 6: Βξεο ηo SSN ησλ employees ρσξίο dependents. Q6a: Με 1-block Queries θαη Except (SELECT E.SSN FROM EMPLOYEE E) // ALL EXCEPT (SELECT DISTINCT D.ESSN FROM Dependent D) // WITH DEPENDENT Q6b: Με Φξήζε ηνπ IN SELECT E.SSN FROM EMPLOYEE E WHERE E.SSN NOT IN ( SELECT DISTINCT D.ESSN FROM DEPENDENT D) Q6c: Με Φξήζε EXISTS SELECT E.SSN FROM EMPLOYEE E WHERE NOT EXISTS ( SELECT * FROM DEPENDENT D WHERE D.ESSN=E.SSN) Τν DISTINCT (πάλσ ζε nonkey) κεηώλεη ηνλ αξηζκό ησλ ελδηάκεζσλ απνηειεζκάησλ Μπνξεί λα δηαηππσζεί ην Query ζε 1 block ρσξίο πξάμε ζπλόισλ; 15-24
Γηαίξεζε ζε SQL Παξόιν πνπ νη αξρηθέο εθδόζεηο ηεο SQL όξηδαλ εμεηδηθεπκέλε εληνιή δηαίξεζεο, ηελ CONTAINS, κηα ηέηνηα δπλαηόηεηα ΓΔΝ ππάξρεη ζηα λεόηεξα πξόηππα θαη πινπνηήζεηο: Δλδερόκελνη Λόγνη Δγθαηάιεηςεο ηνπ CONTAINS: Γπζθνιία Απνδνηηθήο Υινπνίεζεο Μεησκέλε Φξήζε ηεο ελ ιόγσ εληνιήο Σηα πιαίζηα απηνύ ηνπ καζήκαηνο ζεσξήζηε όηη ΓΔΝ ππάξρεη ε εληνιή δηαίξεζεο CONTAINS Γηα λα δηαηξέζνπκε δπν ζρέζεηο ζα ρξεζηκνπνηήζνπκε ηελ ινγηθή ηνπ NOT EXISTS. EXCEPT πνπ αθνινπζεί. Σεκεηώζηε όηη ζε TSQL, ε εληνιή CONTAINS ρξεζηκνπνηείηαη γηα θάηη δηαθνξεηηθό ηελ αλαδήηεζε ζε πεδία θεηκέλνπ (όπσο ε LIKE) 15-25
Γηαίξεζε ζε SQL (Τν CONTAINS ζηελ TSQL) H TSQL-CONTAINS ρξεζηκνπνηείηαη γηα Αλαδήηεζε Κεηκέλνπ ζε Γλσξίζκαηα ηεο Βάζεο (Freetext Search) Σπγθεθξηκέλα ππνζηεξίδεηαη ε Δπαθξηβήο Αλαδήηεζε (Exact Search) θαη ε Πξνζεγγηζηηθή Αλαδήηεζε (Proximity Search). Π.ρ., βξεο ζην πεδίν Description ηνπ πίλαθα Products, εάλ πεξηιακβάλεηαη ε ιέμε bicycle : SELECT Description FROM Products WHERE CONTAINS(Description, 'bicycle') ή WHERE CONTAINS(Description, 'bicycle NEAR performance'); Γηα επαθξηβή αλαδήηεζε είλαη αληίζηνηρν κε ην WHERE Description LIKE '%bicycle%', αιιά ην CONTAINS έρεη γεληθά κεγαιύηεξε εθθξαζηηθή δύλακε Μειεηήζηε όιεο ηηο δπλαηόηεηεο απηήο ηεο εληνιήο: http://msdn.microsoft.com/en-us/library/ms187787.aspx 15-26
Παξάδεηγκα Γηαίξεζεο ζε SQL Query 3: Βξεο ην όλνκα θάζε employee πνπ δνπιεύεη ζε ΚΑΘΔ project πνπ ειέγρεηαη από ην department number 5. 5 Q3: SELECT E.FNAME, E.LNAME FROM EMPLOYEE E WHERE NOT EXISTS (( (SELECT P.Pnumber FROM PROJECT P WHERE P.Dnum=5) EXCEPT (SELECT W.PNO FROM WORKS_ON W WHERE E.SSN=W.ESSN) ALL Projects by Department 5 ALL Projects of Current Employee (outer block) 15-27