sql patterns

32
SQL Design Patterns Advanced SQL programming idioms

Upload: phanleson

Post on 10-Jul-2015

1.331 views

Category:

Documents


8 download

TRANSCRIPT

Page 1: Sql Patterns

SQL Design Patterns

Advanced SQL programming idioms

Page 2: Sql Patterns

Genesis

C++ worldAdvanced C++ Programming Styles and Idioms, by

James O. Coplien Design Patterns: Elements of Reusable Object-

Oriented Software by Erich Gamma et al

SQLSQL for Smarties by Joe CelkoSQL Cookbook by Anthony Molinaro The Art of SQL

by Stephane Faroult, Peter Robson

Page 3: Sql Patterns

What is a SQL Pattern?

A common design vocabulary A documentation and learning aid An adjunct to existing design methods A target for refactoring Large range of granularity -- from very general design principles to language-specific idioms

Page 4: Sql Patterns

List of Patterns

CountingConditional summationInteger generatorString/Collection decompositionList AggregateEnumerating pairsEnumerating setsInterval coalesce

Page 5: Sql Patterns

Discrete interval samplingUser-defined aggregatePivotSymmetric differenceHistogramSkyline queryRelational divisionOuter unionComplex constraintNested intervalsTransitive closureHierarchical total

Page 6: Sql Patterns

Symmetric Difference

A = B ?

Isn’t it Equality operator ?

Page 7: Sql Patterns

Venn diagram

A\B

B\AA∩B

(A \ B) ∪ (B \ A)

(A ∪ B) \ (A ∩ B)

Page 8: Sql Patterns

SQL Query

( select * from A minus select * from B) union all ( select * from B minus select * from A)

Page 9: Sql Patterns

Test

create table A asselect obj# id, name from sys.obj$where rownum < 100000;

create table B asselect obj# id, name from sys.obj$where rownum < 100010;

Page 10: Sql Patterns

Execution Statistics

Page 11: Sql Patterns

Anti Join Transformation

convert_set_to_join = true:

select * from A

where (col1,col2,…) not in (select col1,col2,… from B)

union all

select * from B

where (col1,col2,…) not in (select col1,col2,… from A)

Page 12: Sql Patterns

Execution Statistics

Page 13: Sql Patterns

Optimization continued…

CREATE INDEX A_id_name ON A(id, name); CREATE INDEX B_id_name ON B(id, name);

_hash_join_enabled = false_optimizer_sortmerge_join_enabled = falseor/*+ use_nl(@"SEL$74086987" A) use_nl(@"SET$D8486D66" B)*/

Page 14: Sql Patterns

Symmetric Difference via Aggregation

select * from ( select id, name, sum(case when src=1 then 1 else 0 end) cnt1, sum(case when src=2 then 1 else 0 end) cnt2 from ( select id, name, 1 src from A union all select id, name, 2 src from B ) group by id, name)where cnt1 <> cnt2

Page 15: Sql Patterns

Execution Statistics

Page 16: Sql Patterns

Equality checking via Aggregation1. Is there any difference? (Boolean).

2. What are the rows that one table contains, and the other doesn't?

|| orahash 267629

|| orahash 512259|| orahash 334382|| orahash 592731

+++=1523431

Page 17: Sql Patterns

Relational Division

Name  Steve

 Pete 

 Kate 

x Language

 SQL 

 Java 

=

Name Language

Steve  SQL 

Pete  Java 

Kate  SQL 

Steve  Java 

Pete  SQL 

Kate  Java 

JobApplicants JobRequirements

ApplicantSkills

Page 18: Sql Patterns

Dividend, Divisor and Quotient

Name Language Steve  SQL 

Pete  Java 

Kate  SQL 

Kate  Java 

/

ApplicantSkills

Language

 SQL 

 Java 

=

JobRequirements

? Name

Kate

Remainder

Page 19: Sql Patterns

Is it a common Pattern?

Not a basic operator in RA or SQLInformally:

“Find job applicants who meet all job requirements”

compare with:

“Find job applicants who meet at least one job requirement”

Page 20: Sql Patterns

Set Union Query

Given a set of sets, e.g {{1,3,5},{3,4,5},{5,6}}Find their union:

SELECT DISTINCT elementFROM Sets

ID ELEMENT  1   1 

 1   3  1   5  2   3  2   4  2   5  3   5  3   6 

Sets

Page 21: Sql Patterns

Set Intersection

Given a set of sets, e.g {{1,3,5},{3,4,5},{5,6}}Find their intersection?

ID ELEMENT  1   1 

 1   3  1   5  2   3  2   4  2   5  3   5  3   6 

Sets

Page 22: Sql Patterns

It’s Relational Division Query!

“Find Elements which belong to all sets” compare with:

“Find Elements who belong to at least one set”

ID ELEMENT  1   1  1   3  1   5  2   3  2   4  2   5  3   5  3   6 

/

ID

 1 

 2 

 3 

= ELEMENT

 5 

Page 23: Sql Patterns

Implementation (1)

πName(ApplicantSkills) x JobRequirements Name Language

Steve  SQL 

Pete  Java 

Kate  SQL 

Steve  Java 

Pete  SQL 

Kate  Java 

Page 24: Sql Patterns

Implementation (2)

Applicants who are not qualified:

πName ( πName(ApplicantSkills) x JobRequirements

- ApplicantSkills

)

Page 25: Sql Patterns

Implementation (3)

Final Query:

πName (ApplicantSkills) - πName ( ApplicantSkills -

πName(ApplicantSkills) x JobRequirements )

Page 26: Sql Patterns

Implementation in SQL (1)select distinct Name from ApplicantSkillsminusselect Name from ( select Name, Language from ( select Name from ApplicantSkills ), ( select Language from JobRequirements ) minus select Name, Language from ApplicantSkills)

Page 27: Sql Patterns

Implementation in SQL (2)

select distinct Name from ApplicantSkills i

where not exists (

select * from JobRequirements ii

where not exists (

select * from ApplicantSkills iii

where iii.Language = ii.Language

and iii.Name = i.Name

)

)

Page 28: Sql Patterns

Implementation in SQL (3)

“Name the applicants such that for all job requirements there exists a corresponding entry in the applicant skills”

“Name the applicants such that there is no job requirement such that there doesn’t exists a corresponding entry in the applicant skills”

“Name the applicants for which the set of all job skills is a subset of their skills”

Page 29: Sql Patterns

Implementation in SQL (4)

select distinct Name from ApplicantSkills i

where

(select Language from JobRequirements ii

where ii.Name = i.Name)

in

(select Language from ApplicantSkills)

Page 30: Sql Patterns

Implementation in SQL (5)

A ⊆ B A \ B = ∅

select distinct Name from ApplicantSkills iwhere not exists ( select Language from ApplicantSkills minus select Language from JobRequirements ii where ii.Name = i.Name)

Page 31: Sql Patterns

Implementation in SQL (6)

select Name from ApplicantSkills s, JobRequirements r

where s.Language = r.Language

group by Name

having count(*) = (select count(*) from

JobRequirements)

Page 32: Sql Patterns

Book