MIS Database Systems SQL: Queries, Constraints, Triggers

Similar documents
SQL: Queries, Programming, Triggers

Example Instances. SQL: Queries, Programming, Triggers. Conceptual Evaluation Strategy. Basic SQL Query. A Note on Range Variables

SQL: Queries, Programming, Triggers

Chapter 5. SQL: Queries, Constraints, Triggers

Relational Algebra and SQL

Boats bid bname color 101 Interlake blue 102 Interlake red 103 Clipper green 104 Marine red. Figure 1: Instances of Sailors, Boats and Reserves

Part A: Data Definition Language (DDL) Schema and Catalog CREAT TABLE. Referential Triggered Actions. CSC 742 Database Management Systems

CSC 443 Data Base Management Systems. Basic SQL

Θεµελίωση Βάσεων εδοµένων

The SQL Query Language. Creating Relations in SQL. Referential Integrity in SQL. Basic SQL Query. Primary and Candidate Keys in SQL

Introduction to SQL: Data Retrieving

Part 4: Database Language - SQL

COMP 5138 Relational Database Management Systems. Week 5 : Basic SQL. Today s Agenda. Overview. Basic SQL Queries. Joins Queries

Chapter 8. SQL-99: SchemaDefinition, Constraints, and Queries and Views

UNIT 6. Structured Query Language (SQL) Text: Chapter 5

Relational Schema. CS 4700/6700 A Sample of Small Database Design Using Microsoft Access

Relational Algebra. Module 3, Lecture 1. Database Management Systems, R. Ramakrishnan 1

SQL Nested & Complex Queries. CS 377: Database Systems

SQL-99: Schema Definition, Basic Constraints, and Queries

How To Create A Table In Sql (Ahem)

Proposed solutions Project Assignment #1 (SQL)

CS 338 Join, Aggregate and Group SQL Queries

Chapter 5 More SQL: Complex Queries, Triggers, Views, and Schema Modification

Summary on Chapter 4 Basic SQL

The Relational Model. Why Study the Relational Model? Relational Database: Definitions

Lab Assignment Creating a Relational Database Schema from ER Diagram, Populating the Database and Querying over the database with SQL

The Relational Model. Why Study the Relational Model? Relational Database: Definitions. Chapter 3

The Relational Model. Why Study the Relational Model?

The Relational Algebra

ER & EER to Relational Mapping. Chapter 9 1

SQL: QUERIES, CONSTRAINTS, TRIGGERS

Lecture 6. SQL, Logical DB Design

New York University Computer Science Department Courant Institute of Mathematical Sciences

Lecture 4: More SQL and Relational Algebra

10CS54: DATABASE MANAGEMENT SYSTEM

SQL NULL s, Constraints, Triggers

More on SQL. Juliana Freire. Some slides adapted from J. Ullman, L. Delcambre, R. Ramakrishnan, G. Lindstrom and Silberschatz, Korth and Sudarshan

The Relational Model. Ramakrishnan&Gehrke, Chapter 3 CS4320 1

More SQL: Assertions, Views, and Programming Techniques

Query-by-Example (QBE)

Database Security. Chapter 21

3. Relational Model and Relational Algebra

Oracle SQL. Course Summary. Duration. Objectives

Introduction to database design

Answer Key. UNIVERSITY OF CALIFORNIA College of Engineering Department of EECS, Computer Science Division

CS2Bh: Current Technologies. Introduction to XML and Relational Databases. The Relational Model. The relational model

Oracle Database: SQL and PL/SQL Fundamentals

EECS 647: Introduction to Database Systems

Oracle Database: SQL and PL/SQL Fundamentals

Information Systems SQL. Nikolaj Popov

Relational Databases

Procedural Extension to SQL using Triggers. SS Chung

SUBQUERIES AND VIEWS. CS121: Introduction to Relational Database Systems Fall 2015 Lecture 6

ICAB4136B Use structured query language to create database structures and manipulate data

Lecture 6: Query optimization, query tuning. Rasmus Pagh

Instant SQL Programming

Functional Dependency and Normalization for Relational Databases

Structured Query Language (SQL)

History of SQL. Relational Database Languages. Tuple relational calculus ALPHA (Codd, 1970s) QUEL (based on ALPHA) Datalog (rule-based, like PROLOG)

INFO/CS 330: Applied Database Systems

1 Structured Query Language: Again. 2 Joining Tables

Relational Database: Additional Operations on Relations; SQL

Introduction to Microsoft Jet SQL

Databases and BigData

Oracle Database: SQL and PL/SQL Fundamentals NEW

Database Management Systems. Chapter 1

Lab Manual. Database Systems COT-313 & Database Management Systems Lab IT-216

Outline. Data Modeling. Conceptual Design. ER Model Basics: Entities. ER Model Basics: Relationships. Ternary Relationships. Yanlei Diao UMass Amherst

Chapter 9 Joining Data from Multiple Tables. Oracle 10g: SQL

{ PreviousEducation ( CollegeName, StartDate, EndDate, { Degree (DegreeName, Month, Year) }, { Transcript (CourseName, Semester, Year, Grade) } ) }

There are five fields or columns, with names and types as shown above.

Duration Vendor Audience 5 Days Oracle End Users, Developers, Technical Consultants and Support Staff

Chapter 5: FUNCTIONAL DEPENDENCIES AND NORMALIZATION FOR RELATIONAL DATABASES

Week 4 & 5: SQL. SQL as a Query Language

Review Entity-Relationship Diagrams and the Relational Model. Data Models. Review. Why Study the Relational Model? Steps in Database Design

SQL Simple Queries. Chapter 3.1 V3.0. Napier University Dr Gordon Russell

Advance DBMS. Structured Query Language (SQL)

CHAPTER 8: SQL-99: SCHEMA DEFINITION, BASIC CONSTRAINTS, AND QUERIES

6 QUERY-BY-EXAMPLE (QBE)

2874CD1EssentialSQL.qxd 6/25/01 3:06 PM Page 1 Essential SQL Copyright 2001 SYBEX, Inc., Alameda, CA

CS143 Notes: Views & Authorization

Data Modeling. Database Systems: The Complete Book Ch ,

4. SQL. Contents. Example Database. CUSTOMERS(FName, LName, CAddress, Account) PRODUCTS(Prodname, Category) SUPPLIERS(SName, SAddress, Chain)

VIEWS virtual relation data duplication consistency problems

SQL SELECT Query: Intermediate

The Relational Data Model and Relational Database Constraints

SQL Server for developers. murach's TRAINING & REFERENCE. Bryan Syverson. Mike Murach & Associates, Inc. Joel Murach

Chapter 13: Query Optimization

Comp 5311 Database Management Systems. 3. Structured Query Language 1

Review: Participation Constraints

Oracle Database 10g: Introduction to SQL

MOC 20461C: Querying Microsoft SQL Server. Course Overview

Guide to SQL Programming: SQL:1999 and Oracle Rdb V7.1

IT2304: Database Systems 1 (DBS 1)

Introduction to Querying & Reporting with SQL Server

A basic create statement for a simple student table would look like the following.

Intermediate SQL C H A P T E R4. Practice Exercises. 4.1 Write the following queries in SQL:

SQL - QUICK GUIDE. Allows users to access data in relational database management systems.

Programming with SQL

SQL DATA DEFINITION: KEY CONSTRAINTS. CS121: Introduction to Relational Database Systems Fall 2015 Lecture 7

Transcription:

MIS 335 - Database Systems SQL: Queries, Constraints, Triggers http://www.mis.boun.edu.tr/durahim/ Ahmet Onur Durahim

Learning Objectives Basics of SQL Conceptual Evaluation of SQL Queries Range Variables, Expressions and Strings Nested Queries Joins, Aggregate Operators General Constraints Grouping Triggers

Example Instances Sailors and Reserves relations If the key for the Reserves relation contained only the attributes sid and bid, how would the semantics differ? S1 S2 R1 sid bid day 22 101 10/10/96 58 103 11/12/96 sid sname rating age 22 dustin 7 45.0 31 lubber 8 55.5 58 rusty 10 35.0 sid sname rating age 28 yuppy 9 35.0 31 lubber 8 55.5 44 guppy 5 35.0 58 rusty 10 35.0

Basic SQL Query SQL is the standard for querying relational data Basic query structure SELECT FROM WHERE [DISTINCT] target-list relation-list qualification Relation-list: A list of relation names (possibly with a range-variable after each name) Target-list: A list of attributes of relations in relation-list

Basic SQL Query SQL is the standard for querying relational data Basic query structure SELECT FROM WHERE [DISTINCT] target-list relation-list qualification Qualification: Comparisons (Attr op const or Attr1 op Attr2, where op is one of,,,,, ) combined using AND, OR and NOT DISTINCT is an optional keyword indicating that the answer should not contain duplicates Default is that duplicates are not eliminated!

Conceptual Evaluation Strategy Semantics of an SQL query defined in terms of the following conceptual evaluation strategy: 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 This strategy is probably the least efficient way to compute a query! A query optimizer will find more efficient strategies to compute the same answers

Example of Conceptual Evaluation Query: Find names of sailors who ve reserved boat #103 Solution (Rel.Alg.): Solution (SQL): sname (( Re serves ) Sailors ) bid 103 SELECT S.sname FROM Sailors S, Reserves R WHERE 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

Range Variables Really needed only if the same relation appears twice in the FROM clause. The previous query can also be written as: OR SELECT sname FROM Sailors, Reserves WHERE Sailors.sid=Reserves.sid AND bid=103 SELECT S.sname FROM Sailors S, Reserves R WHERE S.sid=R.sid AND bid=103 Query: Find names of sailors who ve reserved boat #103 Range variables are necessary when joining a table with itself!!

Expressions and Strings SELECT S.age, age1=s.age-5, 2*S.age AS age2 FROM Sailors S WHERE S.sname LIKE B_%B Illustrates use of arithmetic expressions and string pattern matching: Find triples (of ages of sailors and two fields defined by expressions) for sailors whose names begin and end with B and contain at least three characters AS and = are two ways to name fields in result LIKE is used for string matching. _ stands for any one character and % stands for 0 or more arbitrary characters

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? SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND (B.color= red OR B.color= green ) SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND B.color= red UNION SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND B.color= green

Find sid s of sailors who ve reserved a red or a green boat EXCEPT: Used to compute the set difference of two union-compatible sets of tuples What do we get if we replace UNION by EXCEPT in the previous query? SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND B.color= red UNION SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND B.color= green

Find sid s of sailors who ve reserved a red or a green boat??? EXCEPT: Used to compute the set difference of two union-compatible sets of tuples What do we get if we replace UNION by EXCEPT in the previous query? SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND B.color= red EXCEPT SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND B.color= green

Find sid s of sailors who ve reserved a red but not a green boat EXCEPT: Used to compute the set difference of two union-compatible sets of tuples SELECT R.sid FROM Boats B, Reserves R WHERE R.bid=B.bid AND B.color= red EXCEPT SELECT R.sid FROM Boats B, Reserves R WHERE 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.sid FROM Sailors S, Boats B1, Reserves R1, Boats B2, Reserves R2 WHERE 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 ) Key field! SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND B.color= red INTERSECT SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE 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 BID b1 b2 B1 Colr red grn X SID s1 s1 s2 R1 BID b1 b2 b1 B1 X R1 B1 X R1 BID Colr SID BID b1 red s1 b1 b1 red s1 b2 b1 red s2 b1 b2 grn s1 b1 b2 grn s1 b2 b2 grn s2 b1

Find sid s of sailors who ve reserved a red and a green boat R2 B1 X R1 SID BID BID Colr SID BID s1 b1 s1 b2 s2 b1 X b1 red s1 b1 b1 red s1 b2 b1 red s2 b1 b2 grn s1 b1 b2 grn s1 b2 b2 grn s2 b1 R2 X B1 X R1 SID BID BID Colr SID BID S1 b1 b1 red s1 b1 s1 b1 b1 red s1 b2 S1 b1 b1 red s2 b1 s1 b1 b2 grn s1 b1 s1 b1 b2 grn s1 b2 s1 b1 b2 grn s2 b1 s1 b2 b1 red s1 b1 s1 b2 b1 red s1 b2 s1 b2 b1 red s2 b1 s1 b2 b2 grn s1 b1 s1 b2 b2 grn s1 b2 s1 b2 b2 grn s2 b1 s2 b1 b1 red s1 b1 s2 b1 b1 red s1 b2 s2 b1 b1 red s2 b1 s2 b1 b2 grn s1 b1 s2 b1 b2 grn s1 b2 s2 b1 b2 grn s2 b1

Find sid s of sailors who ve reserved a red and a green boat B2 BID Colr b1 red b2 grn X R2 X B1 X R1 SID BID BID Colr SID BID s1 b1 b1 red s1 b1 s1 b1 b1 red s1 b2 S1 b1 b1 red s2 b1 s1 b1 b2 grn s1 b1 s1 b1 b2 grn s1 b2 s1 b1 b2 grn s2 b1 s1 b2 b1 red s1 b1 s1 b2 b1 red s1 b2 s1 b2 b1 red s2 b1 s1 b2 b2 grn s1 b1 s1 b2 b2 grn s1 b2 s1 b2 b2 grn s2 b1 s2 b1 b1 red s1 b1 s2 b1 b1 red s1 b2 s2 b1 b1 red s2 b1 s2 b1 b2 grn s1 b1 s2 b1 b2 grn s1 b2 s2 b1 b2 grn s2 b1 B2 X R2 X B1 X R1 (First half) BID Colr SID BID BID Colr SID BID b1 red s1 b1 b1 red s1 b1 b1 red s1 b1 b1 red s1 b2 b1 red s1 b1 b1 red s2 b1 b1 red s1 b1 b2 grn s1 b1 b1 red s1 b1 b2 grn s1 b2 b1 red s1 b1 b2 grn s2 b1 b1 red s1 b2 b1 red s1 b1 b1 red s1 b2 b1 red s1 b2 b1 red s1 b2 b1 red s2 b1 b1 red s1 b2 b2 grn s1 b1 b1 red s1 b2 b2 grn s1 b2 b1 red s1 b2 b2 grn s2 b1 b1 red s2 b1 b1 red s1 b1 b1 red s2 b1 b1 red s1 b2 b1 red s2 b1 b1 red s2 b1 b1 red s2 b1 b2 grn s1 b1 b1 red s2 b1 b2 grn s1 b2 b1 red s2 b1 b2 grn s2 b1

B2 X R2 X B1 X R1 (Second half) Query: Find sid s of sailors who ve reserved a red and a green boat SELECT S.sid FROM Sailors S, Boats B1, Reserves R1, Boats B2, Reserves R2 WHERE 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 ) BID Colr SID BID BID Colr SID BID b2 grn s1 b1 b1 red s1 b1 b2 grn s1 b1 b1 red s1 b2 b2 grn S1 b1 b1 red s2 b1 b2 grn s1 b1 b2 grn s1 b1 b2 grn s1 b1 b2 grn s1 b2 b2 grn s1 b1 b2 grn s2 b1 b2 grn s1 b2 b1 red s1 b1 b2 grn s1 b2 b1 red s1 b2 b2 grn s1 b2 b1 red s2 b1 b2 grn s1 b2 b2 grn s1 b1 b2 grn s1 b2 b2 grn s1 b2 b2 grn s1 b2 b2 grn s2 b1 b2 grn s2 b1 b1 red s1 b1 b2 grn s2 b1 b1 red s1 b2 b2 grn s2 b1 b1 red s2 b1 b2 grn s2 b1 b2 grn s1 b1 b2 grn s2 b1 b2 grn s1 b2 b2 grn s2 b1 b2 grn s2 b1

B2 X R2 X B1 X R1 (Second half) Query: Find sid s of sailors who ve reserved a red and a green boat SELECT R1.sid FROM Boats B1, Reserves R1, Boats B2, Reserves R2 WHERE R1.sid =R2.sid AND R1.bid=B1.bid AND R2.bid=B2.bid AND (B1.color= red AND B2.color= green ) BID Colr SID BID BID Colr SID BID b2 grn s1 b1 b1 red s1 b1 b2 grn s1 b1 b1 red s1 b2 b2 grn S1 b1 b1 red s2 b1 b2 grn s1 b1 b2 grn s1 b1 b2 grn s1 b1 b2 grn s1 b2 b2 grn s1 b1 b2 grn s2 b1 b2 grn s1 b2 b1 red s1 b1 b2 grn s1 b2 b1 red s1 b2 b2 grn s1 b2 b1 red s2 b1 b2 grn s1 b2 b2 grn s1 b1 b2 grn s1 b2 b2 grn s1 b2 b2 grn s1 b2 b2 grn s2 b1 b2 grn s2 b1 b1 red s1 b1 b2 grn s2 b1 b1 red s1 b2 b2 grn s2 b1 b1 red s2 b1 b2 grn s2 b1 b2 grn s1 b1 b2 grn s2 b1 b2 grn s1 b2 b2 grn s2 b1 b2 grn s2 b1

B2 X R2 X B1 X R1 (Second half) Query: Find sid s of sailors who ve reserved a red and a green boat SELECT R1.sid FROM Boats B1, Reserves R1, Boats B2, Reserves R2 WHERE R1.sid =R2.sid AND R1.bid=B1.bid AND R2.bid=B2.bid AND (B1.color= red AND B2.color= green ) BID Colr SID BID BID Colr SID BID b2 grn s1 b1 b1 red s1 b1 b2 grn s1 b1 b1 red s1 b2 b2 grn S1 b1 b1 red s2 b1 b2 grn s1 b1 b2 grn s1 b1 b2 grn s1 b1 b2 grn s1 b2 b2 grn s1 b1 b2 grn s2 b1 b2 grn s1 b2 b1 red s1 b1 b2 grn s1 b2 b1 red s1 b2 b2 grn s1 b2 b1 red s2 b1 b2 grn s1 b2 b2 grn s1 b1 b2 grn s1 b2 b2 grn s1 b2 b2 grn s1 b2 b2 grn s2 b1 b2 grn s2 b1 b1 red s1 b1 b2 grn s2 b1 b1 red s1 b2 b2 grn s2 b1 b1 red s2 b1 b2 grn s2 b1 b2 grn s1 b1 b2 grn s2 b1 b2 grn s1 b2 b2 grn s2 b1 b2 grn s2 b1

B2 X R2 X B1 X R1 (Second half) Query: Find sid s of sailors who ve reserved a red and a green boat SELECT R1.sid FROM Boats B1, Reserves R1, Boats B2, Reserves R2 WHERE R1.sid =R2.sid AND R1.bid=B1.bid AND R2.bid=B2.bid AND (B1.color= red AND B2.color= green ) BID Colr SID BID BID Colr SID BID b2 grn s1 b1 b1 red s1 b1 b2 grn s1 b1 b1 red s1 b2 b2 grn S1 b1 b1 red s2 b1 b2 grn s1 b2 b1 red s1 b1 b2 grn s1 b2 b1 red s1 b2 b2 grn s1 b2 b1 red s2 b1 b2 grn s2 b1 b1 red s1 b1 b2 grn s2 b1 b1 red s1 b2 b2 grn s2 b1 b1 red s2 b1

B2 X R2 X B1 X R1 (Second half) Query: Find sid s of sailors who ve reserved a red and a green boat SELECT R1.sid FROM Boats B1, Reserves R1, Boats B2, Reserves R2 WHERE R1.sid =R2.sid AND R1.bid=B1.bid AND R2.bid=B2.bid AND (B1.color= red AND B2.color= green ) BID Colr SID BID BID Colr SID BID b2 grn s1 b1 b1 red s1 b1 b2 grn s1 b1 b1 red s1 b2 b2 grn S1 b1 b1 red s2 b1 b2 grn s1 b2 b1 red s1 b1 b2 grn s1 b2 b1 red s1 b2 b2 grn s1 b2 b1 red s2 b1 b2 grn s2 b1 b1 red s1 b1 b2 grn s2 b1 b1 red s1 b2 b2 grn s2 b1 b1 red s2 b1

B2 X R2 X B1 X R1 (Second half) Query: Find sid s of sailors who ve reserved a red and a green boat SELECT R1.sid FROM Boats B1, Reserves R1, Boats B2, Reserves R2 WHERE R1.sid =R2.sid AND R1.bid=B1.bid AND R2.bid=B2.bid AND (B1.color= red AND B2.color= green ) BID Colr SID BID BID Colr SID BID b2 grn s1 b2 b1 red s1 b1 b2 grn s1 b2 b1 red s1 b2 b2 grn s1 b2 b1 red s2 b1

B2 X R2 X B1 X R1 (Second half) Query: Find sid s of sailors who ve reserved a red and a green boat SELECT R1.sid FROM Boats B1, Reserves R1, Boats B2, Reserves R2 WHERE R1.sid =R2.sid AND R1.bid=B1.bid AND R2.bid=B2.bid AND (B1.color= red AND B2.color= green ) BID Colr SID BID BID Colr SID BID b2 grn s1 b2 b1 red s1 b1 b2 grn s1 b2 b1 red s1 b2 b2 grn s1 b2 b1 red s2 b1

B2 X R2 X B1 X R1 (Second half) Query: Find sid s of sailors who ve reserved a red and a green boat SELECT R1.sid FROM Boats B1, Reserves R1, Boats B2, Reserves R2 WHERE R1.sid =R2.sid AND R1.bid=B1.bid AND R2.bid=B2.bid AND (B1.color= red AND B2.color= green ) BID Colr SID BID BID Colr SID BID b2 grn s1 b2 b1 red s1 b1 b2 grn s1 b2 b1 red s2 b1

B2 X R2 X B1 X R1 (Second half) Query: Find sid s of sailors who ve reserved a red and a green boat SELECT R1.sid FROM Boats B1, Reserves R1, Boats B2, Reserves R2 WHERE R1.sid =R2.sid AND R1.bid=B1.bid AND R2.bid=B2.bid AND (B1.color= red AND B2.color= green ) BID Colr SID BID BID Colr SID BID b2 grn s1 b2 b1 red s1 b1 b2 grn s1 b2 b1 red s2 b1

B2 X R2 X B1 X R1 (Second half) Query: Find sid s of sailors who ve reserved a red and a green boat BID Colr SID BID BID Colr SID BID SELECT R1.sid FROM Boats B1, Reserves R1, Boats B2, Reserves R2 WHERE R1.sid =R2.sid AND R1.bid=B1.bid AND R2.bid=B2.bid AND (B1.color= red AND B2.color= green ) b2 grn s1 b2 b1 red s1 b1

Nested Queries SELECT S.sname FROM Sailors S WHERE S.sid IN (SELECT R.sid FROM Reserves R WHERE R.bid=103) A very powerful feature of SQL: a WHERE clause can itself contain an SQL query! (Actually, so can FROM and HAVING clauses) To understand semantics of nested queries, think of a nested loops evaluation: For each Sailors tuple, check the qualification by computing the subquery For (i=1 10) do { x=x+1; For (j=1 5) do { y=y+1; } } Find names of sailors who ve reserved boat #103:

Nested Queries Find names of sailors who ve reserved boat #103: SELECT S.sname FROM Sailors S WHERE S.sid IN (SELECT R.sid FROM Reserves R WHERE R.bid=103)

Nested Queries Find names of sailors who ve NOT reserved boat #103: SELECT S.sname FROM Sailors S WHERE S.sid NOT IN (SELECT R.sid FROM Reserves R WHERE R.bid=103)

Nested Queries with Correlation Find names of sailors who ve reserved boat #103: SELECT S.sname FROM Sailors S WHERE EXISTS (SELECT * FROM Reserves R WHERE R.bid=103 AND S.sid = R.sid) EXISTS is another set comparison operator, like IN

Nested Queries with Correlation Find names of sailors with at most one reservation for boat #103: SELECT S.sname FROM Sailors S WHERE UNIQUE (SELECT R.sid FROM Reserves R WHERE R.bid=103 AND S.sid = R.sid) If UNIQUE is used, and * is replaced by R.bid UNIQUE checks for duplicate tuples; returns true if no row appears twice UNIQUE returns true if the answer is empty * 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

More on Set-Comparison Operators We ve already seen IN, EXISTS and UNIQUE. Can also use negated versions: 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: SELECT * FROM Sailors S WHERE S.rating > ANY (SELECT S2.rating FROM Sailors S2 WHERE S2.sname= Horatio )

Rewriting INTERSECT Queries Using IN Find sid s of sailors who ve reserved both a red and a green boat: SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE 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 ) 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: 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?) SELECT S.sname FROM Sailors S WHERE S.sid IN (( SELECT R.sid FROM Boats B, Reserves R WHERE R.bid=B.bid AND B.color= red ) INTERSECT (SELECT R.sid FROM Boats B2, Reserves R2 WHERE R2.bid=B2.bid AND B2.color= green )

Division in SQL Find sailors who ve reserved all boats How to do it the hard way, without EXCEPT? SELECT S.sname FROM Sailors S WHERE NOT EXISTS (SELECT B.bid FROM Boats B Sailors S such that... there is no boat B without... SELECT S.sname FROM Sailors S WHERE NOT EXISTS ((SELECT B.bid FROM Boats B) EXCEPT (SELECT R.bid FROM Reserves R WHERE R.sid=S.sid)) WHERE NOT EXISTS (SELECT R.bid FROM Reserves R a Reserves tuple showing S reserved B WHERE R.bid=B.bid AND R.sid=S.sid))

Joins (SQL 2003 std, source: wikipedia) Department Table DepartmentID DepartmentName 31 Sales 33 Engineering 34 Clerical 35 Marketing Employee Table LastName DepartmentID Rafferty 31 Jones 33 Steinberg 33 Robinson 34 Smith 34 Jasper 36 Adapted from the slides of Yücel Saygın

Inner Joins SELECT * FROM employee INNER JOIN department ON employee.departmentid = department.departmentid SELECT * FROM employee, department WHERE employee.departmentid = department.departmentid

Inner Joins Employee.LastName Employee.DepartmentID Department.DepartmentName Department.DepartmentID Smith 34 Clerical 34 Jones 33 Engineering 33 Robinson 34 Clerical 34 Steinberg 33 Engineering 33 Rafferty 31 Sales 31

Joins SELECT * FROM employee NATURAL JOIN department Employee.LastName DepartmentID Department.DepartmentName Smith 34 Clerical Jones 33 Engineering Robinson 34 Clerical Steinberg 33 Engineering Rafferty 31 Sales SELECT * FROM employee CROSS JOIN department SELECT * FROM employee, department;

Employee. LastName Joins (Outer Joins) SELECT * FROM employee LEFT OUTER JOIN department ON department.departmentid = employee.departmentid Employee. DepartmentID Department. DepartmentName Jones 33 Engineering 33 Rafferty 31 Sales 31 Robinson 34 Clerical 34 Smith 34 Clerical 34 Jasper 36 NULL NULL Steinberg 33 Engineering 33 Department. DepartmentID

Joins (Full Outer Join) SELECT * FROM employee FULL OUTER JOIN department ON department.departmentid = employee.departmentid Some DBMSs do not support FULL OUTER JOIN! Can you implement FULL OUTER JOIN WITH LEFT and RIGHT OUTER JOINS?

Aggregate Operators Significant extension of relational algebra A function where the values of multiple rows are grouped together as input on certain criteria to form a single value of more significant meaning or measurement such as a set, a bag or a list COUNT (*) COUNT ( [DISTINCT] A) SUM ( [DISTINCT] A) AVG ( [DISTINCT] A) MAX (A) MIN (A) single column Used to write statistical queries Mainly used for reporting such as Total sales in 2014 Average, max, min income of employees Total number of employees hired in 2014 http://en.wikipedia.org/wiki/aggregate_function http://msdn.microsoft.com/en-us/library/ms173454.aspx

Aggregate Operators COUNT (*): The number of values in a table COUNT ( [DISTINCT] A): The number of (unique) values in the A column SUM ( [DISTINCT] A): The sum of all (unique) values in the A column AVG ( [DISTINCT] A): The average of all (unique) values in the A column MAX (A): The maximum value in the A column MIN (A) : The minimum value in the A column http://en.wikipedia.org/wiki/aggregate_function http://msdn.microsoft.com/en-us/library/ms173454.aspx

Aggregate Operators Except for COUNT, aggregate functions ignore null values Aggregate functions are frequently used with the GROUP BY clause of the SELECT statement Total number of Sailors? SELECT COUNT (*) FROM Sailors S COUNT (*) COUNT ( [DISTINCT] A) SUM ( [DISTINCT] A) AVG ( [DISTINCT] A) MAX (A) MIN (A) single column Average age of Sailors whose ratings are 10 SELECT AVG (S.age) FROM Sailors S WHERE S.rating=10 Average distinct age of Sailors whose ratings are 10 SELECT AVG ( DISTINCT S.age) FROM Sailors S WHERE S.rating=10 http://en.wikipedia.org/wiki/aggregate_function http://msdn.microsoft.com/en-us/library/ms173454.aspx

Aggregate Operators Name of Sailors whose ratings are equal to the maximum rating among Sailors SELECT S.sname FROM Sailors S WHERE S.rating= (SELECT MAX(S2.rating) FROM Sailors S2) Number of distinct ratings in Sailors whose names are Bob SELECT COUNT (DISTINCT S.rating) FROM Sailors S WHERE S.sname= Bob COUNT (*) COUNT ( [DISTINCT] A) SUM ( [DISTINCT] A) AVG ( [DISTINCT] A) MAX (A) MIN (A) SELECT COUNT (S.rating) FROM Sailors S single column How many different ratings are there among the Sailors?? SELECT COUNT (DISTINCT S.rating) FROM Sailors S

Find name and age of the oldest sailor(s) SELECT S.sname, MAX(S.age) FROM Sailors S? This query is illegal! If the Select clause uses an aggregate operation, then it must use only aggregate operations unless the query contains a GROUP BY clause SELECT S.sname, S.age FROM Sailors S WHERE (SELECT MAX (S2.age) FROM Sailors S2) = S.age This query is allowed in the SQL/92 standard, but is not supported in some systems

Find name and age of the oldest sailor(s) SELECT S.sname, S.age FROM Sailors S WHERE (SELECT MAX (S2.age) FROM Sailors S2) = S.age SELECT S.sname, S.age FROM Sailors S WHERE S.age = (SELECT MAX (S2.age) FROM Sailors S2) This query is allowed in the SQL/92 standard, but is not supported in some systems This query is allowed in the SQL/92 standard and is valid for all systems SELECT S.sname, S.age FROM Sailors S WHERE S.age > ALL (SELECT S2.age FROM Sailors S2)

Motivation for Grouping We ve applied aggregate operators to all (qualifying) tuples Sometimes, we want to apply them to each of several groups of tuples Find the age of the youngest sailor for each rating level In general, we don t know how many rating levels exist, and what the rating values for these levels are Suppose we know that rating values go from 1 to 10; we can write 10 queries that look like this: For i = 1, 2,..., 10: SELECT MIN (S.age) FROM Sailors S WHERE S.rating = i

Queries with GROUP BY and HAVING SELECT [DISTINCT] target-list FROM relation-list WHERE qualification GROUP BY grouping-list HAVING group-qualification The target-list contains i. attribute names ii. terms with aggregate operations (e.g., MIN (S.age)) The attribute list (i) must be a subset of grouping-list Each answer tuple corresponds to a group, and these attributes must have a single value per group A group is a set of tuples that have the same value for all attributes in grouping-list

Conceptual Evaluation 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 One answer tuple is generated per qualifying group

SELECT target-list FROM relation-list WHERE qualification Conceptual Evaluation SELECT [DISTINCT] target-list FROM relation-list WHERE qualification GROUP BY grouping-list HAVING group-qualification GROUP BY grouping-list HAVING group-qualification gr1 gr2 RESULT gr3 gr4

SELECT S.rating FROM Sailors S WHERE S.age >= 18 Age = 20 Age = 25 Age = 19 Age=70 Age = 60 Age = 40 Age = 33 Age = 32 Age = 18 Age = 22 Age = 39 Conceptual Evaluation GROUP BY S.rating HAVING COUNT(*) > 1 Rating = 4 Rating =2 Rating =3 Rating=2 Rating=3 Rating=5 Rating=1 Rating=4 Rating=3 Rating=4 Rating=1 gr1 gr2 gr3 gr4 Rating=1 Rating=1 Rating=2 Rating=2 Rating=3 Rating=3 Rating=3 Rating=4 Rating=4 Rating=4 Rating=5 SELECT S.rating FROM Sailors S WHERE S.age >= 18 GROUP BY S.rating HAVING COUNT (*) > 1 RESULT Rating = 1 Rating = 2 Rating = 3 Rating = 4

Find age of the youngest sailor with age 18, for each rating with at least 2 such sailors SELECT S.rating, MIN (S.age) AS minage FROM Sailors S WHERE S.age >= 18 GROUP BY S.rating HAVING COUNT (*) > 1 Only S.rating and S.age are mentioned in the SELECT, GROUP BY or HAVING clauses; 2nd column of result is named minage using AS rating minage 3 25.5 7 35.0 8 25.5 Answer relation: Sailors instance: 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

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 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 (of any age) SELECT S.rating, MIN (S.age) FROM Sailors S WHERE S.age > 18 GROUP BY S.rating HAVING 1 < (SELECT COUNT (*) FROM Sailors S2 WHERE S.rating=S2.rating) Shows HAVING clause can also contain a subquery. Compare this with the query where we considered only ratings with 2 sailors over 18! What if HAVING clause is replaced by: HAVING COUNT(*) >1 Sailors instance: 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

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) AS minage FROM Sailors S WHERE S.age > 18 GROUP BY S.rating HAVING 1 < (SELECT COUNT (*) FROM Sailors S2 WHERE S.rating=S2.rating) Answer relation: rating minage 3 25.5 7 35.0 8 25.5 10 35.0 Sailors instance: 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

Find age of the youngest sailor with age > 18, for each rating with at least 2 sailors (of any age) Shows HAVING clause can also contain a subquery. Compare this with the query where we considered only ratings with 2 sailors over 18! What if HAVING clause is replaced by: HAVING COUNT(*) >1 SELECT S.rating, MIN (S.age) FROM Sailors S WHERE S.age > 18 GROUP BY S.rating HAVING COUNT (*) > 1 Sailors instance: 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

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 S WHERE S.age > 18 GROUP BY S.rating HAVING COUNT (*) > 1 Answer relation: rating minage 3 25.5 7 35.0 8 25.5 Sailors instance: 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

Find those ratings for which the average age is the minimum over all ratings Aggregate operations cannot be nested! WRONG: SELECT S.rating FROM Sailors S WHERE S.age = (SELECT MIN (AVG (S2.age)) FROM Sailors S2) Correct solution (in SQL/92): SELECT Temp.rating, Temp.avgage FROM (SELECT S.rating, AVG (S.age) AS avgage FROM _Sailors S GROUP BY S.rating) AS Temp WHERE Temp.avgage = (SELECT MIN (Temp2.avgage) FROM (SELECT AVG (S.age) AS avgage FROM _Sailors S GROUP BY S.rating) AS Temp2)

For each red boat, find the number of reservations for this boat

For each red boat, find the number of reservations for this boat SELECT B.bid, COUNT (*) AS scount FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND B.color= red GROUP BY B.bid 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? SELECT B.bid, COUNT (*) AS scount FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid GROUP BY B.bid HAVING B.color= red

Find the product models for which the maximum list price is more than twice the average for the model USE AdventureWorks2008R2; GO SELECT p1.productmodelid FROM Production.Product p1 GROUP BY p1.productmodelid HAVING MAX(p1.ListPrice) >= ALL (SELECT 2 * AVG(p2.ListPrice) FROM Production.Product p2 WHERE p1.productmodelid = p2.productmodelid) ; GO

Null Values Field values in a tuple are sometimes unknown (e.g., a rating has not been assigned) or inapplicable (e.g., no maiden name) SQL provides a special value null for such situations The presence of null complicates many issues 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 WHERE clause eliminates rows that don t evaluate to true New operators (in particular, outer joins) possible/needed

Integrity Constraints 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 Can be used to 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

General Constraints Useful when more general ICs than keys are involved Can use queries to express constraint Constraints can be named 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 nointerlakeres CHECK (`Interlake <> ( SELECT B.bname FROM Boats B WHERE B.bid=bid)))

Constraints Over Multiple Relations CREATE TABLE Sailors ( sid INTEGER, sname CHAR(10), rating INTEGER, age REAL, PRIMARY KEY (sid), CHECK Number of boats plus number of sailors is < 100 ( (SELECT COUNT (S.sid) FROM Sailors S) + (SELECT COUNT (B.bid) FROM Boats B) < 100 ) ASSERTION is the right solution; not associated with either table Awkward and wrong! If Sailors is empty, the number of Boats tuples can be anything! CREATE ASSERTION smallclub CHECK ( (SELECT COUNT (S.sid) FROM Sailors S) + (SELECT COUNT (B.bid) FROM Boats B) < 100 )

Triggers Trigger: procedure that starts automatically if specified changes occur to the DBMS Deamon that monitors a database, and is executed when the DB is modified in a way that matches the event specification An insert, delete or update statement could activate a trigger (before/after executing the changes) Three parts: Event (activates the trigger) Condition (tests whether the triggers should run) Action (what happens if the trigger runs)

Triggers: Example (SQL:1999) CREATE TRIGGER youngsailorupdate AFTER INSERT ON SAILORS REFERENCING NEW TABLE NewSailors FOR EACH STATEMENT INSERT INTO YoungSailors(sid, name, age, rating) SELECT sid, name, age, rating FROM NewSailors N WHERE N.age <= 18

Summary SQL was an important factor in the early acceptance of the relational model more natural than earlier, procedural query languages Relationally complete; in fact, significantly more expressive power than relational algebra Even queries that can be expressed in RA can often be expressed more naturally in SQL Many alternative ways to write a query; optimizer should look for most efficient evaluation plan In practice, users need to be aware of how queries are optimized and evaluated for best results

Summary NULL for unknown field values brings many complications SQL allows specification of rich integrity constraints Triggers respond to changes in the database

Sample Questions

Q11: List the names of managers with at least one dependent EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO) DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE) DEPT_LOCATIONS(DNUMBER, DLOCATION) PROJECT(PNAME, PNUMBER, PLOCATION, DNUM) WORKSON(ESSN, PNO, HOURS) DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP) SELECT FROM WHERE EMPLOYEE.NAME EMPLOYEE, DEPARTMENT DEPARTMENT.MGRSSN = EMPLOYEE.SSN AND EMPLOYEE.SSN IN (SELECT DISTINCT ESSN FROM DEPENDENT)

Q12: List the names of employees who do not work on a project controlled by department no 5 EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO) DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE) DEPT_LOCATIONS(DNUMBER, DLOCATION) PROJECT(PNAME, PNUMBER, PLOCATION, DNUM) WORKSON(ESSN, PNO, HOURS) DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP) SELECT NAME FROM EMPLOYEE WHERE SSN NOT IN (SELECT WORKSON.ESSN FROM WORKSON, PROJECT WHERE WORKSON.PNO = PROJECT.PNUMBER AND PROJECT.DNUM = 5)

Q13: List the names of employees who do not work on all projects controlled by department no 5 EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO) DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE) DEPT_LOCATIONS(DNUMBER, DLOCATION) PROJECT(PNAME, PNUMBER, PLOCATION, DNUM) WORKSON(ESSN, PNO, HOURS) DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP) SELECT E.NAME FROM WORKSON W, EMPLOYEE E WHERE E.SSN = W.ESSN AND EXISTS ((SELECT P.PNUMBER FROM PROJECT P WHERE P.DNUM = 5) EXCEPT (SELECT W1.PNO FROM WORKSON W1 WHERE W1.ESSN = W.ESSN)) ORACLE DOES NOT SUPPORT EXCEPT!!! SQL Server Supports it

Q13: List the names of employees who do not work on all projects controlled by department no 5 EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO) DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE) DEPT_LOCATIONS(DNUMBER, DLOCATION) PROJECT(PNAME, PNUMBER, PLOCATION, DNUM) WORKSON(ESSN, PNO, HOURS) DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP) SELECT E.NAME FROM WORKSON W, EMPLOYEE E WHERE E.SSN = W.ESSN AND EXISTS (SELECT P.PNUMBER FROM PROJECT P WHERE P.DNUM = 5 AND NOT EXISTS (SELECT W1.ESSN FROM WORKSON W1 WHERE W1.ESSN = W.ESSN AND W1.PNO = P.PNUMBER))

Q14: List the names of employees who do not have supervisors (IS NULL checks for null values!) EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO) DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE) DEPT_LOCATIONS(DNUMBER, DLOCATION) PROJECT(PNAME, PNUMBER, PLOCATION, DNUM) WORKSON(ESSN, PNO, HOURS) DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP) SELECT NAME FROM EMPLOYEE WHERE SUPERSSN IS NULL

Q15: Find the SUM of the salaries of all employees, the max salary, min salary and average salary EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO) DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE) DEPT_LOCATIONS(DNUMBER, DLOCATION) PROJECT(PNAME, PNUMBER, PLOCATION, DNUM) WORKSON(ESSN, PNO, HOURS) DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP) SELECT SUM(SALARY) AS SALARY_SUM, MAX(SALARY) AS MAX_SALARY, MIN(SALARY) AS MIN_SALARY, AVG(SALARY) AS AVERAGE_SALARY FROM EMPLOYEE

Q16: Find the SUM of the salaries of all employees, the max salary, min salary and average salary for research department EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO) DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE) DEPT_LOCATIONS(DNUMBER, DLOCATION) PROJECT(PNAME, PNUMBER, PLOCATION, DNUM) WORKSON(ESSN, PNO, HOURS) DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP) SELECT SUM(SALARY) AS SALARY_SUM, MAX(SALARY) AS MAX_SALARY, MIN(SALARY) AS MIN_SALARY, AVG(SALARY) AS AVERAGE_SALARY FROM EMPLOYEE, DEPARTMENT WHERE EMPLOYEE.DNO = DEPARTMENT.DNUMBER AND DEPARTMENT.DNAME = 'RESEARCH'

Q17: Find the number of employees in research department EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO) DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE) DEPT_LOCATIONS(DNUMBER, DLOCATION) PROJECT(PNAME, PNUMBER, PLOCATION, DNUM) WORKSON(ESSN, PNO, HOURS) DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP) SELECT COUNT(*) AS EMPLOYEE_COUNT FROM EMPLOYEE, DEPARTMENT WHERE EMPLOYEE.DNO = DEPARTMENT.DNUMBER AND DEPARTMENT.DNAME = 'RESEARCH'

Q19: Display the names of the employees who do not practice birth control (more than 5 children) EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO) DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE) DEPT_LOCATIONS(DNUMBER, DLOCATION) PROJECT(PNAME, PNUMBER, PLOCATION, DNUM) WORKSON(ESSN, PNO, HOURS) DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP) SELECT NAME FROM EMPLOYEE WHERE SSN IN (SELECT ESSN FROM DEPENDENT WHERE RELATIONSHIP = 'Child' GROUP BY ESSN HAVING COUNT(*) > 5)

Q20: For each department, retrieve the department number, number of employees in that department and the average salary EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO) DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE) DEPT_LOCATIONS(DNUMBER, DLOCATION) PROJECT(PNAME, PNUMBER, PLOCATION, DNUM) WORKSON(ESSN, PNO, HOURS) DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP) SELECT DNO, COUNT(*) AS EMPLOYEE_COUNT, AVG(SALARY) AS AVERAGE_SALARY FROM EMPLOYEE GROUP BY DNO

Q21: For each project, retrieve the project number, the project name, and the number of employees who work for that project EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO) DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE) DEPT_LOCATIONS(DNUMBER, DLOCATION) PROJECT(PNAME, PNUMBER, PLOCATION, DNUM) WORKSON(ESSN, PNO, HOURS) DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP) SELECT PROJECT.PNAME, PROJECT.PNUMBER, COUNT(*) AS EMPLOYEE_COUNT FROM PROJECT, WORKSON WHERE WORKSON.PNO = PROJECT.PNUMBER GROUP BY PROJECT.PNUMBER DO YOU SEE ANYTHING WRONG WITH THIS QUERY?

Q22: For each project on which more than two employees work, retrieve the project number, the project name, and the number of employees who work on the project EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO) DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE) DEPT_LOCATIONS(DNUMBER, DLOCATION) PROJECT(PNAME, PNUMBER, PLOCATION, DNUM) WORKSON(ESSN, PNO, HOURS) DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP) SELECT PROJECT.PNAME, PROJECT.PNUMBER, COUNT(*) AS EMPLOYEE_COUNT FROM PROJECT, WORKSON WHERE WORKSON.PNO = PROJECT.PNUMBER GROUP BY PROJECT.PNUMBER, PROJECT.PNAME HAVING COUNT(*) > 2

Q23: For each department that has more than five employees, retrieve the department number and the number of its employees who are making more than 40000 yearly EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO) DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE) DEPT_LOCATIONS(DNUMBER, DLOCATION) PROJECT(PNAME, PNUMBER, PLOCATION, DNUM) WORKSON(ESSN, PNO, HOURS) DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP) SELECT DNO, COUNT(*) AS EMPLOYEE_COUNT FROM EMPLOYEE WHERE SALARY * 12 > 40000 AND DNO IN (SELECT DNO FROM EMPLOYEE GROUP BY DNO HAVING COUNT(*) > 5) GROUP BY DNO