SQL Subqueries: T. M. Murali
SQL Subqueries: T. M. Murali
T. M. Murali
September 1, 2010
T. M. Murali
September 1, 2010
Relational algebra expressions can become very long. Use linear notation to store results of intemediate expressions.
1. A relation name and a parenthesised list of attributes for that relation. Use Answer as the conventional name for the nal result. 2. The assignment symbol :=. 3. Any expression in relational algebra on the right.
T. M. Murali
September 1, 2010
Name pairs of students who live at the same address. Normal expression: S1.Name,S2.Name (S1.Address
= S2.Address (S1 (Students)
S2 (Students)))
T. M. Murali
September 1, 2010
Name pairs of students who live at the same address. Normal expression: S1.Name,S2.Name (S1.Address Linear notation:
Pairs(P1, N1, A1, P2, N2, A2) := S1 (Students) S2 (Students) Matched(P1, N1, A1, P2, N2, A2) := A1 = A2 (Pairs(P1, N1, A1, P2, N2, A2)) Answer(Name1, Name2) := N1,N2 (Matched(P1, N1, A1, P2, N2, A2)).
= S2.Address (S1 (Students)
S2 (Students)))
T. M. Murali
September 1, 2010
T. M. Murali
September 1, 2010
SELECT A, B FROM R, S WHERE C; Nested loops: for each tuple t1 in R for each tuple t2 in S if the attributes in t1 and t2 satisfy C output the tuples involving attributes A and B.
T. M. Murali
September 1, 2010
SELECT A, B FROM R, S WHERE C; Nested loops: for each tuple t1 in R for each tuple t2 in S if the attributes in t1 and t2 satisfy C output the tuples involving attributes A and B. Conversion to relational algebra: A,B (C (R S)).
1. Compute R S. 2. Apply the selection operator C () to R S. 3. Project the resulting tuples to attributes A and B.
T. M. Murali
September 1, 2010
T. M. Murali
September 1, 2010
Find the name of the professor who teaches CS 4604. SELECT Name FROM Professors, Teach WHERE (PID = ProfessorPID) AND (Number = 4604) AND (DeptName = CS) ;
T. M. Murali
September 1, 2010
Find the name of the professor who teaches CS 4604. SELECT Name FROM Professors, Teach WHERE (PID = ProfessorPID) AND (Number = 4604) AND (DeptName = CS) ; Do we need to take the natural join of two big relations just to get a relation with one tuple? Can we rewrite the query without using a join?
T. M. Murali
September 1, 2010
T. M. Murali
September 1, 2010
Find the name of the professor who teaches CS 4604. SELECT Name FROM Professors WHERE PID = (SELECT ProfessorPID FROM Teach WHERE (Number = 4604) AND (DeptName = CS) );
T. M. Murali
September 1, 2010
Find the name of the professor who teaches CS 4604. SELECT Name FROM Professors WHERE PID = (SELECT ProfessorPID FROM Teach WHERE (Number = 4604) AND (DeptName = CS) ); When using =, the subquery must return a single tuple.
T. M. Murali
September 1, 2010
T. M. Murali
September 1, 2010
T. M. Murali
September 1, 2010
T. M. Murali
September 1, 2010
T. M. Murali
September 1, 2010
T. M. Murali
September 1, 2010
T. M. Murali
September 1, 2010
t > ANY R (which is unary) is true if and only if t is greater than at least one value in R.
T. M. Murali
September 1, 2010
t > ANY R (which is unary) is true if and only if t is greater than at least one value in R. We can use NOT to negate EXISTS, ALL, and ANY.
T. M. Murali September 1, 2010 CS 4604: SQL Subqueries
Find the departments of the courses taken by the student with name Suri.
T. M. Murali
September 1, 2010
Find the departments of the courses taken by the student with name Suri. SELECT DeptName FROM Take WHERE StudentPID IN (SELECT PID FROM Students WHERE (Name = Suri) );
T. M. Murali
September 1, 2010
Correlated Subqueries
Find course names that have been used for two or more courses.
T. M. Murali
September 1, 2010
Correlated Subqueries
Find course names that have been used for two or more courses. SELECT CourseName FROM Courses AS First WHERE CourseName IN (SELECT CourseName FROM Courses WHERE
T. M. Murali
September 1, 2010
Correlated Subqueries
Find course names that have been used for two or more courses. SELECT CourseName FROM Courses AS First WHERE CourseName IN (SELECT CourseName FROM Courses WHERE (Number <> First.Number) OR (DeptName <> First.DeptName));
T. M. Murali
September 1, 2010
SELECT CourseName FROM Courses AS First WHERE CourseName IN (SELECT CourseName FROM Courses WHERE (Number <> First.Number) OR (DeptName <> First.DeptName));
Evaluate query by looping over tuples of First and for each tuple, evaluate the subquery.
T. M. Murali
September 1, 2010
SELECT CourseName FROM Courses AS First WHERE CourseName IN (SELECT CourseName FROM Courses WHERE (Number <> First.Number) OR (DeptName <> First.DeptName));
Evaluate query by looping over tuples of First and for each tuple, evaluate the subquery. Scoping rules: an attribute in a subquery belongs to one of the tuple variables in that subquerys FROM clause, or to the immediately surrounding subquery, and so on.
T. M. Murali September 1, 2010 CS 4604: SQL Subqueries
T. M. Murali
September 1, 2010
T. M. Murali
September 1, 2010
Find the (names of (Professors who have taught (courses taken by student with name Suri))).
T. M. Murali
September 1, 2010
Find the (names of (Professors who have taught (courses taken by student with name Suri))).
SELECT Name FROM Professors WHERE PID IN (SELECT ProfessorPID FROM Teach WHERE (Number, DeptName) IN (SELECT Number, DeptName FROM Take, Students WHERE (StudentPID = PID) AND (Students.Name = Suri)));
T. M. Murali
September 1, 2010
T. M. Murali
September 1, 2010
T. M. Murali
September 1, 2010