Tải bản đầy đủ (.pdf) (1,166 trang)

OReilly SQL cookbook dec 2005 ISBN 0596009763

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.65 MB, 1,166 trang )

SQLCookbook
ByAnthonyMolinaro
...............................................
Publisher:O'Reilly
PubDate:December2005
PrintISBN-10:0-596-00976-3
PrintISBN-13:978-0-59-600976-2
Pages:628

TableofContents|Index

YouknowtherudimentsoftheSQLquerylanguage,yetyoufeelyouaren'ttakingfull
advantageofSQL'sexpressivepower.You'dliketolearnhowtodomoreworkwithSQL
insidethedatabasebeforepushingdataacrossthenetworktoyourapplications.You'dlike
totakeyourSQLskillstothenextlevel.
Let'sfaceit,SQLisadeceptivelysimplelanguagetolearn,andmanydatabasedevelopers
nevergofarbeyondthesimplestatement:SELECTFROMWHERE.Butthereissomuch
moreyoucandowiththelanguage.IntheSQLCookbook,experiencedSQLdeveloper
AnthonyMolinaroshareshisfavoriteSQLtechniquesandfeatures.You'lllearnabout:

Windowfunctions,arguablythemostsignificantenhancementtoSQLinthepast
decade.Ifyou'renotusingthese,you'remissingout
Powerful,database-specificfeaturessuchasSQLServer'sPIVOTandUNPIVOT
operators,Oracle'sMODELclause,andPostgreSQL'sveryusefulGENERATE_SERIES
function
Pivotingrowsintocolumns,reverse-pivotingcolumnsintorows,usingpivotingto
facilitateinter-rowcalculations,anddouble-pivotingaresultset
Bucketization,andwhyyoushouldneverusethatterminBrooklyn.
Howtocreatehistograms,summarizedataintobuckets,performaggregationsover
amovingrangeofvalues,generaterunning-totalsandsubtotals,andother
advanced,datawarehousingtechniques


Thetechniqueofwalkingastring,whichallowsyoutouseSQLtoparsethroughthe
characters,words,ordelimitedelementsofastring


WritteninO'Reilly'spopularProblem/Solution/Discussionstyle,theSQLCookbookissure
toplease.Anthony'scredois:"Whenitcomesdowntoit,weallgotowork,weallhave
billstopay,andweallwanttogohomeatareasonabletimeandenjoywhat'sstill
availableofourdays."TheSQLCookbookmovesquicklyfromproblemtosolution,saving
youtimeeachstepoftheway.


SQLCookbook
ByAnthonyMolinaro
...............................................
Publisher:O'Reilly
PubDate:December2005
PrintISBN-10:0-596-00976-3
PrintISBN-13:978-0-59-600976-2
Pages:628

TableofContents|Index

















































Copyright
Dedication
Preface
WhyIWroteThisBook
ObjectivesofThisBook
AudienceforThisBook
HowtoUseThisBook
What'sMissingfromThisBook
StructureofThisBook
PlatformandVersion
TablesUsedinThisBook
ConventionsUsedinThisBook
UsingCodeExamples
CommentsandQuestions
Safari®Enabled
Acknowledgments
Chapter1.RetrievingRecords
Recipe1.1.RetrievingAllRowsandColumnsfromaTable
Recipe1.2.RetrievingaSubsetofRowsfromaTable
Recipe1.3.FindingRowsThatSatisfyMultipleConditions
Recipe1.4.RetrievingaSubsetofColumnsfromaTable
Recipe1.5.ProvidingMeaningfulNamesforColumns

Recipe1.6.ReferencinganAliasedColumnintheWHEREClause
Recipe1.7.ConcatenatingColumnValues















































































Recipe1.8.UsingConditionalLogicinaSELECTStatement
Recipe1.9.LimitingtheNumberofRowsReturned
Recipe1.10.ReturningnRandomRecordsfromaTable
Recipe1.11.FindingNullValues
Recipe1.12.TransformingNullsintoRealValues
Recipe1.13.SearchingforPatterns
Chapter2.SortingQueryResults
Recipe2.1.ReturningQueryResultsinaSpecifiedOrder
Recipe2.2.SortingbyMultipleFields
Recipe2.3.SortingbySubstrings
Recipe2.4.SortingMixedAlphanumericData

Recipe2.5.DealingwithNullswhenSorting
Recipe2.6.SortingonaDataDependentKey
Chapter3.WorkingwithMultipleTables
Recipe3.1.StackingOneRowsetatopAnother
Recipe3.2.CombiningRelatedRows
Recipe3.3.FindingRowsinCommonBetweenTwoTables
Recipe3.4.RetrievingValuesfromOneTableThatDoNotExistinAnother
Recipe3.5.RetrievingRowsfromOneTableThatDoNotCorrespondtoRowsin
Another
Recipe3.6.AddingJoinstoaQueryWithoutInterferingwithOtherJoins
Recipe3.7.DeterminingWhetherTwoTablesHavetheSameData
Recipe3.8.IdentifyingandAvoidingCartesianProducts
Recipe3.9.PerformingJoinswhenUsingAggregates
Recipe3.10.PerformingOuterJoinswhenUsingAggregates
Recipe3.11.ReturningMissingDatafromMultipleTables
Recipe3.12.UsingNULLsinOperationsandComparisons
Chapter4.Inserting,Updating,Deleting
Recipe4.1.InsertingaNewRecord
Recipe4.2.InsertingDefaultValues
Recipe4.3.OverridingaDefaultValuewithNULL
Recipe4.4.CopyingRowsfromOneTableintoAnother
Recipe4.5.CopyingaTableDefinition
Recipe4.6.InsertingintoMultipleTablesatOnce
Recipe4.7.BlockingInsertstoCertainColumns
Recipe4.8.ModifyingRecordsinaTable
Recipe4.9.UpdatingwhenCorrespondingRowsExist
Recipe4.10.UpdatingwithValuesfromAnotherTable
Recipe4.11.MergingRecords


















































































Recipe4.12.DeletingAllRecordsfromaTable
Recipe4.13.DeletingSpecificRecords
Recipe4.14.DeletingaSingleRecord
Recipe4.15.DeletingReferentialIntegrityViolations
Recipe4.16.DeletingDuplicateRecords
Recipe4.17.DeletingRecordsReferencedfromAnotherTable
Chapter5.MetadataQueries
Recipe5.1.ListingTablesinaSchema
Recipe5.2.ListingaTable'sColumns
Recipe5.3.ListingIndexedColumnsforaTable
Recipe5.4.ListingConstraintsonaTable
Recipe5.5.ListingForeignKeysWithoutCorrespondingIndexes
Recipe5.6.UsingSQLtoGenerateSQL

Recipe5.7.DescribingtheDataDictionaryViewsinanOracleDatabase
Chapter6.WorkingwithStrings
Recipe6.1.WalkingaString
Recipe6.2.EmbeddingQuotesWithinStringLiterals
Recipe6.3.CountingtheOccurrencesofaCharacterinaString
Recipe6.4.RemovingUnwantedCharactersfromaString
Recipe6.5.SeparatingNumericandCharacterData
Recipe6.6.DeterminingWhetheraStringIsAlphanumeric
Recipe6.7.ExtractingInitialsfromaName
Recipe6.8.OrderingbyPartsofaString
Recipe6.9.OrderingbyaNumberinaString
Recipe6.10.CreatingaDelimitedListfromTableRows
Recipe6.11.ConvertingDelimitedDataintoaMulti-ValuedIN-List
Recipe6.12.AlphabetizingaString
Recipe6.13.IdentifyingStringsThatCanBeTreatedasNumbers
Recipe6.14.ExtractingthenthDelimitedSubstring
Recipe6.15.ParsinganIPAddress
Chapter7.WorkingwithNumbers
Recipe7.1.ComputinganAverage
Recipe7.2.FindingtheMin/MaxValueinaColumn
Recipe7.3.SummingtheValuesinaColumn
Recipe7.4.CountingRowsinaTable
Recipe7.5.CountingValuesinaColumn
Recipe7.6.GeneratingaRunningTotal
Recipe7.7.GeneratingaRunningProduct
Recipe7.8.CalculatingaRunningDifference











































































Recipe7.9.CalculatingaMode
Recipe7.10.CalculatingaMedian
Recipe7.11.DeterminingthePercentageofaTotal
Recipe7.12.AggregatingNullableColumns
Recipe7.13.ComputingAveragesWithoutHighandLowValues
Recipe7.14.ConvertingAlphanumericStringsintoNumbers
Recipe7.15.ChangingValuesinaRunningTotal
Chapter8.DateArithmetic
Recipe8.1.AddingandSubtractingDays,Months,andYears
Recipe8.2.DeterminingtheNumberofDaysBetweenTwoDates
Recipe8.3.DeterminingtheNumberofBusinessDaysBetweenTwoDates
Recipe8.4.DeterminingtheNumberofMonthsorYearsBetweenTwoDates
Recipe8.5.DeterminingtheNumberofSeconds,Minutes,orHoursBetween
TwoDates
Recipe8.6.CountingtheOccurrencesofWeekdaysinaYear
Recipe8.7.DeterminingtheDateDifferenceBetweentheCurrentRecordandthe
NextRecord
Chapter9.DateManipulation
Recipe9.1.DeterminingifaYearIsaLeapYear
Recipe9.2.DeterminingtheNumberofDaysinaYear
Recipe9.3.ExtractingUnitsofTimefromaDate
Recipe9.4.DeterminingtheFirstandLastDayofaMonth

Recipe9.5.DeterminingAllDatesforaParticularWeekdayThroughoutaYear
Recipe9.6.DeterminingtheDateoftheFirstandLastOccurrenceofaSpecific
WeekdayinaMonth
Recipe9.7.CreatingaCalendar
Recipe9.8.ListingQuarterStartandEndDatesfortheYear
Recipe9.9.DeterminingQuarterStartandEndDatesforaGivenQuarter
Recipe9.10.FillinginMissingDates
Recipe9.11.SearchingonSpecificUnitsofTime
Recipe9.12.ComparingRecordsUsingSpecificPartsofaDate
Recipe9.13.IdentifyingOverlappingDateRanges
Chapter10.WorkingwithRanges
Recipe10.1.LocatingaRangeofConsecutiveValues
Recipe10.2.FindingDifferencesBetweenRowsintheSameGrouporPartition
Recipe10.3.LocatingtheBeginningandEndofaRangeofConsecutiveValues
Recipe10.4.FillinginMissingValuesinaRangeofValues
Recipe10.5.GeneratingConsecutiveNumericValues
Chapter11.AdvancedSearching

















































































Recipe11.1.PaginatingThroughaResultSet
Recipe11.2.SkippingnRowsfromaTable
Recipe11.3.IncorporatingORLogicwhenUsingOuterJoins
Recipe11.4.DeterminingWhichRowsAreReciprocals
Recipe11.5.SelectingtheTopnRecords
Recipe11.6.FindingRecordswiththeHighestandLowestValues
Recipe11.7.InvestigatingFutureRows
Recipe11.8.ShiftingRowValues
Recipe11.9.RankingResults
Recipe11.10.SuppressingDuplicates
Recipe11.11.FindingKnightValues
Recipe11.12.GeneratingSimpleForecasts
Chapter12.ReportingandWarehousing
Recipe12.1.PivotingaResultSetintoOneRow
Recipe12.2.PivotingaResultSetintoMultipleRows
Recipe12.3.ReversePivotingaResultSet
Recipe12.4.ReversePivotingaResultSetintoOneColumn
Recipe12.5.SuppressingRepeatingValuesfromaResultSet
Recipe12.6.PivotingaResultSettoFacilitateInter-RowCalculations
Recipe12.7.CreatingBucketsofData,ofaFixedSize
Recipe12.8.CreatingaPredefinedNumberofBuckets
Recipe12.9.CreatingHorizontalHistograms
Recipe12.10.CreatingVerticalHistograms
Recipe12.11.ReturningNon-GROUPBYColumns
Recipe12.12.CalculatingSimpleSubtotals

Recipe12.13.CalculatingSubtotalsforAllPossibleExpressionCombinations
Recipe12.14.IdentifyingRowsThatAreNotSubtotals
Recipe12.15.UsingCaseExpressionstoFlagRows
Recipe12.16.CreatingaSparseMatrix
Recipe12.17.GroupingRowsbyUnitsofTime
Recipe12.18.PerformingAggregationsoverDifferentGroups/Partitions
Simultaneously
Recipe12.19.PerformingAggregationsoveraMovingRangeofValues
Recipe12.20.PivotingaResultSetwithSubtotals
Chapter13.HierarchicalQueries
Recipe13.1.ExpressingaParent-ChildRelationship
Recipe13.2.ExpressingaChild-Parent-GrandparentRelationship
Recipe13.3.CreatingaHierarchicalViewofaTable
Recipe13.4.FindingAllChildRowsforaGivenParentRow




Recipe13.5.DeterminingWhichRowsAreLeaf,Branch,orRootNodes


Chapter14.Odds'n'Ends

Recipe14.1.CreatingCross-TabReportsUsingSQLServer'sPIVOTOperator

Recipe14.2.UnpivotingaCross-TabReportUsingSQLServer'sUNPIVOT

Operator

Recipe14.3.TransposingaResultSetUsingOracle'sMODELClause


Recipe14.4.ExtractingElementsofaStringfromUnfixedLocations

Recipe14.5.FindingtheNumberofDaysinaYear(anAlternateSolutionfor

Oracle)

Recipe14.6.SearchingforMixedAlphanumericStrings

Recipe14.7.ConvertingWholeNumberstoBinaryUsingOracle

Recipe14.8.PivotingaRankedResultSet

Recipe14.9.AddingaColumnHeaderintoaDoublePivotedResultSet

Recipe14.10.ConvertingaScalarSubquerytoaCompositeSubqueryinOracle

Recipe14.11.ParsingSerializedDataintoRows

Recipe14.12.CalculatingPercentRelativetoTotal

Recipe14.13.CreatingCSVOutputfromOracle

Recipe14.14.FindingTextNotMatchingaPattern(Oracle)

Recipe14.15.TransformingDatawithanInlineView

Recipe14.16.TestingforExistenceofaValueWithinaGroup

AppendixA.WindowFunctionRefresher


RecipeA.1.Grouping

RecipeA.2.Windowing

AppendixB.RozenshteinRevisited

RecipeB.1.Rozenshtein'sExampleTables

RecipeB.2.AnsweringQuestionsInvolvingNegation

RecipeB.3.AnsweringQuestionsInvolving"atMost"

RecipeB.4.AnsweringQuestionsInvolving"atLeast"

RecipeB.5.AnsweringQuestionsInvolving"Exactly"

RecipeB.6.AnsweringQuestionsInvolving"Any"or"All"

AbouttheAuthor

Colophon

Index


Copyright©2006O'ReillyMedia,Inc.Allrightsreserved.
PrintedintheUnitedStatesofAmerica.
PublishedbyO'ReillyMedia,Inc.,1005GravensteinHighway
North,Sebastopol,CA95472.

O'Reillybooksmaybepurchasedforeducational,business,or
salespromotionaluse.Onlineeditionsarealsoavailablefor
mosttitles(safari.oreilly.com).Formoreinformation,contact
ourcorporate/institutionalsalesdepartment:(800)998-9938or

Editor:

JonathanGennick

ProductionEditor:

DarrenKelly

ProductionServices:

nSight,Inc.

CoverDesigner:

KarenMontgomery

InteriorDesigner:

DavidFutato

PrintingHistory:



December2005:


FirstEdition.

NutshellHandbook,theNutshellHandbooklogo,andthe
O'ReillylogoareregisteredtrademarksofO'ReillyMedia,Inc.
TheCookbookseriesdesignations,SQLCookbook,theimageof
anAgamidlizard,andrelatedtradedressaretrademarksof
O'ReillyMedia,Inc.
Manyofthedesignationsusedbymanufacturersandsellersto


distinguishtheirproductsareclaimedastrademarks.Where
thosedesignationsappearinthisbook,andO'ReillyMedia,Inc.
wasawareofatrademarkclaim,thedesignationshavebeen
printedincapsorinitialcaps.
Whileeveryprecautionhasbeentakeninthepreparationofthis
book,thepublisherandauthorassumenoresponsibilityfor
errorsoromissions,orfordamagesresultingfromtheuseof
theinformationcontainedherein.
ISBN:0-596-00976-3
[M]




Dedication
Tomymom:
You'rethebest!Thankyouforeverything.




Preface
SQListhelanguageinthedatabaseworld.Ifyou'redeveloping
fororreportingfromrelationaldatabases,yourabilitytoput
dataintoadatabaseandthengetitbackoutagainultimately
comesdowntoyourknowledgeofSQL.Yetmanypractitioners
useSQLinaperfunctorymanner,andareunawareofthepower
attheirdisposal.Thisbookaimstochangeallthat,byopening
youreyestowhatSQLcanreallydoforyou.
Thebookyou'reholdinginyourhandsisacookbook.It'sa
collectionofcommonSQLproblemsandtheirsolutionsthatI
hopeyou'llfindhelpfulinyourday-to-daywork.Recipesare
categorizedintochaptersofrelatedtopics.Whenfacedwitha
newSQLproblemthatyouhaven'tsolvedbefore,findthe
chapterthatbestseemstoapply,skimthroughtherecipetitles,
andhopefullyyouwillfindasolution,oratleastinspirationfor
asolution.
Morethan150recipesareavailableinthis600-pluspagebook,
andI'veonlyscratchedthesurfaceofwhatcanbedoneusing
SQL.ThenumberofdifferentSQLsolutionsavailableforsolving
ourdailyprogrammingproblemsiseclipsedonlybythenumber
ofproblemsweneedtosolve.Youwon'tfindallpossible
problemscoveredinthisbook.Indeed,suchcoveragewouldbe
impossible.Youwill,however,findmanycommonproblemsand
theirsolutions.Andinthosesolutionslietechniquesthatyou'll
learnhowtoexpanduponandapplytoother,newproblems
thatIneverthoughttocover.

MypublisherandIareconstantlyonthelookoutfornew,cookbookworthySQLrecipes.IfyoucomeacrossagoodorcleverSQLsolution
toaproblem,considersharingit;considersendingitinforinclusionin

thenexteditionofthisbook.See"CommentsandQuestions"forour
contactinformation.


WhyIWroteThisBook
Queries,queries,queries.Mygoalfromthebeginningofthis
projecthasnotbeensomuchtowritea"SQLCookbook"asto
writea"QueryCookbook."I'veaimedtocreateabook
comprisedofqueriesrangingfromtherelativelyeasytothe
relativelydifficultinhopesthereaderwillgraspthetechniques
behindthosequeriesandusethemtosolvehisownparticular
businessproblems.IhopetopassonmanyoftheSQL
programmingtechniquesI'veusedinmycareersothatyou,
thereader,willtakethem,learnfromthem,andeventually
improveuponthem;throughthiscycleweallbenefit.Being
abletoretrievedatafromadatabaseseemssosimple,yetin
theworldofInformationTechnology(IT)it'scrucialthatthe
operationofdataretrievalbedoneasefficientlyaspossible.
Techniquesforefficientdataretrievalshouldbesharedsothat
wecanallbeefficientandhelpeachotherimprove.
Considerforamomenttheoutstandingcontributionto
mathematicsbyGeorgCantor,whowasthefirsttorealizethe
vastbenefitofstudyingsetsofelements(studyingthesetitself
ratherthanitsconstituents).Atfirst,Cantor'sworkwasn't
acceptedbymanyofhispeers.Intime,though,itwasnotonly
accepted,butsettheoryisnowconsideredthefoundationof
mathematics!Moreimportantly,however,itwasnotthrough
Cantor'sworkalonethatsettheorybecamewhatitistoday;
rather,bysharinghisideas,otherssuchasErnstZermelo,
GottlobFrege,AbrahamFraenkel,ThoralfSkolem,KurtGödel,

andJohnvonNeumanndevelopedandimprovedthetheory.
Suchsharingnotonlyprovidedeveryonewithabetter
understandingofthetheory,itmadeforabettersettheory
thanwasfirstconceived.


ObjectivesofThisBook
Ultimately,thegoalofthisbookistogiveyou,thereader,a
glimpseofwhatcanbedoneusingSQLoutsideofwhatis
consideredthetypicalSQLproblemdomain.SQLhascomea
verylongwayinthelasttenyears.Problemstypicallysolved
usingaprocedurallanguagesuchasCorJAVAcannowbe
solveddirectlyinSQL,butmanydevelopersaresimplyunaware
ofthisfact.Thisbookistohelpmakeyouaware.
Now,beforeyoutakewhatIjustsaidthewrongway,letme
statethatIamafirmbelieverin,"Ifitain'tbroke,don'tfixit."
Forexample,let'ssayyouhaveaparticularbusinessproblem
tosolve,andyoucurrentlyuseSQLtosimplyretrieveyourdata
whileapplyingyourcomplexbusinesslogicusingalanguage
otherthanSQL.Ifyourcodeworksandperformanceis
acceptable,thengreat.Iaminnowaysuggestingthatyou
scrapyourcodeforaSQL-onlysolution;Ionlyaskthatyou
openyourmindandrealizethattheSQLyouprogrammedwith
in1995isnotthesameSQLbeingusedin2005.Today'sSQL
candosomuchmore.


AudienceforThisBook
Thistextisuniqueinthatthetargetaudienceiswide,butthe
qualityofthematerialpresentedisnotcompromised.Consider

thatbothcomplexandsimplesolutionsareprovided,andthat
solutionsforfivedifferentvendorsareavailablewhena
commonsolutiondoesnotexist.Thetargetaudienceisindeed
wide:

TheSQLnovice
PerhapsyouhavejustpurchasedatextonlearningSQL,or
youarefreshintoyourfirstsemesterofarequired
databasecourseandyouwanttosupplementyournew
knowledgewithsomechallengingrealworldexamples.
Maybeyou'veseenaquerythatmagicallytransformsrows
tocolumns,orthatparsesaserializedstringintoaresult
set.Therecipesinthisbookexplaintechniquesfor
performingtheseseeminglyimpossiblequeries.

Thenon-SQLprogrammer
Perhapsyourbackgroundisinanotherlanguageandyou've
beenthrownintothefireatyourcurrentjobandare
expectedtosupportcomplexSQLwrittenbysomeoneelse.
Therecipesshowninthisbook,particularlyinthelater
chapters,breakdowncomplexqueriesandprovideagentle
walk-throughtohelpyouunderstandcomplexcodethatyou
mayhaveinherited.

TheSQLjourneyman


FortheintermediateSQLdeveloper,thisbookisthegoldat
theendoftherainbow(OK,maybethat'stoostrong;please
forgiveanauthor'senthusiasmforhistopic).Inparticular,if

you'vebeencodingSQLforquitesometimeandhavenot
foundyourwayontowindowfunctions,you'reinforatreat.
Forexample,thedaysofneedingtemporarytablestostore
intermediateresultsareover;windowfunctionscangetyou
toananswerinasinglequery!Allowmetoagainstatethat
Ihavenointentionoftryingtoforce-feedmyideastoan
alreadyexperiencedpractitioner.Instead,considerthisbook
asawaytoupdateyourskillsetifyouhaven'tcaughtonto
someoftheneweradditionstotheSQLlanguage.

TheSQLexpert
Undoubtedlyyou'veseentheserecipesbefore,andyou
probablyhaveyourownvariations.Why,then,isthisbook
usefultoyou?Perhapsyou'vebeenaSQLexpertonone
platformyourwholecareer,say,SQLServer,andnowwish
tolearnOracle.Perhapsyou'veonlyeverusedMySQL,and
youwonderwhatthesamesolutionsinPostgreSQLwould
looklike.Thistextcoversdifferentrelationaldatabase
managementsystems(RDBMSs)anddisplaystheir
solutionssidebyside.Here'syourchancetoexpandyour
knowledgebase.




HowtoUseThisBook
Besuretoreadthisprefacethoroughly.Itcontainsnecessary
backgroundandotherinformationthatyoumightotherwise
missifyoudiveintoindividualrecipes.Thesectionon"Platform
andVersion"tellsyouwhatRDBMSsthisbookcovers.Pay

specialattentionto"TablesUsedinThisBook,"sothatyou
becomefamiliarwiththeexampletablesusedinmostofthe
recipes.You'llalsofindimportantcodingandfontconventions
in"ConventionsUsedinThisBook."Allthesesectionscome
laterinthispreface.
Rememberthatthisisacookbook,acollectionofcode
examplestouseasguidelinesforsolvingsimilar(oridentical)
problemsthatyoumayhave.DonottrytolearnSQLfromthis
book,atleastnotfromscratch.Thisbookshouldactasa
supplementto,notareplacementfor,acompletetexton
learningSQL.Additionally,followingthetipsbelowwillhelpyou
usethisbookmoreproductively:
Thisbooktakesadvantageofvendor-specificfunctions.SQL
PocketGuidebyJonathanGennickhasallofthemandis
convenienttohaveclosetoyouincaseyoudon'tknow
whatsomeofthefunctionsinmyrecipesdo.
Ifyou'veneverusedwindowfunctions,orhavehad
problemswithqueriesusingGROUPBY,readAppendixA
first.ItwilldefineandprovewhatagroupisinSQL.More
importantly,itgivesabasicideaofhowwindowfunctions
work.WindowfunctionsareoneofthemostimportantSQL
developmentsofthepastdecade.
Usecommonsense!Realizethatitisimpossibletowritea
bookthatprovidesasolutiontoeverypossiblebusiness


probleminexistence.Instead,usetherecipesfromthis
bookastemplatesorguidelinestoteachyourselfthe
techniquesrequiredtosolveyourownspecificproblems.If
youfindyourselfsaying,"Great,thisrecipeworksforthis

particulardataset,butmineisdifferentandthustherecipe
doesn'tworkquitecorrectly,"that'sexpected.Inthatcase,
trytofindcommonalitybetweenthedatainthebookand
yourdata.Breakdownthebook'squerytoitssimplestform
andaddcomplexityasyougo.Allqueriesstartwith
SELECT…FROM…,sointheirsimplestform,allqueriesare
thesame.Ifyouaddcomplexityasyougo,"building"a
queryonestep,onefunction,onejoinatatime,youwill
notonlyunderstandhowthoseconstructschangetheresult
set,butyouwillseehowtherecipeisdifferentfromwhat
youactuallyneed.Andfromthereyoucanmodifythe
recipetoworkforyourparticulardataset.
Test,test,andtest.Undoubtedlyanytableofyoursis
biggerthanthe14rowEMPtableusedinthisbook,so
pleasetestthesolutionsagainstyourdata,attheveryleast
toensurethattheyperformwell.Ican'tpossiblyknowwhat
yourtableslooklike,whatcolumnsareindexed,andwhat
relationshipsarepresentinyourschema.Soplease,donot
blindlyimplementthesetechniquesinyourproductioncode
untilyoufullyunderstandthemandhowtheywillperform
againstyourparticulardata.
Don'tbeafraidtoexperiment.Becreative!Feelfreetouse
techniquesdifferentfromwhatI'veused.Imakeitapoint
tousemanyofthefunctionssuppliedbythedifferent
vendorsinthisbook,andoftenthereareseveralother
functionsthatmayworkaswellastheoneI'vechosento
useinaparticularrecipe.Feelfreetoplugyourown
variationsintotherecipesofthisbook.
Newerdoesnotalwaysmeanbetter.Ifyou'renotusing



someofthemorerecentfeaturesoftheSQLlanguage(for
example,windowfunctions),thatdoesnotnecessarily
meanyourcodeisnotasefficientasitcanbe.Thereare
manycasesinwhichtraditionalSQLsolutionsareasgood
orbetterthananynewsolution.Pleasekeepthisinmind,
particularlyintheAppendixB,RozenshteinRevisited.After
readingthisbook,youshouldnotcomeawaywiththeidea
thatyouneedtoupdateorchangeallyourexistingcode.
Instead,onlyrealizetherearemanynewandextremely
efficientfeaturesofSQLavailablenowthatwerenot
available10yearsago,andtheyareworththetimetaken
tolearnthem.
Don'tbeintimidated.Whenyougettothesolutionsection
ofarecipeandaquerylooksimpossibletounderstand,
don'tfear.I'vegonetogreatlengthstonotonlybreakdown
eachquerystartingfromitssimplestform,buttoshowthe
intermediateresultsofeachportionofaqueryaswework
ourwaytothecompletesolution.Youmaynotbeableto
seethebigpictureimmediately,butonceyoufollowthe
discussionandseenotonlyhowaqueryisbuilt,butthe
resultsofeachstep,you'llfindthatevenconvoluted-looking
queriesarenothardtograsp.
Programdefensivelywhennecessary.Inanefforttomake
thequeriesinthisbookasterseashumanlypossible
withoutobscuringtheirmeaning,I'veremovedmany
"defensivemeasures"fromtherecipes.Forexample,
consideraquerycomputingarunningtotalforanumberof
employeesalaries.Itcouldbethecasethatyouhave
declaredthecolumnoftypeVARCHARandare(sadly)

storingamixofnumericandstringdatainonefield.You'll
findtherunningtotalrecipeinthisbookdoesnotcheckfor
suchacase(anditwillfailasthefunctionSUMdoesn't
knowwhattodowithcharacterdata),soifyouhavethis
typeof"data"("problem"isamoreaccuratedescription),
youwillneedtocodearounditor(hopefully)fixyourdata,


becausetherecipesprovideddonotaccountforsuch
designpracticesasthemixingofcharacterandnumeric
datainthesamecolumn.Theideaistofocusonthe
technique;onceyouunderstandthetechnique,
sidesteppingsuchproblemsistrivial.
Repetitionisthekey.Thebestwaytomastertherecipesin
thisbookistositdownandcodethem.Whenitcomesto
code,readingisfine,butactuallycodingisevenbetter.You
mustreadtounderstandwhythingsaredoneacertainway,
butonlybycodingwillyoubeabletocreatethesequeries
yourself.
Beadvisedthatmanyoftheexamplesinthisbookare
contrived.Theproblemsarenotcontrived.Theyarereal.
However,I'vebuiltallexamplesaroundasmallsetoftables
containingemployeedata.I'vedonethattohelpyouget
familiarwiththeexampledata,sothat,havingbecomefamiliar
withthedata,youcanfocusonthetechniquethateachrecipe
illustrates.Youmightlookataspecificproblemandthink:"I
wouldneverneedtodothatwithemployeedata."Buttryto
lookpasttheexampledatainthosecasesandfocusonthe
techniquethatI'millustrating.Thetechniquesareuseful.My
colleaguesandIusethemdaily.Wethinkyouwilltoo.



What'sMissingfromThisBook
Duetoconstraintsontimeandbooksize,itisn'tpossiblefora
singlebooktoprovidesolutionsforallthepossibleSQL
problemsyoumayencounter.Thatsaid,herearesome
additionalitemsthatdidnotmakethelist:

DataDefinition
AspectsofSQLsuchascreatingindexes,adding
constraints,andloadingdataarenotcoveredinthisbook.
Suchtaskstypicallyinvolvesyntaxthatishighlyvendorspecific,soyou'rebestoffreferringtovendormanuals.In
addition,suchtasksdonotrepresentthetypeof"hard"
problemforwhichonewouldpurchaseabooktosolve.
Chapter4,however,doesproviderecipesforcommon
problemsinvolvingtheinsertion,updating,anddeletingof
data.

XML
ItismystrongopinionthatXMLrecipesdonotbelongina
bookonSQL.StoringXMLdocumentsinrelational
databasesisbecomingincreasinglypopular,andeach
RDBMShastheirownextensionsandtoolsforretrieving
andmanipulatingsuchdata.XMLmanipulationoften
involvescodethatisproceduralandthusoutsidethescope
ofthisbook.RecentdevelopmentssuchasXQUERY
representcompletelyseparatetopicsfromSQLandbelong
intheirownbook(orbooks).



Object-OrientedExtensionstoSQL
Untilalanguagemoresuitablefordealingwithobjects
comesalong,Iamstronglyagainstusingobject-oriented
featuresanddesignsinrelationaldatabases.Atthepresent
time,theobject-orientedfeaturesavailablefromsome
vendorsaremoresuitableforuseinprocedural
programmingthaninthesortofsetorientedproblemsolvingforwhichSQLisdesigned.

DebatesonPointsofTheory
Youwon'tfindargumentsinthisbookaboutwhetherSQLis
relational,oraboutwhetherNULLvaluesshouldexist.
Thesesortoftheoreticaldiscussionshavetheirplace,but
notinabookcenteredondeliveringSQLsolutionstoreallifeproblems.Tosolvereal-lifeproblems,yousimplyhave
toworkwiththetoolsavailabletoyouatthetime.Youhave
todealwithwhatyouhave,notwhatyouwishyouhad.

Ifyouwishtolearnmoreabouttheory,anyof
ChrisDate's"RelationalDatabaseWritings"
bookswouldbeagoodstart.Youmightalso
pickupacopyofhismostrecentbook,
DatabaseinDepth(O'Reilly).

VendorPolitics
ThistextprovidessolutionsforfivedifferentRDBMSs.Itis
onlynaturaltowanttoknowwhichvendor'ssolutionis
"best"or"fastest."Thereisplentyofinformationthateach


vendorwouldgladlyprovidetoshowthattheirproductis
"best";Ihavenointentionofdoingsohere.


ANSIPolitics
Manytextsshyawayfromtheproprietaryfunctions
suppliedbydifferentvendors.Thistextembraces
proprietaryfunctions.Ihavenointentionofwriting
convoluted,poorlyperformingSQLcodesimplyforthesake
ofportability.Ihaveneverworkedinanenvironmentwhere
theuseofvendor-specificextensionswasprohibited.You
arepayingforthesefeatures;whynotusethem?
Vendorextensionsexistforareason,andmanytimesoffer
betterperformanceandreadabilitythanyoucould
otherwiseachieveusingstandardSQL.IfyoupreferANSIonlysolutions,fine.AsImentionedbefore,Iamnothereto
tellyoutoturnallyourcodeupsidedown.Ifwhatyouhave
isstrictlyANSIanditworksforyou,great.Whenitcomes
downtoit,weallgotowork,weallhavebillstopay,and
weallwanttogohomeatareasonabletimeandenjoy
what'sstillleftofourdays.So,I'mnotsuggestingthat
ANSI-onlyiswrong.Dowhatworksandisbestforyou.But,
Iwanttomakeclearthatifyou'relookingforANSI-only
solutions,youshouldlookelsewhere.

LegacyPolitics
Therecipesinthistextmakeuseofthenewestfeatures
availableatthetimeofwriting.Ifyouareusingoldversions
oftheRDBMSsthatIcover,manyofmysolutionswill
simplynotworkforyou.Technologydoesnotstandstill,
andneithershouldyou.Ifyouneedoldersolutions,you'll
findthatmanyoftheSQLtextsavailablefromyearspast



haveplentyofexamplesusingolderversionsofthe
RDBMSscoveredinthisbook.




StructureofThisBook
Thisbookisdividedinto14chaptersand2appendices:
Chapter1,RetrievingRecords,introducesverysimple
queries.ExamplesincludehowtouseaWHEREclauseto
restrictrowsfromyourresultset,providingaliasesfor
columnsinyourresultset,usinganinlineviewtoreference
aliasedcolumns,usingsimpleconditionallogic,limitingthe
numberofrowsreturnedbyaquery,returningrandom
records,andfindingNULLvalues.Mostoftheexamplesare
verysimple,butsomeofthemappearinmorecomplex
recipes,soit'sagoodideatoreadthischapterifyou're
relativelynewtoSQLoraren'tfamiliarwithanyofthe
exampleslistedforthischapter.
Chapter2,SortingQueryResults,introducesrecipesfor
sortingqueryresults.TheORDERBYclauseisintroduced
andisusedtosortqueryresults.Examplesincreasein
complexityrangingfromsimple,single-columnordering,to
orderingbysubstrings,toorderingbasedonconditional
expressions.
Chapter3,WorkingwithMultipleTables,introducesrecipes
forcombiningdatafrommultipletables.Ifyouarenewto
SQLorareabitrustyonjoins,Istronglyrecommendyou
readthischapterbeforereadingChapter5andlater.Joining
tablesiswhatSQLisallabout;youmustunderstandjoins

tobesuccessful.Examplesinthischapterinclude
performingbothinnerandouterjoins,identifyingCartesian
productions,basicsetoperations(setdifference,union,
intersection),andtheeffectsofjoinsonaggregate
functions.


×