keskiviikko 10. lokakuuta 2007

613

Vika tehtävässä riittää mainiosti UNIONiin perustuva ratkaisu.

Käsitellään tuota Liitos hommaa sitten vika luennolla

Alikyselyiden vastauksia

601: 3 kpl
602: 1 kpl
603: 132 kpl
604: 96 kpl
605: sama kuin 603
606: 397 kpl
607: 430 (Käytä DATEDIFF!)
608: 22 kpl
609: 126/127 kpl (riippuu onko ehtosi Invoice vai Soldblock -tauluun)
610: 12/13 kpl (riippuu onko ehtosi Invoice vai Soldblock -tauluun)
611: 21 kpl
612: 1 rivi 3 saraketta
613: 46 kpl

torstai 4. lokakuuta 2007

Vuosineljännes

Myytyjen blokkien vuosineljänneksen saat selville CASE -lauseella:

CASE
WHEN MONTH(datesold) IN(1,2,3) THEN '1. neljännes'

WHEN MONTH(datesold) IN(4,5,6) THEN '2. neljännes'
WHEN MONTH(datesold) IN(7,8,9) THEN '3. neljännes'
ELSE '4. neljännes'
END AS VuoNel

Mallitulokset

Moi!

Käsitykseni mukaan tämän viikon tehtävistä ei ole tarvetta julkaista mallituloksia koska useassa kohtaa tehtävämäärittelyssä on vastaus jo kerrottu!

torstai 27. syyskuuta 2007

Kyselyt 207 ja 208

Jussi Loiri kyseli miksi 207 - 208 antaa eri vastauksia jos ehdossa käytetään Invoice tai Soldblock -taulua:
----
Itse asiassa ko. liiketoiminnassa on mahdollista sellainen tilanne, jossa ensin myydään vaikkapa 5 tuotetta. Tehdään lasku joka jää vielä avoimeksi (eli siis ei ole lähetty asiakkaalle). Kuluu viikko ja asiakas ostaa vielä 1:n blokin, joka lisätään samalle laskulle mutta myyntipäivämäärä on eri kuin muilla blokeilla. Tämä ei kyllä ole sitten yleinen toimintamalli mutta tuolla tavalla sen olen aikoinani koodannut!

keskiviikko 26. syyskuuta 2007

Liitokset

201 -- 1 kpl, ASKOLAN GRANIT
202 -- 47 kpl
203 -- 245 kpl
204 -- 9 kpl
205 -- 36 kpl
206 -- 8 kpl
207 -- 76
208 -- 70
209 -- 446
210 -- 269
211 -- 85
212 -- 114
213 -- 1964
214 -- 216 - 1 kpl CSJ ja Venäjältähän se löytyy

torstai 20. syyskuuta 2007

125

125 tehtävässä pyydetään käyttämään CASE tai IF

Idea siis:

SELECT kentta1, kentta2,
CASE
WHEN kentta3 > 999 THEN 'XXXX'
WHEN kentta3 > 999 THEN 'YYYY'
WHEN kentta3 > 999 THEN 'ZZZZ'
ELSE 'HHHH'
END AS KentanNimi
FROM TAULU
WHERE ehdot

126

Viimeinen koodi ratkeaa jollakin CONCAT -funktiolla

maanantai 17. syyskuuta 2007

Viikon 3 (kyselyt) vastaukset

101: 0 kpl
102: 96 kpl
103: 111 kpl
104: 386 kpl
105: 102 kpl
106: 59 kpl
107: 30 kpl
108: 41 kpl
109: 49 kpl
110: 7 kpl ( - tämä on korjattu tulos -)
111: 9 kpl ( - tämä on korjattu tulos -)
112: 13 kpl
113: 17 kpl
114: 22 kpl
115: 208 kpl
116: 12 kpl
117: 56 kpl
118: 90 kpl
119: 11 kpl
120: 5 kpl
121: 25 kpl
122: 3 kpl
123: 36 kpl
124: 45 kpl
125: 96 kpl
126: 1843 kpl

Tärkeää kyselyistä

phpMyAdminissa on bugi! Jos nimittäin päätät kyselyn puolipisteeseen et näe kyselyn tulosta eli rivien lukumäärää!

Jos sen sijaan jätät puolipisteen pois, tulostaa phpMyAdmin siististi löytämänsä rivit - valikkorivin alle:

Näkyvillä rivit 0 - 29 (96 yhteensä, kysely kesti 0.0049 sek.)

maanantai 10. syyskuuta 2007

Poisto / muutos säännöt

Viite-avaimen (FOREIGN KEY) oletusarvo poistosäännölle on:
ON DELETE RESTRICT
- estää 1-pään rivin poiston jos M-päässä riviin viittauksia

Toinen vaihtoehto
ON DELETE CASCADE
- poistaa 1-pään rivin ja vastaavat rivit myös M -päästä

Kolmas vaihtoehto:
ON DELETE SET NULL
- poistaa 1-pään taulun rivin ja 'tyhjentää' eli asettaa viiteavaimen arvoksi NULL

Samoin ON UPDATE -kohdalla eli sallitaanko (CASCADE) vai kielletäänkö 1-pään avaimen muuttaminen vai merkitäänkö se tyhjäksi arvoksi!

Linkki: MySQL

Viiteavain virhe poistossa

Kun olet syöttänyt Tuoterivi -tauluun (M-pää) rivejä ja yrität poistaa Tuoteryhmä taulusta (1-pää) vastaavaa riviä, saat aikaiseksi seuraavan virheilmoituksen:

#1451 - Cannot delete a parent row: a foreign key constraint fails (`KiukaJu/Tuote`, CONSTRAINT `Tuote_ibfk_1` FOREIGN KEY (`tuoteryhmaID`) REFERENCES `Tuoteryhma` (`tuoteryhmaID`))


Esimerkiksi: DELETE FROM Tuoteryhma WHERE tuoteryhmaID = '11111';

Eli 1 -pään taulusta (parent) et voi poistaa sellaista riviä (tuoteryhmaID = 11111), jolle on syötetty tietoa Monta -pään tauluuun.

Tämä johtuu siitä että tietokannan Tuote -taulu luotiin:

FOREIGN KEY (tuoteryhmaID) REFERENCES Tuoteryhma ON DELETE RESTRICT -poistosäännöllä.
Jos jätät ON DELETE -määrityksen pois niin RESTRICT eli poiston esto on oletusarvo!


Viiteavain virhe lisäyksessä

Jos yrität syöttää sellaista tuotetta, jonka viite-avainta (FOREIGN KEY) ei löydy Tuoteryhma -taulusta saat aikaiseksi virhetilanteen:

Esimerkiksi:
INSERT INTO Tuote(tuoteID,nimi,tuoteryhmaID,yksikkohinta,pakkauskoko,toimitustapa)VALUES ('A1000','Astianpesukone A','99999',100.60,'lava','kotiinkuljetus');

Virheilmoitus:

#1452 - Cannot add a child row: a foreign key constraint fails (`KiukaJu/Tuote`, CONSTRAINT `Tuote_ibfk_1` FOREIGN KEY (`tuoteryhmaID`) REFERENCES `Tuoteryhma` (`tuoteryhmaID`))

Eli et voi lisätä Tuote -tauluun sellaista viite-avaimen arvoa (99999), jota ei löydy 1 -pään taulun perusavaimesta!

Perusavain virhe

Jos yrität syöttää Tuoteryhma -tauluun sellaista koodia (tuoteryhmaID) joka on jo olemassa niin saat aikaiseksi perusavain virheen:

INSERT INTO Tuoteryhma (tuoteryhmaID, nimi) VALUES ('11111','Pakastimet');

Virheilmoitus: #1062 - Duplicate entry '11111' for key 1

Luentokoodit viikko 2

/* 1 -pään taulun perustaminen */
CREATE TABLE Tuoteryhma

(
tuoteryhmaID CHAR(5) PRIMARY KEY,
nimi VARCHAR(50) NOT NULL
)
Type=InnoDB;

/* Tämän jälkeen voit perustaa Monta -pään taulun eli tuotteen: */
CREATE TABLE Tuote

(tuoteID CHAR(5) NOT NULL PRIMARY KEY,
nimi VARCHAR(60) NOT NULL,
tuoteryhmaID CHAR(5),
yksikkohinta DECIMAL(5,2),
pakkauskoko VARCHAR(10),
toimitustapa VARCHAR(30),
FOREIGN KEY (tuoteryhmaID) REFERENCES Tuoteryhma(tuoteryhmaID) ON DELETE RESTRICT ON UPDATE RESTRICT)Type=InnoDB;

/* Seuraavassa lisätään 1 -pään tauluun rivit */
INSERT INTO Tuoteryhma (tuoteryhmaID,nimi)
VALUES ('11111','Ykkösryhmä'),
('22222','kakkosryhmä'),
('33333','kolmasryhmä'),
('44444','neljäsryhmä'),
('55555','viidesryhmä');

/* Ja sitten lisätään M -pään tauluun rivit */
INSERT INTO Tuote(tuoteID,nimi,tuoteryhmaID,yksikkohinta,pakkauskoko,toimitustapa)
VALUES ('A1000','Astianpesukone A','11111',100.60,'lava','kotiinkuljetus');

INSERT INTO Tuote(tuoteID,nimi,tuoteryhmaID,yksikkohinta,pakkauskoko,toimitustapa)
VALUES('A2000','Astianpesukone B','11111',100.60,'lava','kotiinkuljetus');

INSERT INTO Tuote(tuoteID,nimi,tuoteryhmaID,yksikkohinta,pakkauskoko,toimitustapa)
VALUES('A3000','Astianpesukone C','11111',100.60,'lava','kotiinkuljetus');

INSERT INTO Tuote(tuoteID,nimi,tuoteryhmaID,yksikkohinta,pakkauskoko,toimitustapa)
VALUES('B1000','Uuni A','22222',100.60,'lava','kotiinkuljetus');

INSERT INTO Tuote(tuoteID,nimi,tuoteryhmaID,yksikkohinta,pakkauskoko,toimitustapa)
VALUES('B2000','Uuni B','22222',100.60,'lava','kotiinkuljetus');

Lisäyksen yhteydessä tulee huolehtia siitä, että viiteavaimella tuoteryhmaID:lla on kelvollinen arvo, joka löytyy 1-pään taulusta!

Manuaalilinkit: INSERT

Syntaksista

Kaikissa ohjelmointikielissä kielen rakenne kuvataan syntaksin avulla:CREATE TABLE -komennon syntaksi:

http://dev.mysql.com/doc/refman/5.0/en/create-table.html
Merkkien syntaksi:
-------------------------------------------------------------
[ ] --- valinnainen osio eli voit siis jättää sulkujen sisällä olevan määritteen pois:
Syntaksi: [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)

Esimerkki perusavaimen määrittelystä (jossa CONSTRAINT on valinnainen):


CREATE TABLE Taulu

( kentta1 CHAR(3),
...,
PRIMARY KEY (kentta1)

);
- tai
CREATE TABLE Taulu
( kentta1 CHAR(3),
...,
CONSTRAINT pkey PRIMARY KEY,...
);
Eli perusavaimen määrittelyn yhteydessä voit jättää perusavaimen nimeämättä!


-------------------------------------------------------------
(pystyviiva) merkitsee tai eli sinun tulee valita jokin tai jompikumpi vaihtoehdoista
Syntaksi:

data_type: BIT[(length)]
TINYINT[(length)] [UNSIGNED] [ZEROFILL]
SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]


Esimerkiksi: sinun tulee siis määritellä kentälle jokin tietotyyppi
-------------------------------------------------------------
{} eli valitse vaihtoehdoista jokin
Syntaksi:
table_option:
{ENGINE TYPE} [=] engine_name
Esimerkiksi:
CREATE TABLE Taulu ( ...)
TYPE = InnoDB;
- tai
CREATE TABLE Taulu ( ...)
ENGINE InnoDB
-------------------------------------------------------------
... edellisen osan toisto
Syntaksi:
CREATE TABLE tbl_name (create_definition,...)

Esimerkiksi: ko. syntaksi kertoo että voit tauluun määritellä useamman kentän:

CREATE TABLE Taulu
( kentta1 CHAR(3),
kentta2 VARCHAR(35),
kentta3 INT,
PRIMARY KEY (kentta1)
);

torstai 6. syyskuuta 2007

Kommentointi

SQL :ssä voit kommentoida koodisi normitavalla eli

/* tekstiä */

maanantai 3. syyskuuta 2007

Meaning of blogi

Tätä blogia käytetään Etelä-Karjalan Ammattikorkeakoulun Relaatiotietokannat -kurssilla syksyllä 2007. Julkaisen täällä maanantaiset luennot ja koodinpätkät sekä vinkkejä tehtävän suoritusta varten. Kurssilaisilla on mahdollisuus esittää tätä kautta SQL:n liittyviä lisäkysymyksiä.

Kouluttaja:
Juha Kiukas
040 5510711
juha.kiukas@ekamo.fi

Osanottajat:
Etelä-Karjalan Ammattikorkeakoulun ATITE2S -ryhmä

Blogi on avoin mutta sitä voi lukea / sinne voi kirjoittaa vain yo. immeiset!

Tietokannan luonti

Maanantain 3.9 luennolla kävimme läpi tietokannan luonnin SQL -kielellä. Ohessa koodi, johon tutustuimme:

--------------------------------------------------------------------------------
Ajattelutyötä:

Kun aloitat tietokannan toteutuksen koodaamalla SQL -kielellä taulut, niin muista aloittaa tietomallin Yksi -päästä. Eli ennen Tuote -taulun perustamista tulee koodata Tuoteryhma -taulu. Ajattele asia seuraavasti: kun syötät Tuote -tauluun tietoa niin tuoteryhmä koodi tarkistetaan (eli sen tulee siis olla jo olemassa) Tuoteryhma -taulusta.

Tuoteryhmä on siis 1 -pään taulu ja Tuote M(onta) -pään taulu

Tietomallissa: Tuoteryhmä ----->> Tuote tai ääretön merkki.
----------------------------------------------------------------------------------
Vaihe1:

Yksi -pään tauluun tulee siis määritellä perusavain (PRIMARY KEY):

CREATE TABLE Tuoteryhma
(
tuoteryhmaID INT PRIMARY KEY,
nimi VARCHAR(50) NOT NULL
)
Type=InnoDB;
----------------------------------------------------------------------------------
Vaihe 2:

Tämän jälkeen voit perustaa Monta -pään taulun eli tuotteen:

CREATE TABLE Tuote
(
tuoteID VARCHAR(20) NOT NULL PRIMARY KEY,
nimi VARCHAR(255) NOT NULL,
tuoteryhmaID INT,
yksikkohinta DECIMAL(8,2) NOT NULL,
pakkauskoko VARCHAR(10),
toimitustapa VARCHAR(30),
FOREIGN KEY (tuoteryhmaID) REFERENCES Tuoteryhma(tuoteryhmaID)
)
Type=InnoDB;

Huom1:
FOREIGN KEY -määre luo automaattisesti indeksin (voit tarkistaa sen phpMyAdminista) ja linkittää taulut toisiinsa!

Huom 2:
Type=InnoDB : MySQL vaatii ko. taulun tyypin (tietokantamoottorin), jotta linkitys (yhteys) taulun välillä toimii!

Kuka olen

Olen 47 vuotias LuK Lappeenrannasta.
Päätyönäni opetan Ammattiopiston puolella tietotekniikkaa mutta olen pitänyt vuodesta 1997 asti Tekniikan Ammattikorkeakoulun puolella SQL-kursseja.
Suhteeni SQL:ään on hyvin pitkäkestoinen: ensimmäinen tutustuminen aiheeseen oli vuonna 1985 hierarkisilla tietokannoilla. Relaatiomalliin törmäsin ensimmäisen kerran 90 -luvun alussa. Siitä lähtien olen asioita opettanut ja myös tietokantoja käytännön elämässä laatinut ja toteuttanut.Tämänkin kurssin esimerkit tulevat käytännön elämästi eli kyseiset tietokannat ovat todellakin toiminnassa ko. yrityksissä.
Tervetuloa kurssille!