Opi SQL:ää – opas, jossa on koodiesimerkkejä
SQL:n syntaksi perustuu relaatioalgebraan, mikä erottaa tämän ohjelmointikielen muista kielistä. Syntaksin opettelu käytännön esimerkkien avulla voi auttaa sinua oppimaan SQL:ää tehokkaasti.
Mikä on SQL-syntaksi?
Ohjelmoinnissa syntaksi tarkoittaa sitä, miten ohjelmointikieli kirjoitetaan. Syntaksi määrittelee koodin perusrakenteet ja niiden yhdistämistavat. Syntaksin ymmärtäminen on ohjelmointikielillä koodin lukemisen ja kirjoittamisen perusedellytys.
SQL:n tärkeimmät syntaksirakenteet ovat SQL-lauseet, jotka voivat sisältää myös lauseosia. Molempia kutsutaan yleisesti ”SQL-komennoiksi”, vaikka teknisesti katsoen tämä ei olekaan täysin tarkka ilmaisu. Nämä eivät kuitenkaan ole ainoat SQL-syntaksirakenteet. Alla olevasta taulukosta löydät yleiskatsauksen SQL-syntaksirakenteista.
| SQL-termi | Selitys | Esimerkki |
|---|---|---|
| Lause | Käskee DBMS:ää suorittamaan toiminnon; päättyy puolipisteeseen | CREATE TABLE People;
|
| Lause | Muokkaa lausetta; voi esiintyä vain lauseiden sisällä | WHERE, HAVING
|
| Lauseke | Palauttaa arvon arvioitaessa | 6 * 7
|
| Tunniste | Tietokantaobjektin, muuttujan tai proseduurin nimi; voi olla määritelty tai määrittelemätön | dbname.tablename / tablename
|
| Predikaatti | Lauseke, jonka arvo on TRUE, FALSE tai UNKNOWN
|
Age < 42
|
| Kysely | Erityinen lause; palauttaa löydetyt tietueet | SELECT Name FROM People WHERE Age < 42;
|
| Funktio | Käsittelee yhtä tai useampaa arvoa; luo yleensä uuden arvon | UPPER('text') -- returns 'TEXT'
|
| Kommentti | Käytetään SQL-koodin kommentointiin; RDBMS ohittaa sen | -- Comment up to end of line / /*multiline comment if necessary*/
|
SQL-komennot, kuten SELECT ja CREATE TABLE, kirjoitetaan yleensä isoilla alkukirjaimilla. SQL ei kuitenkaan erota isoja ja pieniä kirjaimia. Komentojen kirjoittaminen isoilla alkukirjaimilla on vain yleisesti käytetty käytäntö.
Miten SQL-koodi suoritetaan?
SQL-koodi on lähdekoodina tekstitiedostoissa. Koodi herää eloon vasta sopivassa suoritusympäristössä. SQL-tulkki lukee lähdekoodin ja muuntaa sen RDBMS-järjestelmän toiminnoiksi. Tässä on kaksi peruslähestymistapaa:
1. Suorita SQL-koodiinteraktiivisesti Tässä menetelmässä SQL-koodi syötetään tai kopioidaan suoraan tekstiruutuun. SQL-koodi suoritetaan, ja tulos näytetään. Voit muokata koodia ja suorittaa sen uudelleen. Koodin muokkaamisen ja tulosten näyttämisen nopea vuorottelu tekee tästä menetelmästä parhaiten sopivan monimutkaisten kyselyjen oppimiseen ja luomiseen. 2. Suorita SQL-koodi skriptinäTässä menetelmässä koko SQL-koodia sisältävä lähdekooditiedosto suoritetaan rivi riviltä. Tarvittaessa palautetta lähetetään käyttäjälle vasta suorituksen lopussa. Tämä menetelmä sopii parhaiten prosessien automatisointiin ja MySQL-tietokantavarmuuskopioiden tuontiin MySQL-dump-komennolla.
| Käyttöliittymä | Kuvaus | Esimerkkejä |
|---|---|---|
| Komentoriviliitäntä (CLI) | Tekstipohjainen käyttöliittymä; SQL-koodi syötetään ja suoritetaan, tulos näytetään tekstinä | mysql, psql, mysqlsh |
| Graafinen käyttöliittymä (GUI) | SQL-koodi syötetään teksti-ikkunaan ja/tai generoidaan käyttäjän toimien perusteella; SQL-koodi suoritetaan, tulos näytetään taulukoina | phpMyAdmin, MySQL Workbench, HeidiSQL |
| Sovellusohjelmointirajapinta (API) | Mahdollistaa suoran viestinnän RDBMS:n kanssa; SQL-koodi sisällytetään ja suoritetaan merkkijonona ohjelmointikielen koodissa; tulokset ovat käytettävissä tietorakenteina jatkokäyttöä varten | PHP Data Objects (PDO), Connector/J (Java), Connector/Python, C API |
Tuotehallintajärjestelmän määrittäminen SQL:n avulla
Helpoin tapa oppia ohjelmointikieltä on kirjoittaa ja suorittaa koodia itse. Tässä opetusohjelmassa luomme pienen tietokannan ja teemme siihen kyselyjä. Tätä varten käytämme verkkosivuston sql.js tarjoamaa online-SQL-tulkkia. Voit seurata opetusohjelmaa siirtymällä sivustolle ja korvaamalla sinne jo syötetyn SQL-koodin esimerkkien koodilla. Suorita koodi pala palalta, jotta tulokset tulevat näkyviin.
Luo SQL-tietokanta
Tässä esimerkissä rakennamme kaupallisen tuotanhallintajärjestelmän eräälle kaupalle. Vaatimukset ovat seuraavat:
- Tuotteita on useita, ja jokaisesta tuotteesta on varastossa tietty määrä.
- Asiakaskuntaamme kuuluu monia asiakkaita.
- Asiakkaiden tekemät tilaukset voivat sisältää useita tuotteita.
- Jokaisesta tilauksesta tallennamme tilauspäivän ja tilaajan tiedot sekä tilatut tuotteet ja tilausmäärän.
Nämä vaatimukset muunnetaan abstraktiksi kuvauksiksi ja sen jälkeen SQL-koodiksi:
- Luo malli
- Määritä skeema
- Syötä tietueet
- Määritä kyselyt
Luo malli entiteeteistä ja suhteista
Ensimmäinen vaihe toteutetaan paperilla tai erityisillä mallinnustyökaluilla. Keräämme tietoa mallinnettavasta järjestelmästä, jotta voimme määrittää entiteetit ja suhteet. Tämä vaihe toteutetaan usein entiteetti-suhdekaaviona (ER-kaaviona).
Mitä entiteettejä on olemassa ja miten ne liittyvät toisiinsa? Entiteetit ovat asioiden luokkia. Tuotehallintajärjestelmän esimerkissämme entiteettejä ovat tuotteet, asiakkaat ja tilaukset. Jokaista entiteettiä varten tarvitaan oma taulukko. Relaatiomallin erityispiirteiden vuoksi suhteiden mallintamiseksi lisätään uusia taulukoita. Tämän ymmärtäminen ja asianmukainen toteuttaminen vaatii kokemusta.
Keskeinen kysymys, johon on löydettävä vastaus, on se, miten entiteetit liittyvät toisiinsa. Tässä yhteydessä on otettava huomioon suhteen molemmat suunnat ja tehtävä ero yksikön ja monikon välillä. Seuraavassa on esimerkki, jossa käytetään autoja ja auton omistajia:
- Yksi omistaja voi omistaa useita autoja.
- Auto voi kuulua vain yhdelle omistajalle.
Näiden kahden tahon välillä voidaan havaitakolme mahdollista suhdemallia:
| Suhde | Entiteetit | Vasemmalta | Oikealta |
|---|---|---|---|
| 1:1-suhde | Auto:vilkku | Autolla voi olla vain yksi vilkku. | Yksi vilkku voi kuulua vain yhteen autoon. |
| 1:n-suhde | Omistaja:auto | Omistajalla voi olla useita autoja. | Auto voi kuulua vain yhdelle omistajalle. |
| m:n-suhde | Auto:katu | Auto voi ajaa useilla teillä. | Useat autot voivat ajaa yhdellä tiellä. |
Tuotteiden käyttöönotto
Aluksi luomme tuotetietokannan. Tätä varten meidän on määriteltävä tietomalli, syötettävä tietueita ja suoritettava muutamia yksinkertaisia kyselyjä testausta varten.
Määritä skeema
Tietokantataulukoiden määrittämisen keskeinen SQL-komento on CREATE TABLE. Tämän komennon avulla voit luoda taulukon, jolle annetaan nimi, ja määrittää sarakkeiden ominaisuudet. Samalla määritellään tietotyypit ja tarvittaessa tallennettavia arvoja koskevat rajoitukset:
DROP TABLE IF EXISTS Products;
CREATE TABLE Products ( product_id int, product_name text, stocked int, price int );sqlKäytämme DROP TABLE IF EXISTS -lauseita ennen taulukon määrittelyä. Tämä poistaa mahdollisen olemassa olevan taulukon ja mahdollistaa saman SQL-koodin suorittamisen useita kertoja ilman, että siitä aiheutuu virheilmoituksia.
Lisää tietokokonaisuuksia
Luomme nyt muutaman testitietueen. Käytämme kenttien täyttämiseen SQL-komentoa INSERT INTO sekä VALUES-funktiota:
INSERT INTO Products VALUES (10, 'ABC Product', 74, 1050);
INSERT INTO Products VALUES (20, 'KLM Product', 23, 750);
INSERT INTO Products VALUES (30, 'XYZ Product', 104, 350);sqlMääritä kyselyt
Tarkistaaksemme Products-taulukon tilan kirjoitamme yksinkertaisen kyselyn. Käytämme SELECT FROM -komentoa ja tulostamme koko taulukon:
SELECT * FROM Products;sqlNyt kirjoitamme hieman monimutkaisemman kyselyn, joka laskee varastossamme olevien tuotteiden kokonaisarvon:
SELECT product_name AS 'Name', (stocked * price) AS 'Value' FROM Products;sqlLisää taulukoita
Seuraavaksi luomme loput tarvitsemamme taulukot. Toimimme samalla tavalla kuin Tuotteet-taulukon kohdalla. Ensin luomme Asiakkaat-taulukon:
DROP TABLE IF EXISTS Customers;
CREATE TABLE Customers ( customer_id int, customer_name text, contact text );sqlSitten syötämme kahden esimerkkiasiakkaan tiedot:
INSERT INTO Customers VALUES (100, 'EDC Customer', 'ED@example.com');
INSERT INTO Customers VALUES (200, 'WVU Customer', 'WV@example.com');sqlTarkistaaksemme, toimiiko se, tulostamme asiakastiedoston:
SELECT * FROM Customers;sqlSeuraavaksi luodaan Orders-taulukko:
DROP TABLE IF EXISTS Orders;
CREATE TABLE Orders ( order_id int, customer_id int, order_date text );sqlSyötämme nyt kolme esimerkkitilausta. Ensimmäiseksi arvoksi määritämme tunnisteen (ID) ensisijaiseksi avaimeksi. Toinen arvo on olemassa olevien asiakastunnisteiden, jotka toimivat viiteavaimina. Sitten tallennamme tilauspäivän:
INSERT INTO Orders VALUES (1000, 100, '2022-05-03');
INSERT INTO Orders VALUES (1001, 100, '2022-05-04');
INSERT INTO Orders VALUES (1002, 200, '2022-05-08');sqlTestaamme sitä antamalla seuraavat komennot:
SELECT * FROM Orders;sqlLopuksi tarvitsemme taulukon, joka sisältää tilauksen tuotteet ja niiden määrät. Kyseessä on m:n-suhde, koska yksi tilaus voi sisältää useita tuotteita ja yksi tuote voi esiintyä useissa tilauksissa. Määritellään taulukko, joka sisältää tilausten ja tuotteiden tunnisteet vierasavaimina:
DROP TABLE IF EXISTS OrderItems;
CREATE TABLE OrderItems ( orderitem_id int, order_id int, product_id int, count int );sqlSyötämme nyt muutaman tilatun tuotteen. Valitsemme tilausten ja tuotteiden tunnisteet siten, että yksi tilaus sisältää kaksi tuotetta ja toinen tilaus vain yhden tuotteen:
INSERT INTO OrderItems VALUES (10001, 1000, 10, 3);
INSERT INTO OrderItems VALUES (10002, 1000, 20, 2);
INSERT INTO OrderItems VALUES (10003, 1002, 30, 12);sqlTarkistaaksemme tämän, toimitamme tilatut tuotteet:
SELECT * FROM OrderItems;sqlKirjoita monimutkaisia kyselyitä
Jos olet suorittanut kaikki tähän mennessä esitetyt koodinpätkät, sinun pitäisi pystyä ymmärtämään testitietokantamme rakenne. Siirrytään nyt monimutkaisempiin kyselyihin, jotka osoittavat SQL:n tehokkuuden. Kirjoitetaan ensin kysely, joka yhdistää useisiin taulukoihin hajautetut tiedot. Käytämme SQL JOIN -komentoa yhdistämään taulukot, jotka sisältävät asiakastiedot ja tilaukset. Samalla nimeämme sarakkeet ja asetamme vastaavan asiakastunnuksen JOIN-ehdoksi. Muista, että käytämme määriteltyjä tunnisteita erottamaan kahden taulukon sarakkeet toisistaan:
SELECT customers.customer_name as 'Customer', customers.customer_id, orders.order_id, orders.order_date AS 'Date' FROM Customers JOIN Orders ON Orders.customer_id = Customers.customer_id ORDER BY Customers.customer_id;sqlNyt laskemme tilattujen tuotteiden kokonaiskustannukset toisen JOIN-komennon avulla:
SELECT OrderItems.order_id, OrderItems.orderitem_id AS 'Order Item', Products.product_name AS 'Product', Products.price AS 'Unit Price', OrderItems.count AS 'Count', (OrderItems.count * Products.price) AS 'Total' FROM OrderItems JOIN Products ON OrderItems.product_id = Products.product_id;sql