Duomenų bazės ir SQL: praktiniai klausimai su paaiškinimais

Nemokami testo klausimai tema Duomenų bazės ir SQL su užuominomis ir paaiškinimais, trijų lygių: pagrindinės sąvokos ir faktai, sąvokų taikymas, atvejai ir analizė.

Nemokamas pratybų uždavinysLengvas

Kuris apribojimas užtikrina, kad stulpelis niekada neliktų tuščias (NULL)?

Kitas uždavinys →

Ką praktikuositės

  1. Lengvaspagrindinės sąvokos ir faktai
  2. Vidutinissąvokų taikymas
  3. Sunkusatvejai ir analizė

Išmokite Duomenų bazės ir SQL nuo nulio

1Kas yra reliacinė duomenų bazė

Reliacinė duomenų bazė saugo duomenis lentelėse. Lentelė atrodo kaip skaičiuoklė: kiekviena eilutė yra vienas įrašas, kiekvienas stulpelis – viena savybė.

Parduotuvė gali turėti lentelę customers su stulpeliais id, name ir city bei lentelę orders su stulpeliais id, customer_id ir total.

Pirminis raktas yra stulpelis ar stulpelių rinkinys, vienareikšmiškai identifikuojantis kiekvieną eilutę. Jis niekada negali kartotis ir niekada negali būti tuščias. Čia tai kiekvienos lentelės id.

Išorinis raktas yra stulpelis, nurodantis kitos lentelės pirminį raktą. Lentelėje orders customer_id nurodo, kuris klientas pateikė užsakymą.

Taip lentelės susiejamos: vienas klientas gali turėti daug užsakymų, bet kiekvienas užsakymas priklauso vienam klientui. Tai vienas su daug ryšys.

SQL (Structured Query Language) yra kalba, kuria kuriate lenteles, keičiate duomenis ir klausiate apie juos.

Savikontrolė Kas yra pirminis raktas?
  1. Indeksas, pagreitinantis paiešką
  2. Pirmasis kiekvienos lentelės stulpelis
  3. Stulpelis ar stulpelių rinkinys, vienareikšmiškai identifikuojantis kiekvieną eilutę
  4. Stulpelis, nurodantis eilutę kitoje lentelėje

Atsakymas: Stulpelis ar stulpelių rinkinys, vienareikšmiškai identifikuojantis kiekvieną eilutę. Pirminis raktas yra unikalus ir niekada nėra NULL, todėl išrenka lygiai vieną eilutę. Stulpelis, nurodantis kitą lentelę, yra išorinis raktas.

2Duomenų skaitymas su SELECT

Dauguma klausimų yra apie SELECT sakinį. Jis sudarytas iš sakinių dalių, visada rašomų šia tvarka:

SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY …
  • SELECT išvardija norimus stulpelius. DISTINCT pašalina pasikartojančias eilutes.
  • FROM nurodo lentelę arba kartu sujungtas lenteles.
  • WHERE palieka tik eilutes, atitinkančias sąlygą, pavyzdžiui, WHERE total > 20.
  • GROUP BY sudeda tą pačią reikšmę turinčias eilutes į vieną grupę, kad galėtumėte skaičiuoti ar sumuoti pagal grupę.
  • HAVING palieka tik grupes, atitinkančias sąlygą. Jis gali naudoti agregatus, o WHERE – ne.
  • ORDER BY rūšiuoja rezultatą, pagal numatymą didėjimo tvarka; pridėkite DESC, kad didžiausi būtų pirmi.

Agregatinės funkcijos apibendrina daug eilučių į vieną reikšmę: COUNT, SUM, AVG, MIN ir MAX.

Duomenų bazė sakinio dalių nevykdo ta tvarka, kuria jas rašote. Ji pirmiausia vykdo FROM, tada WHERE, GROUP BY, HAVING, SELECT ir galiausiai ORDER BY.

Kiti sakiniai keičia duomenis: INSERT prideda eilutes, UPDATE keičia eilutes, o DELETE pašalina eilutes. CREATE, ALTER ir DROP keičia pačias lenteles.

Savikontrolė Norite tik klientų, turinčių daugiau nei 5 užsakymus. Kuri dalis filtruoja pagal COUNT(*) > 5?
  1. DISTINCT
  2. HAVING
  3. ORDER BY
  4. WHERE

Atsakymas: HAVING. Skaičius egzistuoja tik sugrupavus eilutes, o HAVING filtruoja grupes. WHERE vykdomas prieš grupavimą, todėl negali naudoti agregato, tokio kaip COUNT.

3Sujungimai, normalizavimas ir transakcijos

Sujungimas (join) sujungia dviejų lentelių eilutes pagal sąlygą, paprastai išorinis raktas = pirminis raktas:

FROM customers c JOIN orders o ON o.customer_id = c.id
  • INNER JOIN (arba JOIN) palieka tik eilutes, turinčias atitikmenį abiejose lentelėse.
  • LEFT JOIN palieka kiekvieną kairiosios lentelės eilutę. Kur atitikmens nėra, dešiniosios lentelės stulpeliai yra NULL.
  • NULL reiškia, kad reikšmės nėra arba ji nežinoma. Tikrinkite su IS NULL, niekada su = NULL.

Normalizavimas suskaido lenteles, kad kiekvienas faktas būtų saugomas vieną kartą. Taip išvengiama to paties fakto atnaujinimo keliose vietose.

  • 1NF: kiekvienas langelis turi vieną atominę reikšmę, be pasikartojančių grupių.
  • 2NF: 1NF, ir kiekvienas ne rakto stulpelis priklauso nuo viso rakto, o ne nuo sudėtinio rakto dalies.
  • 3NF: 2NF, ir joks ne rakto stulpelis nepriklauso nuo kito ne rakto stulpelio.

Transakcija sugrupuoja sakinius į vieną vienetą. COMMIT padaro ją nuolatinę, o ROLLBACK ją atšaukia. Transakcijos laikosi ACID: atomiškumas (viskas arba nieko), nuoseklumas, izoliuotumas ir patvarumas.

Savikontrolė Klientas nepateikė jokių užsakymų. Kas nutinka tam klientui užklausoje customers LEFT JOIN orders?
  1. Klientas pasirodo kiekvieną kartą už kiekvieną lentelės užsakymą
  2. Klientas pasirodo vieną kartą, su NULL užsakymų stulpeliuose
  3. Klientas praleidžiamas rezultate
  4. Užklausa nepavyksta ir grąžina klaidą

Atsakymas: Klientas pasirodo vieną kartą, su NULL užsakymų stulpeliuose. LEFT JOIN palieka kiekvieną kairiosios lentelės eilutę ir trūkstamą dešinę pusę užpildo NULL. Kliento praleidimas yra tai, ką daro INNER JOIN.

4Metodas žingsnis po žingsnio

Norėdami parašyti užklausą arba išsiaiškinti, ką grąžina duota užklausa:

  1. Raskite lenteles, kuriose saugomi duomenys, ir kaip jos susietos raktais.
  2. Parašykite FROM su sujungimais. Rinkitės LEFT JOIN, kai eilutės be atitikmens turi likti.
  3. Pridėkite WHERE sąlygoms atskiroms eilutėms.
  4. Jei klausime yra „kiekvienam“ ar „pagal“, pridėkite GROUP BY ir agregatą.
  5. Pridėkite HAVING agregato sąlygoms, tada ORDER BY, jei svarbi tvarka.
  6. Patikrinkite rezultatą nedideliame pavyzdyje: išvardykite eilutes po kiekvienos sakinio dalies tokia tvarka, kokia jas vykdo duomenų bazė.

Teorijos klausimui pirmiausia įvardykite sąvoką (raktas, sujungimo tipas, normalinė forma, ACID savybė), tada pasirinkite variantą, atitinkantį jos apibrėžimą.

5Išspręstas pavyzdys

Sekite kiekvieną žingsnį. Pabandykite nuspėti kitą, prieš jį atidarydami.

Išspręstas pavyzdys

Lentelėje customers yra eilutės (1, Ana), (2, Ben) ir (3, Cas). Lentelėje orders yra eilutės (id, customer_id) = (10, 1), (11, 1), (12, 2) ir (13, 1). Ką grąžina ši užklausa? SELECT c.name, COUNT(o.id) FROM customers c LEFT JOIN orders o ON o.customer_id = c.id GROUP BY c.name

1

Vykdykite FROM ir sujungimą

Kiekvienas klientas suporuojamas su užsakymais, turinčiais jo id. Ana atitinka užsakymus 10, 11 ir 13. Benas atitinka užsakymą 12.

Cas užsakymų neturi. Kadangi tai LEFT JOIN, Cas lieka rezultate, o o.id yra NULL.

2

Išvardykite sujungtas eilutes

  • Ana, 10
  • Ana, 11
  • Ana, 13
  • Ben, 12
  • Cas, NULL

Tai 5 eilutės.

3

Sugrupuokite pagal name

GROUP BY c.name sudaro tris grupes: Ana su 3 eilutėmis, Ben su 1 eilute ir Cas su 1 eilute.

4

Suskaičiuokite pagal grupę

COUNT(o.id) skaičiuoja tik reikšmes, kurios nėra NULL. Ana gauna 3, o Ben gauna 1.

Cas turi vieną eilutę, bet jo o.id yra NULL, todėl Cas gauna 0.

5

Patikrinkite atsakymą

Ana, Ben ir Cas kartu turi 3 + 1 + 0 = 4 užsakymus, tiek pat, kiek eilučių lentelėje orders. Su COUNT(*) vietoj to Cas klaidingai gautų 1, nes COUNT(*) skaičiuoja pačią eilutę.

Atsakymas

Ana 3, Ben 1, Cas 0.

6Dažnos klaidos

  • Agregatas naudojamas WHERE. COUNT, SUM ar AVG sąlygos priklauso HAVING.
  • Rašoma = NULL. Bet koks palyginimas su NULL yra nežinomas; naudokite IS NULL arba IS NOT NULL.
  • Naudojamas INNER JOIN, kai eilutės be atitikmens turi likti. Naudokite LEFT JOIN.
  • Pamirštama sujungimo sąlyga. Be ON kiekviena eilutė suporuojama su kiekviena eilute (kryžminis sujungimas).
  • Parenkamas stulpelis, kurio nėra nei GROUP BY, nei agregate.
  • Painiojami DELETE (pašalina eilutes) ir DROP TABLE (pašalina visą lentelę).
  • UPDATE arba DELETE vykdomas be WHERE. Jis pakeičia kiekvieną lentelės eilutę.
Savikontrolė Lentelė turi 10 eilučių, o stulpelis col yra NULL kiekvienoje eilutėje. Ką grąžina SELECT COUNT(col)?
  1. 0
  2. 10
  3. 1
  4. NULL

Atsakymas: 0. COUNT(col) skaičiuoja tik reikšmes, kurios nėra NULL, todėl grąžina 0. COUNT(*) skaičiuoja eilutes ir grąžintų 10.

7Kaip atrodo egzamino uždaviniai

  • Lengvi: pagrindinės sąvokos ir faktai. Ką daro SELECT, WHERE, ORDER BY ar DELETE, pirminiai ir išoriniai raktai, ką reiškia NULL.
  • Vidutiniai: sąvokų taikymas. Tinkama užklausa užduočiai, WHERE ir HAVING skirtumas, vidiniai ir išoriniai sujungimai, normalinės formos, ACID.
  • Sunkūs: atvejai ir analizė. Vidinės užklausos, izoliacijos lygiai ir jų anomalijos, BCNF, langų funkcijos, indeksai ir užklausų našumas, SQL injekcija.

Kai duota užklausa, atsekite ją keliose eilutėse tokia tvarka: FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY. Dauguma spąstų paaiškėja per tris eilutes.

Mokykitės žingsnis po žingsnio programėlėjeMokykitės žingsnis po žingsnio programėlėje

Pavyzdiniai klausimai

Pavyzdys 1Lengvas

Ką UNION daro su dviejų SELECT užklausų rezultatais?

  1. ASujungia juos greta pagal raktą
  2. BPalieka tik abiejuose esančias eilutes
  3. CSujungia juos į vieną rezultatą ir pašalina pasikartojančias eilutes
  4. DPalieka tik tas eilutes, kurios yra pirmojoje, bet ne antrojoje užklausoje
Rodyti užuominas
  1. Abi užklausos turi turėti tiek pat suderinamų stulpelių.
  2. Du neteisingi atsakymai dabar išbraukti. Vienas iš likusių dviejų yra teisingas.
Rodyti atsakymą ir paaiškinimą

Kodėl tai yra atsakymas

UNION sudeda abiejų užklausų eilutes vieną po kitos ir pašalina pasikartojimus; UNION ALL pasikartojimus palieka.

Atsakymas

C · Sujungia juos į vieną rezultatą ir pašalina pasikartojančias eilutes
Pavyzdys 2Vidutinis

Ką grąžina SELECT SUM(amount) FROM orders, kai WHERE sąlyga neatitinka jokių eilučių?

  1. AKlaidą
  2. B0
  3. CNULL
  4. DTuščią eilutę
Rodyti užuominas
  1. Čia SUM skiriasi nuo COUNT.
  2. Du neteisingi atsakymai dabar išbraukti. Vienas iš likusių dviejų yra teisingas.
Rodyti atsakymą ir paaiškinimą

Kodėl tai yra atsakymas

SUM, AVG, MIN ir MAX tuščiai aibei grąžina NULL, o COUNT grąžina 0; COALESCE(SUM(amount), 0) vietoj to duoda 0.

Atsakymas

C · NULL
Pavyzdys 3Sunkus

Ką grąžina SELECT name, dept, AVG(salary) OVER (PARTITION BY dept) FROM emp?

  1. ATik darbuotojus, uždirbančius daugiau nei jų skyriaus vidurkis
  2. BKiekvieno darbuotojo eilutę kartu su jo skyriaus vidutiniu atlyginimu
  3. CKlaidą, nes name nėra GROUP BY sąraše
  4. DPo vieną eilutę kiekvienam skyriui su jo vidutiniu atlyginimu
Rodyti užuominas
  1. Lango funkcijos eilučių nesutraukia.
  2. Du neteisingi atsakymai dabar išbraukti. Vienas iš likusių dviejų yra teisingas.
Rodyti atsakymą ir paaiškinimą

Kodėl tai yra atsakymas

Kitaip nei GROUP BY, lango funkcija išlaiko kiekvieną įvesties eilutę ir prideda reikšmę, apskaičiuotą jos skaidinyje, šiuo atveju skyriuje.

Atsakymas

B · Kiekvieno darbuotojo eilutę kartu su jo skyriaus vidutiniu atlyginimu

Klausimai ir atsakymai

Duomenų bazės ir SQL: kas tai?

Parduotuvė gali turėti lentelę customers su stulpeliais id, name ir city bei lentelę orders su stulpeliais id, customer_id ir total.

Taip lentelės susiejamos: vienas klientas gali turėti daug užsakymų, bet kiekvienas užsakymas priklauso vienam klientui. Tai vienas su daug ryšys.

Duomenų bazės ir SQL: kaip išmokti žingsnis po žingsnio?
  1. Kas yra reliacinė duomenų bazė
  2. Duomenų skaitymas su SELECT
  3. Sujungimai, normalizavimas ir transakcijos
  4. Metodas žingsnis po žingsnio
  5. Išspręstas pavyzdys
  6. Dažnos klaidos
  7. Kaip atrodo egzamino uždaviniai
Duomenų bazės ir SQL: ką lavinsite?
  • Lengvas: pagrindinės sąvokos ir faktai
  • Vidutinis: sąvokų taikymas
  • Sunkus: atvejai ir analizė

Kiekvienas klausimas turi keturis atsakymų variantus, ir tik vienas yra teisingas. Strigote? Pirmiausia atverkite nedidelę užuominą, o visą paaiškinimą – tik kai jo prireiks.

Kaip vyksta praktika

  • Kiekvienas klausimas turi keturis atsakymų variantus, ir tik vienas yra teisingas.
  • Strigote? Pirmiausia atverkite nedidelę užuominą, o visą paaiškinimą – tik kai jo prireiks.
  • Jūsų pažanga, klaidos ir išsaugoti uždaviniai išlieka, todėl prieš egzaminą galite viską pakartoti.

Kursai su šia tema

Daugiau temų: Informatika

Spausdinamas užduočių lapas