create table tablename (spalte 1 Datentyp, Spalte 2 Datentyp ... Spalte n Datentyp) ;Folgende Regeln für die Namensvergabe sind zu beachten:
create table produkt (Produktnummer number(10), Produktname char(30));Es wird eine Tabelle namens Produkt erzeugt, welche aus zwei Spalten besteht.
Number (Gesamtstellen,Nachkommastellen) Varchar2 (Zeichenzahl) DateEine Übersicht aller Datentypen befindet sich in [13].
create table tablename as Unterabfrage;
create table emp_from_dept_10 as select empno,ename from emp where deptno = 10 ;Es wird eine neue Tabelle erstellt, welche genau die Datensätze enthält, die der Abfrage entsprechen. Die Datentypen richten sich nach den Datentypen der Spalten in der oder den Originaltabellen.
select * from emp_from_dept_10 EMPNO ENAME --------------- 7782 CLARK 7839 KING 7934 MILLEREs ist ebenfalls möglich, eine neue Tabelle auf Grundlagen einer Abfrage über mehrere Tabellen zu erstellen.
create table emp_from_dept_10 as
select e.empno, e.ename, d.dname from emp e, dept d
where e.deptno = d.deptno and d.deptno = 10
;
Es wird eine neue Tabelle, welche genau die Datensätze enthält, die der Abfrage entsprechen.
Zusätzlich wird noch der Name der Abteilung angezeigt.
select * from emp_from_dept_10 EMPNO ENAME DNAME --------------------------- 7782 CLARK ACCOUNTING 7839 KING ACCOUNTING 7934 MILLER ACCOUNTING
DROP TABLE tabellenname;Alle Daten und die Struktur der Tabelle werden gelöscht. Alle offenden Transaktionen werden committet (automatisches COMMIT). Alle zugehörigen Indizes werden gelöscht. Alle auf dieser Tabelle basierenden VIEWs und SYNONYMs werden nicht gelöscht. DROP kann nicht per ROLLBACK rückgängig gemacht werden.
truncate table tabellenname
truncate table emp;Alle Datensätze der Tabelle Mitarbeiter (emp) werden gelöscht.
alter table emp add birthdate date; DESC emp; Name Null? Typ ----------------------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2) BIRTHDATE DATEEs wird zur Tabelle emp eine neue Spalte namens birthdate und dem Datentyp date hinzugefügt.
alter table emp drop column birthdate;Es wird die Spalte birthdate einschließlich der Inhalte gelöscht.
DESC emp; Name Null? Typ ------------------------------------ EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2)
ALTER TABLE emp MODIFY job NOT NULL; DESC emp; Name Null? Typ ---------------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB NOT NULL VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2)Die Spalte job wird so verändert, dass NULL-Werte in dieser Spalte nicht mehr erlaubt sind.
alter table emp modify job varchar2(20); DESC emp; Name Null? Typ ----------------------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(20) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2)Es wird der Datentyp (genauer der Wertebereich) der Spalte job verändert
Zusammenfassung:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view [(alias[, alias] ...)] AS subquery WITH CHECK OPTION [CONSTRAINT constraint]] WITH READ ONLY;OR REPLACE - Erzeugt die View neu wenn diese bereits existiert.
Der eigentliche Nutzen einer Sicht ist das Verstecken einer recht komplizierten und umfangreichen Abfrage. So ist es einfacher, alle Datensätze der Sicht research_mitarbeiter abzufragen als sich die Abfrage, welche alle Research-Mitarbeiter ermittelt, zu schreiben und anschließend auszuführen.
Ein weiterer Vorteil einer Sicht ist die Möglichkeit, Berechtigungen auf Sichtebene anzugeben. Es ist durch Sichten demnach möglich, z.B. dem Datenbankbenutzer anna die Berechtigung zu geben, sich alle Datensätze der Mitarbeiter (emp) anzeigen zu lassen, außer die Datensätze der Mitarbeiter der Research-Abteilung. Hierfür brauchen Sie nur eine kleine Sicht, die alle Mitarbeiter mit Ausnahmen der Research-Mitarbeiter auswählt. Nun geben Sie Anna die notwendigen Berechtigungen auf die Sicht.
create view Research_Mitarbeiter as
select * from emp
where deptno=
(select deptno from dept where dname = 'RESEARCH')
;
Es wird ein View erstellt, der alle Spalten der Tabelle Mitarbeiter (emp) selektiert, die aus der Abteilung RESEARCH kommen.
create or replace view Research_Mitarbeiter as
select * from emp
where deptno=
(select deptno from dept where dname = 'SALES')
;
drop view Research_Mitarbeiter;
Ein PUBLIC-SYNONYM (öffentliches Synonym) kann von jedem benutzt werden.
create public synonym d for scott.dept;
drop synonym d;
Mit der Pseudocoloumn sequencename.nextval können Sie den nächsten Wert der Sequence erzeugen und in die Tabelle einfügen. Nehmen wir an, Sie haben folgende leere Tabelle erzeugt:
create sequence s1 start with 1 maxvalue 5 increment by 1 nocycle;Es wird eine Sequence namens s1 erzeugt. Der Startwert dieser Sequence ist 1 (start with 1) und der Maximalwert beträgt 5 (maxvalue=5). Erhöht wird jeweils um 1 (increment by 1). Wird der Maximalwert erreicht, so wird nicht von vorn begonnen (nocycle).
insert into produkt(produktnummer,produktname)
values(s1.nextval,'Milch');
insert into produkt(produktnummer,produktname)
values(s1.nextval,'Butter');
insert into produkt(produktnummer,produktname)
values(s1.nextval,'Brot')
;
select * from produkt;
PRODUKTNUMMER PRODUKTNAME
---------------------------
1 Milch
2 Butter
3 Brot
Es wurden drei Produkte hinzugefügt und eine neue Produktnummer jeweils über s1.nextval erzeugt.
Dies geht bei der oben erstellten Sequence s1 bis zur Zahl 5, danach muss beim Einfügen von Datensätzen wieder ein Wert eingegeben werden.
create sequence product_seq start with 1 increment by 1; insert into t_emp values (product_seq.nexval, 'Joe Black');Mit der Funktion sequencename.currval können Sie sich den aktuellen Wert der Sequence anschauen, nachdem mindestens einmal nextval angefordert wurde.
select s1.currval from dual;
CURRVAL
-------
3
Es wird der aktuelle Wert der Sequence s1 ermittelt und zurückgegeben
| increment by n | Wert, um den jeweils erhöht wird | |
| (Standard ist 1). | ||
| start with n | erste zu generierende Sequencenummer | |
| maxvalue | Höchstwert der Sequence. | |
| minvalue | Mindestwert der Sequence. | |
| cycle sequence | fängt nach Erreichen des Maximalwertes von vorn an | |
| (ist nicht Standard). | ||
| nocycle sequence | fängt nach Erreichen des Maximalwertes nicht von vorn an. | |
| (Ist Standard - vergleiche mit Cycle) | ||
| cache n | Es werden n Sequencewerte im Speicher gehalten. | |
| nocache | Es werden keine Sequencewerte im Speicher gehalten. |
select sequence_name,min_value,max_value,increment_by,last_number from user_sequences ; SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY LAST_NUMBER ---------------------------------------------------------- S1 1 5 1 6Mit dieser Sicht des Data Dictionary werden die Optionen der Sequences ermittelt. last_number ist der nächste verfügbare Sequencewert.
drop sequence Sequencename ;
Haben Sie dann endlich die Seite gefunden, auf der sich der von Ihnen gesuchte Name befindet, lesen Sie die Seite von Anfang bis Ende - bis Sie den Namen gefunden haben. Nun können Sie beruhigt telefonieren. Wäre das Telefonbuch nicht alphabetisch sortiert, so müssten Sie das ganze Buch durchblättern, um die entsprechende Telefonnummer herauszubekommen.
Ein Index arbeitet ähnlich dem Telefonbuchprinzip. Zuerst wird die indizierte Spalte sortiert und anschließend als Baumstruktur gespeichert. Auf die unterschiedlichen Speicherformen von Indizes soll an dieser Stelle verzichtet werden.
create index indexname on tabelle(spalte1, spalte2, ... spalte n);
create index id1 on emp(ename);Es wird ein Index namens id1 erstellt, der sich über die Spalte ename der Tabelle emp erstreckt. Hierdurch wird das Suchen nach ename beschleunigt. Doppelt vorkommende ename sind erlaubt.
create unique index id1 on emp(ename);Es wird ein Index namens id1 erstellt, der sich über die Spalte Ename der Tabelle emp erstreckt. Doppelt vorkommende ename sind nicht erlaubt.
drop index indexname
drop index id1Der Index namens id1 wird gelöscht.
SELECT i1.index_name, i2.column_name
FROM user_indexes i1, user_ind_columns i2
WHERE i1.index_name = i2.index_name
AND i2.table_name = 'EMP'
;
Index_name Column_name
------------------------
PK_EMP EMPNO
ID1 ENAME
Es werden alle Indizes ermittelt, die sich auf die Tabelle emp beziehen.
Ausgegeben wird der Indexname und die beteiligte Spalte bzw. die beteiligten Spalten
Stefan Hietel dama.go GmbH, Robert Warnke http://rowa.giso.de