SQL:N PERUSTEET OSIO 03 MARKKU SUNI
SQL - KIELI FUNKTIOT ELI SAADUN TIEDON JATKOKÄSITTELYÄ MARKKU SUNI
Tarkastellaan Koostefunktioita Päiväys- ja kellonaikafunktioita Aritmeettisia funktioita Merkkifunktioita Muuntofunktioita Eräitä muita funktioita
Funktio on etukäteen määritelty kuvaus, joka annettujen tietojen perusteella palauttaa tuloksen. Matematiikassa esim. sini, kosini, tangentti, jne. SQL: funktio antaa jonkin määritellyn tuloksen kyselyn tuloksessa olevien tietojen perusteella Yleensä nimenomaan kyselyn tuloksesta ei kannan sisällöstä
Funktioita on määritelty SQL-standardissa melkoinen joukko. Tuotteiden myyjät ovat lisänneet omiaan helpottaakseen ja tehostaakseen tuotteidensa käyttöä. Kurssilla olisi hyvä esittää ensin standardin mukaiset funktiot, sitten lisäyksiä.
Funktioita on määritelty SQL-standardissa melkoinen joukko. Koska osoittautui melko vaikeaksi saada esille luotettava SQL-standardi, otin esiin IBM:n manuaalin, joka esittelee SQL-standardia ja siitä funktioiden luettelon. IBM sentään kehitti ensimmäisen SQL-tuotteen.
ABS or ABSVAL ACOS ASCII ASIN ATAN ATAN2 AVG BIGINT, returning integer values BLOB
CEIL or CEILING CHAR, use in datetime conversion CHR CLOB COALESCE CONCAT CONCAT or COS COT
DATE, returning dates from values DAY, returning day part of value DAYNAME DAYOFMONTH DAYOFWEEK DAYOFYEAR DAYS, returning integer durations DBCLOB DECIMAL or DEC, returning decimal equivalents DEGREES DEREF DIFFERENCE DIGITS
DLCOMMENT, comment from DATALINK value DLLINKTYPE, linktype from DATALINK value DLURLCOMPLETE, complete URL from DATALINK value DLURLPATH, path and file name from DATALINK value DLURLPATHONLY, extracting path and file name from DATALINK value DLURLSCHEME, extracting scheme from DATALINK value DLURLSERVER, extracting file server from DATALINK value DLVALUE, building a DATALINK value
DOUBLE or DOUBLE_PRECISION DOUBLE, returning floating point values EVENT_MON_STATE, returning event monitor states EXP FLOAT, returning floating point values FLOOR GENERATE_UNIQUE GRAPHIC GROUPING HEX HOUR, returning hour part of values INSERT INTEGER or INT, returning integer values JULIAN_DAY
LCASE LEFT LENGTH, length values from expressions LN LOCATE LOG LOG10 LONG_VARCHAR LONG_VARGRAPHIC LTRIM
MICROSECOND, returning microsecond part of values MIDNIGHT_SECONDS MINUTE, returning minute part of values MOD MONTH, returning month part of values MONTHNAME NODENUMBER NULLIF PARTITION POSSTR POWER QUARTER
RADIANS RAISE_ERROR RAND REAL, returning floating point values REPEAT REPLACE RIGHT ROUND RTRIM
SECOND, returning second from values SIGN SIN SMALLINT, returning small integer values SOUNDEX SPACE SQRT SUBSTR, returning substring from string
TABLE_NAME TABLE_SCHEMA TAN TIME, using time in an expression TIMESTAMP, returning timestamp from values TIMESTAMPDIFF TIMESTAMP_ISO TRANSLATE TRUNC or TRUNCATE TYPE_ID TYPE_NAME TYPE_SCHEMA
UCASE VALUE, returning non-null result VARCHAR VARGRAPHIC WEEK YEAR, returning values based on year
Tarkastellaan joitakin funktioita ja niiden käyttöä SQL-kyselyissä Esimerkit on suoritettu Microsoft Accessin SQLkielellä ja Northwind-tietokannalla.
Funktio COUNT laskee niiden rivien määrän, jotka täyttävät WHEREosiossa annetun ehdon SELECT COUNT( * ) FROM asiakkaat; 91 SELECT COUNT(*) FROM asiakkaat WHERE maa = Suomi ; 2 SELECT count(*) 7 from asiakkaat WHERE maa IN ('Suomi', 'Ruotsi', 'Tanska', 'Norja');
Funktio COUNT laskee myös mainitulle sarakkeelle niiden rivien määrän, jotka täyttävät WHERE-osiossa annetun ehdon SELECT COUNT( maa ) FROM asiakkaat; 91 SELECT COUNT( maa ) FROM asiakkaat WHERE maa = Suomi ; 2 SELECT count( maa ) 7 from asiakkaat WHERE maa IN ('Suomi', 'Ruotsi', 'Tanska', 'Norja');
Funktio COUNT SELECT COUNT( alue ) FROM asiakkaat; 31 SELECT COUNT( alue ) FROM asiakkaat WHERE alue IS NULL; 0 SELECT count( alue ) 31 from asiakkaat WHERE alue IS NOT NULL; SELECT count( maa ) 60 from asiakkaat WHERE alue IS NULL;
Funktio COUNT ja sen yhdistetty käyttö SELECT DISTINCT( alue ) FROM asiakkaat UNION SELECT COUNT( alue ) FROM asiakkaat ; alue 31 AK BC CA Co. Cork DF ID Isle of Wight Lara MT NM Nueva Esparta OR Québec RJ SP Táchira WA WY
Funktio SUM laskee sarakkeen lukujen summan SELECT SUM( rahti) FROM tilaukset;
Funktio SUM laskee sarakkeen lukujen summan SELECT SUM( rahti) FROM tilaukset; SELECT asiakastunnus, rahti, rahti*1.22 AS verollinen, SUM( rahti) FROM tilaukset EI ONNISTU!! ; No, mutta miksi ei??
SELECT rahti, rahti*1.22 AS verollinen FROM tilaukset UNION SELECT sum(rahti), sum(rahti*1.22) AS verollinen FROM tilaukset ; rahti verollinen 0,09 mk 0,1098 0,54 mk 0,6588 0,63 mk 0,7686... 3 645,23 mk 4447,1745 3 738,38 mk 4560,8175 4 008,51 mk 4890,3822 4 534,38 mk 5531,9436 292 242,11 mk 356535,3681 siinä se summa
Ja luonnollisen loogisesti: SELECT sum(rahti), sum(rahti*1.22) AS verollinen FROM tilaukset WHERE rahti > 1000 ;
Keskimääräinen rahti: SELECT sum(rahti)/count(rahti), sum(rahti*1.22)/count(rahti*1.22) AS verollinen FROM tilaukset ; Expr1000 verollinen 352,098921686747 429,560684457831
Keskimääräinen rahti toisin funktio AVG: SELECT AVG(rahti), AVG(rahti*1.22) AS verollinen FROM tilaukset ; Expr1000 verollinen 352,10 mk 429,560684457831 Vertailun vuoksi edellisen kalvon tulos: Expr1000 verollinen 352,098921686747 429,560684457831
Sarakkeen suurin arvo funktio MAX: SELECT MAX(rahti), MAX(rahti*1.22) AS verollinen FROM tilaukset ; Expr1000 verollinen 4 534,38 mk 5531,9436 Ulkoasu: MAX(rahti) on tulos sarakkeen luvuista sitä koskee sarakkeen muotoilu lasketulle sarakkeelle ei ole annettu muotoiluohjetta
Sarakkeen pienin arvo funktio MIN: SELECT MIN(rahti), MIN(rahti*1.22) AS verollinen FROM tilaukset ; SELECT min( yritys ) FROM asiakkaat; Expr1000 Alfreds Futterkiste Merkkijonoille aakkosjärjestys!!
Sarakkeen pienin ja suurin arvo funktioilla: SELECT min( yritys ), max( yritys), count(yritys) FROM asiakkaat; Expr1000 Expr1001 Expr1002 Alfreds Futterkiste Wolski Zajazd 91
SQL:n ANSI-standardissa on määritelty funktiot COUNT, SUM, MAX, MIN, AVG. Standardinomaisesti useimmat tuotteet tuntevat myös funktiot VARIANCE - varianssin laskeminen STDEV - standardihajonta, keskihajonta Nimitys voi vaihdella; MS Access käyttää nimeä VAR varianssista Dstdev hajonnasta
Päivämäärä- ja aikafunktioita Useimmissa SQL-tuotteissa on DATE-tyyppi, mutta sen täsmällinen esitysmuoto (ja talletusmuoto) saattaa vaihdella.
Päivämäärä- ja aikafunktioita Useimmissa SQL-tuotteissa on DATE-tyyppi, mutta sen täsmällinen esitysmuoto (ja talletusmuoto) saattaa vaihdella. Löytyy myös TIME-tyyppi samoin huomautuksin Tietokannoissa oleellinen tyyppi on TIMESTAMP eli aikaleima: päivämäärä ja kellonaika yhdistettynä
Päivämäärä- ja aikafunktioita DATE, DAY, DAYNAME, DAYOFMONTH number 1 31 DAYOFWEEK number 1-7 returning dates from values returning day part of value eg. Friday DAYOFYEAR number 1-366 DAYS, returning integer durations
Päivämäärä- ja aikafunktioita HOUR, returning hour part of values MICROSECOND, returning microsecond part of values MIDNIGHT_SECONDS MINUTE, returning minute part of values MONTH, returning month part of values MONTHNAME e.g. January SECOND, returning second from values TIME, using time in an expression TIMESTAMP, returning timestamp from values TIMESTAMPDIFF TIMESTAMP_ISO
Päivämäärä- ja aikafunktioita ORACLE tuntee seuraavat: ADD_MONTHS( päiväys, luku) luku ilmoittaa montako kuukautta lisätään päiväykseen päiväys voi olla vakiopäivämäärä, sarakkeella lausekkeen tulos LAST_DAY( päiväys ) ilmoittaa ko. kuukauden viimeisen päivän päiväyksen MONTHS_BETWEEN( päiväys1, päiväys2 ) ilmoittaa ko. päiväysten välisten kuukausien määrän negatiivisena, jos päiväys1 on aikaisempi
Päivämäärä- ja aikafunktioita ORACLE tuntee seuraavat: NEXT_DAY( päiväys, viikonpäivä ) ilmoittaa ensimmäisen annettua päiväystä seuraavan (tai saman) ko. viikonpäivää vastaavan päiväyksen NEXT_DAY( toimituspäivämäärä, FRIDAY ) SYSDATE ilmoittaa järjestelmän senhetkisen päiväyksen ja ajan
MS ACCESS tuntee seuraavat: AIKA-funktio AIKA_ARVO-funktio KUUKAUSI-funktio KUUKAUSI.LOPPU-funktio MINUUTTI-funktio NYT-funktio PÄIVÄ-funktio PÄIVÄ.KUUKAUSI-funktio PÄIVÄT360-funktio
MS ACCESS tuntee seuraavat: PÄIVÄYS-funktio PÄIVÄYSARVO-funktio SEKUNNIT-funktio TUNTI-funktio TYÖPÄIVÄ-funktio TYÖPÄIVÄT-funktio TÄMÄ.PÄIVÄ-funktio VIIKONPÄIVÄ-funktio VUOSI-funktio VUOSI.OSA-funktio
MS ACCESS tuntee seuraavat: AIKA(tunnit;minuutit;sekunnit) Palauttaa annettua aikaa vastaavan luvun. Funktio palauttaa desimaaliluvun 0 0,99999999, joka vastaa aikaa 0:00:00 23:59:59. Tunnit on luku 0 23, joka vastaa tunteja. Minuutit on luku 0 59, joka vastaa minuutteja. Sekunnit on luku 0 59, joka vastaa sekunteja.
MS ACCESS tuntee seuraavat: AIKA_ARVO(aika_teksti) Palauttaa luvun, joka vastaa tekstimuotoista aikaa. Aika_teksti on tekstimerkkijono, joka määrittää ajan jossakin ajan esitysmuodoista, kuten muodossa 18:45. Päivämäärätietoja ei oteta huomioon.
MS ACCESS tuntee seuraavat: AIKA_KUUKAUSI(aloituspäivä;kuukaudet) Palauttaa järjestyslukuna päivämäärän, joka poikkeaa aloituspäivämäärästä annetun kuukausimäärän verran eteen- tai taaksepäin. Aloituspäivästä lasketaan annetun kuukausimäärän verran eteen- tai taaksepäin. Kuukausien määrän antaa kuukaudetargumentti. Kuukaudet on kuukausimäärä ennen aloituspäivämäärää tai sen jälkeen. Arvo on positiivinen tulevissa päivämäärissä ja negatiivinen edeltävissä päivämäärissä.
MS ACCESS tuntee seuraavat: Lisätietoja: ACCESSin HELP-toiminto ja käsikirjat
ARITMEETTISET funktiot ABS - luvun itseisarvo CEIL - pienin kokonaisluku, >= funktion parametri FLOOR suurin kokonaisluku, <= funktion parametri COS, COSH, SIN, SINH, TAN, TANH tutut trigonometriset funktiot argumentti (parametri) radiaaneina EXP e argumentin potenssiin LN, LOG - argumentin luonnollinen tai Briggsin logaritmi
ARITMEETTISET funktiot MOD - modulus, jakojäännös MOD( 5, 2 ) = 1 MOD( 5, 7 ) = 5 POWER argumentti potenssiin SIGN 1, 0, -1 jos argumentti on >0, =0, < SQRT - neliöjuuri
MERKKIJONOfunktiot Merkkijonofunktiot toimivat merkkijonoille ja antavat tuloksenaan merkkijonon, luvun tai totuusarvon Merkkijonoille tyypillisiä operaatioita: Jonon katkaisu osajono osajonon haku jonon tasaaminen vasempaan tai oikeaan merkkien korvaaminen toisilla
MERKKIJONOfunktiot CHR saa argumenttinaan luvun, jota vastaavan merkin palauttaa Laitteiston koodiston mukaan (EBCDIC, ASCII) SELECT rahti, CHR( 61 ), rahti*1.22 AS verollinen, CHR( 41 ) FROM tilaukset; rahti Expr1001 verollinen Expr1003 145,71 mk = 177,7662 ) 52,25 mk = 63,7389 ) 296,24 mk = 361,4067 )
MERKKIJONOfunktiot CONCAT saa kaksi argumenttia, jotka konkatenoi sama operaatio kuin operaattorilla SELECT concat( etunimi, sukunimi ) FROM nimet;
MERKKIJONOfunktiot INITCAP asettaa argumenttinsa ensimmäisen merkin suureksi, muut pieniksi LCASE muuttaa argumenttinsa kirjaimet pieniksi joissakin systeemeissä LOWER UCASE muuttaa argumenttinsa kirjaimet suuriksi joissakin systeemeissä UPPER SELECT rahti, lähetysmaa FROM tilaukset WHERE UCASE( lähetysmaa ) = SAKSA ;
MERKKIJONOfunktiot Esim. Oraclen LPAD ja RPAD lisäävät merkkejä merkkijonon vasempaan (oikeaan) laitaan. Tulos on pitempi kuin merkkijono alun perin LPAD( Lähetysmaa, 10, * ) **********Saksa **********Suomi RPAD( Lähetysmaa, 10, * ) Saksa ********** Suomi **********
MERKKIJONOISTA Merkkijonon operaatiot ottavat huomioon pituuden, joskin tapa voi vaihdella Vertailuissa, kopioinneissa yleensä täytetään blankoilla lähtömaa > tulomaa Suomi > Etelä-Afrikka
LTRIM ja RTRIM poistavat merkkijonoista (vasemmalta, oikealta) haluttuja merkkejä. Oletuksena blankko RPAD( RTRIM( Lähetysmaa ), 10, * ) Saksa********** Suomi********** Sveitsi********* LTRIM( Lähetysmaa, S ) aksa uomi veitsi
REPLACE korvaa merkkijonoissa merkkijonoja toisilla. Ellei korvaavaa jonoa anneta, oletetaan se NULLiksi ja vain poistetaan löytyneet merkkijonot REPLACE( hintaselitys, ON EUR, MARKK ) HINTA ON EUROINA HINTA MARKKOINA REPLACE( hintaselitys, EUROINA ) HINTA ON EUROINA HINTA ON
SUBSTR poimii merkkijonosta osajonon. Parametreina alkupositio ja pituus. kentässä Markku Suni SUBSTR( nimi, 2, 5 ) = arkku SUBSTR( nimi, 8, 3 ) = uni
Oh, that I were where I would be Then, would I be where I am But, oh that I am where I must be WhereI wouldbei cannot. On this little lolly day On this little lolly day Oi, valita jos mie voisin, niin josko täällä mie oisin? Ei, mutta näin minun täytyy Minne tahdon, pääse en. ajan valuessa vaan