Vous êtes sur la page 1sur 8

Solved Problems SQL

Chapter 2 2.1 Consider the tables in Figure 2.1. Write the SQL code for the queries that will return the following:

(a) The PO details associated with Purchase Order 2594:


SELECT * FROM PO_DETAIL WHERE PO_NUMBER=2594;

(b) The list of purchase order numbers, without duplication, that have an OPEN line item:
SELECT DISTINCT PO_NUMBER FROM PO_DETAIL WHERE STATUS = OPEN;

(c) The following PO details from purchase orders placed with Vendor V250: PO_NUMBER, PO_LINE_ITEM, MATERIAL_ID, QUANTITY, UNIT_COST, TOTAL_COST (QUANTITY UNIT_COST): SELECT PO_NUMBER, PO_LINE_ITEM, MATERIAL_ID, QUANTITY, UNIT_COST, (QUANTITY * UNIT_COST) AS TOTAL_COST FROM PO_DETAIL WHERE PO_NUMBER IN (SELECT PO_NUMBER FROM PURCHASE_ORDER WHERE VENDOR_ID=V250); (d) Repeat part c, but order the result by TOTAL_COST increasing: SELECT PO_NUMBER, PO_LINE_ITEM, MATERIAL_ID, QUANTITY, UNIT_COST, (QUANTITY * UNIT_COST) AS TOTAL_COST FROM PO_DETAIL WHERE PO_NUMBER IN (SELECT PO_NUMBER FROM PURCHASE_ORDER WHERE VENDOR_ID=V250) ORDER BY TOTAL_COST ASC;

(e) Return the number of purchase orders whose PO_AMT is greater than 3000: SELECT COUNT(PO_NUMBER) FROM PURCHASE_ORDER WHERE PO_AMT > 3000;

(f) Return the vendor ID, without duplication, of any vendor having an open PO line item where quantity times unit cost is more than $500: SELECT DISTINCT VENDOR_ID FROM PURCHASE_ORDER WHERE PO_NUMBER IN (SELECT PO_NUMBER FROM PO_DETAIL WHERE STATUS = OPEN AND (QUANTITY * UNIT_COST) > 500);

(g) Return V_NAME, PO_NUMBER, PO_LINE_ITEM, TOTAL_COST (QUANTITY*UNIT_COST) from any vendor with an OPEN purchase order having a PO_AMT greater than $2000.

SELECT VENDOR.VENDOR_NAME, PURCHASE_ORDER .PO_NUMBER, PO_DETAIL. PO_LINE_IT, (PO_DETAIL.QUANTITY * PO_DETAIL. UNIT_COST) AS TOTAL_COST FROM VENDOR, PURCHASE_ORDER, PO_DETAIL WHERE VENDOR.VENDOR_ID = PURCHASE_ORDER.VENDOR_ID AND PURCHASE_ORDER.PO_NUMBER = PO_DETAIL.PO_NUMBER AND PURCHASE_ORDER.PO_STATUS = "OPEN" AND PURCHASE_ORDER.PO_AMT>2000;

2.3 The human resources department of an enterprise maintains a database on the companys employees in order to track their qualifications at various skill levels. The tables are as follows.

All attributes are text data types except DATE_QUALIFIED, which is a date data type. The database can be downloaded from the web site supporting this book. (a) Identify the primary key(s) and foreign key(s) of each table.

Table name EMPLOYEE SKILL DEPARTMENT EMPLOYEE_SKILL_SET

Primary key EMPL_ID SKILL_ID DEPT_ID EMPL_ID , SKILL_ID

Foreign key DEPT_ID ----------------EMPL_ID , SKILL_ID

(b) Write the SQL commands to return the following data from the database: (1) The first and last names of the employees who work in Department 30: SELECT FIRST_NAME, LAST_NAME FROM EMPLOYEE WHERE DEPT_ID = 30; (2) The first and last names of employees with the SKILL_ID of 110 One sub-query: SELECT FIRST_NAME, LAST_NAME FROM EMPLOYEE WHERE EMPL_ID IN (SELECT EMPL_ID FROM EMPLOYEE_SKILL_SET WHERE SKILL_ID = 110) ; (3) The first and last names of the employees who are C Programmers Two sub-queries: SELECT FIRST_NAME, LAST_NAME

FROM EMPLOYEE WHERE EMPL_ID IN (SELECT EMPL_ID FROM EMPLOYEE_SKILL_SET WHERE SKILL_ID IN (SELECT SKILL_ID FROM SKILL WHERE SKILL_DESC = C Programmer)) ; (4) The number of Java Programmers in Department 30 SELECT COUNT(EMPL_ID) FROM EMPLOYEE WHERE DEPT_ID = 30 AND EMPL_ID IN (SELECT EMPL_ID FROM EMPLOYEE_SKILL_ SET WHERE SKILL_ID IN (SELECT SKILL_ID FROM SKILL WHERE SKILL_DESC = Java programmer)); OR SELECT COUNT(SKILL_ID) FROM EMPLOYEE_SKILL_SET WHERE SKILL_ID IN (SELECT SKILL_ID FROM SKILL WHERE SKILL_DESC = Java Programmer)) AND EMPL_ID IN (SELECT EMPL_ID FROM EMPLOYEE WHERE DEPT_ID = 30); (5) The last and first names of the Java Programmers in Department 30 listed alphabetically by last name

SELECT FIRST_NAME, LAST_NAME FROM EMPLOYEE WHERE EMPL_ID IN (SELECT EMPL_ID FROM EMPLOYEE_SKILL_SET WHERE SKILL_ID IN (SELECT SKILL_ID FROM SKILL WHERE SKILL_DESC = Java Programmer)) ; AND DEPT_ID = 30) ORDER BY LAST_NAME; (6) The department ID and department name, listed without repetition, of any departments that do not have Java Programmers Three sub-queries SELECT DISTINCT DEPT_ID, DEPT_NAME FROM DEPARTMENT WHERE NOT DEPT_ID IN (SELECT DEPT_ID FROM EMPLOYEE IN WHERE EMPL_ID IN (SELECT EMPL_ID FROM EMPLOYEE_SKILL_SET WHERE SKILL_ID IN (SELECT SKILL_ID FROM SKILL WHERE SKILL_DESC = Java Programmer))));

Vous aimerez peut-être aussi