HAVING product_type_id product_type_idSELECT product_type_id, AVG(price) FROM products GROUP BY product_type_id ORDER BY product_type_id; PRODUCT_TYPE_ID AVG(PRICE) --------------- ---------- 1 24.975 2 26.22 3 13.24 4 13.99 13.49 product_type_id FROM FROM product_id SELECT product_id FROM (SELECT product_id FROM products WHERE product_id < 3); PRODUCT_ID ---------- 1 2 products product_id product_id FROM product_id price products SELECT prds.product_id, price, purchases_data.product_count FROM products prds, (SELECT product_id, COUNT(product_id) product_count
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
HAVINGproduct_type_idproduct_type_id
SELECT product_type_id, AVG(price)FROM productsGROUP BY product_type_idORDER BY product_type_id;
ORA-01427: single-row subquery returns more than one row.
=
SQL> SELECT product_id, name 2 FROM products 3 WHERE product_id = 4 (SELECT product_id 5 FROM products 6 WHERE name LIKE '%e%');
(SELECT product_id *ERROR at line 4:ORA-01427: single-row subquery returns more than one row
productse
ORDER BYORDER BYproduct_id
SELECT product_id, name, priceFROM productsWHERE price > (SELECT AVG(price) FROM products)ORDER BY product_id DESC;
PRODUCT_ID NAME PRICE---------- ------------------------------ ---------- 5 Z Files 49.99 3 Supernova 25.99 2 Chemistry 30 1 Modern Science 19.95
INANYALL
SELECT product_id, nameFROM productsWHERE product_id IN (1, 2, 3);
PRODUCT_ID NAME---------- ------------------- 1 Modern Science 2 Chemistry 3 Supernova
EXISTS
INNOT ININ
INproduct_idproduct_ide
SELECT product_id, nameFROM productsWHERE product_id IN
(SELECT product_id FROM products WHERE name LIKE '%e%');
PRODUCT_ID NAME---------- ------------------- 1 Modern Science 2 Chemistry 3 Supernova 5 Z Files 6 2412: The Return 7 Space Force 9 8 From Another Planet 11 Creative Yell 12 My Front Line
NOT INpurchases
SELECT product_id, nameFROM productsWHERE product_id NOT IN (SELECT product_id FROM purchases);
PRODUCT_ID NAME---------- ------------------- 4 Tank War 5 Z Files 6 2412: The Return 7 Space Force 9 8 From Another Planet 9 Classical Music 10 Pop 3 11 Creative Yell 12 My Front Line
ANY=<><><=>=ANYANYsalary_grades
SELECT employee_id, last_nameFROM employeesWHERE salary < ANY (SELECT low_salary FROM salary_grades);
EMPLOYEE_ID LAST_NAME----------- ---------- 2 Johnson 3 Hobbs 4 Jones
ALL=<><><=>=ALLALLsalary_grades
SELECT employee_id, last_nameFROM employeesWHERE salary > ALL (SELECT high_salary FROM salary_grades);
no rows selected
SELECT product_id, product_type_id, name, priceFROM productsWHERE (product_type_id, price) IN (SELECT product_type_id, MIN(price) FROM products GROUP BY product_type_id);
PRODUCT_ID PRODUCT_TYPE_ID NAME PRICE---------- --------------- ------------------------------ ---------- 1 1 Modern Science 19.95 4 2 Tank War 13.95 8 3 From Another Planet 12.99 9 4 Classical Music 10.99
product_type_idpriceWHEREproduct_type_idprice
SELECT product_id, product_type_id, name, priceFROM products outerWHERE price > (SELECT AVG(price) FROM products inner WHERE inner.product_type_id = outer.product_type_id);
PRODUCT_ID PRODUCT_TYPE_ID NAME PRICE---------- --------------- ------------------------------ ---------- 2 1 Chemistry 30 5 2 Z Files 49.99 7 3 Space Force 9 13.49 10 4 Pop 3 15.99 11 4 Creative Yell 14.99
FROM employees inner WHERE inner.manager_id = outer.employee_id);
EMPLOYEE_ID LAST_NAME----------- ---------- 1 Smith 2 Johnson
EXISTS
SELECT employee_id, last_nameFROM employees outerWHERE EXISTS (SELECT 1 FROM employees inner WHERE inner.manager_id = outer.employee_id);
EMPLOYEE_ID LAST_NAME----------- ---------- 1 Smith 2 Johnson
EXISTSEXISTSEXISTS
NOT EXISTS
SELECT product_id, nameFROM products outerWHERE NOT EXISTS (SELECT 1 FROM purchases inner WHERE inner.product_id = outer.product_id);
PRODUCT_ID NAME---------- ------------------- 4 Tank War 5 Z Files 6 2412: The Return 7 Space Force 9 8 From Another Planet 9 Classical Music 10 Pop 3 11 Creative Yell 12 My Front Line
INEXISTSINEXISTSIN
EXISTSINEXISTSIN
NOT EXISTSNOT INNOT EXISTSNOT INNOT EXISTSproducts
SELECT product_type_id, nameFROM product_types outerWHERE NOT EXISTS (SELECT 1 FROM products inner WHERE inner.product_type_id = outer.product_type_id);
SELECT product_type_id, AVG(price)FROM productsGROUP BY product_type_idHAVING AVG(price) < (SELECT MAX(AVG(price)) FROM products WHERE product_type_id IN (SELECT product_id FROM purchases WHERE quantity > 1) GROUP BY product_type_id)ORDER BY product_type_id;
PRODUCT_ID PRODUCT_TYPE_ID NAME---------- --------------- ------------------- 1 1 Modern Science 2 1 Chemistry 3 2 Supernova 4 2 Tank War 5 2 Z Files 6 2 2412: The Return 7 3 Space Force 9 8 3 From Another Planet 9 4 Classical Music 10 4 Pop 3 11 4 Creative Yell 12 My Front Line
PRODUCT_ID PRODUCT_TYPE_ID NAME---------- --------------- ------------------------------ 1 1 Modern Science 2 1 Chemistry 3 2 Supernova 4 2 Tank War 5 2 Z Files 6 2 2412: The Return 7 3 Space Force 9 8 3 From Another Planet 9 4 Classical Music 10 4 Pop 3 11 4 Creative Yell 12 My Front Line 1 1 Modern Science 2 1 Chemistry 3 Supernova 4 2 Lunar Landing 5 2 Submarine
PRODUCT_ID PRODUCT_TYPE_ID NAME---------- --------------- ------------------- 1 1 Modern Science 1 1 Modern Science 2 1 Chemistry 2 1 Chemistry 3 2 Supernova 3 Supernova 4 2 Tank War 4 2 Lunar Landing 5 2 Z Files 5 2 Submarine 6 2 2412: The Return 7 3 Space Force 9 8 3 From Another Planet 9 4 Classical Music 10 4 Pop 3 11 4 Creative Yell 12 My Front Line
PRODUCT_ID PRODUCT_TYPE_ID NAME---------- --------------- ------------------- 1 1 Modern Science 2 1 Chemistry 3 2 Supernova 3 Supernova 4 2 Lunar Landing 4 2 Tank War 5 2 Submarine 5 2 Z Files 6 2 2412: The Return 7 3 Space Force 9 8 3 From Another Planet 9 4 Classical Music 10 4 Pop 3 11 4 Creative Yell 12 My Front Line
PRODUCT_ID PRODUCT_TYPE_ID NAME---------- --------------- ------------------- 3 2 Supernova 4 2 Tank War 5 2 Z Files 6 2 2412: The Return 7 3 Space Force 9 8 3 From Another Planet 9 4 Classical Music 10 4 Pop 3 11 4 Creative Yell 12 My Front Line
PRODUCT_ID PRODUCT_TYPE_ID NAME---------- --------------- ------------------- 1 1 Modern Science 2 1 Chemistry 3 2 Supernova 4 2 Tank War 5 2 Z Files 6 2 2412: The Return 7 3 Space Force 9 8 3 From Another Planet 9 4 Classical Music 10 4 Pop 3 11 4 Creative Yell 12 My Front Line
availablemore_productsavailable'Product is available''Product is not available'
SELECT prd_id, available, DECODE(available, 'Y', 'Product is available', 'Product is not available')FROM more_products;
PRD_ID A DECODE(AVAILABLE,'Y','PR---------- - ------------------------ 1 Y Product is available 2 Y Product is available 3 N Product is not available 4 N Product is not available 5 Y Product is available
PRODUCT_ID PRODUCT_TYPE_ID DECODE(P---------- --------------- -------- 1 1 Book 2 1 Book 3 2 Video 4 2 Video 5 2 Video 6 2 Video 7 3 DVD 8 3 DVD 9 4 CD 10 4 CD 11 4 CD 12 Magazine
product_type_idBook
product_type_idVideo
product_type_idDVD
product_type_idCD
product_type_idMagazine
CASECASEDECODE()CASECASE
CASE
CASE
CASECASE
CASE search_expression WHEN expression1 THEN result1 WHEN expression2 THEN result2 ... WHEN expressionN THEN resultN ELSE default_resultEND
SELECT product_id, product_type_id, CASE product_type_id WHEN 1 THEN 'Book' WHEN 2 THEN 'Video' WHEN 3 THEN 'DVD' WHEN 4 THEN 'CD' ELSE 'Magazine' ENDFROM products;
PRODUCT_ID PRODUCT_TYPE_ID CASEPROD---------- --------------- -------- 1 1 Book 2 1 Book 3 2 Video 4 2 Video 5 2 Video 6 2 Video 7 3 DVD 8 3 DVD 9 4 CD 10 4 CD 11 4 CD 12 Magazine
CASECASE
CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... WHEN conditionN THEN resultN ELSE default_resultEND
condition1, condition2, ..., conditionN
result1, result2, ..., resultNcondition1result1
default_result
CASE
SELECT product_id, product_type_id, CASE WHEN product_type_id = 1 THEN 'Book' WHEN product_type_id = 2 THEN 'Video' WHEN product_type_id = 3 THEN 'DVD' WHEN product_type_id = 4 THEN 'CD' ELSE 'Magazine' ENDFROM products;
PRODUCT_ID PRODUCT_TYPE_ID CASEPROD---------- --------------- -------- 1 1 Book 2 1 Book 3 2 Video 4 2 Video 5 2 Video 6 2 Video 7 3 DVD 8 3 DVD 9 4 CD 10 4 CD 11 4 CD 12 Magazine
CASE
SELECT product_id, price, CASE WHEN price > 15 THEN 'Expensive' ELSE 'Cheap' ENDFROM products;
EMPLOYEE_ID MANAGER_ID FIRST_NAME LAST_NAME TITLE SALARY----------- ---------- ---------- ---------- ------------- ---------- 1 James Smith CEO 800000 2 1 Ron Johnson Sales Manager 600000 3 2 Fred Hobbs Sales Person 200000 4 1 Susan Jones Support Manager 500000 5 2 Rob Green Sales Person 40000 6 4 Jane Brown Support Person 45000 7 4 John Grey Support Manager 30000 8 7 Jean Blue Support Person 29000
9 6 Henry Heyson Support Person 30000 10 1 Kevin Black Ops Manager 100000 11 10 Keith Long Ops Person 50000 12 10 Frank Howard Ops Person 45000 13 10 Doreen Penn Ops Person 47000
CONNECT BYSTART WITHSELECT
CONNECT BYSTART WITHSELECT
SELECT [LEVEL], column, expression, ...FROM table[WHERE where_clause][[START WITH start_condition] [CONNECT BY PRIOR prior_condition]];
prior_conditionCONNECT BY PRIORprior_conditionemployee_id = manager_idemployee_idmanager_idmanager_idemployee_id
START WITHCONNECT BY PRIORmanager_id
SELECT employee_id, manager_id, first_name, last_nameFROM more_employeesSTART WITH employee_id = 1CONNECT BY PRIOR employee_id = manager_id;
EMPLOYEE_ID MANAGER_ID FIRST_NAME LAST_NAME----------- ---------- ---------- --------- 1 James Smith 2 1 Ron Johnson 3 2 Fred Hobbs 5 2 Rob Green 4 1 Susan Jones 6 4 Jane Brown 9 6 Henry Heyson 7 4 John Grey 8 7 Jean Blue 10 1 Kevin Black 11 10 Keith Long 12 10 Frank Howard 13 10 Doreen Penn
LEVEL
SELECT LEVEL, employee_id, manager_id, first_name, last_nameFROM more_employeesSTART WITH employee_id = 1CONNECT BY PRIOR employee_id = manager_idORDER BY LEVEL;
LEVEL EMPLOYEE_ID MANAGER_ID FIRST_NAME LAST_NAME---------- ----------- ---------- ---------- --------- 1 1 James Smith 2 2 1 Ron Johnson 2 4 1 Susan Jones 2 10 1 Kevin Black 3 3 2 Fred Hobbs 3 7 4 John Grey 3 12 10 Frank Howard 3 13 10 Doreen Penn 3 11 10 Keith Long 3 5 2 Rob Green 3 6 4 Jane Brown 4 9 6 Henry Heyson 4 8 7 Jean Blue
COUNT()LEVEL
SELECT COUNT(DISTINCT LEVEL)FROM more_employeesSTART WITH employee_id = 1CONNECT BY PRIOR employee_id = manager_id;
FROM more_employeesSTART WITH employee_id = ( SELECT employee_id FROM more_employees WHERE first_name = 'Kevin' AND last_name = 'Black')CONNECT BY PRIOR employee_id = manager_id;
LEVEL EMPLOYEE---------- --------------- 1 Kevin Black 2 Keith Long 2 Frank Howard 2 Doreen Penn
CONNECT BY PRIORCONNECT BY PRIOR manager_id = employee_idmanager_idemployee_id
LEVEL
SELECT LEVEL, LPAD(' ', 2 * LEVEL - 1) || first_name || ' ' || last_name AS employeeFROM more_employeesSTART WITH last_name = 'Blue'CONNECT BY PRIOR manager_id = employee_id;
LEVEL EMPLOYEE---------- ------------------ 1 Jean Blue 2 John Grey 3 Susan Jones 4 James Smith
LEVEL EMPLOYEE---------- ------------------- 1 James Smith 2 Susan Jones 3 Jane Brown 4 Henry Heyson 3 John Grey 4 Jean Blue 2 Kevin Black 3 Keith Long 3 Frank Howard 3 Doreen Penn
LEVEL EMPLOYEE SALARY---------- ------------------------- ---------- 3 Rob Green 40000 3 Jane Brown 45000 4 Henry Heyson 30000 3 John Grey 30000 4 Jean Blue 29000 3 Keith Long 50000 3 Frank Howard 45000 3 Doreen Penn 47000
ROLLUPGROUP BY
CUBEGROUP BY
divisions
jobs
employees2
store_schema.sqldivisions
CREATE TABLE divisions ( division_id CHAR(3) CONSTRAINT divisions_pk PRIMARY KEY, name VARCHAR2(15) NOT NULL);
divisions
SELECT *FROM divisions;
DIV NAME--- ----------SAL Sales
OPE OperationsSUP SupportBUS Business
jobs
CREATE TABLE jobs ( job_id CHAR(3) CONSTRAINT jobs_pk PRIMARY KEY, name VARCHAR2(20) NOT NULL);
jobs
SELECT *FROM jobs;
JOB NAME--- ------------WOR WorkerMGR ManagerENG EngineerTEC TechnologistPRE President
EMPLOYEE_ID DIV JOB FIRST_NAME LAST_NAME SALARY----------- --- --- ---------- ---------- ---------- 1 BUS PRE James Smith 800000 2 SAL MGR Ron Johnson 350000 3 SAL WOR Fred Hobbs 140000 4 SUP MGR Susan Jones 200000 5 SAL WOR Rob Green 350000
ROLLUPGROUP BY
GROUP BYGROUP BYemployees2department_idSUM()division_id
SELECT division_id, SUM(salary)FROM employees2GROUP BY division_idORDER BY division_id;
DIV SUM(SALARY)--- -----------BUS 1610000OPE 1320000SAL 4936000SUP 1015000
ROLLUP
SELECT division_id, SUM(salary)FROM employees2GROUP BY ROLLUP(division_id)ORDER BY division_id;
DIV SUM(SALARY)--- -----------BUS 1610000OPE 1320000SAL 4936000SUP 1015000 8881000
SELECT CASE GROUPING(division_id) WHEN 1 THEN 'All divisions' ELSE division_id END AS div, CASE GROUPING(job_id) WHEN 1 THEN 'All jobs' ELSE job_id END AS job, SUM(salary)FROM employees2GROUP BY ROLLUP(division_id, job_id)ORDER BY division_id, job_id;
DIV JOB SUM(SALARY)------------- -------- -----------BUS MGR 530000BUS PRE 800000BUS WOR 280000BUS All jobs 1610000OPE ENG 245000OPE MGR 805000OPE WOR 270000OPE All jobs 1320000SAL MGR 4446000SAL WOR 490000SAL All jobs 4936000SUP MGR 465000SUP TEC 115000SUP WOR 435000SUP All jobs 1015000All divisions All jobs 8881000
GROUPING()CUBE
SELECT CASE GROUPING(division_id) WHEN 1 THEN 'All divisions' ELSE division_id END AS div, CASE GROUPING(job_id) WHEN 1 THEN 'All jobs' ELSE job_id END AS job, SUM(salary)FROM employees2GROUP BY CUBE(division_id, job_id)ORDER BY division_id, job_id;
DIV JOB SUM(SALARY)------------- -------- -----------BUS MGR 530000BUS PRE 800000BUS WOR 280000BUS All jobs 1610000OPE ENG 245000OPE MGR 805000OPE WOR 270000OPE All jobs 1320000SAL MGR 4446000SAL WOR 490000SAL All jobs 4936000SUP MGR 465000SUP TEC 115000SUP WOR 435000SUP All jobs 1015000All divisions ENG 245000All divisions MGR 6246000All divisions PRE 800000All divisions TEC 115000All divisions WOR 1475000All divisions All jobs 8881000
GROUPING SETSGROUPING SETSdivision_idjob_id
SELECT division_id, job_id, SUM(salary)FROM employees2GROUP BY GROUPING SETS(division_id, job_id)ORDER BY division_id, job_id;
DIV JOB SUM(SALARY)--- --- -----------BUS 1610000OPE 1320000
SAL 4936000SUP 1015000 ENG 245000 MGR 6246000 PRE 800000 TEC 115000 WOR 1475000
SELECT division_id, job_id, GROUPING(division_id) AS DIV_GRP, GROUPING(job_id) AS JOB_GRP, GROUPING_ID(division_id, job_id) AS grp_id, SUM(salary)FROM employees2GROUP BY CUBE(division_id, job_id)ORDER BY division_id, job_id;
SELECT prd_type_id, SUM(amount), RANK() OVER (ORDER BY SUM(amount) DESC) AS rank, DENSE_RANK() OVER (ORDER BY SUM(amount) DESC) AS dense_rankFROM all_salesWHERE year = 2003AND amount IS NOT NULLGROUP BY prd_type_idORDER BY prd_type_id;
all_salesAMOUNTPRD_TYPE_ID AND amount IS NOT NULLWHEREANDWHERE
SELECT prd_type_id, SUM(amount), RANK() OVER (ORDER BY SUM(amount) DESC) AS rank, DENSE_RANK() OVER (ORDER BY SUM(amount) DESC) AS dense_rankFROM all_salesWHERE year = 2003GROUP BY prd_type_idORDER BY prd_type_id;
SELECT prd_type_id, SUM(amount), RANK() OVER (ORDER BY SUM(amount) DESC NULLS LAST) AS rank, DENSE_RANK() OVER (ORDER BY SUM(amount) DESC NULLS LAST) AS dense_rankFROM all_salesWHERE year = 2003GROUP BY prd_type_idORDER BY prd_type_id;
SELECT prd_type_id, month, SUM(amount), RANK() OVER (PARTITION BY month ORDER BY SUM(amount) DESC) AS rankFROM all_salesWHERE year = 2003AND amount IS NOT NULLGROUP BY prd_type_id, monthORDER BY prd_type_id, month;
SELECT prd_type_id, SUM(amount), RANK() OVER (ORDER BY SUM(amount) DESC) AS rankFROM all_salesWHERE year = 2003GROUP BY ROLLUP(prd_type_id)ORDER BY prd_type_id;
SELECT prd_type_id, emp_id, SUM(amount), RANK() OVER (ORDER BY SUM(amount) DESC) AS rankFROM all_salesWHERE year = 2003GROUP BY CUBE(prd_type_id, emp_id)ORDER BY prd_type_id, emp_id;
SELECT prd_type_id, emp_id, SUM(amount), RANK() OVER (ORDER BY SUM(amount) DESC) AS rankFROM all_salesWHERE year = 2003GROUP BY GROUPING SETS(prd_type_id, emp_id)ORDER BY prd_type_id, emp_id;
SELECT prd_type_id, SUM(amount), CUME_DIST() OVER (ORDER BY SUM(amount) DESC) AS cume_dist, PERCENT_RANK() OVER (ORDER BY SUM(amount) DESC) AS percent_rankFROM all_salesWHERE year = 2003GROUP BY prd_type_idORDER BY prd_type_id;
SELECT prd_type_id, SUM(amount), NTILE(4) OVER (ORDER BY SUM(amount) DESC) AS ntileFROM all_salesWHERE year = 2003AND amount IS NOT NULLGROUP BY prd_type_idORDER BY prd_type_id;
SELECT prd_type_id, SUM(amount), ROW_NUMBER() OVER (ORDER BY SUM(amount) DESC) AS row_numberFROM all_salesWHERE year = 2003GROUP BY prd_type_idORDER BY prd_type_id;
SELECT PERCENTILE_CONT(0.6) WITHIN GROUP (ORDER BY SUM(amount) DESC) AS percentile_cont, PERCENTILE_DISC(0.6) WITHIN GROUP (ORDER BY SUM(amount) DESC) AS percentile_discFROM all_salesWHERE year = 2003GROUP BY prd_type_id;
SELECT month, SUM(amount) AS month_amount, SUM(SUM(amount)) OVER (ORDER BY month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_amountFROM all_salesWHERE year = 2003GROUP BY monthORDER BY month;
SUM(SUM(amount)) OVER (ORDER BY month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_amount
SUM(amount)SUM()
ORDER BY month
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROWUNBOUNDED PRECEDINGCURRENT ROWCURRENT ROWSUM()
SUM()
SELECT month, SUM(amount) AS month_amount, SUM(SUM(amount)) OVER (ORDER BY month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_amountFROM all_salesWHERE year = 2003AND month BETWEEN 6 AND 12GROUP BY monthORDER BY month;
SELECT month, SUM(amount) AS month_amount, AVG(SUM(amount)) OVER (ORDER BY month ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS moving_averageFROM all_salesWHERE year = 2003GROUP BY monthORDER BY month;
AVG(SUM(amount)) OVER (ORDER BY month ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS moving_average
SUM(amount)AVG()
ORDER BY month
ROWS BETWEEN 3 PRECEDING AND CURRENT ROW
SELECT month, SUM(amount) AS month_amount, AVG(SUM(amount)) OVER (ORDER BY month ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS moving_averageFROM all_salesWHERE year = 2003GROUP BY monthORDER BY month;
SELECT month, SUM(amount) AS month_amount, FIRST_VALUE(SUM(amount)) OVER (ORDER BY month ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS previous_month_amount, LAST_VALUE(SUM(amount)) OVER (ORDER BY month ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS next_month_amountFROM all_salesWHERE year = 2003GROUP BY monthORDER BY month;
SELECT month, SUM(amount) AS month_amount, SUM(amount)/FIRST_VALUE(SUM(amount)) OVER (ORDER BY month ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS curr_div_prev, SUM(amount)/LAST_VALUE(SUM(amount)) OVER (ORDER BY month ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS curr_div_nextFROM all_salesWHERE year = 2003
SELECT month, prd_type_id, SUM(SUM(amount)) OVER (PARTITION BY month) AS total_month_amount, SUM(SUM(amount)) OVER (PARTITION BY prd_type_id) AS total_product_type_amountFROM all_salesWHERE year = 2003AND month <= 3GROUP BY month, prd_type_idORDER BY month, prd_type_id;
RATIO_TO_REPORT(SUM(amount)) OVER (PARTITION BY month) AS prd_type_ratio
SUM(amount)
OVER (PARTITION BY month)SUM()
LAG()LEAD()LAG()LEAD()
SELECT month, SUM(amount) AS month_amount, LAG(SUM(amount), 1) OVER (ORDER BY month) AS previous_month_amount, LEAD(SUM(amount), 1) OVER (ORDER BY month) AS next_month_amountFROM all_salesWHERE year = 2003
SELECT MIN(month) KEEP (DENSE_RANK FIRST ORDER BY SUM(amount)) AS highest_sales_month, MIN(month) KEEP (DENSE_RANK LAST ORDER BY SUM(amount)) AS lowest_sales_monthFROM all_salesWHERE year = 2003GROUP BY monthORDER BY month;
SELECT prd_type_id, REGR_AVGX(amount, month) AS avgx, REGR_AVGY(amount, month) AS avgy, REGR_COUNT(amount, month) AS count, REGR_INTERCEPT(amount, month) AS inter, REGR_R2(amount, month) AS r2, REGR_SLOPE(amount, month) AS slope, REGR_SXX(amount, month) AS sxx, REGR_SXY(amount, month) AS sxy, REGR_SYY(amount, month) AS syyFROM all_salesWHERE year = 2003GROUP BY prd_type_id;
SELECT prd_type_id, SUM(amount), RANK() OVER (ORDER BY SUM(amount) DESC) AS rank, PERCENT_RANK() OVER (ORDER BY SUM(amount) DESC) AS percent_rankFROM all_salesWHERE year = 2003AND amount IS NOT NULLGROUP BY prd_type_idORDER BY prd_type_id;
SELECT RANK(500000) WITHIN GROUP (ORDER BY SUM(amount) DESC) AS rank, PERCENT_RANK(500000) WITHIN GROUP (ORDER BY SUM(amount) DESC) AS percent_rankFROM all_salesWHERE year = 2003AND amount IS NOT NULLGROUP BY prd_type_idORDER BY prd_type_id;
RANK PERCENT_RANK---------- ------------ 2 .25
MODELMODELall_salesMODEL
MODEL
SELECT prd_type_id, year, month, sales_amountFROM all_salesWHERE prd_type_id BETWEEN 1 AND 2AND emp_id = 21MODELPARTITION BY (prd_type_id)DIMENSION BY (month, year)MEASURES (amount sales_amount) ( sales_amount[1, 2004] = sales_amount[1, 2003], sales_amount[2, 2004] = sales_amount[2, 2003] + sales_amount[3, 2003], sales_amount[3, 2004] = ROUND(sales_amount[3, 2003] * 1.25, 2))ORDER BY prd_type_id, year, month;
sales_amount[1, 2004] = ROUND(AVG(sales_amount)[month BETWEEN 1 AND 3, 2003], 2)
SELECT prd_type_id, year, month, sales_amountFROM all_salesWHERE prd_type_id BETWEEN 1 AND 2AND emp_id = 21MODELPARTITION BY (prd_type_id)DIMENSION BY (month, year)MEASURES (amount sales_amount) ( sales_amount[1, 2004] = ROUND(AVG(sales_amount)[month BETWEEN 1 AND 3, 2003], 2))ORDER BY prd_type_id, year, month;
ANYIS ANYANYIS ANY
sales_amount[1, 2004] = ROUND(SUM(sales_amount)[ANY, year IS ANY], 2)
SELECT prd_type_id, year, month, sales_amountFROM all_salesWHERE prd_type_id BETWEEN 1 AND 2AND emp_id = 21MODELPARTITION BY (prd_type_id)DIMENSION BY (month, year)MEASURES (amount sales_amount) ( sales_amount[1, 2004] = ROUND(SUM(sales_amount)[ANY, year IS ANY], 2))ORDER BY prd_type_id, year, month;
sales_amount[FOR month FROM 1 TO 3 INCREMENT 1, 2004] = CASE WHEN sales_amount[CURRENTV(), 2003] IS PRESENT THEN ROUND(sales_amount[CURRENTV(), 2003] * 1.25, 2) ELSE 0 END
SELECT prd_type_id, year, month, sales_amountFROM all_salesWHERE prd_type_id BETWEEN 1 AND 2
AND emp_id = 21MODELPARTITION BY (prd_type_id)DIMENSION BY (month, year)MEASURES (amount sales_amount) ( sales_amount[FOR month FROM 1 TO 3 INCREMENT 1, 2004] = CASE WHEN sales_amount[CURRENTV(), 2003] IS PRESENT THEN ROUND(sales_amount[CURRENTV(), 2003] * 1.25, 2) ELSE 0 END)ORDER BY prd_type_id, year, month;
SELECT *FROM ( SELECT month, prd_type_id, amount FROM all_sales WHERE year = 2003 AND prd_type_id IN (1, 2, 3))PIVOT ( SUM(amount) FOR month IN (1 AS JAN, 2 AS FEB, 3 AS MAR, 4 AS APR))ORDER BY prd_type_id;
PRD_TYPE_ID JAN FEB MAR APR----------- ---------- ---------- ---------- ---------- 1 38909.04 70567.9 91826.98 120344.7 2 14309.04 13367.9 16826.98 15664.7 3 24909.04 15467.9 20626.98 23844.7
PIVOT
SELECT
SELECT *FROM ( inner_query )PIVOT ( aggregate_function FOR pivot_column IN (list_of_values))ORDER BY ...;
all_sales
SUM(amount) FOR month IN (1 AS JAN, 2 AS FEB, 3 AS MAR, 4 AS APR)PIVOT
SELECT *FROM ( SELECT month, prd_type_id, amount FROM all_sales WHERE year = 2003 AND prd_type_id IN (1, 2, 3))PIVOT ( SUM(amount) FOR (month, prd_type_id) IN ( (1, 2) AS JAN_PRDTYPE2, (2, 3) AS FEB_PRDTYPE3, (3, 1) AS MAR_PRDTYPE1, (4, 2) AS APR_PRDTYPE2 ));
SELECT *FROM ( SELECT month, prd_type_id, amount FROM all_sales WHERE year = 2003 AND prd_type_id IN (1, 2, 3))PIVOT ( SUM(amount) FOR (month, prd_type_id) IN ( (1, 1) AS JAN_PRDTYPE1, (2, 2) AS FEB_PRDTYPE2, (3, 3) AS MAR_PRDTYPE3, (4, 1) AS APR_PRDTYPE1 ));
CREATE TABLE pivot_sales_data AS SELECT * FROM ( SELECT month, prd_type_id, amount FROM all_sales WHERE year = 2003 AND prd_type_id IN (1, 2, 3) ) PIVOT ( SUM(amount) FOR month IN (1 AS JAN, 2 AS FEB, 3 AS MAR, 4 AS APR) ) ORDER BY prd_type_id;
pivot_sales_data
SELECT *FROM pivot_sales_data;
PRD_TYPE_ID JAN FEB MAR APR----------- ---------- ---------- ---------- ---------- 1 38909.04 70567.9 91826.98 120344.7 2 14309.04 13367.9 16826.98 15664.7 3 24909.04 15467.9 20626.98 23844.7
UNPIVOT
SELECT *FROM pivot_sales_dataUNPIVOT ( amount FOR month IN (JAN, FEB, MAR, APR))ORDER BY prd_type_id;
PRD_TYPE_ID MON AMOUNT----------- --- ---------- 1 JAN 38909.04 1 FEB 70567.9 1 MAR 91826.98 1 APR 120344.7 2 JAN 14309.04 2 FEB 13367.9 2 APR 15664.7 2 MAR 16826.98 3 JAN 24909.04 3 MAR 20626.98 3 FEB 15467.9 3 APR 23844.7
DESCRIBE customers Name Null? Type ----------------------------------------- -------- ------------ CUSTOMER_ID NOT NULL NUMBER(38) FIRST_NAME NOT NULL VARCHAR2(10) LAST_NAME NOT NULL VARCHAR2(10) DOB DATE PHONE VARCHAR2(12)
CUSTOMER_ID FIRST_NAME LAST_NAME DOB PHONE----------- ---------- ---------- --------- ------------ 1 John Brown 01-JAN-65 800-555-1211 2 Cynthia Green 05-FEB-68 800-555-1212 3 Steve White 16-MAR-71 800-555-1213 4 Gail Black 800-555-1214 5 Doreen Blue 20-MAY-70 6 Fred Brown 01-JAN-70 800-555-1215
INSERT INTO customersVALUES (7, 'Jane', 'Green', '01-JAN-1970', '800-555-1216');
DESCRIBE
NULLINSERTdobphone
INSERT INTO customersVALUES (8, 'Sophie', 'White', NULL, NULL);
dobphone
SELECT *FROM customersWHERE customer_id = 8;
CUSTOMER_ID FIRST_NAME LAST_NAME DOB PHONE----------- ---------- ---------- --------- ------------ 8 Sophie White
dobphone
INSERTO'MalleyO
INSERT INTO customersVALUES (9, 'Kyle', 'O''Malley', NULL, NULL);
The "Great" Gatsby
INSERT INTO products ( product_id, product_type_id, name, description, price) VALUES ( 13, 1, 'The "Great" Gatsby', NULL, 12.99);
SQL> INSERT INTO products ( 2 product_id, product_type_id, name, description, price 3 ) VALUES ( 4 13, 6, 'Test', 'Test', NULL 5 );INSERT INTO products (*ERROR at line 1:ORA-02291: integrity constraint (STORE.PRODUCTS_FK_PRODUCT_TYPES) violated - parent key not found
product_type_idproducts
SQL> UPDATE products 2 SET product_type_id = 6 3 WHERE product_id = 1;UPDATE products*ERROR at line 1:ORA-02291: integrity constraint (STORE.PRODUCTS_FK_PRODUCT_TYPES) violated - parent key not found
SQL> DELETE FROM product_types 2 WHERE product_type_id = 1;DELETE FROM product_types*ERROR at line 1:ORA-02292: integrity constraint (STORE.PRODUCTS_FK_PRODUCT_TYPES) violated - child record found
CUSTOMER_ID FIRST_NAME LAST_NAME DOB PHONE----------- ---------- ---------- --------- ------------ 1 John Brown 01-JAN-65 800-555-1211 2 Cynthia Green 05-FEB-68 800-555-1212 3 Steve White 16-MAR-71 800-555-1213 4 Gail Black 800-555-1214 5 Doreen Blue 20-MAY-70 6 Fred Green 01-JAN-70 800-555-1215
COMMITROLLBACK
INSERTUPDATEDELETE
COMMITROLLBACK
CREATE TABLECOMMIT
GRANTCOMMITGRANT
EXITCOMMITROLLBACKROLLBACK
ROLLBACK
COMMITROLLBACK
SELECT product_id, priceFROM productsWHERE product_id IN (4, 5);
PRODUCT_ID NAME PRICE---------- ------------------------------ ---------- 1 Modern Science 19.95 2 Chemistry 30 3 Supernova 25.99 4 Tank War 13.95 5 Z Files 49.99
PRODUCT_ID NAME PRICE---------- ------------------------------ ---------- 1 Modern Science 14.96 2 Chemistry 22.5 3 Supernova 19.49 4 Tank War 10.46 5 Z Files 37.49
PRODUCT_ID NAME PRICE---------- ------------------------------ ---------- 1 Modern Science 19.95 2 Chemistry 30 3 Supernova 25.99 4 Tank War 13.95 5 Z Files 49.99
PRODUCT_ID NAME PRICE---------- ------------------------------ ---------- 1 Modern Science 14.96 2 Chemistry 22.5 3 Supernova 19.49 4 Tank War 10.46 5 Z Files 37.49
GRANTEE TABLE_NAME---------------------- ------------------------------GRANTOR PRIVILEGE GRA HIE---------------------- ---------------------------- --- ---STEVE PRODUCTSSTORE INSERT NO NO
STEVE PRODUCTSSTORE SELECT NO NO
STEVE PRODUCTSSTORE UPDATE NO NO
user_col_privs_madeuser_col_privs_made
grantee VARCHAR2(30)
table_name VARCHAR2(30)
grantor VARCHAR2(30)
privilege VARCHAR2(40)
grantable VARCHAR2(3) YESNO
hierarchy VARCHAR2(3) YESNO
user_tab_privs_made
user_col_privs_made
SELECT *FROM user_col_privs_made;
GRANTEE TABLE_NAME------------------------------ -------------COLUMN_NAME GRANTOR------------------------------ -------------PRIVILEGE GRA---------------------------------------- ---STEVE EMPLOYEESLAST_NAME STOREUPDATE NO
STEVE EMPLOYEESSALARY STOREUPDATE NO
user_tab_privs_recduser_tab_privs_recd
steveuser_tab_privs_recd
grantee VARCHAR2(30)
table_name VARCHAR2(30)
column_name VARCHAR2(30)
grantor VARCHAR2(30)
privilege VARCHAR2(40)
grantable VARCHAR2(3) YESNO
user_col_privs_made
CONNECT steve/buttonSELECT *FROM user_tab_privs_recdORDER BY privilege;
OWNER TABLE_NAME------------------------------ ------------------------------GRANTOR PRIVILEGE GRA HIE------------------------------ ---------------------------------------- --- ---STORE PRODUCTSSTORE INSERT NO NO
STORE CUSTOMERSSTORE SELECT YES NO
STORE EMPLOYEESSTORE SELECT NO NO
STORE PRODUCTSSTORE SELECT NO NO
STORE PRODUCTSSTORE UPDATE NO NO
user_col_privs_recduser_col_privs_recd
owner VARCHAR2(30)
table_name VARCHAR2(30)
grantor VARCHAR2(30)
privilege VARCHAR2(40)
grantable VARCHAR2(3) YESNO
hierarchy VARCHAR2(3) YESNO
user_col_privs_recd
SELECT *FROM user_col_privs_recd;
OWNER TABLE_NAME------------------------------ -------------COLUMN_NAME GRANTOR------------------------------ -------------PRIVILEGE GRA---------------------------------------- ---STORE EMPLOYEESLAST_NAME STOREUPDATE NO
STORE EMPLOYEESSALARY STOREUPDATE NO
steveSELECTstore.customers
CONNECT steve/buttonSELECT *FROM store.customers;
CUSTOMER_ID FIRST_NAME LAST_NAME DOB PHONE----------- ---------- ---------- --------- ------------ 1 John Brown 01-JAN-65 800-555-1211 2 Cynthia Green 05-FEB-68 800-555-1212 3 Steve White 16-MAR-71 800-555-1213 4 Gail Black 800-555-1214 5 Doreen Blue 20-MAY-70
owner VARCHAR2(30)
table_name VARCHAR2(30)
column_name VARCHAR2(30)
grantor VARCHAR2(30)
privilege VARCHAR2(40)
grantable VARCHAR2(3) YESNO
user_col_privs_recd
stevepurchasesORA-00942: table or view does not exist
SQL> SELECT * 2 FROM store.purchases;FROM store.purchases *ERROR at line 2:ORA-00942: table or view does not exist
stevecustomersstorestore.customersCREATE SYNONYM
systemCREATE SYNONYMsteve
CONNECT system/managerGRANT CREATE SYNONYM TO steve;
steveCREATE SYNONYMstore.customers
CONNECT steve/buttonCREATE SYNONYM customers FOR store.customers;
store.customersstevecustomersFROMSELECT
SELECT *FROM customers;
CUSTOMER_ID FIRST_NAME LAST_NAME DOB PHONE----------- ---------- ---------- --------- ------------ 1 John Brown 01-JAN-65 800-555-1211 2 Cynthia Green 05-FEB-68 800-555-1212 3 Steve White 16-MAR-71 800-555-1213 4 Gail Black 800-555-1214 5 Doreen Blue 20-MAY-70
system
CREATE PUBLIC SYNONYMstore
store
productsstore.products
CONNECT system/managerGRANT CREATE PUBLIC SYNONYM TO store;CONNECT store/store_passwordCREATE PUBLIC SYNONYM products FOR store.products;
steveSELECTstore.productsstore.productsproducts
CONNECT steve/buttonSELECT *FROM products;
store.productsgailproductsgailstore.productsgailproductsORA-00942: table or view does not exist
SQL> CONNECT gail/seymourConnected.SQL> SELECT * FROM products;SELECT * FROM products *ERROR at line 1:ORA-00942: table or view does not exist
GRANT SELECT, INSERT, UPDATE, DELETE ON product_types TO product_manager;GRANT SELECT, INSERT, UPDATE, DELETE ON products TO product_manager;GRANT SELECT, INSERT, UPDATE, DELETE ON salary_grades TO hr_manager;GRANT SELECT, INSERT, UPDATE, DELETE ON employees TO hr_manager;GRANT CREATE USER TO hr_manager;GRANT product_manager, hr_manager TO overall_manager;
GRANToverall_managersteve
GRANT overall_manager TO steve;
user_role_privsuser_role_privs
steveuser_role_privs
CONNECT steve/buttonSELECT *FROM user_role_privs;
USERNAME GRANTED_ROLE ADM DEF OS_------------------ -------------------------- --- --- ---STEVE OVERALL_MANAGER NO YES NO
ROLE PRIVILEGE ADM------------------------------ ---------------------------------------- ---RESOURCE CREATE CLUSTER NORESOURCE CREATE INDEXTYPE NORESOURCE CREATE OPERATOR NORESOURCE CREATE PROCEDURE NORESOURCE CREATE SEQUENCE NOCONNECT CREATE SESSION NORESOURCE CREATE TABLE NORESOURCE CREATE TRIGGER NORESOURCE CREATE TYPE NOHR_MANAGER CREATE USER NO
RESOURCE
role_tab_privsrole_tab_privs
role_tab_privsroleHR_MANAGER
SELECT *FROM role_tab_privsWHERE role='HR_MANAGER'ORDER BY table_name;
ROLE OWNER------------------------------ ------------------------------TABLE_NAME COLUMN_NAME------------------------------ ------------------------------PRIVILEGE GRA---------------------------------------- ---HR_MANAGER STOREEMPLOYEESDELETE NO
NAME NAME------------------------------ ----------Modern Science BookChemistry BookSupernova VideoTank War VideoZ Files Video2412: The Return VideoSpace Force 9 DVDFrom Another Planet DVDClassical Music CDPop 3 CDCreative Yell CD
SELECT table_name, tablespace_name, temporaryFROM user_tablesWHERE table_name IN ('ORDER_STATUS2', 'ORDER_STATUS_TEMP');
TABLE_NAME TABLESPACE_NAME T------------------------------ ------------------------------ -ORDER_STATUS2 USERS NORDER_STATUS_TEMP Y
order_status_tempY
table_name VARCHAR2(30)
tablespace_name VARCHAR2(30)
temporary VARCHAR2(1) YN
user_tables
user_tab_columnsuser_tab_columns
all_tab_columns
user_tab_columnsproducts
COLUMN column_name FORMAT a15COLUMN data_type FORMAT a10SELECT column_name, data_type, data_length, data_precision, data_scaleFROM user_tab_columnsWHERE table_name = 'PRODUCTS';
COLUMN_NAME DATA_TYPE DATA_LENGTH DATA_PRECISION DATA_SCALE--------------- ---------- ----------- -------------- ----------PRODUCT_ID NUMBER 22 38 0PRODUCT_TYPE_ID NUMBER 22 38 0NAME VARCHAR2 30DESCRIPTION VARCHAR2 50PRICE NUMBER 22 5 2
ALTER TABLEALTER TABLE
ALTER TABLE
table_name VARCHAR2(30)
column_name VARCHAR2(30)
data_type VARCHAR2(106)
data_length NUMBER
data_precision NUMBER
data_scale NUMBER
user_tab_columns
ALTER TABLEINTEGERmodified_byorder_status2
ALTER TABLE order_status2ADD modified_by INTEGER;
initially_createdorder_status2
ALTER TABLE order_status2ADD initially_created DATE DEFAULT SYSDATE NOT NULL;
DESCRIBEorder_status2
DESCRIBE order_status2 Name Null? Type ----------------------------------------- -------- ------------ ID NOT NULL NUMBER(38) STATUS VARCHAR2(10) LAST_MODIFIED DATE MODIFIED_BY NUMBER(38) INITIALLY_CREATED NOT NULL DATE
ALTER TABLEaverage_salarysalary_grades
ALTER TABLE salary_gradesADD (average_salary AS ((low_salary + high_salary)/2));
DESCRIBE salary_grades Name Null? Type ----------------------------------------- -------- ---------- SALARY_GRADE_ID NOT NULL NUMBER(38) LOW_SALARY NUMBER(6) HIGH_SALARY NUMBER(6) AVERAGE_SALARY NUMBER
CONSTRAINT_NAME C STATUS DEFERRABLE DEFERRED------------------------------ - -------- -------------- ---------ORDER_STATUS2_PK P ENABLED NOT DEFERRABLE IMMEDIATEORDER_STATUS2_STATUS_CK C ENABLED NOT DEFERRABLE IMMEDIATEORDER_STATUS2_ID_CK C ENABLED NOT DEFERRABLE IMMEDIATEORDER_STATUS2_STATUS_NN C DISABLED NOT DEFERRABLE IMMEDIATEORDER_STATUS2_STATUS_UQ U ENABLED DEFERRABLE DEFERREDSYS_C004807 C ENABLED NOT DEFERRABLE IMMEDIATE
SYS_C004807
user_cons_columnsuser_cons_columns
all_cons_columns
owner VARCHAR2(30)
constraint_name VARCHAR2(30)
constraint_type VARCHAR2(1) PRCUVO
table_name VARCHAR2(30)
status VARCHAR2(8) ENABLEDDISABLEDdeferrable VARCHAR2(14)
COLUMN_NAME CONSTRAINT_NAME C STATUS--------------- ------------------------------ - --------ID ORDER_STATUS2_ID_CK C ENABLEDID ORDER_STATUS2_PK P ENABLEDSTATUS ORDER_STATUS2_STATUS_CK C ENABLEDSTATUS ORDER_STATUS2_STATUS_NN C DISABLEDSTATUS ORDER_STATUS2_STATUS_UQ U ENABLEDLAST_MODIFIED SYS_C004807 C ENABLED
owner VARCHAR2(30)
constraint_name VARCHAR2(30)
table_name VARCHAR2(30)
column_name VARCHAR2(4000)
user_cons_columns
RENAMEorder_status2order_state
RENAME order_status2 TO order_state;
RENAME order_state TO order_status2;
COMMENTorder_status2
COMMENT ON TABLE order_status2 IS'order_status2 stores the state of an order';
order_status2.last_modified
COMMENT ON COLUMN order_status2.last_modified IS'last_modified stores the date and time the order was modified last';
TABLE_NAME TABLE_TYPE------------------------------ -----------COMMENTS------------------------------------------ORDER_STATUS2 TABLEorder_status2 stores the state of an order
TABLE_NAME COLUMN_NAME------------------------------ ------------------------------COMMENTS------------------------------------------------------------------ORDER_STATUS2 ID
ORDER_STATUS2 STATUS
ORDER_STATUS2 LAST_MODIFIEDlast_modified stores the date and time the order was modified last
TRUNCATEorder_status2
TRUNCATE TABLE order_status2;
TRUNCATEDELETETRUNCATETRUNCATECOMMIT
DROP TABLEorder_status2
DROP TABLE order_status2;
CREATE SEQUENCE
CREATE SEQUENCE sequence_name[START WITH start_num][INCREMENT BY increment_num][ { MAXVALUE maximum_num | NOMAXVALUE } ]
CREATE SEQUENCE s_test2START WITH 10 INCREMENT BY 5MINVALUE 10 MAXVALUE 20CYCLE CACHE 2 ORDER;
s_test3
CREATE SEQUENCE s_test3START WITH 10 INCREMENT BY -1MINVALUE 1 MAXVALUE 10CYCLE CACHE 5;
user_sequencesuser_sequences
all_sequences
sequence_name VARCHAR2(30)
min_value NUMBER
max_value NUMBER
increment_by NUMBER
cycle_flag VARCHAR2(1) YNorder_flag VARCHAR2(1) YNcache_size NUMBER
last_number NUMBER
user_sequences
user_sequences
COLUMN sequence_name FORMAT a13SELECT * FROM user_sequencesORDER BY sequence_name;
SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER------------- ---------- ---------- ------------ - - ---------- -----------S_TEST 1 1.0000E+27 1 N N 20 1S_TEST2 10 20 5 Y Y 2 10S_TEST3 1 10 -1 Y N 5 10
COLUMN table_name FORMAT a15COLUMN column_name FORMAT a15SELECT index_name, table_name, column_nameFROM user_ind_columnsWHERE table_name IN ('CUSTOMERS', 'EMPLOYEES')ORDER BY index_name;
PRODUCT_ID NAME PRICE---------- ------------------------------ ---------- 4 Tank War 13.95 6 2412: The Return 14.95
7 Space Force 9 13.49 8 From Another Planet 12.99 9 Classical Music 10.99 11 Creative Yell 14.99 12 My Front Line 13.49
employees_view
SELECT *FROM employees_view;
EMPLOYEE_ID MANAGER_ID FIRST_NAME LAST_NAME TITLE----------- ---------- ---------- ---------- ------------- 1 James Smith CEO 2 1 Ron Johnson Sales Manager 3 2 Fred Hobbs Salesperson 4 2 Susan Jones Salesperson
INSERT INTO cheap_products_view3 ( product_id, product_type_id, name, price) VALUES ( 16, 1, 'Northern Front', 19.50); product_id, product_type_id, name, price *ERROR at line 2:ORA-42399: cannot perform a DML operation on a read-only view
DESCRIBEDESCRIBEcheap_products_view3
DESCRIBE cheap_products_view3 Name Null? Type ----------------------------------------- -------- ------------ PRODUCT_ID NOT NULL NUMBER(38) PRODUCT_TYPE_ID NUMBER(38) NAME NOT NULL VARCHAR2(30) DESCRIPTION VARCHAR2(50) PRICE NUMBER(5,2)
user_viewsuser_views
view_name VARCHAR2(30)
text_length NUMBER
text LONG
user_views
all_views
textSET LONGLONGLONG
SET LONG 200
view_nametext_lengthtextuser_views
SELECT view_name, text_length, textFROM user_viewsORDER BY view_name;
CONSTRAINT_NAME C STATUS DEFERRABLE DEFERRED------------------------------ - -------- -------------- ---------CHEAP_PRODUCTS_VIEW2_PRICE V ENABLED NOT DEFERRABLE IMMEDIATECHEAP_PRODUCTS_VIEW3_READ_ONLY O ENABLED NOT DEFERRABLE IMMEDIATE
constraint_typeCHEAP_PRODUCTS_VIEW2_PRICEVCHECK OPTIONconstraint_typeCHEAP_PRODUCTS_VIEW3_READ_ONLYOREAD ONLY
GROUP BYDISTINCT
products_and_types_viewproductsproduct_types
CREATE VIEW products_and_types_view ASSELECT p.product_id, p.name product_name, pt.name product_type_name, p.priceFROM products p FULL OUTER JOIN product_types ptUSING (product_type_id)ORDER BY p.product_id;
products_and_types_view
SELECT *FROM products_and_types_view;
PRODUCT_ID PRODUCT_NAME PRODUCT_TY PRICE---------- ------------------------------ ---------- ---------- 1 Modern Science Book 19.95 2 Chemistry Book 30 3 Supernova Video 25.99 4 Tank War Video 13.95 5 Z Files Video 49.99 6 2412: The Return Video 14.95 7 Space Force 9 DVD 13.49 8 From Another Planet DVD 12.99 9 Classical Music CD 10.99 10 Pop 3 CD 15.99 11 Creative Yell CD 14.99 12 My Front Line 13.49 13 Western Front Book 13.5 14 Eastern Front Book 16.5 Magazine
employee_salary_grades_view
CREATE VIEW employee_salary_grades_view ASSELECT e.first_name, e.last_name, e.title, e.salary, sg.salary_grade_idFROM employees e INNER JOIN salary_grades sgON e.salary BETWEEN sg.low_salary AND sg.high_salaryORDER BY sg.salary_grade_id;
employee_salary_grades_view
SELECT *FROM employee_salary_grades_view;
FIRST_NAME LAST_NAME TITLE SALARY SALARY_GRADE_ID---------- ---------- -------------------- ---------- ---------------Fred Hobbs Salesperson 150000 1Susan Jones Salesperson 500000 2Ron Johnson Sales Manager 600000 3James Smith CEO 800000 4
product_average_view
WHEREproductsprice
GROUP BYproduct_type_id
HAVING
CREATE VIEW product_average_view ASSELECT product_type_id, AVG(price) average_priceFROM productsWHERE price < 15GROUP BY product_type_idHAVING AVG(price) > 13ORDER BY product_type_id;
PRODUCT_ID NAME PRICE---------- ------------------------------ ---------- 1 Modern Science 19.95 2 Chemistry 30 3 Supernova 25.99 4 Tank War 13.95 5 Z Files 49.99 6 2412: The Return 14.95 7 Space Force 9 13.49 8 From Another Planet 12.99 9 Classical Music 10.99 10 Pop 3 15.99 11 Creative Yell 14.99 12 My Front Line 13.49 13 Western Front 13.5 14 Eastern Front 16.5
INSERT
INSERT
SELECT product_id, name, priceFROM store.productsAS OF TIMESTAMPTO_TIMESTAMP('2007-08-12 13:05:00', 'YYYY-MM-DD HH24:MI:SS');
DECLARE v_width INTEGER; v_height INTEGER := 2; v_area INTEGER := 6;BEGIN -- set the width equal to the area divided by the height v_width := v_area / v_height; DBMS_OUTPUT.PUT_LINE('v_width = ' || v_width);EXCEPTION WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE('Division by zero');END;/
SET SERVEROUTPUT ONDBMS_OUTPUT.PUT_LINE()DECLAREBEGINEXCEPTION
IF condition1 THEN statements1ELSIF condition2 THEN statements2ELSE statements3END IF;
condition1condition2
statements1statements2statements3
condition1statements1
condition1condition2statements2
condition1condition2statements3
IFIF
IF v_count > 0 THEN v_message := 'v_count is positive'; IF v_area > 0 THEN v_message := 'v_count and v_area are positive'; END IFELSIF v_count = 0 THEN v_message := 'v_count is zero';ELSE v_message := 'v_count is negative';END IF;
v_countv_message'v_count is positive'v_countv_areav_message'v_count and v_area are positive'
v_counter := 0;LOOP -- after the CONTINUE statement is executed, control returns here v_counter := v_counter + 1; IF v_counter = 3 THEN CONTINUE; -- end current iteration unconditionally END IF; EXIT WHEN v_counter = 5;END LOOP;
CONTINUE WHEN
v_counter := 0;LOOP -- after the CONTINUE WHEN statement is executed, control returns here v_counter := v_counter + 1; CONTINUE WHEN v_counter = 3; -- end current iteration when v_counter = 3 EXIT WHEN v_counter = 5;END LOOP;
LOOP -- fetch the rows from the cursor FETCH v_product_cursor INTO v_product_id, v_name, v_price;
-- exit the loop when there are no more rows, as indicated by -- the Boolean variable v_product_cursor%NOTFOUND (= true when -- there are no more rows) EXIT WHEN v_product_cursor%NOTFOUND;
-- use DBMS_OUTPUT.PUT_LINE() to display the variables DBMS_OUTPUT.PUT_LINE( 'v_product_id = ' || v_product_id || ', v_name = ' || v_name || ', v_price = ' || v_price );END LOOP;
-- step 2: declare the cursor CURSOR v_product_cursor IS SELECT product_id, name, price FROM products ORDER BY product_id;BEGIN -- step 3: open the cursor OPEN v_product_cursor;
LOOP -- step 4: fetch the rows from the cursor FETCH v_product_cursor INTO v_product_id, v_name, v_price;
-- exit the loop when there are no more rows, as indicated by -- the Boolean variable v_product_cursor%NOTFOUND (= true when -- there are no more rows) EXIT WHEN v_product_cursor%NOTFOUND;
-- use DBMS_OUTPUT.PUT_LINE() to display the variables DBMS_OUTPUT.PUT_LINE( 'v_product_id = ' || v_product_id || ', v_name = ' || v_name || ', v_price = ' || v_price ); END LOOP;
-- step 5: close the cursor CLOSE v_product_cursor;END;/
storestore_password product_cursor.sql
SQL> @ C:\SQL\product_cursor.sql
product_cursor.sqlC:\SQL
product_cursor.sql
v_product_id = 1, v_name = Modern Science, v_price = 19.95v_product_id = 2, v_name = Chemistry, v_price = 30v_product_id = 3, v_name = Supernova, v_price = 25.99v_product_id = 4, v_name = Tank War, v_price = 13.95v_product_id = 5, v_name = Z Files, v_price = 49.99v_product_id = 6, v_name = 2412: The Return, v_price = 14.95v_product_id = 7, v_name = Space Force 9, v_price = 13.49v_product_id = 8, v_name = From Another Planet, v_price = 12.99v_product_id = 9, v_name = Classical Music, v_price = 10.99v_product_id = 10, v_name = Pop 3, v_price = 15.99v_product_id = 11, v_name = Creative Yell, v_price = 14.99v_product_id = 12, v_name = My Front Line, v_price = 13.49
-- product_cursor2.sql displays the product_id, name,-- and price columns from the products table using a cursor-- and a FOR loop
SET SERVEROUTPUT ON
DECLARE CURSOR v_product_cursor IS SELECT product_id, name, price FROM products ORDER BY product_id;BEGIN FOR v_product IN v_product_cursor LOOP DBMS_OUTPUT.PUT_LINE( 'product_id = ' || v_product.product_id || ', name = ' || v_product.name || ', price = ' || v_product.price ); END LOOP;END;/
product_cursor2.sql
SQL> @ "C:\SQL\product_cursor2.sql"
product_id = 1, name = Modern Science, price = 19.95product_id = 2, name = Chemistry, price = 30product_id = 3, name = Supernova, price = 25.99product_id = 4, name = Tank War, price = 13.95product_id = 5, name = Z Files, price = 49.99product_id = 6, name = 2412: The Return, price = 14.95product_id = 7, name = Space Force 9, price = 13.49product_id = 8, name = From Another Planet, price = 12.99product_id = 9, name = Classical Music, price = 10.99product_id = 10, name = Pop 3, price = 15.99product_id = 11, name = Creative Yell, price = 14.99product_id = 12, name = My Front Line, price = 13.49
OPEN-FORproduct_cursor3.sql
-- product_cursor3.sql displays the product_id, name,-- and price columns from the products table using a cursor-- variable and the OPEN-FOR statement
SET SERVEROUTPUT ON
DECLARE -- declare a REF CURSOR type named t_product_cursor TYPE t_product_cursor IS REF CURSOR RETURN products%ROWTYPE;
-- declare a t_product_cursor object named v_product_cursor v_product_cursor t_product_cursor;
-- declare an object to store columns from the products table -- named v_product (of type products%ROWTYPE) v_product products%ROWTYPE;BEGIN -- assign a query to v_product_cursor and open it using OPEN-FOR OPEN v_product_cursor FOR SELECT * FROM products WHERE product_id < 5;
-- use a loop to fetch the rows from v_product_cursor into v_product LOOP FETCH v_product_cursor INTO v_product; EXIT WHEN v_product_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE( 'product_id = ' || v_product.product_id || ', name = ' || v_product.name || ', price = ' || v_product.price );
END LOOP;
-- close v_product_cursor CLOSE v_product_cursor;END;/
DECLAREREF CURSORt_product_cursort_
TYPE t_product_cursor ISREF CURSOR RETURN products%ROWTYPE;
OPEN v_product_cursor FORSELECT * FROM products WHERE product_id < 5;
v_product_cursorproductsv_product_cursorSELECT
v_product_cursorv_product
LOOP FETCH v_product_cursor INTO v_product; EXIT WHEN v_product_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE( 'product_id = ' || v_product.product_id || ', name = ' || v_product.name || ', price = ' || v_product.price );END LOOP;
v_product_cursor
CLOSE v_product_cursor;
product_cursor2.sql
unconstrained_cursor.sqlv_cursor
-- This script shows the use of unconstrained cursors
SET SERVEROUTPUT ON
DECLARE -- declare a REF CURSOR type named t_cursor (this has no return -- type and can therefore run any query) TYPE t_cursor IS REF CURSOR;
-- declare a t_cursor object named v_cursor v_cursor t_cursor;
-- declare an object to store columns from the products table -- named v_product (of type products%ROWTYPE) v_product products%ROWTYPE;
-- declare an object to store columns from the customers table -- named v_customer (of type customers%ROWTYPE) v_customer customers%ROWTYPE;BEGIN -- assign a query to v_cursor and open it using OPEN-FOR OPEN v_cursor FOR SELECT * FROM products WHERE product_id < 5;
-- use a loop to fetch the rows from v_cursor into v_product LOOP FETCH v_cursor INTO v_product; EXIT WHEN v_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE( 'product_id = ' || v_product.product_id || ', name = ' || v_product.name || ', price = ' || v_product.price ); END LOOP;
-- assign a new query to v_cursor and open it using OPEN-FOR OPEN v_cursor FOR SELECT * FROM customers WHERE customer_id < 3;
-- use a loop to fetch the rows from v_cursor into v_product LOOP FETCH v_cursor INTO v_customer; EXIT WHEN v_cursor%NOTFOUND;
product_id = 1, name = Modern Science, price = 19.95product_id = 2, name = Chemistry, price = 30product_id = 3, name = Supernova, price = 25.99product_id = 4, name = Tank War, price = 13.95customer_id = 1, first_name = John, last_name = Browncustomer_id = 2, first_name = Cynthia, last_name = Green
REF CURSOR
EXCEPTION
DECLARE v_width INTEGER; v_height INTEGER := 2; v_area INTEGER := 6;BEGIN -- set the width equal to the area divided by the height v_width := v_area / v_height; DBMS_OUTPUT.PUT_LINE('v_width = ' || v_width);EXCEPTION WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE('Division by zero');END;/
BEGIN INSERT INTO customers ( customer_id, first_name, last_name ) VALUES ( 1, 'Greg', 'Green' );EXCEPTION WHEN DUP_VAL_ON_INDEX THEN DBMS_OUTPUT.PUT_LINE('Duplicate value on an index');END;/
Duplicate value on an index
INVALID_NUMBER123X
INSERTINVALID_NUMBER123X
BEGIN INSERT INTO customers ( customer_id, first_name, last_name ) VALUES ( '123X', 'Greg', 'Green' );EXCEPTION WHEN INVALID_NUMBER THEN DBMS_OUTPUT.PUT_LINE('Conversion of string to number failed');END;/
Conversion of string to number failed
OTHERS
BEGIN DBMS_OUTPUT.PUT_LINE(1 / 0);EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('An exception occurred');END;/
An exception occurred
OTHERSEXCEPTIONOTHERSPLS-00370
SQL> BEGIN 2 DBMS_OUTPUT.PUT_LINE(1 / 0); 3 EXCEPTION 4 WHEN OTHERS THEN 5 DBMS_OUTPUT.PUT_LINE('An exception occurred'); 6 WHEN ZERO_DIVIDE THEN 7 DBMS_OUTPUT.PUT_LINE('Division by zero'); 8 END; 9 / WHEN OTHERS THEN *ERROR at line 4:ORA-06550: line 4, column 3:PLS-00370: OTHERS handler must be last among the exception handlers of a blockORA-06550: line 0, column 0:PL/SQL: Compilation unit analysis terminated
CREATE PROCEDURE CREATE PROCEDURE
CREATE [OR REPLACE] PROCEDURE procedure_name[(parameter_name [IN | OUT | IN OUT] type [, ...])]{IS | AS}BEGIN procedure_bodyEND procedure_name;
OR REPLACE
procedure_name
parameter_name
IN | OUT | IN OUT
INININ
OUT
IN OUT
type
procedure_body
update_product_price()�
store_schema.sqlupdate_product_price()
CREATE PROCEDURE update_product_price( p_product_id IN products.product_id%TYPE, p_factor IN NUMBER) AS v_product_count INTEGER;BEGIN -- count the number of products with the -- supplied product_id (will be 1 if the product exists) SELECT COUNT(*) INTO v_product_count FROM products WHERE product_id = p_product_id;
-- if the product exists (v_product_count = 1) then -- update that product's price IF v_product_count = 1 THEN UPDATE products SET price = price * p_factor WHERE product_id = p_product_id; COMMIT; END IF;EXCEPTION WHEN OTHERS THEN ROLLBACK;END update_product_price;/
OBJECT_NAME AGG PAR------------------------------ --- ---UPDATE_PRODUCT_PRICE NO NO
DROP PROCEDUREupdate_product_price()
DROP PROCEDURE update_product_price;
SHOW ERRORSCREATE PROCEDUREp_dobp_dobs
SQL> CREATE PROCEDURE update_customer_dob ( 2 p_customer_id INTEGER, p_dob DATE 3 ) AS 4 BEGIN 5 UPDATE customers 6 SET dob = p_dobs 7 WHERE customer_id = p_customer_id; 8 END update_customer_dob; 9 /
Warning: Procedure created with compilation errors.
SHOW ERRORS
SQL> SHOW ERRORSErrors for PROCEDURE UPDATE_CUSTOMER_DOB:
CREATE FUNCTION circle_area ( p_radius IN NUMBER) RETURN NUMBER AS v_pi NUMBER := 3.1415926; v_area NUMBER;BEGIN -- circle area is pi multiplied by the radius squared
CREATE FUNCTION average_product_price ( p_product_type_id IN INTEGER) RETURN NUMBER AS v_average_product_price NUMBER;BEGIN SELECT AVG(price) INTO v_average_product_price FROM products WHERE product_type_id = p_product_type_id; RETURN v_average_product_price;END average_product_price;/
CREATE PACKAGE product_package AS TYPE t_ref_cursor IS REF CURSOR; FUNCTION get_products_ref_cursor RETURN t_ref_cursor; PROCEDURE update_product_price ( p_product_id IN products.product_id%TYPE, p_factor IN NUMBER );END product_package;/
CREATE [OR REPLACE] PACKAGE BODY package_name{IS | AS} package_bodyEND package_name;
package_name
package_body
product_package
CREATE PACKAGE BODY product_package AS FUNCTION get_products_ref_cursor RETURN t_ref_cursor IS v_products_ref_cursor t_ref_cursor; BEGIN -- get the REF CURSOR OPEN v_products_ref_cursor FOR SELECT product_id, name, price FROM products;
-- return the REF CURSOR RETURN v_products_ref_cursor; END get_products_ref_cursor;
PROCEDURE update_product_price ( p_product_id IN products.product_id%TYPE, p_factor IN NUMBER ) AS v_product_count INTEGER; BEGIN -- count the number of products with the -- supplied product_id (will be 1 if the product exists) SELECT COUNT(*) INTO v_product_count FROM products WHERE product_id = p_product_id;
-- if the product exists (v_product_count = 1) then -- update that product's price IF v_product_count = 1 THEN UPDATE products SET price = price * p_factor WHERE product_id = p_product_id; COMMIT; END IF; EXCEPTION WHEN OTHERS THEN ROLLBACK; END update_product_price;END product_package;/
PRODUCT_ID NAME PRICE---------- ------------------------------ ---------- 1 Modern Science 19.95 2 Chemistry 30 3 Supernova 25.99 4 Tank War 13.95 5 Z Files 49.99 6 2412: The Return 14.95 7 Space Force 9 13.49 8 From Another Planet 12.99 9 Classical Music 10.99 10 Pop 3 15.99 11 Creative Yell 14.99 12 My Front Line 13.49