20.2.2017

Taulujen määrittely ja muuttaminen

Taulujen perustaminen




Taulujen perustaminen




SQL-esimerkki: taulun luonti/1



Taulu luodaan CREATE TABLE –käskyllä:
CREATE TABLE Opiskelija (
OpiskelijaID INTEGER NOT NULL,
Etunimi VARCHAR(64),
Sukunimi VARCHAR(128),
Syntymaaika DATE,
Koulutusohjelma VARCHAR(64),
PRIMARY KEY (OpiskelijaID)
);


SQL-esimerkki: taulun luonti/2



CREATE TABLE Yritys (
YritysID SMALLINT NOT NULL,
YritysNimi VARCHAR(80),
Toimialakoodi CHAR(10),
YrLisaysPvm DATE DEFAULT Current_date,
CONSTRAINT pk_YritysID PRIMARY KEY(YritysID)
);


Viite-eheys



Viite-eheys REFERENCES-määreellä:
CONSTRAINT fk_Yritys_Toimialakoodi FOREIGN KEY
(Toimialakoodi)
REFERENCES TOIMIALA (Toimialakoodi)



Muutamia SQL-92-standardin tietotyyppejä



CHAR [(pit.), kiinteä, oletuspit. 1]

VARCHAR [(pit.), vaihtuvanmitt. merkkijono]
-- VARCHAR on sama kuin CHAR VARYING

NUMERIC [(koko pituus [,desimaaliosa])]
-- NUMERIC on sama kuin DECIMAL

INTEGER [kokonaisluku, pit. tuotekoht.]
-- Voidaan lyhentää INT

DATE [vuosi (0001-9999), kk ja päivä]

TIME [(pit.), tunti, minuutti ja sekuntti]

BLOB [SQL-99, binary large object]


SQL:2003 – muutokset aikaisempaan standardiin



Uudet tietotyypit:


Esim. Taulun rakenteen kopiointi:
CREATE TABLE Opettaja LIKE Opiskelija;

Taulun muutos: ALTER TABLE



Paljon tuotekohtaisia eroja Esim. sarakkeen lisäys:

ALTER TABLE henkilo
ADD COLUMN sex varchar(16) DEFAULT 'male'
AFTER snimi;


Sarakkeen muutos/poisto: ALTER/DROP COLUMN



Ks. oma tuotteesi, esim.
ALTER TABLE henkilo
DROP COLUMN sex;

Eheysvaatimukset





Rajoitteet eli pakotteet (constraints)




ALTER TABLE dept
ADD CONSTRAINT pk_deptno PRIMARY KEY (deptno),
ADD priority SMALLINT DEFAULT 1,
ADD CONSTRAINT chk_sukup CHECK (sukupuoli IN (‘M’,’N’)
);

Primary Key, Unique ja Foreign key



Primary Key



CONSTRAINT pk_sarake PRIMARY KEY (sarakenimi1 [,sarakenimi2])

Unique



CONSTRAINT sarakenimi UNIQUE

Foreign Key



CONSTRAINT fk_sarake FOREIGN KEY (sarakenimi)
REFERENCES vanhempi (perusvain)

Primary Key / MySQL



”A PRIMARY KEY is a unique index where all key columns must be defined as NOT NULL. If they are not explicitly declared as NOT NULL, MySQL declares them so implicitly ( and silently). A table can have only one PRIMARY KEY.”

http://dev.mysql.com/doc/refman/5.5/en/create-table.html#id879566


Viiteavaimen lisäys ja poistojen/päivitysten vyörytys




ALTER TABLE Puhelin
ADD CONSTRAINT fk_HenkiloID
FOREIGN KEY (HenkiloID)
REFERENCES Henkilo (HenkiloID)
ON DELETE CASCADE

Laskuri: automaattisesti kasvava sarake




Laskurin luonti, 2 standardivaihtoehtoa



Esimerkki 1


CREATE TABLE tuote (
tuoteID INTEGER GENERATED ALWAYS AS IDENTITY
-- ja lisäksi esim.
START WITH 100
INCREMENT 1
MINVALUE 100
NO MAXVALUE
NO CYCLE,
... )

Esimerkki 2



CREATE SEQUENCE tuoteID
AS INTEGER
START WITH 1
INCREMENT BY 1
MAXVALUE 100000
MINVALUE 1

Laskurin luonti: MySQL



Luonti:
CREATE TABLE car (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(64)
)
AUTO_INCREMENT = 50; -- eka arvo 50

Käyttö:
INSERT INTO car (name) VALUES ('Ford');
–--> id=50

SELECT LAST_INSERT_ID();

INSERT INTO car VALUES (100, 'Opel');
---> id=100, seuraava 101


Taulun poisto: DROP TABLE




Taulun poisto vs. tyhjäys



Taulun poisto:
DROP TABLE henkilo;

Taulun tyhjäys:
SET SQL_SAFE_UPDATES=0;
truncate henkilo;
SET SQL_SAFE_UPDATES=1;


DML (Data Manipulation Language)



Tietojen lisääminen



INSERT INTO tuote(tuoteNimi, hinta)
VALUES ('SQL-opas', 20);

INSERT INTO taulu1 SELECT s1, s2 FROM taulu2;


Tietojen muuttaminen eli päivittäminen



Olemassa olevien tietojen päivittäminen  / Syntaksi:
UPDATE taulu SET arvo = uusiarvo [WHERE ehto]

Esimerkki 1
UPDATE tuote SET hinta = 120
WHERE tuoteID = 123; -- tuotteen 123 hinnaksi 120

10 %:n hinnan lisäys:

UPDATE tuotteet SET hinta = hinta * 1.1

Päivitys, jossa 2 taulua on liitetty toisiinsa

UPDATE tuote SET varastosaldo = 10
FROM tuote INNER JOIN myyja
ON tuote.myyjaID = myyja.myyjaID;

Tietojen poistaminen



Rivien poistaminen taulusta  / Syntaksi:
DELETE {FROM} [taulun nimi] WHERE [ehto poistettaville riveille]:

Esimerkki 1:
DELETE FROM tuote WHERE tuoteNimi = 'auto'


Poisto alikyselyn avulla:
DELETE FROM asiakas WHERE asiakasID
NOT IN (SELECT asiakasID FROM TILAUS)