‹header›
‹date/time›
Click to edit Master text styles
Second level
Third level
Fourth level
Fifth level
‹footer›
‹#›
Lisätty asioita Ari Hovin kirjasta
Esim. SQL Serverin SQL-versio on nimeltään Transact-SQL
http://en.wikipedia.org/wiki/SQL
http://www.xmission.com/~comphope/jargon/s/sql.htm
Kommenteissa näkyy on usein SQL Server -vastine
DDL-käskyt edellyttävät admin-oikeuksia (tarkemmin sanottuna eksklusiivista saantioikeutta) objekteihin; muut käyttäjät eivät saa olla esim. päivittämässä objektia (taulua tai näkymää)
SELECT-käsky voidaan määrittää kuuluvaksi omaan kategoriaan, Data Query Language (DQL)
SQL Server, Access ja MySQL hyväksyvät myös pelkän SELECT-käskyn, jos haetaan esim. pvm.
Jokaisessa SELECT-käskyssä on oltava SELECT-osan lisäksi ainakin FROM-osa
Access: Tee kysely, joka hakee kaikki henkilöt, joiden sukunimen alkukirjain on välillä A-J
SELECT *
FROM HENKILO
WHERE ((Sukunimi) Like "[A-J]*")
Puuttuva arvo: NULL
esim. WHERE hinta IS NULL
SQL Server: ^ = ei –merkki; [   ] = joku näistä
SQL Server:
SELECT nimi, määrä  FROM tuotteet
WHERE nimi LIKE ‘[A-C] [^A] %’
Monissa tuotteissa on lisäksi omia funktioita esim. keskihajonnan tai varianssin laskemiseen.
-- Harjoitus 2: peruskyselyjä OCELOT-tietokannasta
-- aiheena funktiot, ryhmittely, liitokset
-- hae kaupungit, joista kotoisin olevien työntekijöiden arvojen summa on suurempi kuin 30
SELECT city,SUM(rate)
FROM EMPS
GROUP BY CITY
HAVING SUM(RATE) > 30;
-- rajaa edellinen kysely siten, että osasto on A, B tai C
-- anna arvosummalle (otsikon) nimeksi Arvosumma
SELECT city,SUM(rate) AS Arvosumma
FROM emps
WHERE dept < 'D'
GROUP BY city
HAVING SUM(rate) > 30;
Transact-SQL:
SELECT hinta, Uusihinta = (hinta * 1.22), nimi FROM tuote
Pyöristys Transact-SQL:ssä: Uusihinta = ROUND(hinta * 1.22, 0)
Päivämääräfunktioita:
SELECT pvm = getdate()
SELECT pvm = dateadd(dd, 7, getdate()); lisää viikko
Tietotyypin muuntaminen: CONVERT
SELECT ‘hinta on’ + CONVERT(varchar(10), hinta)
FROM tuote
SELECT SUBSTR(ename,1,10) as Nimi, SAL as Palkka, SAL*0.1 AS Korotus, '=', SAL+SAL*0.1 As UusiPalkka FROM emp;
Transact-SQL: SUBSTRING
Esim. asiakkaan tilaukset (perinteinen liitossyntaksi):
SELECT nimi, tilausnumero
FROM asiakas, tilaus
WHERE asiakas.asiakastunnus = tilaus.asiakastunnus;
ANSI-syntaksi (uusi liitossyntaksi):
SELECT nimi, tilausnumero
FROM asiakas INNER JOIN tilaus
ON asiakas.asiakastunnus = tilaus.asiakastunnus;
tai:
SELECT nimi, tilausnumero
FROM asiakas a INNER JOIN tilaus t
ON a.asiakastunnus = t.asiakastunnus
Esim. asiakkaan tilaukset (perinteinen liitossyntaksi):
SELECT nimi, tilausnumero
FROM asiakas, tilaus
WHERE asiakas.asiakastunnus = tilaus.asiakastunnus;
ANSI-syntaksi (uusi liitossyntaksi):
SELECT nimi, tilausnumero
FROM asiakas INNER JOIN tilaus
ON asiakas.asiakastunnus = tilaus.asiakastunnus;
Transact- SQL:
Cross Join on tulo liitettävien taulujen riveistä (harvoin hyödyllinen)
Outer Join ottaa mukaan myös ne rivit, jotka eivät täytä join-ehtoa; esim asiakkaat ilman tilausta:
SELECT nimi, tilausnumero
FROM asiakas a LEFT OUTER JOIN tilaus t
ON a.asiakastunnus = t.asiakastunnus
tulostaa myös ne asiakkaat, joille ei löydy tilauksia
Liitos itseensä:
SELECT a.nimi
FROM asiakas a INNER JOIN asiakas b
ON a.postitoimipaikka = b.postitoimipaikka
WHERE b.nimi = ‘JAMK’
Jos alikysely palauttaa useamman kuin yhden arvon, pitää =-merkin sijaan käyttää IN-sanaa.
Vinkki: voit käyttää myös NOT EXISTS –yhdistelmää, esim. mille tuotteille ei ole myyjiä:
SELECT nimi, hinta
FROM tuote
WHERE NOT EXISTS
(SELECT *
FROM myyja
WHERE myyja.myyja = tuote.myyja); -- myyja-taulu on tuote-taulun vanhempi
Toimii myös mm. Accessissa, mutta MySQL 3.2.x:ssä ei saa olla välilyöntejä, esim. char(4).
Transact-SQL -kielen numeeriset tietotyypit:
decimal [ ( p, [ , s ] ) ] tai numeric [ ( p, [ , s ] ) ]
p = tarkkuus ( 1…38) , s = skaala, desimaaliosien määrä
float [ ( n ) ]
liukuluku, tarkkuus 15 numeroa
real
liukuluku, tarkkuus 7 numeroa
kokonaisluvut:
int (32 bitin)
smallint (16 bittiä)
tiny (0 … 255)
raha:
money, smallmoney
Transact-SQL -kielen numeeriset tietotyypit:
decimal [ ( p, [ , s ] ) ] tai numeric [ ( p, [ , s ] ) ]
p = tarkkuus ( 1…38) , s = skaala, desimaaliosien määrä
float [ ( n ) ]
liukuluku, tarkkuus 15 numeroa
real
liukuluku, tarkkuus 7 numeroa
kokonaisluvut:
int (32 bitin)
smallint (16 bittiä)
tiny (0 … 255)
raha:
money, smallmoney
Muut Transact-SQL-kielen tietotyypit
char [ ( n ) ]
vakiomittainen merkkitieto, n = 1…255
varchar [ ( n ) ]
vaihtuvamittainen merkkitieto, n = 1…255
binary [ ( n ) ], varbinary [ ( n ) ]
datetime, smalldatetime
 pvm-typit
text, image
suuret tietomäärät (maks 2 Gtavua)
bit
timestamp
muuttuu riviä päivitettäessa
Toimii myös mm. Accessissa, mutta MySQL:ssä ei saa olla välilyöntejä, esim. char(4).
SQL Server:
ALTER TABLE tuotteet
ADD CONSTRAINT PK_Tuotetunnus
PRIMARY KEY CLUSTERED (tuotetunnus)
SQL Server: perusavain luo oletusarvona klusteroidun indeksin
Default
Luo oletusarvon sarakkeelle
Voidaan määritellä yksi / sarake
ADD CONSTRAINT DF_lkm DEFAULT 0 FOR määrä
Check
Liittää pakotteet sarakkeeseen
Voi viitata saman taulun toiseen sarakkeeseen
Tarkistetaan Insert- ja Update -komennoissa
Voi olla useita / sarake
ALTER TABLE tuotteet
ADD
CONSTRAINT CK_hinta
CHECK ( hinta BETWEEN 10 AND 1000 )
Taululle voidaan määritellä identity-sarake, joka on automaattisesti kasvava numero
Määrittelyssä annetaan alkuarvo ja lisäys:
IDENTITY(100, 10); oletus on IDENTITY(1,1)
Identity voidaan liittää seuraaviin tietotyyppeihin:
int, smallint, tinyint
decimal(p,0), numeric(p,0)
Ominaisuus luodaan Create Table, Alter Table tai Select Into -komennolla
IDENTITYCOL -avainsanan käyttö:
SELECT * FROM Tilaus WHERE IDENTITYCOL = 10
Identity-sareke voi toimia pääavaimena
Oraclessa se annetaan CREATE SEQUENCE -käskyllä
SQL Server:
INSERT prosessorit(cpu, hinta) VALUES (‘AMD’, 700)
Sarakkeiden nimiä ei tarvitse luetella, jos kaikille annetaan arvo tai niillä on oletusarvo, timestamp, identity tai ne sallivat Null-arvon
Taulusta toiseen:
INSERT taulu1 SELECT * FROM taulu2
Oletusarvot
INSERT prosessorit DEFAULT VALUES
ehdot kuten edellä
INSERT prosessorit VALUES ('pentiu'’, DEFAULT)
http://data.hamk.fi/materiaalit/tiedonhallinta2/ccr/eristyvyys.pps
Chris Date, J. Rantanen
Näkymät eivät siis ole olemassa tauluina, mutta niitä käytetään hauissa kuten tauluja.
Monissa tuotteissa kuten SQL Serverissä klusteroiva eli ryvästävä (clustered) indeksi järjestää taulun sarakkeet  indeksin mukaiseen järjestykseen. Tauluissa voi olla useita indeksejä, mutta vain yksi klusteroiva, esim:
CREATE UNIQUE CLUSTERED INDEX tunnus
ON prosessorit(tyyppi)
SQL Server: ei kannata indeksoida Text, Image ja bit -tyyppisiä sarakkeita
Linkit tarkistettu 25.9.2003