keskiviikko 10. lokakuuta 2007
613
Käsitellään tuota Liitos hommaa sitten vika luennolla
Alikyselyiden vastauksia
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
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
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
----
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
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
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
maanantai 17. syyskuuta 2007
Viikon 3 (kyselyt) vastaukset
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ä
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
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
#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
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
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
maanantai 3. syyskuuta 2007
Meaning of blogi
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
--------------------------------------------------------------------------------
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!