home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 8 Other / 08-Other.zip / rsql.zip / RSQL.SCR < prev    next >
Text File  |  1994-01-13  |  18KB  |  470 lines

  1. EXEC DBA: CONTINUE_ON_ERROR;
  2. EXEC DBA: STARTUSE SAMPLE S;
  3.  
  4. --  *------------------------------------------------------------------*
  5. --  * SCRIPT  1:  A simple SQL Query Demonstration                     *
  6. --  *------------------------------------------------------------------*
  7.  
  8. --  ****** Display all rows and columns from the ORG table        ******
  9. EXEC SQL: SELECT * FROM ORG
  10.           ORDER BY DIVISION, LOCATION;
  11.  
  12. --  ****** Display all rows and columns from the STAFF table      ******
  13. EXEC SQL: SELECT * FROM STAFF
  14.           ORDER BY NAME;
  15.  
  16. --  *------------------------------------------------------------------*
  17. --  * SCRIPT  2:  A demonstration of the WHERE search clause           *
  18. --  *------------------------------------------------------------------*
  19.  
  20. --  ****** A simple relational predicate with no duplicate rows   ******
  21. EXEC SQL: SELECT DISTINCT *
  22.           FROM ORG
  23.           WHERE DIVISION = 'EASTERN';
  24.  
  25. --  ****** Using OR to connect relational predicates              ******
  26. EXEC SQL: SELECT *
  27.           FROM STAFF
  28.           WHERE (JOB = 'SALES' AND YEARS > 8)
  29.              OR (JOB = 'SALES' AND COMM >= 1200);
  30.  
  31. --  ****** Wild card pattern-matching using the LIKE predicate    ******
  32. EXEC SQL: SELECT ID, NAME
  33.           FROM STAFF
  34.           WHERE NAME LIKE 'LU%';
  35.  
  36. --  ****** The BETWEEN predicate for comparing ranges of values   ******
  37. EXEC SQL: SELECT ID, NAME, SALARY
  38.           FROM STAFF
  39.           WHERE SALARY BETWEEN 20000 AND 21000;
  40.  
  41. --  ****** The IN predicate for testing group membership          ******
  42. EXEC SQL: SELECT ID, NAME, DEPT
  43.           FROM STAFF
  44.           WHERE DEPT IN (66, 84);
  45.  
  46. --  ****** The NULL predicate for testing NULL values             ******
  47. EXEC SQL: SELECT ID, NAME, DEPT
  48.           FROM STAFF
  49.           WHERE YEARS IS NULL;
  50.  
  51. --  *------------------------------------------------------------------*
  52. --  * SCRIPT  3:  A demonstration of the ORDER by clause               *
  53. --  *------------------------------------------------------------------*
  54.  
  55. --  ****** The default sorting order is ascending (ASC)           ******
  56. EXEC SQL: SELECT DEPT, NAME, ID
  57.           FROM STAFF
  58.           WHERE (DEPT = 10 OR DEPT = 20)
  59.           ORDER BY DEPT, NAME;
  60.  
  61. --  ****** You can override the default by specifying (DESC)      ******
  62. EXEC SQL: SELECT *
  63.           FROM ORG
  64.           ORDER BY DIVISION DESC, DEPTNUMB DESC;
  65.  
  66.  
  67. --  *------------------------------------------------------------------*
  68. --  * SCRIPT  4:  A demonstration of simple NESTED Queries             *
  69. --  *------------------------------------------------------------------*
  70.  
  71. --  ****** The inner SELECT returns a single value                ******
  72. EXEC SQL: SELECT NAME, JOB, YEARS, SALARY, COMM
  73.           FROM STAFF
  74.           WHERE JOB = 'Sales'
  75.           AND SALARY > (
  76.           SELECT AVG(SALARY) FROM STAFF WHERE JOB = 'Mgr');
  77.  
  78. --  ****** The inner SELECT returns multiple values               ******
  79. EXEC SQL: SELECT NAME, JOB, YEARS, SALARY, COMM
  80.           FROM STAFF
  81.           WHERE JOB = 'Sales'
  82.           AND YEARS > ALL (
  83.           SELECT YEARS FROM STAFF WHERE JOB = 'Mgr');
  84.  
  85. --  ****** Different tables involved in inner and outer queries   ******
  86. EXEC SQL: SELECT NAME, JOB, YEARS, SALARY, COMM
  87.           FROM STAFF
  88.           WHERE JOB = 'Sales'
  89.           AND DEPT IN (
  90.           SELECT DEPTNUMB FROM ORG WHERE DIVISION = 'Eastern')
  91.           ORDER BY YEARS;
  92.  
  93. --  *------------------------------------------------------------------*
  94. --  * SCRIPT  5:  A demonstration of compount NESTED queries           *
  95. --  *------------------------------------------------------------------*
  96.  
  97. --  ****** Two subqueries at the same level                       ******
  98. EXEC SQL: SELECT NAME, JOB, YEARS, SALARY, COMM
  99.           FROM STAFF
  100.           WHERE JOB = 'Sales'
  101.           AND (salary + comm) >
  102.               (SELECT MIN(salary) FROM staff where job='Mgr')
  103.           AND dept IN
  104.               (SELECT deptnumb from org WHERE division='Eastern')
  105.           ORDER BY job, salary;
  106.  
  107. --  ****** A subquery inside another subquery                     ******
  108. EXEC SQL: SELECT NAME, JOB, YEARS, SALARY, COMM
  109.           FROM STAFF
  110.           WHERE JOB = 'Sales'
  111.           AND years > ALL
  112.               (SELECT years FROM staff where job='Mgr'
  113.                AND dept IN
  114.                    (SELECT deptnumb FROM org WHERE division='Eastern'))
  115.           ORDER BY years;
  116.  
  117. --  *------------------------------------------------------------------*
  118. --  * SCRIPT  6:  A demonstration of CORRELATED subqueries             *
  119. --  *------------------------------------------------------------------*
  120.  
  121. --  ****** Inner query runs once for each job category            ******
  122. EXEC SQL: SELECT NAME, JOB, YEARS, SALARY, COMM
  123.           FROM STAFF S
  124.           WHERE SALARY =
  125.               (SELECT MAX(SALARY) FROM STAFF WHERE JOB = S.JOB)
  126.           ORDER BY JOB, SALARY;
  127.  
  128. --  *------------------------------------------------------------------*
  129. --  * SCRIPT  7:  A demonstration of set operators                     *
  130. --  *------------------------------------------------------------------*
  131.  
  132. --  ****** Merging two queries with the INTESECT set operator     ******
  133. EXEC SQL: SELECT NAME, JOB
  134.           FROM STAFF
  135.           WHERE JOB = 'Sales'
  136.           INTERSECT
  137.           SELECT NAME, JOB
  138.           FROM STAFF
  139.           WHERE YEARS > 10;
  140.  
  141. --  ****** Merging two queries with the EXCEPT set operator       ******
  142. EXEC SQL: SELECT NAME, JOB
  143.           FROM STAFF
  144.           WHERE JOB = 'Sales'
  145.           EXCEPT
  146.           SELECT NAME, JOB
  147.           FROM STAFF
  148.           WHERE YEARS > 10
  149.           ORDER BY 1;
  150.  
  151. --  ****** Merging two queries with the UNION set operator        ******
  152. EXEC SQL: SELECT NAME, JOB
  153.           FROM STAFF
  154.           WHERE JOB = 'Sales'
  155.           UNION
  156.           SELECT NAME, JOB
  157.           FROM STAFF
  158.           WHERE YEARS > 10
  159.           ORDER BY 1;
  160.  
  161. --  *------------------------------------------------------------------*
  162. --  * SCRIPT  8:  A demonstration of JOINS                             *
  163. --  *------------------------------------------------------------------*
  164.  
  165. --  ****** Two-table equijoin using fully qualified names         ******
  166. EXEC SQL: SELECT ORG.DEPTNAME, ORG.LOCATION, STAFF.NAME, STAFF.SALARY
  167.           FROM STAFF, ORG
  168.           WHERE ORG.MANAGER = STAFF.ID
  169.           ORDER BY ORG.DEPTNAME;
  170.  
  171. --  ****** Two-table equijoin using correlation names             ******
  172. EXEC SQL: SELECT O.DEPTNAME, O.LOCATION, S.NAME, S.SALARY
  173.           FROM STAFF S, ORG O
  174.           WHERE O.MANAGER = S.ID
  175.           ORDER BY O.DEPTNAME;
  176.  
  177. --  *------------------------------------------------------------------*
  178. --  * SCRIPT  9:  Creating Tables, Inserts, Updates and Deletes        *
  179. --  *------------------------------------------------------------------*
  180.  
  181. --  ****** Create the staff table's twin                          ******
  182. EXEC SQL: CREATE TABLE NEWSTAFF
  183.                        (ID        SMALLINT NOT NULL,
  184.                         NAME      VARCHAR(9),
  185.                         DEPT      SMALLINT,
  186.                         JOB       CHAR(5),
  187.                         YEARS     SMALLINT,
  188.                         SALARY    DECIMAL(7,2),
  189.                         COMM      DECIMAL(7,2));
  190.  
  191. --  ****** Insert two rows into the NEWSTAFF table                ******
  192. EXEC SQL: INSERT INTO NEWSTAFF
  193.           VALUES (500, 'Bob', 99, 'Nerds', 5, 45000.00, 0);
  194. EXEC SQL: INSERT INTO NEWSTAFF
  195.           VALUES (501, 'Dan', 99, 'Nerds', 4, 42000.00, 0);
  196.  
  197. --  ****** Use a subquery to insert rows from STAFF               ******
  198. EXEC SQL: INSERT INTO NEWSTAFF
  199.                  SELECT * FROM STAFF
  200.                  WHERE  JOB = 'Sales' AND SALARY > 18000;
  201.  
  202. --  ****** COMMIT the work done so far                            ******
  203. EXEC SQL: COMMIT;
  204.  
  205. --  ****** Let's see what we've got                               ******
  206. EXEC SQL: SELECT * FROM NEWSTAFF
  207.           ORDER BY SALARY DESC;
  208.  
  209. --  ****** Let's give ourselves a good raise                      ******
  210. EXEC SQL: UPDATE NEWSTAFF
  211.           SET SALARY = SALARY * 1.80
  212.           WHERE JOB = 'Nerds';
  213.  
  214. --  ****** Things look better now                                 ******
  215. EXEC SQL: SELECT * FROM NEWSTAFF
  216.           WHERE SALARY + COMM > 21000
  217.           ORDER BY SALARY DESC;
  218.  
  219. --  ****** Here's how DELETE works                                ******
  220. EXEC SQL: DELETE FROM NEWSTAFF
  221.           WHERE JOB = 'Sales';
  222.  
  223. --  ****** Let's see what happened                                ******
  224. EXEC SQL: SELECT * FROM NEWSTAFF
  225.           ORDER BY SALARY DESC;
  226.  
  227. --  *------------------------------------------------------------------*
  228. --  * SCRIPT 10:  A demonstration of COMMIT/ROLLBACK                   *
  229. --  *------------------------------------------------------------------*
  230.  
  231. --  ****** Start a unit of recovery                               ******
  232. EXEC SQL: COMMIT;
  233.  
  234. --  ****** Let's see what we've got to start                      ******
  235. EXEC SQL: SELECT * FROM NEWSTAFF;
  236.  
  237. --  ****** Delete all the rows                                    ******
  238. EXEC SQL: DELETE FROM NEWSTAFF;
  239.  
  240. --  ****** Show the empty table                                   ******
  241. EXEC SQL: SELECT * FROM NEWSTAFF;
  242.  
  243. --  ****** Undo the transaction                                   ******
  244. EXEC SQL: ROLLBACK;
  245.  
  246. --  ****** Show the resurrected rows                              ******
  247. EXEC SQL: SELECT * FROM NEWSTAFF;
  248.  
  249. --  *------------------------------------------------------------------*
  250. --  * SCRIPT 11:  Data integrity with NO NULLS                         *
  251. --  *------------------------------------------------------------------*
  252.  
  253. --  ****** Here's a way to insert missing values in regular cols  ******
  254. EXEC SQL: INSERT INTO NEWSTAFF (ID, NAME, DEPT, JOB)
  255.           VALUES (506, 'Ray', 99, 'Nerds');
  256.  
  257. --  ****** Here's another way                                     ******
  258. EXEC SQL: INSERT INTO NEWSTAFF
  259.           VALUES (507, 'Dan', 99, 'Nerds', NULL, NULL, NULL);
  260.  
  261. --  ****** Let's see what we've got                               ******
  262. EXEC SQL: SELECT * FROM NEWSTAFF;
  263.  
  264. --  ****** Watch what happens when inserting into a NOT NULL col  ******
  265. EXEC SQL: INSERT INTO NEWSTAFF
  266.           VALUES (NULL, 'Joe', 99, 'Nerds', 1, 30000.00, 0.0);
  267.  
  268. --  ****** Let's get rid of the garbage data                      ******
  269. EXEC SQL: ROLLBACK;
  270.  
  271. --  *------------------------------------------------------------------*
  272. --  * SCRIPT 12:  Data integrity with UNIQUE keys                      *
  273. --  *------------------------------------------------------------------*
  274.  
  275. --  ****** Let's try inserting a duplicate record into NEWSTAFF   ******
  276. EXEC SQL: INSERT INTO NEWSTAFF
  277.           VALUES (501, 'Dan', 99, 'Nerds', 4, 75600.00, 0);
  278.  
  279. --  ****** As you can see we're not protected against duplicates  ******
  280. EXEC SQL: SELECT * FROM NEWSTAFF;
  281.  
  282. --  ****** Let's get rid of this entry                            ******
  283. EXEC SQL: ROLLBACK;
  284.  
  285. --  ****** Let's protect ourselves, add a UNIQUE index on ID      ******
  286. EXEC SQL: CREATE UNIQUE INDEX XID ON NEWSTAFF (ID)
  287.  
  288. --  ****** Let's see if ENTITY INTEGRITY really works             ******
  289. EXEC SQL: INSERT INTO NEWSTAFF
  290.           VALUES (501, 'Dan', 99, 'Nerds', 4, 42000.00, 0);
  291.  
  292. --  ****** COMMIT the work done so far                            ******
  293. EXEC SQL: COMMIT;
  294.  
  295. --  *------------------------------------------------------------------*
  296. --  * SCRIPT 13:  Data integrity using views with CHECK option         *
  297. --  *------------------------------------------------------------------*
  298.  
  299. --  ****** Create a view PROTECT_STAFF with CHECK option          ******
  300. EXEC SQL: CREATE VIEW PROTECT_STAFF
  301.           AS SELECT * FROM NEWSTAFF
  302.           WHERE JOB = 'Nerds' OR JOB = 'Sales'
  303.           WITH CHECK OPTION;
  304.  
  305. --  ****** Let's see what's in this view so far                   ******
  306. EXEC SQL: SELECT * FROM PROTECT_STAFF;
  307.  
  308. --  ****** Let's put some more data in PROTECT_STAFF              ******
  309. EXEC SQL: INSERT INTO PROTECT_STAFF
  310.           SELECT * FROM STAFF
  311.           WHERE JOB = 'Sales' and SALARY > 20000;
  312.  
  313. --  ****** Now let's insert another well-paid nerd                ******
  314. EXEC SQL: INSERT INTO PROTECT_STAFF
  315.           VALUES (508, 'Joe', 99, 'Nerds', 4, 99000.00, 0.0);
  316.  
  317. --  ****** Watch what happens when we try to insert a Mgr         ******
  318. EXEC SQL: INSERT INTO PROTECT_STAFF
  319.           VALUES (603, 'Sam', 99, 'Mgr', 4, 89000.00, 0.0);
  320.  
  321. --  ****** COMMIT the work done so far                            ******
  322. EXEC SQL: COMMIT;
  323.  
  324. --  *------------------------------------------------------------------*
  325. --  * SCRIPT 14:  Enforcing Data Integrity with Referential Integrity  *
  326. --  *------------------------------------------------------------------*
  327.  
  328. --  ****** Create the ORG table's cousin                          ******
  329. EXEC SQL: CREATE TABLE NEWORG
  330.           (DEPTNUMB SMALLINT NOT NULL PRIMARY KEY,
  331.            DEPTNAME VARCHAR(14),
  332.            MANAGER  SMALLINT,
  333.            DIVISION VARCHAR(10),
  334.            LOCATION VARCHAR(13));
  335.  
  336. --  ****** Let's put some data into it                            ******
  337. EXEC SQL: INSERT INTO NEWORG
  338.           VALUES (99, 'Software', NULL, 'Oceanview', 'Hawaii');
  339. EXEC SQL: INSERT INTO NEWORG
  340.           VALUES (90, 'Multimedia', NULL, 'Oceanview', 'Tahiti');
  341.  
  342. --  ****** Let's start with only Nerds in the NEWSTAFF table      ******
  343. EXEC SQL: DELETE FROM NEWSTAFF
  344.           WHERE JOB <> 'Nerds';
  345.  
  346. --  ****** Let's see what we've got so far                        ******
  347. EXEC SQL: SELECT * FROM NEWORG;
  348. EXEC SQL: SELECT * FROM NEWSTAFF;
  349.  
  350. --  ****** Make DEPT a foreign key to primary key in NEWORG       ******
  351. EXEC SQL: ALTER TABLE NEWSTAFF
  352.           FOREIGN KEY KEYNAME1(DEPT) REFERENCES NEWORG
  353.           ON DELETE RESTRICT;
  354.  
  355. --  ****** Insert data for a valid dept                           ******
  356. EXEC SQL: INSERT INTO NEWSTAFF
  357.           VALUES (605, 'Newhire', 99, 'Nerds', 0, 29000.00, 0.0);
  358. EXEC SQL: INSERT INTO NEWSTAFF
  359.           VALUES (607, 'Newhire', 90, 'Nerds', 0, 29000.00, 0.0);
  360.  
  361. --  ****** Watch what happens when inserting with an invalid dept ******
  362. EXEC SQL: INSERT INTO NEWSTAFF
  363.           VALUES (609, 'Newhire', 20, 'Nerds', 0, 29000.00, 0.0);
  364.  
  365. --  ****** COMMIT the work done so far                            ******
  366. EXEC SQL: COMMIT;
  367.  
  368. --  *------------------------------------------------------------------*
  369. --  * SCRIPT 15:  Enforcing Delete Rules with Referential Integrity    *
  370. --  *------------------------------------------------------------------*
  371.  
  372. --  ****** Observe how the default DELETE rule protects dependents******
  373. EXEC SQL: DELETE FROM NEWORG
  374.           WHERE LOCATION = 'Tahiti';
  375.  
  376. --  ****** COMMIT the work done so far                            ******
  377. EXEC SQL: COMMIT;
  378.  
  379. --  ****** Let's see what data is in our tables                   ******
  380. EXEC SQL: SELECT * FROM NEWORG;
  381. EXEC SQL: SELECT * FROM NEWSTAFF;
  382.  
  383. --  ****** DROP the referential constraint                        ******
  384. EXEC SQL: ALTER TABLE NEWSTAFF
  385.           DROP FOREIGN KEY KEYNAME1;
  386.  
  387. --  ****** Let's change the referential constraint to SET NULLS   ******
  388. EXEC SQL: ALTER TABLE NEWSTAFF
  389.           FOREIGN KEY KEYNAME1(DEPT) REFERENCES NEWORG
  390.           ON DELETE SET NULL;
  391.  
  392. --  ****** COMMIT the change                                      ******
  393. EXEC SQL: COMMIT;
  394.  
  395. --  ****** Let's see what REFERENTIAL INTEGRITY does for us now   ******
  396. EXEC SQL: DELETE FROM NEWORG
  397.           WHERE LOCATION = 'Tahiti';
  398.  
  399. --  ****** The Tahiti dept is dropped (this is the parent row)    ******
  400. EXEC SQL: SELECT * FROM NEWORG;
  401.  
  402. --  ****** The Tahiti dept in child rows is set to NULL           ******
  403. EXEC SQL: SELECT * FROM NEWSTAFF;
  404.  
  405. --  ****** Let's get back our data                                ******
  406. EXEC SQL: ROLLBACK;
  407.  
  408. --  ****** DROP the referential constraint                        ******
  409. EXEC SQL: ALTER TABLE NEWSTAFF
  410.           DROP FOREIGN KEY KEYNAME1;
  411.  
  412. --  ****** Let's change the referential constraint to CASCADE     ******
  413. EXEC SQL: ALTER TABLE NEWSTAFF
  414.           FOREIGN KEY KEYNAME1(DEPT) REFERENCES NEWORG
  415.           ON DELETE CASCADE;
  416.  
  417. --  ****** COMMIT the change                                      ******
  418. EXEC SQL: COMMIT;
  419.  
  420. --  ****** Let's see what REFERENTIAL INTEGRITY does for us now   ******
  421. EXEC SQL: DELETE FROM NEWORG
  422.           WHERE LOCATION = 'Hawaii';
  423.  
  424. --  ****** The parent dept for Hawaii is gone                     ******
  425. EXEC SQL: SELECT * FROM NEWORG;
  426.  
  427. --  ****** All the Hawaii employees (the child rows) are also gone******
  428. EXEC SQL: SELECT * FROM NEWSTAFF;
  429.  
  430. --  ****** Let's get back our data, we made the point             ******
  431. EXEC SQL: ROLLBACK;
  432.  
  433. --  *------------------------------------------------------------------*
  434. --  * SCRIPT 16:  Cascaded Delete rules with Referential Integrity     *
  435. --  *------------------------------------------------------------------*
  436.  
  437. --  ****** Specify the PRIMARY key for NEWSTAFF                   ******
  438. EXEC SQL: ALTER TABLE NEWSTAFF PRIMARY KEY (ID);
  439.  
  440. --  ****** Create the SPOUSES table                               ******
  441. EXEC SQL: CREATE TABLE SPOUSES
  442.           (SPOUSE_NAME VARCHAR(20),
  443.            TELEPHONE   VARCHAR(10),
  444.            EMPL_ID     SMALLINT,
  445.            FOREIGN KEY HOMENUM(EMPL_ID) REFERENCES NEWSTAFF
  446.            ON DELETE CASCADE);
  447.  
  448. --  ****** Insert some data into spouses                          ******
  449. EXEC SQL: INSERT INTO SPOUSES
  450.           VALUES ('Michiko', '4152223333', 501);
  451. EXEC SQL: INSERT INTO SPOUSES
  452.           VALUES ('Jeri', '4154445555', 500);
  453.  
  454. --  ****** Let's take stock of what we've got                     ******
  455. EXEC SQL: SELECT * FROM NEWORG;
  456. EXEC SQL: SELECT * FROM NEWSTAFF;
  457. EXEC SQL: SELECT * FROM SPOUSES;
  458.  
  459. --  ****** Watch this cruel & unusual punishment: No more Hawaii  ******
  460. EXEC SQL: DELETE FROM NEWORG
  461.           WHERE  LOCATION = 'Hawaii';
  462.  
  463. --  ****** Let's see the the damage this has created              ******
  464. EXEC SQL: SELECT * FROM NEWORG;
  465. EXEC SQL: SELECT * FROM NEWSTAFF;
  466. EXEC SQL: SELECT * FROM SPOUSES;
  467.  
  468. --  ****** Let's bring back our data, we made the point           ******
  469. EXEC SQL: ROLLBACK;
  470.