Wat is “geavanceerde” SQL?

Kijken naar een functiebeschrijving waar “geavanceerde SQL” een vereiste is. Ik kan net zo goed basisvragen schrijven als iedereen, en heb in een professionele omgeving met MySQL-databases gewerkt, maar wat zou ik met deze banen beginnen als ik zou worden aangenomen? Wat zijn voorbeelden van geavanceerde SQL en waar sta ik op de schaal van SQL-noob tot SQL-master?


Antwoord 1, autoriteit 100%

Ik denk dat dit het beste kan worden benadrukt met een voorbeeld. Als je denkt dat je de volgende SQL-instructie snel zou kunnen schrijven met weinig/geen referentiemateriaal, dan denk ik dat je waarschijnlijk voldoet aan hun geavanceerde SQL-vereiste:

DECLARE @date DATETIME
SELECT @date = '10/31/09'
SELECT
      t1.EmpName,
      t1.Region,
      t1.TourStartDate,
      t1.TourEndDate,
      t1.FOrdDate,
      FOrdType  = MAX(CASE WHEN o.OrderDate = t1.FOrdDate THEN o.OrderType  ELSE NULL END),
      FOrdTotal = MAX(CASE WHEN o.OrderDate = t1.FOrdDate THEN o.OrderTotal ELSE NULL END),
      t1.LOrdDate,
      LOrdType  = MAX(CASE WHEN o.OrderDate = t1.LOrdDate THEN o.OrderType  ELSE NULL END),
      LOrdTotal = MAX(CASE WHEN o.OrderDate = t1.LOrdDate THEN o.OrderTotal ELSE NULL END)
  FROM 
      (--Derived table t1 returns the tourdates, and the order dates
      SELECT
            e.EmpId,
            e.EmpName,
            et.Region,
            et.TourStartDate,
            et.TourEndDate,
            FOrdDate = MIN(o.OrderDate),
            LOrdDate = MAX(o.OrderDate)
        FROM #Employees e INNER JOIN #EmpTours et
          ON e.EmpId = et.EmpId INNER JOIN #Orders o
          ON e.EmpId = o.EmpId
       WHERE et.TourStartDate <= @date
         AND (et.TourEndDate > = @date OR et.TourEndDate IS NULL)
         AND o.OrderDate BETWEEN et.TourStartDate AND @date
       GROUP BY e.EmpId,e.EmpName,et.Region,et.TourStartDate,et.TourEndDate
      ) t1 INNER JOIN #Orders o
    ON t1.EmpId = o.EmpId
   AND (t1.FOrdDate = o.OrderDate OR t1.LOrdDate = o.OrderDate)
 GROUP BY t1.EmpName,t1.Region,t1.TourStartDate,t1.TourEndDate,t1.FOrdDate,t1.LOrdDate

(bron van de zoekopdracht)

En om eerlijk te zijn, dat is een relatief eenvoudige zoekopdracht – slechts enkele inner joins en een subquery, samen met een paar veelvoorkomende zoekwoorden (max, min, case).


Antwoord 2, autoriteit 92%

Basis


  1. SELECTkolommen uit een tabel
  2. Aggregaties Deel 1: COUNT, SUM, MAX/MIN
  3. Aggregaties Deel 2: DISTINCT, GROUP BY, HAVING

Gemiddeld


  1. JOINs, ANSI-89 en ANSI-92 syntaxis
  2. UNIONversus UNION ALL
  3. NULLafhandeling: COALESCE& Native NULL-verwerking
  4. Subquery’s: IN, EXISTSen inline views
  5. Subquery’s: gecorreleerd
  6. WITHsyntaxis: Subquery Factoring/CTE
  7. Beelden

Geavanceerde onderwerpen


  • Functies, opgeslagen procedures, pakketten
  • Draaigegevens: CASE & PIVOT-syntaxis
  • Hiërarchische zoekopdrachten
  • Cursors: impliciet en expliciet
  • Triggers
  • Dynamische SQL
  • Gematerialiseerde weergaven
  • Optimalisatie van zoekopdrachten: indexen
  • Query-optimalisatie: leg plannen uit
  • Optimalisatie van zoekopdrachten: profilering
  • Gegevensmodellering: normale vormen, 1 t/m 3
  • Gegevensmodellering: primair & Buitenlandse sleutels
  • Gegevensmodellering: tabelbeperkingen
  • Gegevensmodellering: koppelings-/corrollaire tabellen
  • Zoeken in volledige tekst
  • XML
  • Isolatieniveaus
  • Entiteitsrelatiediagrammen (ERD’s), logisch en fysiek
  • Transacties: COMMIT, ROLLBACK, foutafhandeling

Antwoord 3, autoriteit 94%

De rest van de vacaturevermelding zou context kunnen bieden om een betere schatting te geven van wat "Advanced SQL"kan omvatten.

Ik ben het niet eens met opmerkingen en reacties die aangeven dat het begrijpen van JOIN- en verzamelquery’s “geavanceerde” vaardigheden zijn; veel werkgevers zouden dit nogal basaal vinden, vrees ik. Hier is een ruwe schatting van wat ‘Geavanceerd’ kan betekenen.

Er is de afgelopen jaren een “verschrikkelijke” hoeveelheid nieuwe dingen in het RDBMS-domein geweest!

De vereiste “Geavanceerde SQL” verwijst waarschijnlijk naar kennis en mogelijk vaardigheid in verschillende van de nieuwe conceptenzoals:

  • CTE’s (Common Table Expressions)
  • UDF’s (door gebruiker gedefinieerde functies)
  • Fulltext zoekextensies/integratie
  • afstemming van de prestaties met nieuwe indelingsschema’s, gefilterde indexen, schaarse kolommen…)
  • nieuwe gegevenstypen (bijv. GIS/ruimtelijk of hiërarchisch)
  • XML-ondersteuning / integratie
  • LINQ
  • en nog een paar… (BTW de bovenstaande lijst is enigszins MSSQL-gecentreerd, maar vergelijkbare evolutie wordt waargenomen in de meeste andere DBMS-platforms).

Hoewel het op de hoogte blijven van de voor- en nadelen van de nieuwe functies een belangrijke taak is voor elke “geavanceerde SQL”-beoefenaar, de oude “geavanceerde grondbeginselen” worden waarschijnlijk ook beschouwd als onderdeel van de “geavanceerde”:

  • triggers en opgeslagen procedures in het algemeen
  • Cursors (wanneer te gebruiken, hoe te vermijden…)
  • ontwerpexpertise: tabellen definiëren, wat te indexeren, type indexen
  • expertise op het gebied van prestatieafstemming in het algemeen
  • Query-optimalisatie (lezen van queryplannen, wetende wat intrinsiek langzaam enz.)
  • Procedural SQL

Opmerking: het bovenstaande is gericht op vaardigheden die verband houden met programmeer / hoofdrol. “Geavanceerd SQL” kan ook verwijzen naar ervaring met administratieve rollen (replicatie, back-ups, hardware lay-out, gebruikersbeheer …). Kom om erover na te denken, een serieuze programmeur moet ook enigszins bekend zijn met dergelijke praktijken.

bewerken : luckylindy heeft een opmerking geplaatst die ik vrij inzichtelijk vond. Het suggereert dat “geavanceerd” effectief een ander doel kan hebben dan het impliceren van een eerlijk tot expert-niveau in de meeste van de bovengenoemde categorieën …
Ik herhaal deze opmerking hier om het meer zichtbaarheid te geven.

Ik denk dat veel bedrijven geavanceerde SQL post omdat ze het beu zijn om iemand te krijgen die zegt: “Ik ben een SQL-expert” en heeft moeite met het samenstellen van een 3-tafelsbeurt. Ik post soortgelijke dingen in vacatures en mijn verwachting is eenvoudigweg dat een kandidaat niet altijd naar me toe hoeft te komen om SQL te schrijven. (commentaar van Luckylindy)


Antwoord 4, Autoriteit 55%

Uitchecken SQL voor Smarties . Ik dacht dat ik ook redelijk goed was met SQL, totdat ik dat boek lees … gaat in tonnen diepte, praat over dingen die ik niet elders heb gezien (dat wil zeggen het verschil tussen 3’rd en 4′-normale vorm, Boyce Codd Normal Vorm, enz.) …


Antwoord 5, Autoriteit 50%

Ik zou verwachten:

  • Opgeslagen procedure Creatie en gebruik
  • Joins (binnen en uiterlijk) en hoe de groep correct te gebruiken door
  • PRESTATIES EVALUATIE / TUNING
  • kennis van efficiënte (en inefficiënte) manieren om dingen in query’s te doen (begrijpen hoe bepaalde dingen de prestaties kunnen beïnvloeden, bijvoorbeeld het gebruik van functies in WHERE-clausules)
  • dynamische SQL en kennis van cursors (en IMO de weinige keren dat ze zouden moeten worden gebruikt)
  • inzicht in schema-ontwerp, indexering en referentiële integriteit

Antwoord 6, autoriteit 25%

Enkele “geavanceerde” functies

  • recursieve zoekopdrachten
  • venster-/rangschikkingsfuncties
  • draaien en ongedaan maken
  • afstemming van prestaties

Antwoord 7, autoriteit 15%

Als je ze in vereisten ziet staan, bevatten ze meestal:

  • Beelden
  • Opgeslagen procedures
  • Door de gebruiker gedefinieerde functies
  • Triggers
  • soms cursors

Innerlijke en outer joins zijn een must, maar ik zie het zelden vermeld in vereisten. En het is verbazingwekkend hoeveel zogenaamde db-professionals hun hoofd niet rond een simpele outer join kunnen krijgen.


Antwoord 8, autoriteit 5%

SELECT ... HAVING ...is een goed begin. Niet veel ontwikkelaars lijken te begrijpen hoe ze het moeten gebruiken.


Antwoord 9, autoriteit 5%

Ik veronderstel dat subquery’s en PIVOT in aanmerking komen, evenals meerdere joins, vakbonden en dergelijke.


Antwoord 10, autoriteit 5%

Prestaties afstemmen, indexen maken, opgeslagen procedures, enz.

‘Geavanceerd’ betekent voor iedereen iets anders. Ik kan me voorstellen dat dit soort dingen voor elke vacatureposter iets anders betekent.


Antwoord 11, autoriteit 5%

Bij mijn vorige baan hadden we een technische test waaraan alle kandidaten moesten deelnemen. 10ish vragen, duurde ongeveer een uur. In alle eerlijkheid echter, 90% van de mislukkingen kon worden uitgesloten omdat ze geen INNER JOIN-statement konden schrijven. Zelfs geen buitenkant.

Ik zou dat als een vereiste beschouwen voor elke functiebeschrijving waarbij SQL betrokken is en ik zou het met rust laten totdat dat onder de knie was. Van daaruit kun je met ze praten – alle verdere informatie over waar ze eigenlijk naar op zoek zijn, zal in het ergste geval een handige lijst zijn met dingen die je kunt leren als onderdeel van je professionele ontwikkeling.

Other episodes