Examples: Use the SQL Procedure with DBMS Data

Overview

Rather than performing operations on your data in SAS, you can perform operations on data directly in your DBMS by using the LIBNAME statement and the SQL procedure. These examples use the SQL procedure to query, update, and create DBMS tables.

Examples: Query a DBMS Table

Example 1: Query a DBMS Table

This example uses the SQL procedure to query the Payroll Oracle table. The PROC SQL query retrieves all job codes and provides a total salary amount for each job code.
libname mydblib oracle user=testuser password=testpass;

title 'Total Salary by Jobcode';

proc sql;
  select jobcode label='Jobcode',
         sum(salary) as total
         label='Total for Group'
         format=dollar11.2
  from mydblib.payroll
  group by jobcode;
quit;
Query a DBMS Table
                Total Salary by Jobcode

                                Total for
                 Jobcode            Group

                     BCK      $232,148.00
                     FA1      $253,433.00
                     FA2      $447,790.00
                     FA3      $230,537.00
                     ME1      $228,002.00
                     ME2      $498,076.00
                     ME3      $296,875.00
                     NA1      $210,161.00
                     NA2      $157,149.00
                     PT1      $543,264.00
                     PT2      $879,252.00
                     PT3       $21,009.00
                     SCP      $128,162.00
                     TA1      $249,492.00
                     TA2      $671,499.00
                     TA3      $476,155.00

Example 2: Query a DBMS Table with a WHERE Clause

The next example uses the SQL procedure to query flight information from the Delay Oracle table. The WHERE clause specifies that only flights to London and Frankfurt are retrieved.
libname mydblib oracle user=testuser password=testpass;

 title 'Flights to London and Frankfurt';

 proc sql;
   select dates format=datetime9.,
     dest from mydblib.delay
   where (dest eq "FRA") or
     (dest eq "LON")
   order by dest;
quit;
To optimize performance, SAS/ACCESS passes the entire join to the DBMS for processing by default. For more information, see Overview: Optimizing Your SQL Usage.
Query a DBMS Table with a WHERE Clause
               Flights to London and Frankfurt

                          DATES  DEST

                      01MAR1998  FRA
                      04MAR1998  FRA
                      07MAR1998  FRA
                      03MAR1998  FRA
                      05MAR1998  FRA
                      02MAR1998  FRA
                      04MAR1998  LON
                      07MAR1998  LON
                      02MAR1998  LON
                      06MAR1998  LON
                      05MAR1998  LON
                      03MAR1998  LON
                      01MAR1998  LON

Example 3: Query a DBMS Table with SAS Extensions

This example uses the SQL procedure to query the InterNat DB2 table for information about international flights with more than 200 passengers. A PROC SQL query sorts output. Also, the TITLE, LABEL, and FORMAT keywords are not ANSI-standard SQL—they are SAS extensions that you can use in PROC SQL.
libname mydblib db2 ssid=db2;

proc sql;
   title  'International Flights by Flight Number';
   title2 'with More Than 200 Passengers';
   select flight   label="Flight Number",
          dates    label="Departure Date"
                   format datetime9.,
          dest     label="Destination",
          boarded  label="Number Boarded"
     from mydblib.internat
    where boarded > 200
    order by flight;
quit;
Query a DBMS Table with SAS Extensions
             International Flights by Flight Number
                    with More Than 200 Passengers

           Flight  Departure                 Number
           Number       Date  Destination   Boarded
           ----------------------------------------
           219     04MAR1998  LON               232
           219     07MAR1998  LON               241
           622     07MAR1998  FRA               210
           622     01MAR1998  FRA               207

Examples: Query Multiple DBMS Tables

Example 1: Query Multiple Oracle Tables

You can also retrieve data from multiple DBMS tables in a single query by using the SQL procedure. This example joins the Staff and Payroll Oracle tables to query salary information for employees who earn more than $40,000.
libname mydblib oracle user=testuser password=testpass;

title 'Employees with salary greater than $40,000';

options obs=20;

proc sql;
  select a.lname, a.fname, b.salary
    format=dollar10.2
  from mydblib.staff a, mydblib.payroll b
  where (a.idnum eq b.idnum) and
    (b.salary gt 40000);
quit;
To optimize performance, SAS/ACCESS passes the entire join to the DBMS for processing by default. For more information, see Passing Joins to the DBMS.
Query Multiple Oracle Tables
          Employees with salary greater than $40,000
          LNAME            FNAME                SALARY
          --------------------------------------------
          WELCH            DARIUS            $40,858.00
          VENTER           RANDALL           $66,558.00
          THOMPSON         WAYNE             $89,977.00
          RHODES           JEREMY            $40,586.00
          DENNIS           ROGER             $111379.00
          KIMANI           ANNE              $40,899.00
          O'NEAL           BRYAN             $40,079.00
          RIVERS           SIMON             $53,798.00
          COHEN            LEE               $91,376.00
          GREGORSKI        DANIEL            $68,096.00
          NEWKIRK          WILLIAM           $52,279.00
          ROUSE            JEREMY            $43,071.00
       

Example 2: Query Multiple DB2 Tables

This example uses the SQL procedure to join and query the March, Delay, and Flight DB2 tables. The query retrieves information about delayed international flights during the month of March.
libname mydblib db2 ssid=db2;

title "Delayed International Flights in March";

proc sql;
  select distinct march.flight, march.dates format datetime9.,
      delay format=2.0
    from mydblib.march, mydblib.delay,
      mydblib.internat
  where march.flight=delay.flight and
      march.dates=delay.dates and
      march.flight=internat.flight and
      delay>0
  order by delay descending;
quit;
Note: To optimize performance, SAS/ACCESS passes the entire join to the DBMS for processing by default. For more information, see Passing Joins to the DBMS.
Query Multiple DB2 Tables
           Delayed International Flights in March

                 FLIGHT      DATES  DELAY
                 ------------------------
                 622     04MAR1998     30
                 219     06MAR1998     27
                 622     07MAR1998     21
                 219     01MAR1998     18
                 219     02MAR1998     18
                 219     07MAR1998     15
                 132     01MAR1998     14
                 132     06MAR1998       7
                 132     03MAR1998       6
                 271     01MAR1998       5
                 132     02MAR1998       5
                 271     04MAR1998       5
                 271     05MAR1998       5
                 271     02MAR1998       4
                 219     03MAR1998       4
                 271     07MAR1998       4
                 219     04MAR1998       3
                 132     05MAR1998       3
                 219     05MAR1998       3
                 271     03MAR1998       2

Example 3: Query Multiple DBMS Tables

This example uses the SQL procedure to retrieve the combined results of two queries to the Payroll and Payroll2 Oracle tables. An OUTER UNION in PROC SQL concatenates the data.
libname mydblib oracle user=testuser password=testpass;

title "Payrolls 1 & 2";

proc sql;
  select idnum, sex, jobcode, salary,
         birth format datetime9., hired format datetime9.
     from mydblib.payroll
  outer union corr
     select *
        from mydblib.payroll2
        order by idnum, jobcode, salary;
quit;
Query Multiple DBMS Tables
               Payrolls 1 and 2

IDNUM  SEX  JOBCODE    SALARY      BIRTH      HIRED
---------------------------------------------------
1009   M    TA1         28880  02MAR1959  26MAR1992
1017   M    TA3         40858  28DEC1957  16OCT1981
1036   F    TA3         39392  19MAY1965  23OCT1984
1036   F    TA3         42465  19MAY1965  23OCT1984
1037   F    TA1         28558  10APR1964  13SEP1992
1038   F    TA1         26533  09NOV1969  23NOV1991
1050   M    ME2         35167  14JUL1963  24AUG1986
1065   M    ME2         35090  26JAN1944  07JAN1987
1065   M    ME3         38090  26JAN1944  07JAN1987
1076   M    PT1         66558  14OCT1955  03OCT1991
1076   M    PT1         69742  14OCT1955  03OCT1991
1094   M    FA1         22268  02APR1970  17APR1991
1100   M    BCK         25004  01DEC1960  07MAY1988
1101   M    SCP         18723  06JUN1962  01OCT1990
1102   M    TA2         34542  01OCT1959  15APR1991
1103   F    FA1         23738  16FEB1968  23JUL1992
1104   M    SCP         17946  25APR1963  10JUN1991
1105   M    ME2         34805  01MAR1962  13AUG1990

Examples: Update DBMS Data

Example 1: Add to DBMS Data

In addition to querying data, you can also update data directly in your DBMS. You can update rows, columns, and tables by using the SQL procedure. This example adds a new row to the SuperV DB2 table.
libname mydblib db2 ssid=db2;

proc sql;
insert into mydblib.superv
  values('1588','NY','FA');
quit;

proc print data=mydblib.superv;
  title "New Row in AIRLINE.SUPERV";
run;
Note: Depending on how your DBMS processes insert, the new row might not be added as the last physical row of the table.
Add to DBMS Data
   New Row in AIRLINE.SUPERV

OBS    SUPID    STATE    JOBCAT

 1    1677      CT        BC
 2    1834      NY        BC
 3    1431      CT        FA
 4    1433      NJ        FA
 5    1983      NY        FA
 6    1385      CT        ME
 7    1420      NJ        ME
 8    1882      NY        ME
 9    1935      CT        NA
10    1417      NJ        NA
11    1352      NY        NA
12    1106      CT        PT
13    1442      NJ        PT
14    1118      NY        PT
15    1405      NJ        SC
16    1564      NY        SC
17    1639      CT        TA
18    1401      NJ        TA
19    1126      NY        TA
20    1588      NY        FA

Example 2: Delete DBMS Data

This example deletes data from the Staff DB2 table for all employees who work in Connecticut.
libname mydblib db2 ssid=db2;

proc sql;
  delete from mydblib.staff
    where state='CT';
quit;

options obs=20;

proc print data=mydblib.staff;
   title "AIRLINE.STAFF After Deleting Connecticut Employees";
run;
Note: If you omit a WHERE clause when you delete rows from a table, all rows in the table are deleted.
Delete DBMS Data
                  AIRLINE.STAFF After Deleting Connecticut Employees

     OBS IDNUM LNAME           FNAME           CITY            STATE HPHONE

       1 1400  ALHERTANI       ABDULLAH        NEW YORK         NY   212/586-0808
       2 1350  ALVAREZ         MERCEDES        NEW YORK         NY   718/383-1549
       3 1401  ALVAREZ         CARLOS          PATERSON         NJ   201/732-8787
       4 1499  BAREFOOT        JOSEPH          PRINCETON        NJ   201/812-5665
       5 1101  BAUCOM          WALTER          NEW YORK         NY   212/586-8060
       6 1402  BLALOCK         RALPH           NEW YORK         NY   718/384-2849
       7 1479  BALLETTI        MARIE           NEW YORK         NY   718/384-8816
       8 1739  BRANCACCIO      JOSEPH          NEW YORK         NY   212/587-1247
       9 1658  BREUHAUS        JEREMY          NEW YORK         NY   212/587-3622
      10 1244  BUCCI           ANTHONY         NEW YORK         NY   718/383-3334
      11 1383  BURNETTE        THOMAS          NEW YORK         NY   718/384-3569
      12 1574  CAHILL          MARSHALL        NEW YORK         NY   718/383-2338
      13 1789  CARAWAY         DAVIS           NEW YORK         NY   212/587-9000
      14 1404  COHEN           LEE             NEW YORK         NY   718/384-2946
      15 1065  COPAS           FREDERICO       NEW YORK         NY   718/384-5618
      16 1876  CHIN            JACK            NEW YORK         NY   212/588-5634
      17 1129  COUNIHAN        BRENDA          NEW YORK         NY   718/383-2313
      18 1988  COOPER          ANTHONY         NEW YORK         NY   212/587-1228
      19 1405  DACKO           JASON           PATERSON         NJ   201/732-2323
      20 1983  DEAN            SHARON          NEW YORK         NY   718/384-1647

Example 3: Create a DBMS Table

You can create new tables in your DBMS by using the SQL procedure. This example uses the SQL procedure to create the GTForty Oracle table by using data from the Staff and Payroll Oracle tables.
libname mydblib oracle user=testuser password=testpass;

proc sql;
  create table mydblib.gtforty as
  select lname as lastname,
         fname as firstname,
         salary as Salary
           format=dollar10.2
  from mydblib.staff a,
       mydblib.payroll b
  where (a.idnum eq b.idnum) and
        (salary gt 40000);
quit;

options obs=20;

proc print data=mydblib.gtforty noobs;
  title 'Employees with salaries greater than $40,000';
  format salary dollar10.2;
run;
Create a DBMS Table
      Employees with salaries greater than $40,000

 LASTNAME           FIRSTNAME              SALARY

 WELCH              DARIUS             $40,858.00
 VENTER             RANDALL            $66,558.00
 MARSHBURN          JASPER             $89,632.00
 THOMPSON           WAYNE              $89,977.00
 RHODES             JEREMY             $40,586.00
 KIMANI             ANNE               $40,899.00
 CASTON             FRANKLIN           $41,690.00
 STEPHENSON         ADAM               $42,178.00
 BANADYGA           JUSTIN             $88,606.00
 O'NEAL             BRYAN              $40,079.00
 RIVERS             SIMON              $53,798.00
 MORGAN             ALFRED             $42,264.00