Einführung in PROC SQL 10.07.2008 Einführung in PROC SQL Marianne Weires Überblick Marianne Weires C050 Page 2 • Was ist SQL und PROC SQL? • PROC SQL und SAS DATA Step • Data Definition Language: Erstellen/Löschen von Tabellen/Views/Indizes (CREATE, DROP) • Data Manipulation Language: Struktur von SQL Abfragen (SELECT) Einfügen/Ändern/Löschen (INSERT, UPDATE, DELETE) Verknüpfen von Tabellen (JOIN) Geschachtelte Abfragen (Subqueries) Verknüpfen von Abfragen (Set Operatoren) • Performanz und PROC SQL • SAS und relationale Datenbanken (SAS/ACCESS Software) SAS-Treff am URZ Heidelberg 1 Einführung in PROC SQL Marianne Weires C050 10.07.2008 Was ist SQL und PROC SQL? Page 3 Structured Query Language (SQL): • Standardisiert, weit verbreitet in relationalen Datenbanken (z.B. Oracle, MySQL, Access etc.) • Relationale Datenbank: Datenbank mit Tabellen und Relationen (E.F.Codd) • Fourth-Generation Language • ISO- und ANSI-Standard • Datenbankhersteller mit eigenen SQL-Erweiterungen PROC SQL: • SAS Implementierung von SQL • Teil der SAS-Base Software • SAS unterstützt viele Features des SQL Standards (SQL-92) Marianne Weires C050 PROC SQL und SAS DATA Step Page 4 • Terminologie SQL Term SAS Term Tabelle SAS data file Zeile Beobachtung Spalte Variable Datenbank Bibliothek • Syntax proc sql <option(s)>; /* anfang */ create table ...; /* sql befehle*/ select ...; drop table ...; ... quit; /* ende */ SAS-Treff am URZ Heidelberg 2 Einführung in PROC SQL 10.07.2008 PROC SQL und SAS DATA Step Marianne Weires C050 Page 5 • Kategorien von Befehlen in SQL Data Definition Language (DDL) Definition des Datenbankschemas Data Manipulation Language (DML) Datenmanipulation Data Control Language (DCL) Rechteverwaltung PROC SQL und SAS DATA Step Marianne Weires C050 Page 6 • Kategorien von Befehlen in SQL Data Definition Language (DDL) Definition des Datenbankschemas Data Manipulation Language (DML) Datenmanipulation Data Control Language (DCL) Rechteverwaltung SAS-Treff am URZ Heidelberg 3 Einführung in PROC SQL 10.07.2008 Beispieldatensätze Marianne Weires C050 Page 7 Relation Beispieldatensätze Marianne Weires C050 Page 8 my_db.patients ID SEX PRIMMD BIRTHDTE LASTNAME FIRSTNAME 1 1 1972 10AUG1938 Bauer Jürgen 2 2 1972 17MAR1925 Betz Stefan 3 1 1989 02JUL1918 Casper Martha 4 1 4003 25MAY1916 Hemmingw Greg 5 2 1972 31AUG1937 Humboldt Karla ... ... ... ... ... ... my_db.admits PT_ID ADMDATE DISDATE MD_ID HOSP_ID DEST BP_SYS BP_DIA PRIMDX 1 07FEB1999 08FEB1999 3274 1 1 188 85 410.0 1 12APR1999 25APR1999 1972 1 1 230 101 428.2 1 10SEP1999 19SEP1999 3274 2 2 170 78 813.9 1 06JUN1998 12JUN1998 3274 2 9 185 94 428.4 3 15MAR1998 15MAR1998 2322 3 9 74 40 ... ... ... SAS-Treff am URZ Heidelberg ... ... ... ... ... 431 ... 4 Einführung in PROC SQL 10.07.2008 Beispieldatensätze Marianne Weires C050 Page 9 my_db.hospital HOSP_ID HOSPNAME TOWN 1 Big University Hospital NewMitfo 841 1 2 Our Lady of Charity NorthMit 645 2 3 Veteran’s Administration WestMitf 1176 3 4 Community Hospital Derbyvil 448 1 5 City Hospital NewMitfo ... ... ... NBEDS TYPE 1025 ... 1 ... my_db.doctors MD_ID LASTNAME HOSPADM 1972 Fitzhugh 1 1972 Fitzhugh 2 2322 Mac Arthur 1 2322 Mac Arthur 3 2998 Rosenberg ... ... 4 ... Data Definition Language Marianne Weires C050 Page 10 • Erstellen von Tabellen (CREATE) 1) aus Spaltenbeschreibungen proc sql; create table my_db.doctors /* leere tabelle erstellt */ ( MD_ID num, LASTNAME char(8), HOSPADM num ); quit; * proc sql; describe table my_db.doctors; quit; SAS-Treff am URZ Heidelberg 5 Einführung in PROC SQL 10.07.2008 Data Definition Language Marianne Weires C050 Page 11 2) anlog einer existierenden Tabelle proc sql; /* leere tabelle erstellt */ create table my_db.doctors_kopie like my_db.doctors; quit; 3) aus einer Abfrage * proc sql; create table my_db.doctors_kopie as /* tabelle mit inhalt */ select * from my_db.doctors; quit; Data Definition Language Marianne Weires C050 Page 12 • Erstellen von Views (CREATE) - eine View ist eine gespeicherte Abfrage - speichersparend - virtuelle Tabelle, die u.U. mehrere Tabellen zusammenführt - „versteckt“ komplizierte Abfragen, oder auch Zeilen proc sql; create view my_db.diagnosis_view as select * from my_db.admits where primdx like '410%'; /* primary diagnosis */ select * from my_db.diagnosis_view; quit; SAS-Treff am URZ Heidelberg 6 Einführung in PROC SQL 10.07.2008 Data Definition Language Marianne Weires C050 Page 13 proc sql; describe view my_db.diagnosis_view; quit; Im Log Fenster: NOTE: SQL view MY_DB.DIAGNOSIS_VIEW is defined as: select * from MY_DB.ADMITS where primdx like '410%'; Data Definition Language Marianne Weires C050 Page 14 • PROC SQL Tabellen und Views Input für weitere SAS Prozeduren • Vermeiden von order by innerhalb einer View Æ Daten werden bei jeder Referenzierung auf die View sortiert • wenn eine View oft referenziert wird ÆTabelle erstellen • wenn sich die Struktur von Tabellen ändert Æ besser keine Views benutzen SAS-Treff am URZ Heidelberg 7 Einführung in PROC SQL 10.07.2008 Data Definition Language Marianne Weires C050 Page 15 • Erstellen von Indizes (CREATE) - einfacher Index (simpler index) über eine einzige Spalte * proc sql; create index id /* indexname = spaltenname! */ on my_db.patients(id); quit; NOTE: Simple index id has been defined. - zusammengesetzter Index (composite index) über mehrere Spalten * proc sql; create index name on my_db.patients(lastname,firstname); quit; NOTE: Composite index name has been defined. Marianne Weires C050 Data Definition Language Page 16 SAS-Treff am URZ Heidelberg 8 Einführung in PROC SQL 10.07.2008 Data Definition Language Marianne Weires C050 Page 17 • Index erstellen mit SAS 1) mit PROC DATASETS proc datasets library modify patients; index delete id; /* index create id; /* index create name = run; = my_db; index löschen */ simpler index */ (lastname firstname); /* composite index */ 2) mit DATA Set Option data my_db.patients(index = (lastname)); set my_db.patients; run; Data Definition Language Marianne Weires C050 Page 18 • Löschen von Tabellen/Views/Indizes (DROP) proc sql; drop table my_db.patients; quit; proc sql; drop view diagnosis_view; quit; proc sql; drop index name on my_db.patients; drop index id on my_db.patients; quit; SAS-Treff am URZ Heidelberg 9 Einführung in PROC SQL 10.07.2008 Data Manipulation Language Marianne Weires C050 Page 19 • Struktur von SQL Abfragen (SELECT) 1 select 2 from 3 where 4 group by 5 having 6 order by optional Data Manipulation Language Marianne Weires C050 Page 20 - alle Spalten auswählen: * proc sql; select * from my_db.patients; quit; proc sql outobs = 5; /* nur 5 beobachtungen */ select * from my_db.patients; quit; SAS-Treff am URZ Heidelberg 10 Einführung in PROC SQL 10.07.2008 Data Manipulation Language Marianne Weires C050 Page 21 - Spalten auswählen: * proc sql; select firstname,lastname from my_db.patients; /* ausgabereihenfolge wie angegeben */ quit; proc sql; select * from my_db.doctors(drop = HOSPADM); /* DATA step option */ quit; Data Manipulation Language Marianne Weires C050 Page 22 - Duplikate eliminieren: * proc sql; select distinct * /* verschieden in ALLEN spalten */ from my_db.patients; quit; oder mit SAS: proc sort data = my_db.patients out = my_db.patients_nodup noduplicates; by lastname; run; SAS-Treff am URZ Heidelberg 11 Einführung in PROC SQL 10.07.2008 Data Manipulation Language Marianne Weires C050 Page 23 - Duplikate eliminieren: proc sql; select distinct lastname /* verschieden in nur einer spalte */ from my_db.patients; quit; LASTNAME Bauer Betz Casper Hemmingw Humboldt Kampinsk Lessing Mayer … Marianne Weires C050 Data Manipulation Language Page 24 oder mit SAS: proc sort data = my_db.patients out = my_db.patients_nodup nodupkey; by lastname; run; Obs ID SEX PRIMMD BIRTHDTE LASTNAME FIRSTNAME 1 10 2 2322 14Jan1965 Bauer Jürgen 2 1 2 1972 14OCT193 Betz Stefan 3 6 1 2322 12APR195 Casper Martha 4 14 2 8034 14MAY193 Hemmingw Greg 5 15 1 4003 10DEC193 Humboldt Karla 6 3 2 4002 14JAN193 Kampinsk Igor 7 5 1 1972 12FEB196 Lessing Katrin .. SAS-Treff am URZ Heidelberg zusätzliche Spalten … … … … … … 12 Einführung in PROC SQL 10.07.2008 Data Manipulation Language Marianne Weires C050 Page 25 - Anlegen von neuen Spalten (CASE Anweisung): proc sql; create table my_db.bp as select pt_id, bp_sys label = 'Blutdruck systolisch (mmHg)', bp_dia label = 'Blutdruck diastolisch (mmHg)', case when (bp_sys >= 140) and (bp_dia >= 90) then 'hoch' else 'normal' end as Blutdruck /* weitere case anweisungen */ from my_db.admits; quit; PT_ID Blutdruck systolisch (mmHg) Blutdruck diastolisch (mmHg) 1 188 85 1 230 101 ... ... ... Blutdruck normal Hoch ... Data Manipulation Language Marianne Weires C050 Page 26 - Auswahl von Beobachtungen (WHERE): proc sql; select * from my_db.bp where blutdruck = 'hoch'; quit; - einige Operatoren: SAS-Treff am URZ Heidelberg 13 Einführung in PROC SQL 10.07.2008 Data Manipulation Language Marianne Weires C050 Page 27 - Duplikate ausgeben (GROUP BY, HAVING): proc sql; create table my_db.doctors_dup as select md_id, lastname, hospadm as hospital, count(*) as anzahl from my_db.doctors group by md_id having count(*) >= 2 order by lastname; quit; MD_ID hospital anzahl 7803 Avitable LASTNAME 3 2 7803 Avitable 2 2 1972 Fitzhugh 1 2 1972 Fitzhugh 2 2 3274 Hanratty 3 3 3274 Hanratty 2 3 3274 Hanratty 1 3 … … … … Data Manipulation Language Marianne Weires C050 Page 28 oder mit SAS: proc sort data = my_db.doctors; by md_id; run; data my_db.doctors_dup; set my_db.doctors (rename = (hospadm=hospital)); by md_id; if not (first.md_id and last.md_id); run; proc sort data = my_db.doctors_dup; by lastname; run; SAS-Treff am URZ Heidelberg 14 Einführung in PROC SQL 10.07.2008 Data Manipulation Language Marianne Weires C050 Page 29 • Einfügen von Beobachtungen (INSERT) 1) mit values statement proc sql; insert into my_db.doctors values (1111, 'Harald', 4) values (1111, 'Harald', 2); quit; Data Manipulation Language Marianne Weires C050 Page 30 2) mit set statement proc sql; insert into my_db.doctors set md_id = 1111, lastname = 'Harald', hospadm = 4 set md_id = 1111, lastname = 'Harald', hospadm = 2; quit; 3) aus einer Abfrage: proc sql; insert into my_db.doctors_new select * from my_db.doctors; /* werden angehangen */ quit; SAS-Treff am URZ Heidelberg 15 Einführung in PROC SQL 10.07.2008 Data Manipulation Language Marianne Weires C050 Page 31 • Ändern von Beobachtungen (UPDATE) proc sql; update my_db.hospital set nbeds = nbeds * 10; /* ALLE einträge geändert! */ quit; Æ einschränken mit where Data Manipulation Language Marianne Weires C050 Page 32 • Löschen von Beobachtungen (DELETE) proc sql; delete from my_db.doctors; /* ALLE einträge gelöscht! */ quit; Æ einschränken mit where proc sql; delete from my_db.doctors where md_id = 1111; quit; SAS-Treff am URZ Heidelberg 16 Einführung in PROC SQL 10.07.2008 Data Manipulation Language Marianne Weires C050 Page 33 • Verknüpfen von mehreren Tabellen (JOIN) - vergleichbar zu merge - Daten werden horizontal miteinander verknüpft Bespieldaten: Tabelle Two Tabelle One X Y 1 2 2 C050 2 3 9 Marianne Weires Z 4 2 4 A B 1 2 2 4 3 4 5 6 7 8 Data Manipulation Language Page 34 proc sql; select * from my_db.one, my_db.two; /* keine where-bedingung angegeben */ quit; X Y Z A B 1 2 2 1 2 1 2 2 2 4 1 2 2 3 4 1 2 2 5 6 1 2 2 7 8 2 3 4 1 2 2 3 4 2 4 2 3 4 3 4 2 3 4 5 6 2 3 4 7 8 9 2 4 1 2 3x5 Einträge Æ Kartesisches Produkt … … … … … SAS-Treff am URZ Heidelberg 17 Einführung in PROC SQL 10.07.2008 Data Manipulation Language Marianne Weires C050 Page 35 Kartesisches Produkt: vollständige Kombination von Datensätzen miteinander Æ sehr rechenintensiv Æ Im SAS Log Fenster: 1976 proc sql; 1977 select * 1978 from my_db.one, my_db.two; NOTE: The execution of this query involves performing one or more Cartesian product joins that can not be optimized. 1979 quit; NOTE: PROCEDURE SQL used (Total process time): real time 0.03 seconds cpu time 0.00 seconds Marianne Weires C050 Data Manipulation Language Page 36 (Fast) immer will man nur eine Untermenge des kartesischen Produktes Inner Join Right Join Left Join Full Join Outer Joins SAS-Treff am URZ Heidelberg 18 Einführung in PROC SQL 10.07.2008 Data Manipulation Language Marianne Weires C050 Page 37 • Inner Join - Schnittmenge proc sql; select * from my_db.one as a, my_db.two as b where a.X = b.A; quit; oder * proc sql; select * from my_db.one as a inner join my_db.two as b on a.X = b.A; quit; Marianne Weires C050 X Y Z A B 1 2 2 1 2 2 3 4 2 4 Data Manipulation Language Page 38 oder mit SAS: proc sort data = my_db.one; by X; run; proc sort data = my_db.two; by A; run; data my_db.inner_join; merge my_db.one (in = one) my_db.two (in = two rename = (A = X)); by X; if one and two; run; SAS-Treff am URZ Heidelberg 19 Einführung in PROC SQL 10.07.2008 Data Manipulation Language Marianne Weires C050 Page 39 • Outer Joins Als Ergebnis wird eine Tabelle ausgegeben, die - alle gemeinsamen Beobachtungen enthält und - zusätzlich die restlichen Zeilen der linken (left join) bzw. der rechten Tabelle (right join) Data Manipulation Language Marianne Weires C050 Page 40 • Left Join linke Tabelle ist Mastertabelle (d.h. alle Zeilen der linken Tabelle mit den entsprechenden Zeilen der rechten Tabelle) * proc sql; select * from my_db.one as a left join my_db.two as b on a.X = b.A; quit; SAS-Treff am URZ Heidelberg X Y Z A B 1 2 2 1 2 2 3 4 2 4 9 2 4 . . in linker und rechter Tabelle nur in linker Tabelle 20 Einführung in PROC SQL 10.07.2008 Data Manipulation Language Marianne Weires C050 Page 41 oder mit SAS: /* left join */ data my_db.left_join; merge my_db.one (in = one) my_db.two (rename = (A = X)); by X; if one; run; Marianne Weires C050 Data Manipulation Language Page 42 • Right Join rechte Tabelle ist Mastertabelle (d.h. alle Zeilen der rechten Tabelle mit den entsprechenden Zeilen der linken Tabelle) * proc sql; select * from my_db.one as a right join my_db.two as b on a.X = b.A; quit; SAS-Treff am URZ Heidelberg X Y Z A B 1 2 2 1 2 2 3 4 2 4 . . . 3 4 . . . 5 6 . . . 7 8 21 Einführung in PROC SQL 10.07.2008 Data Manipulation Language Marianne Weires C050 Page 43 oder mit SAS: /* right join */ data my_db.right_join; merge my_db.one my_db.two (in = two rename = (A = X)); by X; if two; run; Data Manipulation Language Marianne Weires C050 Page 44 • Full Join Kombination aus left join und right join * proc sql; select * from my_db.one as a full join my_db.two as b on a.X = b.A; quit; SAS-Treff am URZ Heidelberg X Y Z A B 1 2 2 1 2 2 3 4 2 4 . . . 3 4 . . . 5 6 . . . 7 8 9 2 4 . . aus rechter Tabelle aus linker Tabelle 22 Einführung in PROC SQL 10.07.2008 Data Manipulation Language Marianne Weires C050 Page 45 oder mit SAS: /* full join */ data my_db.full_join; merge my_db.one my_db.two (rename = (A = X)); by X; run; Bemerkungen: - mit PROC SQL kein sortieren vorher notwenig - Variablen können unterschiedliche Namen haben (kein rename notwendig) Data Manipulation Language Marianne Weires C050 Page 46 • Geschachtelte Abfragen (Subqueries) Eine Tabelle in einem Join kann wiederum eine SQL Abfrage sein Beispiel: „Wir wollen den Namen von jedem Patienten der eingeliefert wurde“ * proc sql; select id, lastname, firstname from my_db.patients where id in (select distinct pt_id from my_db.admits); quit; Æ diese Abfrage wäre auch mit einem inner join möglich SAS-Treff am URZ Heidelberg 23 Einführung in PROC SQL 10.07.2008 Data Manipulation Language Marianne Weires C050 Page 47 Beispiel: „Wir wollen zu jedem Patient alle Aufnahmen herausfinden, die von seinem Hausarzt durchgeführt wurden. Dabei interessiert uns der Patientenname, Patientenid, Aufnahmedatum, Arztname“ Æ Wir brauchen Informationen aus 3 Tabellen: my_db.admits, my_db.patients, my_db.doctors Data Manipulation Language Marianne Weires C050 Page 48 my_db.admits: Daraus bekommen wir alle Patienten, die eingeliefert wurden (nicht jeder der 15 Patienten wurde eingeliefert) und den Arzt, der eingeliefert hat PT_ID ADMDATE DISDATE MD_ID HOSP_ID DEST BP_SYS BP_DIA PRIMDX my_db.patients: Daraus bekommen wir Patientennamen und ids und die Hausarztid ID SEX PRIMMD BIRTHDTE LASTNAME FIRSTNAME my_db.doctors: Daraus bekommen wir die Arztid und den Arztnamen MD_ID SAS-Treff am URZ Heidelberg LASTNAME HOSPADM 24 Einführung in PROC SQL 10.07.2008 Data Manipulation Language Marianne Weires C050 Page 49 proc sql; create table my_db.adm_prim as select pt_id, admdate, pat.lastname as patname, doc.md_id, doc.lastname as doclastname from my_db.admits as adm inner join my_db.patients as pat on (adm.pt_id = pat.id) and (adm.md_id = pat.primmd) inner join (select distinct md_id, lastname from my_db.doctors) as doc on (adm.md_id = doc.md_id) order by adm.pt_id, admdate; quit; Data Manipulation Language Marianne Weires C050 Page 50 proc sql; create table my_db.adm_prim as select pt_id, admdate, pat.lastname as patname, doc.md_id, doc.lastname as doclastname from my_db.admits as adm inner join my_db.patients as pat on (adm.pt_id = pat.id) and (adm.md_id = pat.primmd) inner join (select distinct md_id, lastname from my_db.doctors) as doc on (adm.md_id = doc.md_id) order by adm.pt_id, admdate; quit; Erste Abfrage liefert nur Einträge für Patienten, die eingeliefert worden sind und der Einweisungsarzt der Hausarzt des Patienten ist SAS-Treff am URZ Heidelberg 25 Einführung in PROC SQL 10.07.2008 Data Manipulation Language Marianne Weires C050 Page 51 proc sql; create table my_db.adm_prim as select pt_id, admdate, pat.lastname as patname, doc.md_id, doc.lastname as doclastname from my_db.admits as adm inner join my_db.patients as pat on (adm.pt_id = pat.id) and (adm.md_id = pat.primmd) inner join (select distinct md_id, lastname from my_db.doctors) as doc on (adm.md_id = doc.md_id) order by adm.pt_id, admdate; quit; Zweite Abfrage liefert nur unterschiedliche Einträge für jeden Arzt, der Einlieferungsarzt ist und gleichzeitig Hausarzt Marianne Weires C050 Data Manipulation Language Page 52 SAS-Treff am URZ Heidelberg PT_ID ADMDATE patname 1 12APR1999 Betz MD_ID 1972 doclastname Fitzhugh 5 10APR1999 Lessing 1972 Fitzhugh 5 10MAR1999 Lessing 1972 Fitzhugh 5 19JAN1999 Lessing 1972 Fitzhugh 7 08SEP1996 Schreibe 3274 Hanratty 7 28JUL1996 Schreibe 3274 Hanratty 10 30NOV1998 Bauer 2322 MacArthu 15 17AUG1997 Humboldt 4003 Colanton 15 25MAY1997 Humboldt 4003 Colanton 26 Einführung in PROC SQL 10.07.2008 Marianne Weires C050 Page 53 In SAS: data my_db.adm_prim1 (drop = primmd); merge my_db.admits (in = adm keep = pt_id admdate md_id) my_db.patients (in = pat keep = id lastname primmd rename = (id = pt_id)); by pt_id; if adm and pat and (md_id = primmd); run; proc sort data = my_db.doctors; by md_id; run; data my_db.doctors_nodup; set my_db.doctors(keep = md_id lastname); by md_id; if first.md_id; run; proc sort data = my_db.adm_prim1; by md_id; run; data my_db.adm_prim; merge my_db.adm_prim1 (in = prim rename = (lastname = patname)) my_db.doctors_nodup (rename = (lastname = docname)); by md_id; if prim; run; Data Manipulation Language Marianne Weires C050 Page 54 • Verknüpfung von mehreren Abfragen (Set Operatoren) - vergleichbar mit set - Daten werden vertikal miteinander verknüpft - grundsätzlich Verknüpfung nach Spaltenposition - z.T. kein direktes Gegenstück in SAS Bespieldaten: Tabelle Two Tabelle One Y 1 2 9 SAS-Treff am URZ Heidelberg A A B 2 1 2 3 2 4 3 4 5 6 7 8 2 27 Einführung in PROC SQL 10.07.2008 Data Manipulation Language Marianne Weires C050 Page 55 UNION EXCEPT INTERSECT OUTER UNION Spaltenreihenfolge u.U. wichtig Modifikation durch: ALL - Doppelte Zeilen werden nicht unterdrückt. nicht mit OUTER UNION verwendbar, da hier bereits alle Zeilen ausgegeben werden CORRESPONDING (CORR) - Spalten mit gleichem Namen werden überlagert (gleiche Spaltennamen erkannt) Data Manipulation Language Marianne Weires C050 Page 56 • Union - Alle Zeilen aus Tabellen ausgegeben ohne doppelte Zeilen (Æ sonst ALL). - Verknüpfung der Spalten entsprechend der Position, d.h. Variablen gleichen Namens nicht erkannt (Æ sonst CORR) - resultierenden Spalten erhalten die Namen der ersten Tabelle * proc sql; select * from my_db.one union select * from my_db.two; quit; SAS-Treff am URZ Heidelberg A Y 1 2 2 3 2 4 3 4 5 6 7 8 9 2 28 Einführung in PROC SQL 10.07.2008 Data Manipulation Language Marianne Weires C050 Page 57 * A proc sql; select * from my_db.one union corr /* verknüpfung über gl. spaltennamen */ select * from my_db.two; quit; 1 2 3 5 7 * proc sql; select * from my_db.one union all /* doppelte Zeilen ausgeben */ select * from my_db.two; quit; Y A 1 2 2 3 9 2 1 2 2 4 3 4 5 6 7 8 Data Manipulation Language Marianne Weires C050 Page 58 • Except - Ergebnisse aus one, jedoch nicht in two - für doppelte Zeilen ALL verwenden. - Vergleich anhand gemeinsamer Variablen mit CORR proc sql; select * from my_db.one except select * from my_db.two; quit; SAS-Treff am URZ Heidelberg Y A 2 3 9 2 29 Einführung in PROC SQL 10.07.2008 Data Manipulation Language Marianne Weires C050 Page 59 • Intersect nur Beobachtungen, die in beiden Dateien die gleichen Ausprägungen in den angegebenen Spalten haben proc sql; select * from my_db.one intersect select * from my_db.two; quit; Y A 1 2 Data Manipulation Language Marianne Weires C050 Page 60 • Outer Union proc sql; select * from my_db.one outer union select* from my_db.two; quit; SAS-Treff am URZ Heidelberg Y A A B 1 2 . . 2 3 . . 9 2 . . . . 1 2 . . 2 4 . . 3 4 . . 5 6 . . 7 8 30 Einführung in PROC SQL 10.07.2008 Data Manipulation Language Marianne Weires C050 Page 61 proc sql; select * from my_db.one outer union corr /* gl. spaltennamen erkannt */ select * from my_db.two; quit; Y A B 1 2 . 2 3 . 9 2 . . 1 2 . 2 4 . 3 4 . 5 6 . 7 8 Performanz und PROC SQL Marianne Weires C050 Page 62 • Tipps für performante SQL Abfragen: - where Bedingung spezifizieren - eher join als eine subquery verwenden - auf order by in Views verzichten - Indexieren SAS-Treff am URZ Heidelberg 31 Einführung in PROC SQL 10.07.2008 Performanz und PROC SQL Marianne Weires C050 Page 63 • Der Index - Ohne Index wird eine Tabelle sequentiell gelesen - ein Index ist eine geordnete Struktur (z.B. Baum) mit Verweis auf Einträge Æ Ordnung verkürzt also die Suche nach einem bestimmten Datensatz - ein Index kann die Verknüpfung von Tabellen (joins) beschleunigen Sinnvoll einen Index zu erstellen: - bestimmte Spalten immer wieder in joins genutzt - Spaltenwerte viele untersch. Werte besitzen (einzelne Datensätze gut diskriminieren) (z.B. patienten id ↔ geschlecht) - Teilmenge der gesamten Daten benötigt wird Marianne Weires C050 Performanz und PROC SQL Page 64 Beispiel: Indexstruktur - binärer Baum - zyklenfreie Graphstruktur - besteht aus Knoten verbunden durch gerichtete Kanten SAS-Treff am URZ Heidelberg record identifier lastname firstname 001 Betz Stefan 002 Polak Edgar 003 Kampinski Igor 004 Mayer Karl 005 Lessing Katrin 006 Casper Martha 007 Schreiber Tobias 008 Schwartkopf Walter 009 Naipaul Victor 010 Bauer Jürgen 011 Voltus Jean 012 Bauer Alberta 013 Shakes William 014 Hemmingway Greg 015 Humboldt Karla 32 Einführung in PROC SQL 10.07.2008 Marianne Weires C050 Performanz und PROC SQL Page 65 Abfrage: proc sql; select name, vorname from my_db.patient where lastname = 'Humboldt' and firstname = 'Karla'; quit; Ohne Index sequentielle Suche in der ungeordneten Tabelle Æ 15 Schritte zum Finden Index über die Spalten Name und Vorname Æ binärer Baum wird angelegt Marianne Weires C050 Voltus Jean, 011 Page 66 Shakes William, 013 Schwartzkopf Walter, 008 Schreiber Tobias, 007 Polak Edgar, 002 Naipaul Victor, 009 Mayer Karl, 004 Lessing Katrin, 005 Kampinski Iger, 003 Humboldt Karla, 015 Hemmingway Greg, 014 Casper Martha, 006 Betz Stefan, 001 Bauer Jürgen, 010 Bauer Alberta, 012 SAS-Treff am URZ Heidelberg 33 Einführung in PROC SQL 10.07.2008 Marianne Weires C050 Voltus Jean, 011 Page 67 Shakes William, 013 Schwartzkopf Walter, 008 Schreiber Tobias, 007 Polak Edgar, 002 Naipaul Victor, 009 Mayer Karl, 004 Lessing Katrin, 005 Kampinski Iger, 003 Humboldt Karla, 015 Hemmingway Greg, 014 Casper Martha, 006 Betz Stefan, 001 Bauer Jürgen, 010 Bauer Alberta, 012 Marianne Weires C050 Voltus Jean, 011 Page 68 Shakes William, 013 Schwartzkopf Walter, 008 Schreiber Tobias, 007 Polak Edgar, 002 Naipaul Victor, 009 Mayer Karl, 004 Lessing Katrin, 005 Kampinski Iger, 003 Humboldt Karla, 015 Hemmingway Greg, 014 Casper Martha, 006 Betz Stefan, 001 Bauer Jürgen, 010 Bauer Alberta, 012 SAS-Treff am URZ Heidelberg 34 Einführung in PROC SQL 10.07.2008 Marianne Weires C050 Voltus Jean, 011 Page 69 Shakes William, 013 Schwartzkopf Walter, 008 Schreiber Tobias, 007 Polak Edgar, 002 Naipaul Victor, 009 Mayer Karl, 004 Lessing Katrin, 005 Kampinski Iger, 003 Humboldt Karla, 015 Hemmingway Greg, 014 Casper Martha, 006 Betz Stefan, 001 Bauer Jürgen, 010 Bauer Alberta, 012 Æ 3 Schritte zum Finden der internen Adresse und 1 Schritt zum Nachschauen des Datensatzes in der Tabelle. Performanz und PROC SQL Marianne Weires C050 Page 70 • Manche Knoten sind durch das Umorganisieren schlechter als vorher platziert (z.B. „Betz Stefan“) Æ Im Durchschnitt verringert sich aber die Anzahl der Vergleiche • Blattknoten möglichst die gleiche Distanz zum Wurzelknoten Æ balancierter Baum Æ nach Hinzufügen/Löschen Baum wieder ausbalancieren Æ B-Bäume in DB (balancierte Bäume Æ weniger Zugriffe) • zusätzlicher Speicherverbrauch für einen Index Æ jedoch werden die meisten Datenbanken viel häufiger gelesen als geschrieben • Indexierte Daten müssen vor einer by Verarbeitung nicht mehr sortiert werden • Indizes werden beim nachfolgenden sortieren ungültig (force Option setzen) proc sort data = my_db.two force; by A; run; SAS-Treff am URZ Heidelberg 35 Einführung in PROC SQL 10.07.2008 Performanz und PROC SQL Marianne Weires C050 Page 71 • Beispiel: proc sql; select id, sex, couple_id from spouses.couples_02 where id not in (select id from spouses.all); quit; Ohne Index: NOTE: PROCEDURE SQL used (Total process time): real time 16:39.15 cpu time 5:40.26 Mit Index (id): 476 create index id 477 on spouses.couples_02(id); real time 2:59.75 cpu time 11.39 seconds 478 479 create index id 480 on spouses.all; real time 5:18.38 cpu time 10.93 seconds NOTE: SQL Statement used (Total process time): real time 3:32.08 cpu time 24.35 seconds Marianne Weires C050 Page 72 SAS und relationale Datenbanken • SAS/ACCESS Software: Schnittstelle zwischen SAS SW und einem anderen DB Management System Zugriffsmöglichkeiten: libname Anweisung - einer Datenbank eine SAS library zuweisen - Zugriff auf DB mit DATA Step Programmierung - Optimierung von joins und anderen Funktionen (Indizes der Datenbank genutzt) libname my_lib mysql user = testuser password = testpass database = mysqldb server = mysqlserv port = 9876; proc print data = my_lib.employees; where dept = 'CSR010';run; SAS-Treff am URZ Heidelberg PROC SQL Pass-Through Facility - SQL Erweiterungen der jeweiligen DB können genutzt werden - Optimierung von joins und anderen Funktionen (Indizes der Datenbank genutzt) proc sql; connect to mysql (user = ...); select * from connection to mysql (select * from customers); disconnect from mysql; quit; 36 Einführung in PROC SQL 10.07.2008 Zusammenfassung Marianne Weires C050 Page 73 • Nicht behandelt: - Aggregierungsfunktionen - Makrovariablen und SQL • Fazit: - Kompaktere Anweisungen mit PROC SQL - Set Operatoren Æ kein direktes Gegenstück für UNION, EXCEPT, INTERSECT in SAS - Keine statistischen Auswertungen mit PROC SQL - SQL ist DER Standard für relationale Datenbanksysteme Marianne Weires C050 Literaturliste Page 74 DATA Step vs. PROC SQL: What’s a neophyte to do? Craig Dickstein, (Paper 61-26) Proceedings of the 12th Annual NorthEast SAS Users Group Conference, Washington, DC, 1999. An Introduction to PROC SQL, Rosalind K. Gusinow and J. Michael Miscisin (Handson Workshops) Undocumented and Hard-to-find SQL Features Kirk Paul Lafler (Paper 19-28) SAS Institute Inc., 2004. SAS/ACCESS 9.1.2 Supplement for MySQL Frequently Asked Questions about SAS Indexes (Paper 008-30) An Introduction to SQL in SAS Pete Lund (Paper 257-30) * SAS Institute Inc., 2004. SAS9.1 SQL Procedure User’s Guide. * PROC SQL for DATA Step Die-Hards, Williams, C.S. (manche Beispiele) SQL SET OPERATORS: SO HANDY VENN YOU NEED THEM, Howard Schreier (PAPER 242-31) * Creating and Exploiting SAS Indexes Michael A. Raithel (Paper 123-29) Top Ten Reasons to Use PROC SQL Weiming Hu (Paper 042-29) SAS-Treff am URZ Heidelberg * * 37 Einführung in PROC SQL Marianne Weires C050 10.07.2008 Einführung in PROC SQL Page 75 Vielen Dank für die Aufmerksamkeit! Bei weiteren Fragen: [email protected] SAS-Treff am URZ Heidelberg 38