390 likes | 501 Views
More about SQL. Nested SELECT Other Joins Views Index. SQL2 - DML. (Q16): Sub queries (nested SELECTs) SELECT E.FNAME, E.LNAME FROM EMPLOYEE E WHERE E.SSN IN (SELECT ESSN FROM DEPENDENT WHERE ESSN = E.SSN AND E.FNAME = DEPENDENT_NAME AND SEX = E.SEX)
E N D
More about SQL Nested SELECT Other Joins Views Index NOEA/IT FEN - Databases/SQL
SQL2 - DML (Q16): Sub queries (nested SELECTs) SELECT E.FNAME, E.LNAME FROM EMPLOYEE E WHERE E.SSN IN (SELECT ESSN FROM DEPENDENT WHERE ESSN = E.SSN AND E.FNAME = DEPENDENT_NAME AND SEX = E.SEX) Also ANY (SOME) and ALL in combination with comparison operators (>, >=, <, >= and <>). NOEA/IT FEN - Databases/SQL
SQL2 - DML (Q16): Sub queries (nested SELECTs) SELECT E.FNAME, E.LNAME FROM EMPLOYEE E WHERE E.SSN IN (SELECT ESSN FROM DEPENDENT WHERE ESSN = E.SSN AND E.FNAME = DEPENDENT_NAME AND SEX = E.SEX) For each row in outer table (E), the inner SELECT is executed. If E.SSN is contained in the result of the inner SELECT, then E is included in the result table for the outer SELECT. NOEA/IT FEN - Databases/SQL
SQL2 - DML (Q7): Existential quantifier - EXISTS: SELECT FNAME, LNAME FROM EMPLOYEE WHERE EXISTS (SELECT * FROM DEPENDENT WHERE SSN = ESSN) AND EXISTS (SELECT * FROM DEPARTMENT WHERE SSN = MGRSSN) NOEA/IT FEN - Databases/SQL
SQL2 - DML (Q6): NOT EXISTS: SELECT FNAME, LNAME FROM EMPLOYEE WHERE NOT EXISTS (SELECT * FROM DEPENDENT WHERE SSN =ESSN) NOEA/IT FEN - Databases/SQL
SQL2 - DMLFor All i SQL • Although SQL is supposed to be an implementation of first order predicate logic, it does not support the universal qualifier (FORALL), only the existential quantifier (EXISTS) is supported. • A well known (?) result from predicate logic can be used in a workaround: • Retrieving all elements satisfying some predicate is equivalent to retrieving elements that are not in the set of elements that do not satisfy the predicate: SELECT * FROM --- WHERE NOT EXISTS (SELECT * FROM --- WHERE NOT EXISTS ---- NOEA/IT FEN - Databases/SQL
A Side: Predicate Logic • Let x be an arbitrary element in some set and p a predicate stating some condition on x: • De Morgan’s Law: (x: p(x)) x: p(x) Apply to p(x): (x: p(x)) x: (p(x)) Reduce the right hand side: x: p(x) (x: p(x)) “it is not true that there exists x, so p(x) is not true” – that is: “p is true for all x” SELECT * FROM --- WHERE NOT EXISTS (SELECT * FROM --- WHERE NOT EXISTS ---- NOEA/IT FEN - Databases/SQL
SQL2 - DML (Q3B): ”Retrieve the name of each employee who works on all projects controlled by department number 5” SELECT LNAME, FNAME FROM EMPLOYEE WHERE NOT EXISTS (SELECT * FROM WORKS_ON B WHERE (B.PNO IN (SELECT PNUMBER FROM PROJECT WHERE DNUM = 5)) AND NOT EXISTS (SELECT * FROM WORKS_ON C WHERE C.ESSN = SSN AND C.PNO=B.PNO)) NOEA/IT FEN - Databases/SQL
SQL2 – DML: SELECT Queries: SELECT <attribute-list> FROM <tables> [WHERE <condition>] [GROUP BY <attribute-list>] [HAVING <condition>] [ORDER BY <attribute-list>] [...]: WHERE, GROUP BY, HAVING and ORDER BY may be omitted. NOEA/IT FEN - Databases/SQL
SQL2 - DML SELECT DISTINCT ESSN FROM WORKS_ON WHERE PNO IN (1,2,3) SELECT FNAME, LNAME FROM EMPLOYEE WHERE SUPERSSN IS NULL NOEA/IT FEN - Databases/SQL
SQL2 - DML SELECT E.LNAME AS EMP_NAME, S.LNAME AS SUPER_NAME FROM EMPLOYEE AS E, EMPLOYEE AS S WHERE E.SUPERSSN = S.SSN New coulomb names in the resulting table. AS may be omitted in FROM part. NOEA/IT FEN - Databases/SQL
SQL2 - DML Alternative notations for join: SELECT FNAME, LNAME, ADDRESS FROM (EMPLOYEE JOIN DEPARTMENT ON DNO=DNUMBER) WHERE DNAME = ’Research’ Provides a more clear syntax and opens for more specialised joins. NOEA/IT FEN - Databases/SQL
SQL2 - DML Natural join (not MS SQL Server): (Q1B): SELECT FNAME, LNAME, ADDRESS FROM (EMPLOYEE NATURAL JOIN (DEPARTMENT AS DEPT (DNAME,DNO,MSSN,MSDATE))) WHERE DNAME = ’Research’ DEPARTMENT.DNUMBER must be rename to DNO in order to match EMPLOYEE.DNO. Natural join is over two attributes with the same name (EMPLOYEE.DNO = DEPT.DNO). NOEA/IT FEN - Databases/SQL
SQL2 - DML Outer join: SELECT E.LNAME AS EMP_NAME, S.LNAME AS SUPER_NAME FROM EMPLOYEE AS E, EMPLOYEE AS S WHERE E.SUPERSSN = S.SSN Retrieves only employees who have a supervisor. Left Outer Join retrieves all employees and inserts NULL in the S-attributes for employees with no supervisor. SELECT E.LNAME AS EMP_NAME, S.LNAME AS SUPER_NAME FROM (EMPLOYEE E LEFT OUTER JOIN EMPLOYEE S ON E.SUPERSSN = S.SSN) Also RIGTH OUTER JOIN and FULL OUTER JOIN. NOEA/IT FEN - Databases/SQL
SQL2 - DML NOEA/IT FEN - Databases/SQL
What about employees with no supervisor? NOEA/IT FEN - Databases/SQL
Here they are! NOEA/IT FEN - Databases/SQL
SQL2 - DML NOEA/IT FEN - Databases/SQL
SQL2 - DML NOEA/IT FEN - Databases/SQL
SQL2 - DML Also: • CROSS JOIN (Cartesian Product) • UNION JOIN • SQL2 provides many different ways of expressing the same join: • This can be view as an advantage: • More simple expressions • Or as an disadvantage: • More complicated language NOEA/IT FEN - Databases/SQL
SQL2 - DML Aggregate Functions: • COUNT • SUM • MAX • MIN • AVG NOEA/IT FEN - Databases/SQL
SQL2 - DML Ex.: ”Number of Employees in the research department” SELECT COUNT(*) FROM EMPLOYEE, DEPARTMENT WHERE DNO = DNUMBER AND DNAME = ’Research’ NOEA/IT FEN - Databases/SQL
SQL2 - DML(Q24) NOEA/IT FEN - Databases/SQL
Result of Q24 NOEA/IT FEN - Databases/SQL
SQL2 - DML(Q26) NOEA/IT FEN - Databases/SQL
Result of Q26, 1 NOEA/IT FEN - Databases/SQL
Result of Q26, 2 NOEA/IT FEN - Databases/SQL
SQL2 - DML NOEA/IT FEN - Databases/SQL
SQL - VIEWS • A view is virtual table which is created from one or more existing base tables. • Views may be used in a layered architecture to provide different view of the database to different users. • May also be used to increase efficiency of frequent queries, for instance to avoid JOINs. NOEA/IT FEN - Databases/SQL
SQL - VIEWS CREATE VIEW WORKS_ON1 AS SELECT FNAME, LNAME, PNAME, HOURS FROM EMPLOYEE, PROJECT, WORKS_ON WHERE SSN=ESSN AND PNO=PNUMBER; Using this view, the query: SELECT FNAME, LNAME, PNAME FROM EMPLOYEE, PROJECT, WORKS_ON WHERE PNAME = 'ProductX' AND SSN = ESSN AND PNO = PNUMBER; May written as SELECT FNAME, LNAME, PNAME FROM WORKS_ON1 WHERE PNAME = 'ProductX'; And hence saving the join NOEA/IT FEN - Databases/SQL
SQL - VIEWS • Updating through views is problematic: • FX: Transfer John Smith from the project 'ProductX' to the project 'ProductY’ UPDATE WORKS_ON1 SET PNAME = ’ProductY’ WHERE LNAME = ’Smith’ AND FNAME = ’John’ AND PNAME = ’ProductX’ NOEA/IT FEN - Databases/SQL
SQL - VIEWS Which update of the base tables should be executed? This? Or this? NOEA/IT FEN - Databases/SQL
Not updatable views Gray zone Updatable views SQL - VIEWS Views and update: NOEA/IT FEN - Databases/SQL
SQL - VIEWS Generally: • Views defined over one base table can be updated, if the primary key (ore some candidate key) is included in the view. • Views defined by joining more base tables are generally not updatable. • Some joined view are in principle updatable: all primary keys from the base tables must be included in the view. • Views defined using aggregate or grouping functions are not updatable. • SQL2 standard establishes that joined view are not updatable. NOEA/IT FEN - Databases/SQL
Index • Index is often considered part of the DDL of SQL • index is about internal physical storage access, and • as such NOT a part of the SQL2 standard • many SQL versions include index anyway • Previous versions of SQL includes a CREATE INDEX statement • Is used for speeding up queries, for instance: CREATE INDEX LNAME_INDEX ON EMPLOYEE(LNAME); • Index is in some older SQL implementations also used to simulate primary keys: CREATE UNIQUE INDEX SSN_INDEX ON EMPLOYEE(SSN); NOEA/IT FEN - Databases/SQL
Index Why is that? • Often it is possible to define one (and only one) clustering index: CREATE INDEX DNO_INDEX ON EMPLOYEE(DNO) CLUSTER; • The effect is that employees in the same department are stored physically close • Hereby queries concerning employees in the same department are speeded up. NOEA/IT FEN - Databases/SQL
Databaser (SQL) og programudviklingsværktøjer ODBC/JDBC giver standardiseret tilgang til RDBMS NOEA/IT FEN - Databases/SQL
Databaseprogrammering fra 3GLs og OOPLs • SQL og typiske programmeringssprog som Java, C, Cobol etc. er ikke ”kompatible”: • Impedans-mismatch: • Programmeringssprogets datatyper er ikke afstemt med databasens domæner • SQL er mængde- (tabel-) orienteret: • alle resultater er en tabel med et antal tupler. • 3GLs og OOPLs er tuple- (objekt-)orienteret, dvs. • der er behov for en datastruktur i programmeringssproget NOEA/IT FEN - Databases/SQL
Embedded SQL Databaseaccess vha. SQL fra 3GL/OOPL (værtssprog): Er baseret Cursor-begrebet: • En cursor kan opfattes som en pointer, der udpeger aktiv række i tabellen, som SQL-sætningen resulterer i • En cursor er nødvendig, når resultatet af en SQL-sætning er mere end een tuple (værtssproget er record- (objekt-) orienteret) • Er leverandørafhængig • Visse moderne værktøjer (fx Visual Studio.NET) kan tilsyneladende returnere en mængde af forekomster (dataset eller ResultSet, men reelt er der tale om en indpakket cursor • ODBC (Open Data Base Connectivity): Resultset svarer til en cursor. • I OOPLs kaldes en cursor ofte en iterator (Enumerator i C#). NOEA/IT FEN - Databases/SQL