Enkel innføring i SQL
En komite ved ANSI (American National Standards Institute) har nå godkjent SQL som standard språket for RDBMS (relational database management systems), relasjonsdatabase systemer.
I dag er SQL i bruk over hele verden på alle mulige plattformer fra stormaskiner, minimaskiner, arbeidsstasjoner og til vanlige PC'er.
I gode gamle dBase er det bygget inn SQL. Den nyere databasen til Microsoft, Access bruker SQL, men her er det skjult for den vanlige bruker av grafiske funksjoner.
Nå er selvfølgelig ikke alle lenger nødt til å lære SQL fordi de nye grafiske systemene skjuler det, jfr. MS Access.
Tabellen AVDELING:
AVDNR AVDNAVN STED ------- ----------------------------------- ---------------- 0 Fellesadministrasjonen Borre 1 Avdeling for helsefag Tønsberg 2 Avdeling for lærerutdanning Eik 3 Avdeling for maritim utdanning Borre 10 IT-avdelingen
Tabellen ANSATT:
ANSNR ENAVN STILLING AVDNR ------- ---------------- ---------------------- -------- 100 Refsdal Direktør 0 101 Iveland Studiesjef 0 102 Nesse Kontorsjef 1 103 Aalvik Rådgiver 2 201 Røsland Førstekonsulent 10 202 Utnes Prosjektleder 10
Hver tabell består av rader (horisontalt) og kolonner (vertikalt). Hver rad består av felt og disse feltene kan ha forskjellige typer verdi. Feltet ANSNR har f.eks verdien 100 i et felt og 101 i et annet. Noen felt kan være av teksttype (CHAR) f.eks feltet STILLING, mens andre kan være av typen tall (NUMBER), f.eks ANSNR. I noen felt kan det være krav om unike (UNIQUE) verdier, f.eks. i feltet ANSNR. Det betyr at tallet 100 bare kan forekomme en gang. I andre som feltet ENAVN kan det være tillatt med samme tekst i flere felt. Det er jo f.eks mulig at flere heter Hansen.
Disse to tabellene har forresten en forbindelse som ofte kalles en "hode-linje-klisjee" .
Det vil si at det er en relasjon fra "hode" som her er AVDELING til en eller flere "linjer" i ANSATT. F.eks. har avdeling nr. 10 flere ansatte.
SELECT (* eller kolonnenavn)
FROM (tabellnavn)
Eksempel 1:
SELECT ENAVN,AVDNR FROM ANSATT;Gir resultatet:
ENAVN AVDNR ---------------- ----- Refsdal 0 Iveland 0 Nesse 1 Aalvik 2 Røsland 10 Utnes 10
Eksempel 2:
SELECT * FROM AVDELING;SELECT med symbolet * betyr hele tabellen og gir resultatet:
AVDNR AVDNAVN STED ------- ----------------------------------- ---------- 0 Fellesadministrasjonen Borre 1 Avdeling for helsefag Tønsberg 2 Avdeling for lærerutdanning Eik 3 Avdeling for maritim utdanning Borre 10 IT-avdelingen
For å lage tabellen AVDELING gjør vi følgende:
CREATE TABLE AVDELING (AVDNR NUMBER(2), AVDNAVN CHAR(30), STED CHAR(10)); Table created.Kommandoen er her delt over flere linjer, men det er ikke nødvendig i praksis. Inne i parentesen lister vi opp feltnavn datatype og datalengde.
AVDNR NUMBER(2) betyr at feltet AVDNR skal være et nummerfelt med lengde 2. I feltet AVDNAVN skal vi ha tekst med maksimal lengde 30 tegn.
Dersom vi ønsket at feltet AVDNR alltid skal ha en verdi kunne vi satt opp kommandoen slik:
CREATE TABLE AVDELING (AVDNR NUMBER(2) NOT NULL, AVDNAVN CHAR(30), STED CHAR(10));Dersom vi også ville hindre at det ble registrert flere felt AVDNR med samme tall, kunne vi også definere at feltet skulle være unikt med UNIQUE.
INSERT INTO AVDELING (1, 'Avdeling for helsefag','Tønsberg'); 1 Record created.Tall kan skrives direkte men tekst må markeres med tegnet ' før og etter.
UPDATE ANSATT SET AVDNR = 11 WHERE AVDNR = 10; 2 Records updated.
DELETE FROM AVDELING WHERE AVDNR = 10; 1 Record deleted.
F.eks. dersom vi bare vil ha de ansatte i en bestemt avdeling:
SELECT ENAVN,AVDNR FROM ANSATT WHERE AVDNR = 10;Gir resultatet:
ENAVN AVDNR ---------------- ------ Røsland 10 Utnes 10
Vi vil f.eks sortere alle ansatte alfabetisk:
SELECT ENAVN FROM ANSATT ORDER BY ENAVN;Gir resultatet:
ENAVN --------------- Aalvik Iveland Nesse Refsdal Røsland Utnes
Vi vil f.eks finne alle ansatte i avdeling IT:
SELECT ENAVN FROM ANSATT,AVDELING WHERE AVDNR = 10 AND ANSATT.AVDNR= AVDELING.AVDNR;Gir resultatet:
ENAVN ---------------- Røsland Utnes
Start opp dBase.
Fra prikken skriver du først:
.set index.onDu får da en ny prompt:
SQL.Fra den kan du utføre SQL kommandoene. Lag først tabellen AVDELING, sett deretter inn litt data med INSERT og bruk så SELECT:
SQL. create table avdeling(avdnr numeric(2),avdnavn char(30),sted char(10)); Table AVDELING createdNB ! I dBase heter talltypen NUMERIC.
Husk å avslutte alle kommandoer med tegnet ;
SQL.insert into avdeling(1,'Avdnavn..','Sted..'); 1 row(s) insertedNå kan du spørre med SELECT:
SQL. select * from avdeling; AVDNR AVDNAVN STED 1 Avdnavn.. Sted..Nå kan du fortsette videre på egen hånd. Du kan også bruke "online HELP" fra dBase for å få vite mer om SQL.
Logg On User Name: scott Password: tiger Host String: rakelDu har da et bilde som ser slik ut:
SQL*Plus: Release 3.1.3.5.4 - Copyright (c) Oracle Corporation 1979, 1994. All rights reserved. Connected to: Oracle7 Server Release 7.1.4.3.2 - Production Release With the distributed option PL/SQL Release 2.1.4.3.1 - Production SQL>Oracle setter altid opp en eksempel database med bruker scott/tiger. En av tabellene heter emp.:
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SA COMM DEPTNO
--------- ---------- ---------- --------- --------- --------- -------- ---------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 09-DEC-82 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 12-JAN-83 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
Du kan fortsette med andre kommandoer mot emp og evt. bruke dept i
tillegg.
Forfatter: Ole Jørgen Utnes Dato : 20.06.94 Rev.dato : 15.04.96