Tällä viikolla Kertaus SQL-asioista jatketaan SQL-tekstifuntio-harjoituksia tehdään pelifirman tietokannasta ER-malli MySQL:llä, tarkastellaan mallin toimivuutta ja korjataan, jos korjattavaa löytyy, tehdään parityöskentelynä jatketaan parityöskentelynä: katsotaan netistä peliohjelmasivua ja tutkitaan miten sivun sisältö voitaisiin tallentaa tietokantaan, parit saavat valita oman sivustonsa tai annan linkin Uusi SQL-aihe
Hakukyselyt: SELECT * FROM taulu WHERE sarake1 = Malli Nimi [WHERE sarake1 LIKE M% ] [WHERE BETWEEN ehto1 AND ehto2] [WHERE sarake1 IN/= (alikysely)] ORDER BY sarake1 ASC/DESC
Taulun luonti: CREATE TABLE henkilo ( tunnus CHAR(3), etunimi VARCHAR(20), sukunimi VARCHAR(20) osasto SMALLINT)
Lisäys-, päivitys- ja poistokyselyt INSERT INTO henkilo VALUES( MMe', Masa', Meikäläinen'); UPDATE henkilo SET etunimi='matti WHERE tunnus= MMe DELETE FROM henkilo WHERE etunimi= Matti'
Laskenta-funktiot: SUM, AVG, MIN, MAX, COUNT SELECT rating, AVG(rental_rate) FROM film GROUP BY rating
Loogiset operaattorit AND ja OR: SELECT title, length, rental_duration FROM film WHERE length=55 OR length=95 SELECT title, length, rental_duration FROM film WHERE length=55 AND rental_duration=4
Kyselyiden yhdistäminen, UNION / UNION ALL: SELECT city FROM offices UNION SELECT city FROM customers UNION yhdistely on aina distinct, UNION ALL tuo kaikki rivit Sisäkyselyt: Kyselyä voi käyttää toisen kyselyn lähteenä tai vaikka WHEREehdossa. WHERE-ehdossa eksakti vertailu (=) yhteen arvoon tai joukkoon (IN): SELECT COUNT(*) FROM (SELECT city FROM offices UNION ALL SELECT city FROM customers) AS temp SELECT * FROM customers WHERE city IN (SELECT city FROM offices WHERE country='uk')
Tekstinkäsittelyfunktioita: UPPER - muuttaa merkit isoiksi (uppercase) SELECT UPPER(customerName) FROM customers LOWER - muuttaa merkit pieniksi (lowercase) SELECT LOWER(customerName) FROM customers SELECT 'Teksti' - palauttaa kirjoitetun tekstin CONCAT - yhdistää tekstimuotoisia kenttiä tai kirjoitettua tekstiä SELECT CONCAT(firstName, ' ', lastname) FROM employees SUBSTRING - merkkijonon haku SELECT SUBSTRING(productname, 5, 8) FROM products RIGHT - hakee kentän oikeanpuoleisia merkkejä n kappaletta SELECT RIGHT(email,4) FROM employees LEFT - hakee kentän vasemmanpuoleisia merkkejä n kappaletta SELECT LEFT(productName,4) FROM products LENGTH - kentän pituus = merkkien määrä SELECT LENGTH(firstName) FROM employees
- Hae products-taulusta kaikki Ferrarit - Hae products-taulusta kaksi kenttää, joissa ensimmäisessä lukee 'Ferrari' ja toisessa 'Classic car'. Hyödynnä edellistä kyselyä. Tulokseen tulee kaksi riviä. - Edellisen tehtävän tulokseen tuli kaksi riviä. Millä yhdellä määreellä saat karsittua tuplarivin pois? - Muodosta yhteen kenttään teksti, jossa ensin tuotteen nimi, sitten kaksoispiste ja lopuksi tuotekuvaus - Sama kuin edellä, mutta muuta tuotenimi isoiksi kirjaimiksi ja tuotekuvaus pieniksi kirjaimiksi - Hae työntekijöiden etunimi ja toiseen kenttään etunimen pituus - Tee kahden kentän kysely, jossa ensimmäisessä lukee "Etunimi" toisessa on työntekijän etunimi - Tee sama kuin edellä, mutta tiedot yhteen kenttään ja välilyönti ennen nimeä - Muodosta "ohjelause peliin": "Valitse ajoneuvo:" ja sitten lista ajoneuvoista. (UNION-kysely) - Hae eri kenttiin työntekijöiden etunimen alkukirjain ja sukunimen alkukirjain - Hae työntekijöiden nimikirjaimet muodossa (esim.) "E.S." eli etunimen alkukirjain ja sukunimen alkukirjain - Hae tuotteen S10_2016 tuotekuvauksesta sana "logos
-- Hae products-taulusta kaikki Ferrarit SELECT * FROM products WHERE productname LIKE '%Ferrari% -- Hae products-taulusta kaksi kenttää, joissa ensimmäisessä lukee 'Ferrari' ja toisessa 'Classic car'. Hyödynnä edellistä kyselyä. Tulokseen tulee kaksi riviä. SELECT SUBSTRING(productname,5,8), LEFT(productLine, 11) FROM products WHERE productname LIKE '%Ferrari% -- Edellisen tehtävän tulokseen tuli kaksi riviä. Millä yhdellä määreellä saat karsittua tuplarivin pois? SELECT DISTINCT SUBSTRING(productname,5,8), LEFT(productLine, 11) FROM products WHERE productname LIKE '%Ferrari% -- Muodosta yhteen kenttään teksti, jossa ensin tuotteen nimi, sitten kaksoispiste ja lopuksi tuotekuvaus SELECT CONCAT(productname, ': ', productdescription) FROM products -- Sama kuin edellä, mutta muuta tuotenimi isoiksi kirjaimiksi ja tuotekuvaus pieniksi kirjaimiksi SELECT CONCAT(UPPER(productname), ': ', productdescription) FROM products -- Hae työntekijöiden etunimi ja toiseen kenttään etunimen pituus SELECT firstname, LENGTH(firstName)FROM employees -- Tee kahden kentän kysely, jossa ensimmäisessä lukee "Etunimi" toiesessa on työntekijän etunimi SELECT 'Etunimi', firstname FROM employees -- Tee sama kuin edellä, mutta tiedot yhteen kenttään ja välilyönti ennen nimeä SELECT 'Etunimi', firstname FROM employees -- Muodosta "ohjelause peliin": "Valitse ajoneuvo:" ja sitten lista ajoneuvoista. (UNION-kysely) SELECT 'Valitse ajoneuvo listalta:' AS Ohje UNION SELECT productname FROM products -- Hae eri kenttiin työntekijöiden etunimen alkukirjain ja sukunimen alkukirjain SELECT LEFT(firstName,1), LEFT(lastName,1) FROM employees -- Hae työntekijöiden nimikirjaimet muodossa (esim.) "E.S." eli etunimen alkukirjain ja sukunimen alkukirjain SELECT CONCAT(LEFT(firstName,1), '.', LEFT(lastName,1), '.') FROM employees -- Hae tuotteen S10_2016 tuotekuvauksesta sana "logos SELECT SUBSTRING(productdescription,21,5) FROM products WHERE productcode='s10_2016'
Nämä kyselyt world-tietokantaan 1) Hae kaupunkien nimet ja väkiluku, kun väkiluku ylittää 8 miljoonaa järjestettynä väkiluvun mukaan laskevasti. 2) Lisää edelliseen kenttä, jossa kaupungin nimi lyhennetään siten että yksi kirjain alusta ja kaksi lopusta. 3) Muodosta country-taulusta Euroopan maista tekstit: [Name] :ssa on [Population] asukasta. 4) Monta prosenttia suomalaisista puhuu äidinkielenään muuta kuin suomea? Tee kysely ainakin kahdella eri tavalla.
Nämä kyselyt world-tietokantaan 1) Hae kaupunkien nimet ja väkiluku, kun väkiluku ylittää 8 miljoonaa järjestettynä väkiluvun mukaan laskevasti. SELECT Name, Population FROM city WHERE population>8000000 ORDER BY population DESC; 2) Lisää edelliseen kenttä, jossa kaupungin nimi lyhennetään siten että yksi kirjain alusta ja kaksi lopusta. SELECT Name, CONCAT(LEFT(Name,1), RIGHT(Name,2)) AS Init, Population FROM city WHERE population>8000000 ORDER BY population DESC; 3) Muodosta country-taulusta Euroopan maista tekstit: [Name] :ssa on [Population] asukasta. SELECT CONCAT(Name, ':ssa on ',Population, ' asukasta.') AS Maan_asukkaat FROM country WHERE region LIKE '%Europe% 4) Monta prosenttia suomalaisista puhuu äidinkielenään muuta kuin suomea? Tee kysely ainakin kahdella eri tavalla. SELECT SUM(Percentage) FROM countrylanguage WHERE countrycode='fin AND language<>'finnish'
INNER JOIN LEFT JOIN RIGHT JOIN OUTER JOIN
Inner join, kaikki kaupungit ja niiden sijaintimaat: SELECT city.city, country.country FROM city INNER JOIN country ON country.country_id=city.country_id Left join, varastot ja kaikki osoite-taulun osoitteet vaikkei osoitteessa olisikaan varastoa: SELECT store.store_id, address.address FROM address LEFT JOIN store ON address.address_id=store.address_id Right join, varasto-taulun kaikki rivit ja osoite-taulusta vain varastoihin liittyvät osoitteet: SELECT store.store_id, address.address FROM address RIGHT JOIN store ON address.address_id=store.address_id
Monen taulun liitos: SELECT actor.last_name, film.title FROM actor INNER JOIN film_actor ON film_actor.actor_id=actor.actor_id INNER JOIN film ON film.film_id=film_actor.film_id Taulunimien aliasten käyttö: SELECT k.city, m.country FROM city k INNER JOIN country m ON m.country_id=k.country_id
Käytetään sakila-tietokantaa 1) Hae asiakkaiden nimet ja osoitteet 2) Hae elokuvan nimi ja sen kieli 3) Hae nimet työntekijöille (staff-taulu), jotka ovat vuokranneet (rental-taulu) elokuvia
Käytetään sakila-tietokantaa 1) Hae asiakkaiden nimet ja osoitteet SELECT c.first_name, c.last_name, a.address FROM customer c INNER JOIN address a ON a.address_id=c.address_id 2) Hae elokuvan nimi ja sen kieli SELECT f.title, l.name FROM film f INNER JOIN language l ON l.language_id=f.language_id 3) Hae nimet työntekijöille (staff-taulu), jotka ovat vuokranneet (rentaltaulu) elokuvia SELECT DISTINCT s.first_name, s.last_name FROM staff s INNER JOIN rental r ON s.staff_id=r.staff_id
JOIN-harjoituksia, käytetään world-tietokantaa, tehtävien vastaukset SQL-kyselyinä, käytetään JOIN-kyselyjä vaikka kyselyt voisi tehdä toisinkin. 1) Hae maan nimi ja toiseen sarakkeeseen maassa puhuttava kieli 2) Tee kysely, jossa näkyy WHERE-ehdossa määrätyn maan kaupungit 3a) Hae kaikki maiden nimet ja toiseen kenttään tietokannasta löytyvät maan kaupungit. Vihje: pitää käyttää LEFT tai RIGHT JOINia 3b) Miksi pitää käyttää LEFT tai RIGHT JOINia? 4) Hae kaupungit, joiden kielivalikoimaan kuuluu ruotsi (kolmen taulun liitos)