# 📖💡 DDL – Data Definition Language

![](/files/-MF0uYhyshuo__wS2qGd)

{% hint style="warning" %}
DDL-Kommandos werden nicht protokolliert (kein Rollback!) und setzen entsprechende Berechtigungen voraus.
{% endhint %}

{% hint style="info" %}
Datenbankobjekte sind Objekte, die ausschliesslich mit CREATE angelegt werden.
{% endhint %}

## Datenbank anlegen

Eine neue Datenbank wird in der master-Datenbank angelegt:

```sql
USE master;
```

Bevor Datenbankobjekte angelegt werden können, muss das "Gefäss" dafür existieren: Die Datenbank.

```sql
CREATE DATABASE database_name;
```

Datenbanken lassen sich nur als Mitglied von bestimmten Gruppen bzw. als Inhaber von bestimmten Rollen anlegen. Nach dem Anlegen einer Datenbank ist diese betriebsbereit, aber noch ohne Strukturen und ohne Inhalt.

Mit `USE database_name` wird bestimmt, dass auf der DB-Instanz diese DB verwendet wird.

```sql
CREATE DATABASE database_name
GO
USE database_name;
```

{% hint style="info" %}
**GO**: Batch-Trennzeichen, ist keine SQL-Anweisung, sondern Editor-Befehl, eine Steueranweisung: Stapel von SQL-Anweisungen werden einzeln zum Server geschickt.

**RETURN**: Bewirkt sofortige Beendigung eines Stapels und springt zur nächsten Anweisung nach dem GO.
{% endhint %}

Datenbank umbenennen

```sql
ALTER DATABASE database_name MODIFY Name = other_database_name;
```

## Tabelle anlegen

Mit dem Befehl `CREATE TABLE` kann eine neue Tabelle erstellt werden. Der Befehl ist nach dem folgenden Schema aufgebaut:

```sql
CREATE TABLE table_name (
		spalte1 datentyp [ NULL | NOT NULL ] ,
		spalte2 datentyp [ NULL | NOT NULL ] ,
		spaltex datentyp [ NULL | NOT NULL ]
);
```

Beispiel:

```sql
CREATE TABLE kurse (
    kursid int NOT NULL, 
    kursname varchar(50) NOT NULL, 
    beginn smalldatetime, 
    ende smalldatetime
);
```

Alternative: Tabelle über SELECT anlegen

```sql
# SQL Server
SELECT * INTO neuetabelle FROM … ;

# Oracle
CREATE TABLE neuetabelle as SELECT … ;
```

### Restriktionen bei Oracle

* Tabellenname muss mit einem Buchstaben beginnen und darf nur `A-Z, a-z, 0-9, _, $ und #` enthalten
* Tabellenname darf maximal 30 Zeichen lang sein

## 💡 Aufgabe 3

Öffne die Datei in Azure Data Studio und löse die Aufgaben.

![](/files/-MVL_IvrJggg6Y-Nz-5T)

{% file src="/files/-MFf6uLPycOBsBdWlYJ7" %}
Aufgabe 3 - Datenbank erstellen
{% endfile %}

## Tabelle ändern

### Spalte hinzufügen

```sql
ALTER TABLE table_name ADD spalte datentyp [NOT NULL];
```

### Spalte ändern (z.B. Datentyp oder NOT NULL)&#x20;

{% tabs %}
{% tab title="SQL" %}

```sql
ALTER TABLE table_name ALTER COLUMN spalte datentyp [NOT NULL];
```

{% endtab %}

{% tab title="Oracle" %}

```sql
ALTER TABLE table_name MODIFY COLUMN spalte datentyp [NOT NULL];
```

{% endtab %}
{% endtabs %}

### Spalte löschen

```sql
ALTER TABLE table_name DROP COLUMN spalte;
```

## Tabelle löschen

Dieser Befehl löscht die gesamte Tabellenstruktur aus der Datenbank:

```sql
DROP TABLE table_name;
```

### Im Vergleich dazu das Löschen von Tabelleninhalt

#### TRUNCATE (DDL)

Löscht **alle** Datensätze einer Tabelle bedingungslos. Es ist eine sogenannte *bulk*-Operation (Massenoperation) und wird nicht protokolliert, weil es sich um ein einen DDL-Befehl handelt.

```sql
TRUNCATE TABLE table_name;
```

#### DELETE (DML)

Löscht **alle** Datensätze oder selektive (dazu mehr unter [DML](/tag-1/dml.md)). Diese Operation wird protokolliert, da es sich um eine DML-Anweisung handelt.

```sql
DELETE FROM table_name 
[WHERE ...];
```

## 💡 Aufgabe 4

Öffne die Datei in Azure Data Studio und löse die Aufgaben.

{% file src="/files/-MFf8xudIsn7c1sH4X1S" %}
Aufgabe 4 - Datenbank verändern
{% endfile %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://m105.ict-bz.ch/tag-1/ddl.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
