Nogle udpluk af mine ’SQL-favoritter’ af Dan Foldager 14. September 2010
AGENDA Database Nye ord og begreber og meget andet.. Data retrieval Pivot Hvorfor SQL ? Mere info.. Links
Referential integrity Journaling Materialized query table Database Nye ord Fra DDS til DDL XML Large objects Referential integrity Journaling Materialized query table CREATE TABLE AS (SELECT fra ’data-dictionary’) field-reference-file System i Navigator kan danne SQL udfra DDS
Database – nye ord Felt = kolonne (column) Record = række (row) Library = samling (collection), schema Index = index / view Datatypes: beløbsfelt = Money !!! Large objects: - clob (character large object) - blob (Binary large object) - XML Cascade (on delete) Referential constraint UDF = user defined function MQT = Materialized Query Table Null ? … Datatyper…. Lav liste (matrix m release-numre)
Database - fra DDS til DDL (1 af 3) System i Navigator Fra DDS til SQL via få klik… OBS: Editcode / editword mm.
Database - fra DDS til DDL (2 af 3) - SQL-fejl (editcode, VALUES mm) CREATE TABLE LABEL ON TABLE HER ER NOGET AT PRØVE.. (lille mand)
Database - fra DDS til DDL (3 af 3) CREATE TABLE mylib/myfile AS (SELECT RNO1, RNO2, RNAM, ..., RSTAC, REDAT, REUSR, RMDAT, RMUSR FROM *libl/AVDTADIC) WITH NO DATA Generelt: CREATE TABLE lib/table AS (SELECT field1, field2, field7, field22, … FROM lib/fieldref )
Hvordan ? Library -> files -> !!! Sourcecode (type = SQL) RUNSQLSTM executes the sourcemember RUNSQLSTM (ikke compile – forklar [interpretiv, dvs ’execute’))
Ny applikation.. (1 af 4) CRTLIB gsgruppen : CREATE SCHEMA gsgruppen or CREATE COLLECTION gsgruppen System i Navigator Skemaer – SCHEMA – COLLECTION !!! OBS: h.klik for at danne din liste i træet..
Ny applikation.. (2 af 4) …lad os ombryde til læsbart !! CRTFILE master : CREATE TABLE gsgruppen/master (medlnr INT NOT NULL WITH DEFAULT, navn VARCHAR (50) NOT NULL WITH DEFAULT, inddat DATE , uddat DATE, email VARCHAR ( 100) NOT NULL WITH DEFAULT, tekst VARCHAR (1024) NOT NULL WITH DEFAULT, firma VARCHAR (50) NOT NULL WITH DEFAULT, CONSTRAINT medlnr_pk PRIMARY KEY (medlnr),CONSTRAINT medlnr_value CHECK (medlnr > 0 )) CRTFILE trans : CREATE TABLE gsgruppen/trans (faktNR INT NOT NULL WITH DEFAULT, trndat DATE , medlnr INT NOT NULL WITH DEFAULT, trntxt VARCHAR (100) NOT NULL WITH DEFAULT, amount DECIMAL (9,2) NOT NULL WITH DEFAULT, CONSTRAINT faktnr_pk PRIMARY KEY (faktnr), CONSTRAINT faktnr_value CHECK (faktnr > 100000 ), CONSTRAINT medlnr_fk FOREIGN KEY(medlnr) REFERENCES gsgruppen/master(medlnr) ON DELETE CASCADE ON UPDATE RESTRICT) TODO… …lad os ombryde til læsbart !!
Ny applikation.. (2 af 4) CRTFILE master : CRTFILE trans : TODO… CREATE TABLE gsgruppen/master ( medlnr INT NOT NULL WITH DEFAULT, navn VARCHAR (50) NOT NULL WITH DEFAULT, inddat DATE, uddat DATE, email VARCHAR ( 100) NOT NULL WITH DEFAULT, tekst VARCHAR (1024) NOT NULL WITH DEFAULT, firma VARCHAR (50) NOT NULL WITH DEFAULT, CONSTRAINT medlnr_pk PRIMARY KEY (medlnr), CONSTRAINT medlnr_value CHECK (medlnr > 0 )) CRTFILE trans : CREATE TABLE gsgruppen/trans ( faktNR INT NOT NULL WITH DEFAULT, trndat DATE , medlnr INT NOT NULL WITH DEFAULT, trntxt VARCHAR (100) NOT NULL WITH DEFAULT, amount DECIMAL (9,2) NOT NULL WITH DEFAULT, CONSTRAINT faktnr_pk PRIMARY KEY (faktnr), CONSTRAINT faktnr_value CHECK (faktnr > 100000 ), CONSTRAINT medlnr_fk FOREIGN KEY(medlnr) REFERENCES gsgruppen/master(medlnr) ON DELETE CASCADE ON UPDATE RESTRICT ) TODO…
Ny applikation.. (3 af 4) TODO…
Ny applikation.. (4 af 4) Data… : TODO… INSERT INTO gsgruppen/master VALUES(NULL, ’Dan’, ’Foldager’,….) INSERT INTO gsgruppen/trans ….????????? TODO…
Nogle tips .. Ret stavefejl i feltoverskrift Dokumentation… LABEL ON COLUMN PALPRIS.PRP1UD IS 'Pris 1/1 paller - ud –’ Dokumentation… COMMENT ON COLUMN … [mulighed for 2000 char dokumentation] SQL function Labels : - virker også på DDS-beskrevne filer - COMMENT ON COLUMN FLDREF ( EntryDate IS ‘Date of record creation. Date is set automatically by the syst em.’, EntryUser IS ‘User-ID for person who entered this record. Rows may exist whe re special values starting with an asterisk (”*”) are used, fx ”*CONVERT” an d ”*IMPORT”.’, UpdateDate IS ‘Date of latest record update. Date is set automatically by the system (trigger-pgm). Field is null at record entry to the table.’, STATUS IS ‘Record status field. Defaults to ”A” (Active) when record is created. May be set to ”I” (Inactive), ”D” (Deleted) or ”*” (may be erase d.’ ); SQL i CL ?
Data retrieval SELECT…. Pivot SELECT (CURRENT DATE - 3 DAYS), davno from avadfo_9/avdta
Nogle tips .. Pivot !! (1 af 5) OPGAVE: Vis avance pr varegruppe over tid. SELECT ssvagr, ssdato, ssbelb - sskost AS avance FROM qqq/saltrans
Nogle tips .. Pivot !! (2 af 5) SELECT ssvagr, ssdato, ssbelb - sskost AS avance FROM qqq/saltrans SELECT ssvagr, year(ssdato) as YEAR, ssbelb - sskost AS avance FROM qqq/saltrans QUARTER – WEEKNO – YEAR fra dato-felt
Nogle tips .. Pivot !! (3 af 5) SELECT ssvagr, ssdato, ssbelb - sskost AS avance FROM qqq/saltrans SELECT ssvagr, year(ssdato) as YEAR, ssbelb - sskost AS avance FROM qqq/saltrans SELECT ssvagr, year(ssdato) as YEAR, sum(ssbelb - sskost) AS avance FROM qqq/saltrans GROUP BY ssvagr, year(ssdato) ORDER BY ssvagr, year(ssdato)
Nogle tips .. Pivot !! (4 af 5) SELECT ssvagr, year(ssdato) as YEAR, sum(ssbelb - sskost) AS avance FROM qqq/saltrans GROUP BY ssvagr, year(ssdato) ORDER BY ssvagr, year(ssdato) select ssvagr, sum(case when year(ssdato) = 2006 then (ssbelb - sskost) end) as "2006", sum(case when year(ssdato) = 2007 then (ssbelb - sskost) end) as "2007", sum(case when year(ssdato) = 2008 then (ssbelb - sskost) end) as "2008", sum(case when year(ssdato) = 2009 then (ssbelb - sskost) end) as "2009" from qqq/saltrans where year(ssdato) >= 2006 GROUP BY ssvagr ORDER BY ssvagr
Nogle tips .. Pivot (5 af 5) Use System i Navigator select ssvagr, sum(case when year(ssdato) = 2006 then (ssbelb - sskost) end) as "2006", sum(case when year(ssdato) = 2007 then (ssbelb - sskost) end) as "2007", sum(case when year(ssdato) = 2008 then (ssbelb - sskost) end) as "2008", sum(case when year(ssdato) = 2009 then (ssbelb - sskost) end) as "2009" from qqq/saltrans where year(ssdato) >= 2006 GROUP BY ssvagr ORDER BY ssvagr Use System i Navigator
Hvorfor SQL ? Move databaselogic to database level Lob og xml data ikke muligt i DDS Token !!!!<<<<<<<obs Date calculation Cascading (..on delete) Pivot Cross platform impact… Use STRQM i stedet for WRKQRY !!! …
Some tips .. SQL i CL C/free Exec sql Select …. INTO :aaaaa FROM where :abcde = inputknr; (e løsning hos DFS) /end-free
Mere info.. Links: http://en.wikipedia.org/wiki/SQL#Language_elements http://en.wikipedia.org/wiki/Pivot_table http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=/sqlp/rbafyorderop.htm http://en.wikipedia.org/wiki/SQL http://www-03.ibm.com/systems/i/software/navigator/perftips.html http://itknowledgeexchange.techtarget.com/itanswers/documenting-column-in-sql-table-in-qadbifld-as400/
SLUT dan@adfo.dk www.adfo.dk