Subqueries
ObjectivesAfter completing this lesson, you should be able to do the following:Describe the types of problems that subqueries can solveDefine subqueriesList the types of subqueriesWrite single-row and multiple-row subqueries
Using a Subquery to Solve a Problem“Who has a salary greater than Jones’?”Main Query“Which employees have a salary greater than Jones’ salary?”?Subquery?“What is Jones’ salary?”
SubqueriesSELECTselect_listFROMtableWHEREexpr operator		 	(SELECTselect_list       FROMtable);The subquery (inner query) executes once before the main query.The result of the subquery is used by the main query (outer query).
2975SQL> SELECT ename2  FROM   emp3  WHERE  sal > 4		    (SELECT sal5               FROM   emp6               WHERE  empno=7566);Using a SubqueryENAME----------KINGFORDSCOTT
Guidelines for Using SubqueriesEnclose subqueries in parentheses. Place subqueries on the right side of the comparison operator.Do not add an ORDER BY clause to a subquery.Use single-row operators with single-row subqueries.Use multiple-row operators with multiple-row subqueries.
Main queryreturnsSubqueryMultiple-row subqueryMain queryCLERKMANAGERreturnsSubqueryMultiple-column subqueryMain queryreturnsCLERK        7900MANAGER  7698SubqueryTypes of SubqueriesSingle-row subqueryCLERK
Single-Row SubqueriesReturn only one rowUse single-row comparison operatorsOperator=>      >=	<      <=	<>MeaningEqual toGreater than Greater than or equal to Less than Less than or equal toNot equal to
CLERK1100Executing Single-Row SubqueriesSQL> SELECT   ename, job2  FROM     emp3  WHERE    job = 4		(SELECT  job5FROM     emp6WHERE    empno = 7369)7  AND      sal > 8		(SELECT  sal9FROMemp10WHEREempno = 7876); ENAME      JOB---------- ---------MILLER     CLERK
Using Group Functions in a Subquery800SQL> SELECTename, job, sal2  FROMemp3  WHEREsal = 4			(SELECTMIN(sal)5FROMemp);ENAME      JOB             SAL---------- --------- ---------SMITH      CLERK           800
HAVING Clause with Subqueries800The Oracle Server executes subqueries first.The Oracle Server returns results into the HAVING clause of the main query.SQL> SELECTdeptno, MIN(sal)2  FROMemp3  GROUP BYdeptno4  HAVINGMIN(sal) >5		(SELECTMIN(sal)6FROMemp7WHEREdeptno = 20);
What Is Wrong with This Statement?SQL> SELECT empno, ename2  FROM   emp3  WHERE  sal = 4		(SELECT   MIN(sal)5FROM      emp6GROUP BY  deptno);Single-row operator with multiple-row subqueryERROR:ORA-01427: single-row subquery returns more thanone rowno rows selected
Will This Statement Work?SQL> SELECT ename, job2  FROM   emp3  WHERE  job = 4		(SELECTjob5FROMemp6WHEREename='SMYTHE');no rows selectedSubquery returns no values
Multiple-Row SubqueriesReturn more than one rowUse multiple-row comparison operatorsOperator      IN     ANY     ALLMeaningEqual to any member in the listCompare value to each value returned by the subquery Compare value to every value returned by the subquery
Using ANY Operator in Multiple-Row Subqueries13001100800950SQL> SELECT  empno, ename, job2  FROM    emp3  WHERE   sal < ANY 4			(SELECTsal5FROMemp6WHEREjob = 'CLERK')7  AND    job <> 'CLERK';    EMPNO ENAME      JOB--------- ---------- ---------7654 MARTIN     SALESMAN 7521 WARD       SALESMAN
Using ALL Operator in Multiple-Row Subqueries1566.666721752916.6667SQL> SELECT  empno, ename, job2  FROM    emp3  WHERE   sal > ALL 4		 (SELECTavg(sal)5FROMemp6GROUP BYdeptno);    EMPNO ENAME      JOB--------- ---------- ---------7839 KING       PRESIDENT7566 JONES      MANAGER7902 FORD       ANALYST7788 SCOTT      ANALYST
SummarySubqueries are useful when a query is based on unknown values.SELECTselect_listFROMtableWHEREexpr operator		 (SELECT select_listFROMtable);
Practice OverviewCreating subqueries to query values based on unknown criteriaUsing subqueries to find out what values exist in one set of data and not in another

Les06 Subqueries

  • 1.
  • 2.
    ObjectivesAfter completing thislesson, you should be able to do the following:Describe the types of problems that subqueries can solveDefine subqueriesList the types of subqueriesWrite single-row and multiple-row subqueries
  • 3.
    Using a Subqueryto Solve a Problem“Who has a salary greater than Jones’?”Main Query“Which employees have a salary greater than Jones’ salary?”?Subquery?“What is Jones’ salary?”
  • 4.
    SubqueriesSELECTselect_listFROMtableWHEREexpr operator (SELECTselect_list FROMtable);The subquery (inner query) executes once before the main query.The result of the subquery is used by the main query (outer query).
  • 5.
    2975SQL> SELECT ename2 FROM emp3 WHERE sal > 4 (SELECT sal5 FROM emp6 WHERE empno=7566);Using a SubqueryENAME----------KINGFORDSCOTT
  • 6.
    Guidelines for UsingSubqueriesEnclose subqueries in parentheses. Place subqueries on the right side of the comparison operator.Do not add an ORDER BY clause to a subquery.Use single-row operators with single-row subqueries.Use multiple-row operators with multiple-row subqueries.
  • 7.
    Main queryreturnsSubqueryMultiple-row subqueryMainqueryCLERKMANAGERreturnsSubqueryMultiple-column subqueryMain queryreturnsCLERK 7900MANAGER 7698SubqueryTypes of SubqueriesSingle-row subqueryCLERK
  • 8.
    Single-Row SubqueriesReturn onlyone rowUse single-row comparison operatorsOperator=> >= < <= <>MeaningEqual toGreater than Greater than or equal to Less than Less than or equal toNot equal to
  • 9.
    CLERK1100Executing Single-Row SubqueriesSQL>SELECT ename, job2 FROM emp3 WHERE job = 4 (SELECT job5FROM emp6WHERE empno = 7369)7 AND sal > 8 (SELECT sal9FROMemp10WHEREempno = 7876); ENAME JOB---------- ---------MILLER CLERK
  • 10.
    Using Group Functionsin a Subquery800SQL> SELECTename, job, sal2 FROMemp3 WHEREsal = 4 (SELECTMIN(sal)5FROMemp);ENAME JOB SAL---------- --------- ---------SMITH CLERK 800
  • 11.
    HAVING Clause withSubqueries800The Oracle Server executes subqueries first.The Oracle Server returns results into the HAVING clause of the main query.SQL> SELECTdeptno, MIN(sal)2 FROMemp3 GROUP BYdeptno4 HAVINGMIN(sal) >5 (SELECTMIN(sal)6FROMemp7WHEREdeptno = 20);
  • 12.
    What Is Wrongwith This Statement?SQL> SELECT empno, ename2 FROM emp3 WHERE sal = 4 (SELECT MIN(sal)5FROM emp6GROUP BY deptno);Single-row operator with multiple-row subqueryERROR:ORA-01427: single-row subquery returns more thanone rowno rows selected
  • 13.
    Will This StatementWork?SQL> SELECT ename, job2 FROM emp3 WHERE job = 4 (SELECTjob5FROMemp6WHEREename='SMYTHE');no rows selectedSubquery returns no values
  • 14.
    Multiple-Row SubqueriesReturn morethan one rowUse multiple-row comparison operatorsOperator IN ANY ALLMeaningEqual to any member in the listCompare value to each value returned by the subquery Compare value to every value returned by the subquery
  • 15.
    Using ANY Operatorin Multiple-Row Subqueries13001100800950SQL> SELECT empno, ename, job2 FROM emp3 WHERE sal < ANY 4 (SELECTsal5FROMemp6WHEREjob = 'CLERK')7 AND job <> 'CLERK'; EMPNO ENAME JOB--------- ---------- ---------7654 MARTIN SALESMAN 7521 WARD SALESMAN
  • 16.
    Using ALL Operatorin Multiple-Row Subqueries1566.666721752916.6667SQL> SELECT empno, ename, job2 FROM emp3 WHERE sal > ALL 4 (SELECTavg(sal)5FROMemp6GROUP BYdeptno); EMPNO ENAME JOB--------- ---------- ---------7839 KING PRESIDENT7566 JONES MANAGER7902 FORD ANALYST7788 SCOTT ANALYST
  • 17.
    SummarySubqueries are usefulwhen a query is based on unknown values.SELECTselect_listFROMtableWHEREexpr operator (SELECT select_listFROMtable);
  • 18.
    Practice OverviewCreating subqueriesto query values based on unknown criteriaUsing subqueries to find out what values exist in one set of data and not in another