Benutzer-Werkzeuge

Webseiten-Werkzeuge


start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
start [2025/12/26 06:42]
85.25.210.70 alte Version wiederhergestellt (2025/09/04 04:46)
start [2025/12/28 20:38] (aktuell)
92.204.40.219 alte Version wiederhergestellt (2025/09/14 20:11)
Zeile 400: Zeile 400:
 Warum DHCP? Warum DHCP?
 Um ein Netzwerk per TCP/IP aufzubauen ist es notwendig jede einzelne Station zu konfigurieren. Für ein TCP/IP-Netzwerk müssen folgende Einstellungen bei jeder Station vorgenommen werden: Um ein Netzwerk per TCP/IP aufzubauen ist es notwendig jede einzelne Station zu konfigurieren. Für ein TCP/IP-Netzwerk müssen folgende Einstellungen bei jeder Station vorgenommen werden:
-• Vergabe einer eindeutigen IP-Adresse +  * • Vergabe einer eindeutigen IP-Adresse 
-• Zuweisen einer Subnetzmaske (Subnetmask) +  • Zuweisen einer Subnetzmaske (Subnetmask) 
-• Zuweisen des Default- bzw. Standard-Gateways +  • Zuweisen des Default- bzw. Standard-Gateways 
-• DNS-Serveradressen+  • DNS-Serveradressen
  
  
-===== Hardware  =====+====== Netzwerkübertragungstechnik ====== 
 + 
 +===== IEEE 802 ===== 
 + 
 +  * IEEE - Institute of Electrical and Electronics Engineers 
 +  * über 360.000 Mitglieder in über 176 Ländern 
 +  * Die bekanntesten Standards sind 1394 für FireWire, 1284 für die Centronics-Druckerschnittstelle und 802 für die Netzwerkschnittstelle Ethernet. 
 +  * Mit der Notwendigkeit Ende der 70er Jahre Standards im Bereich der lokalen Netze einzuführen, wurde das Projekt 802 gegründet. 
 + 
 + 
 +===== IEEE 802.3 / Ethernet ===== 
 +  * Standard für lokale Netzwerke (LAN - Local Area Network)  
 +  * 10-MBit-Ethernet über Koaxialkabel 
 +  * Fast Ethernet mit 100 MBit/s 
 +  * Gigabit Ethernet mit 1000 MBit/s und 10 GBit/s 
 +  * Alle Ethernet-Varianten haben eines gemeinsam, sie basieren auf denselben Prinzipien. 
 +    - Zugriffsverfahren CSMA/CD Kollisionsvermeidung 
 +    - Ethernet Datenpaket 
 + 
 + 
 +====== Transportprotokolle ====== 
 + 
 + 
 + 
 + 
 +===== Subnetting ===== 
 +  * Aufteilung eines zusammenhängenden Adressraumes von IP-Adressen in mehrere kleinere Adressräume 
 +  * Teilnetze können mit Routern miteinander verbunden werden 
 +  * um die Netzlast sinnvoll und geordnet zu verteilen 
 + 
 + 
 +| Hostanzahl | Subnetzmaske | 32-Bit-Wert | Präfix | 
 +| 32 | 255.255.255.224 | 1111 1111 1111 1111 1111 1111 1110 0000 | /27 | 
 +| 8 | 255.255.255.248 | 1111 1111 1111 1111 1111 1111 1111 1000 | /29 | 
 + 
 + 
 + 
 + 
 + 
 +===== IP-Routing ===== 
 +  * IP ist das bedeutendste routingfähige Protokoll 
 +  * kann Daten über jede Art von physikalischer Verbindung vermitteln 
 +  * Weg zur nächsten Station finden (aus verschiedenen Wegen wählen) 
 +  * Wege sind in Routing-Tabelle gespeichert  
 +  * Warum ist Routing notwendig?  
 +    - Broadcasts belasten ein Netzwerk 
 +    - Router kann zwischen unterschiedlichen Architekturen vermitteln 
 +    - unterschiedliche Fragmentierung der Datenpakete 
 +    - engmaschiges Netz durch Routing => mehrere Wege zum Ziel  
 +    - Sicherheitsaspekte  
 + 
 + 
 + 
 +===== MTU ===== 
 +**Maximum Transfer Unit ** 
 +  * gibt die maximale IP-Paketlänge/-größe für einen bestimmten Netzwerktyp an 
 +  * Wechselt die MTU auf dem Weg zum Ziel mehrmals, wird das Datenpaket jedesmal neu fragmentiert 
 +  * die Fragmentierung ist sehr zeit- und rechenaufwendig 
 +  * Verhältnis zwischen Header und Nutzdaten wird immer ungünstiger 
 +  * MTU-Wert  1492  (optimaler Wert für Internetverbindung) 
 +  * bei WLan-Verbindungen erfolgt neue Fragmentierung 
 +===== MTU ===== 
 +  * optimalen MTU ermitteln: 
 +    - max.MTU (1492 Byte) - Header(28 Byte) = 1464 Byte 
 +    - ping -f -l 1462 web.de 
 +    - wenn Meldung muß fragmentiert werden 
 +    - wenn keine Meldung in Registry eintragen 
 + 
 + 
 +===== MTU einstellen: ===== 
 + 
 +**Win9x:** 
 + 
 +HKEY_LOCAL_MACHINE\System\ CurrentControlSet\Services\ Class\netTrans\"000 n"\MaxMTU 
 + 
 +**Win2000 / XP** 
 +  - in Registry Schlüssel suchen HKEY_LOCAL_MACHINE\ SYSTEM\CurrentControlSet\ Services\Tcpip\Parameters\Interfaces 
 +  - IP-Adresse in Unterverzeichenisse suchen 
 +  - Neu-DWORD-Wert erstellen MTU,dezimal,Wert 
 +  - MTU ist erst nach dem Booten aktiv 
 +**Linux**  
 + 
 +Datei "/etc/network/interfaces" konfigurieren 
 + 
 +===== MTU - Werte ===== 
 + 
 +^ Netzwerktyp ^ MTU (gesamt) ^ MSS (Nutzdaten) ^ 
 +|X.25 / analoge Modem-Verbindungen| 576 Byte| 536 Byte| 
 +|IEEE 802.3 (PPPoE-Implementierung / DSL)| 1492 Byte| 1452 Byte| 
 +|Ethernet| 1500 Byte| 1460 Byte| 
 +|Token Ring (4 MBit/s)| 4464 Byte| |  
 +|Token Ring (16 MBit/s)| 17914 Byte| |  
 +|min. MTU IPv4| 68 Byte| |  
 +|min. MTU IPv6| 1280 Byte| |  
 + 
 + 
 + 
 +===== NetBEUI - NetBIOS  ===== 
 +**Network Basic Extended User Interface** 
 +  * von IBM im Jahr 1985 für das Betriebssystem OS/2 entwickelt 
 +  * von Microsoft, Intel und Novell weiterentwickelt unter der Bezeichnung NetBIOS 
 +  * NetBEUI wird in MsDos, Windows NT und Windows 9x/ME eingesetzt  
 +  * NetBEUI auf Schnelligkeit in kleinen Netzwerken optimiert 
 +  * NetBEUI mit NetBIOS funktionieren nahezu vollautomatisch 
 +  * Neben NetBEUI kann NetBIOS auch über TCP/IP oder IPX/SPX übertragen werden 
 + 
 + 
 +===== IPX/SPX  ===== 
 +  * eine von Novell entwickelte Protokoll-Familie für lokale Netzwerke 
 +  * IPX/SPX bilden ein Client/Server-orientiertes Netzwerk 
 +  * für den Zugriff auf Dateien, Drucker, Namensverwaltung 
 +  * IPX ist ein verbindungsloses Protokoll (Adressierung über MAC-Adressen) 
 +  * SPX  erweitert IPX um ein verbindungsorientiertes Protokoll 
 +  * auch Windows unterstützt diese Protokoll-Familie 
 +  * seit Version 5 verwendet Netware TCP/IP als Standard-Protokoll 
 +====== Hardware  ======
 ===== CSMA/CD-Verfahren  ===== ===== CSMA/CD-Verfahren  =====
 Carrier Sense Multiple Access/Collision Detection bezeichnet ein asynchrones Medienzugriffsverfahren, dass den Zugriff verschiedener Stationen auf ein gemeinsames Übertragungsmedium regelt. Carrier Sense Multiple Access/Collision Detection bezeichnet ein asynchrones Medienzugriffsverfahren, dass den Zugriff verschiedener Stationen auf ein gemeinsames Übertragungsmedium regelt.
Zeile 1862: Zeile 1977:
 (dev/sdb1 /mnt auto auto, users, exec 0 0) (dev/sdb1 /mnt auto auto, users, exec 0 0)
  
 +
 +==== zertifikat ====
 +
 +<code>
 +root@ubuntu:/etc/apache2# ls -l /var/www/html/
 +insgesamt 16
 +-rw-r--r-- 1 root root 10918 Jun 18 09:54 index.html
 +-rw-r--r-- 1 root root    17 Jun 18 10:01 phpinfo.php
 +root@ubuntu:/etc/apache2# nano /etc/ssl/private/ssl-cert-snakeoil.key
 +root@ubuntu:/etc/apache2# nano /etc/ssl/certs/ssl-cert-snakeoil.pem
 +root@ubuntu:/etc/apache2# a2ensite default-ssl
 +
 +#unter umständen alte confs deaktivieren
 + a2dissite dokuwiki
 +
 +a2enmod ssl
 +
 +</code>
 +
 +==== zertifikat zusammenbauen ====
 +
 +
 +**privater Schlüssel**
 +eine verschlüsselungsmethode:
 +<code>
 +openssl genrsa -out /etc/ssl/private/ibs.key 2048 #2048 schlüssellänge
 +
 +</code>
 +
 +**Zertifikat und öffentlicher Schlüssel**
 +<code>
 +openssl req -new -x509 -key /etc/ssl/private/ibs.key -nodes -days 365 -sha256 -out /etc/ssl/certs/ibs.crt #bei abfrage FQDN wichtig domainname
 +
 +nano /etc/apache2/sites-enabled/default-ssl.conf
 +
 +             SSLCertificateFile      /etc/ssl/certs/ibs.crt
 +                SSLCertificateKeyFile /etc/ssl/private/ibs.key
 +
 +
 +systemctl restart apache2
 +
 +</code>
 +
 +==== Linux Webserver ====
 +
 +
 +feste IP
 +
 +nano /etc/netplan/01-netcfg.yaml
 +
 +network:
 +  version: 2
 +  renderer: networkd
 +  ethernets:
 +    enp0s3:
 +      dhcp4: no
 +      addresses: [192.168.1.150/24]
 +      gateway4: 192.168.1.1
 +      nameservers:
 +        addresses: [8.8.8.8,8.8.4.4]
 +
 +netplan apply
 +
 +sudo apt update
 +
 +sudo apt-get install apache2 libapache2-mod-php7.2 php7.2 php7.2-mysql mysql-server
 +
 +IP im Browser aufrufen
 +
 +php info erstellen
 +echo "<?php phpinfo();" > /var/www/html/phpinfo.php
 +
 +Datenbank testen#
 +mysql
 +
 +db user anlegen
 +nano /root/createDB.sh
 +
 +#Skript
 +#! /bin/bash
 +clear
 +echo -n Bitte Username eingeben:
 +read userdb
 +#echo $userdb
 +echo -n Bitte Passwort eingeben:
 +read passdb
 +#echo $passdb
 +echo CREATE USER "$userdb"@'localhost' IDENTIFIED BY "'$passdb'"";" > /tmp/dbc.sql
 +echo GRANT USAGE ON '* . *' TO "$userdb"@'localhost' IDENTIFIED BY "'$passdb'" WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONs 0 ";" >> /tmp/dbc.sql
 +echo CREATE DATABASE IF NOT EXISTS "$userdb" ";" >> /tmp/dbc.sql
 +echo GRANT ALL PRIVILEGES ON "$userdb" . '*' TO "$userdb"@'localhost'";" >> /tmp/dbc.sql
 +mysql < /tmp/dbc.sql
 +
 +
 +
 +
 +virtuelle Hosts mit PORT
 +
 +nano /etc/apache2/sites-available/000-default.conf
 +
 +<VirtualHost *:80>
 +        ServerAdmin webmaster@localhost
 +        DocumentRoot /var/www/html
 +</VirtualHost>
 +
 +
 +um z.B. Wordpress zu installieren
 +nano /etc/apache2/sites-available/wp.conf
 +
 +<VirtualHost *:81>
 +        ServerAdmin webmaster@localhost
 +        DocumentRoot /var/www/wp
 +</VirtualHost>
 +
 +
 +mkdir /var/www/wp
 +nano /var/www/wp/index.php
 +
 +<?php
 +        echo "Wordpress"
 +?>
 +
 +a2ensite wp           #erspart das eingeben von /etc/apache2/sites-enabled/  wp steht für den dateinamen den man unter sites-available vergeben hat ohne conf
 +
 + nano /etc/apache2/ports.conf
 +
 +Listen 80
 +Listen 81
 +<IfModule ssl_module>
 +        Listen 443
 +</IfModule>
 +
 +<IfModule mod_gnutls.c>
 +        Listen 443
 +</IfModule>
 +
 +systemctl restart apache2
 +
 +
 +
 +virtuelle Hosts mit IP (am Beispiel joomla)
 +
 +
 +nano /etc/netplan/01-netcfg.yaml
 +network:
 +  version: 2
 +  renderer: networkd
 +  ethernets:
 +    enp0s3:
 +      dhcp4: no
 +      addresses: [192.168.1.150/24,192.168.1.151/24]
 +      gateway4: 192.168.1.1
 +      nameservers:
 +        addresses: [8.8.8.8,8.8.4.4]
 +
 +
 + cp /etc/apache2/sites-available/wp.conf /etc/apache2/sites-available/joomla.conf
 + 
 + 
 + 
 + nano /etc/apache2/sites-available/joomla.conf
 +
 +<VirtualHost 192.168.1.151:80>
 +        ServerAdmin webmaster@localhost
 +        DocumentRoot /var/www/jo
 +</VirtualHost>
 +
 +mkdir /var/www/jo
 +
 +nano /var/www/jo/index.php
 +
 +<?php
 +        echo "Joomla"
 +?>
 +
 +a2ensite joomla
 +
 +systemctl restart apache2
 + 
 + 
 + 
 + 
 + virtuelle Hosts mit Namen, namensbasiert (dokuwiki)
 + 
 +mkdir /var/www/dw/
 +cp /var/www/wp/index.php /var/www/dw/
 +nano /var/www/dw/index.php
 +
 +<?php
 +        echo "DokuWiki"
 +?>
 +
 +cp /etc/apache2/sites-available/wp.conf /etc/apache2/sites-available/dokuwiki.conf
 + 
 + 
 + nano /etc/apache2/sites-available/dokuwiki.conf
 + 
 + 
 + so nimmt er alle IPs
 + 
 + NameVirtualHost *
 + <VirtualHost *:80>
 +        ServerAdmin webmaster@localhost
 +        DocumentRoot /var/www/dw
 +        ServerName dokuwiki.ibs
 +</VirtualHost>
 +
 + 
 + 
 + 
 + jetzt nimmt er nur die IP 192.168.1.150
 + 
 +  NameVirtualHost 192.168.1.150
 +  <VirtualHost 192.168.1.150:80>
 +        ServerAdmin webmaster@localhost
 +        DocumentRoot /var/www/dw
 +        ServerName dokuwiki.ibs
 +</VirtualHost>
 +
 + 
 +a2ensite dokuwiki
 +
 +systemctl restart apache2
 + 
 + 
 + Zum Testen z.B. unter Win10 Editor als Admin öffnen; darin C:\Windows\System32\drivers\etc\hosts öffnen unter ergänzen 192.168.1.150 dokuwiki.ibs # dokuwiki
 ====== PHP ====== ====== PHP ======
  
-====== MySQL ======+======= MySQL ======= 
 +===== SQL Einleitung =====
  
 +
 +
 +
 +===== Datenbanken =====
 +  * Datenbanken bestehen aus ein oder mehreren Dateien fester Satzstruktur (Tabellen)
 +  * die einzelnen Tabellen können logisch über Beziehungen miteinander verbunden werden
 +  * bei Datenbanken werden die Zeilen durch Primärschlüssel (ID) bestimmt
 +  * eine Spalte gleich ein Datentyp
 +  * Tabellen können indiziert werden (schnelle Suche)
 +
 +
 +
 +
 +
 +
 +===== Datenbankmodelle =====
 +  - hierarchische Modelle (Bsp. Dateisystem)
 +  - Netzwerkmodell 
 +  - Relationsmodell (Tabellen)
 +  - objektorientiertes Modell
 +  - NoSQL
 +
 +
 +
 +
 +===== Datenbanksysteme =====
 +  - Access
 +  - dbase (frühe Datenbank-Applikation)
 +  - Oracle Database (ORACLE zweitgrößter Softwarehersteller weltweit)
 +  - DB2 (IBM)
 +  - PostgreS
 +  - MS SQL Datenbank
 +  - MySQL 
 + 
 +
 +===== Datenbankentwurf =====
 +
 +  * Zusammenfassung von inhaltlich zusammengehörigen Daten 
 +  * Normalisierung (Redundanzen, Atomarisierung usw.)
 +  * Vergabe von Schlüsseln für die einzelnen Tabellen
 +  * Analyse der Beziehungen (1:1 oder 1:n)
 +
 +===== Relationale Datenbank =====
 +  * Die Daten werden in einer oder mehrere Tabellen gespeichert.
 +  * Attribute = Spaltenüberschriften 
 +  * Attributwerte = Inhalt der Spalten
 +  * Mit den Attributen wird der Datentyp und die Größe festgelegt.
 +  * Tuple/Datensatz = Zeilen
 +  * Entität = Das konkrete Objekt der Tabelle (z.B.:Erna Otto).
 +  * Entitätsmenge/-typ  = Zusammenfassung gleichartiger Objekte
 +  * Es werden Redundanzen vermieden, da die Daten auf mehrere Tabellen verteilt werden. 
 +
 +===== Entity-Relationship-Modell =====
 +Eigenschaften:
 +  - Die Tabelle muss einen eindeutigen Namen besitzen.
 +  - Die Bezeichnung der Attribute ist eindeutig.
 +  - Ein Attribut identifiziert einen Datensatz eindeutig (Primärschlüssel).
 +  - Die Daten eines Attributes besitzen einen vorgegebenen Wertebereich.
 +
 +===== Datenmodellierung 1 =====
 +  * Datenanalyse
 +    - Welche Daten sind vorhanden?
 +    - Max. erwartete Datensätze (DS)?
 +    - Wie sollen die DS erfasst werden?
 +    - Abhängigkeiten zwischen den Daten?
 +    - Welche Auswertungen werden benötigt?
 +
 +===== Datenmodellierung 2 =====
 +  * Datenbeziehungen festlegen
 +    - Verknüpfung der Entitäten festlegen.
 +    - grafische Darstellung mit einem Entity-Relationship-Diagramm (ERD).
 +  * Entwurf des relationalen Datenbankschemas
 +    - Aufbau der vollständigen Tabellenstrukur.
 +    - Übernahme der Fremdschlüssel in die Beziehungstabelle.
 +
 +===== Beziehungstypen =====
 +  * 1:1 Beziehung
 +  * 1:m Beziehung (1 : mehrere)
 +  * m:n Beziehung (mehrere : mehrere)
 +  * 1:c Beziehung (1 : möglicherweise 1)
 +  * 1:mc Beziehung (1 : möglicherweise 1 oder mehr)
 +
 +===== 1:1 Beziehung =====
 +... existiert wenn jedes Objekt der einen Menge mit genau einem Objekt der 
 +anderen Menge in Beziehung steht.
 +\\ 
 +\\
 +Beispeil:
 +  * Mitarbeiter : Handynummer
 +  * Mitarbeiter : Gehalt
 +  * Mitarbeiter : Geburtsdatum
 +
 +===== 1:n Beziehung =====
 +... existiert wenn jedes Objekt der einen Menge mit keinem,einem oder mehreren
 +Objekten der anderen Menge in Beziehung steht.
 +\\
 +\\
 +Beispiel:
 +  * Krankenkasse : Mitarbeiter
 +  * Abteilung : Mitarbeiter
 +
 +===== 1:m Beziehung =====
 +... existiert wenn jedes Objekt der einen Menge mit einem oder mehreren
 +Objekten der anderen Menge in Beziehung steht.
 +\\
 +\\
 +Beispiel:
 +  * Krankenkasse : Mitarbeiter
 +  * Abteilung : Mitarbeiter
 +
 +===== m : n Beziehung =====
 +… existiert wenn jedes Objekt der einen Menge mit einem oder mehreren Objekten der anderen Menge in Beziehung steht und umgekehrt.
 +\\
 +\\
 +Beispiel: 
 +  * Personendaten : Festnetzanschluß 
 +  * Mitarbeiter : Projekte
 +
 +===== 1 : c Beziehung =====
 +… existiert wenn jedes Objekt der Menge A höchstens einem Objekt der Menge B zugeordnet wird.
 +
 +Umgekehrt steht mit jedem Objekt der Menge B genau ein Objekt der Menge A in Beziehung.
 +\\
 +\\
 +Beispiel: 
 +  * Mitarbeiter hat höchstens eine Telefondurchwahl
 +  * Mitarbeiter leitet höchstens eine Abteilung
 +
 +===== 1 : mc Beziehung =====
 +… existiert wenn jedes Objekt der Menge A kein, ein oder mehrere Objekten der Menge B zugeordnet wird.
 +
 +Umgekehrt steht mit jedem Objekt der Menge B genau ein Objekt der Menge A in Beziehung.
 +\\
 +\\
 +Beispiel: 
 +  * Person besitzt kein, ein oder mehrere Handy's.
 +  * Mitarbeiter ist für kein, ein oder mehrere Aufträge verantwortlich.
 +
 +===== Normalisierung =====
 +Unter Normalisierung eines relationalen Datenbankschemas versteht man die schrittweise Zerlegung von Relationen (in der Datenbank: Tabellen) in mehrere Relationen auf der Grundlage funktionaler Abhängigkeiten. 
 +\\
 +Eine Normalisierung ist notwendig, um Redundanzen der Daten zu vermeiden, die bei der Änderung von Daten zu Inkonsistenzen führen können und zudem einen erhöhten Speicherplatz benötigen.
 +
 +===== Erste Normalform =====
 +Die erste Normalform besteht dann, wenn:
 +  - es keine Duplikate in den Zeilen der Tabelle gibt (Schlüsselattribut),
 +  - alle Werte pro Attribut jeweils von derselben Art sind (Fehler=Attribut Adresse),
 +  - jede Zelle einen einzigen unteilbaren Wert enthält (Fehler=alle Titel eines Album in einem Attribut).
 +
 +===== Bsp.: =====
 +  ID Album            Künstler Titelliste
 +  4711 Not That Kind    Anastacia Not That Kind, I'm Outta Love, 3Cowboys & Kisses
 +  4712 Wish You Were Here Pink Floyd   Shine On You Crazy Diamond,...
 +  4713 Freak of Natur     Anastacia Paid my Dues,...
 +
 +  ID Album            Künstler Titelliste
 +  4711 Not That Kind    Anastacia Not That Kind
 +  4711 Not That Kind    Anastacia I'm Outta Love
 +  4711 Not That Kind    Anastacia Cowboys & Kisses
 +  4712 Wish You Were Here Pink Floyd   Shine On You Crazy Diamond
 +  4713 Freak of Natur     Anastacia Paid my Dues
 +
 +===== Zweite Normalform =====
 +
 +Die zweite Normalform ist dann erfüllt, wenn:
 +  * die erste Normalform erfüllt ist.
 +  * Tabellen mit einem Schlüssel aus nur einem Attribut besteht. 
 +
 +
 +===== Bsp. =====
 +
 +  ID Album            Künstler Titel
 +  4711 Not That Kind    Anastacia Not That Kind
 +  4711 Not That Kind    Anastacia I'm Outta Love
 +  4711 Not That Kind    Anastacia Cowboys & Kisses
 +  4712 Wish You Were Here Pink Floyd   Shine On You Crazy Diamond
 +  4713 Freak of Natur     Anastacia Paid my Dues
 +
 +  ID    Album            Künstler 
 +
 +  ID    Titel
 +
 +===== Dritte Normalform =====
 +Eine Tabelle befindet sich in der dritten Normalform, wenn: 
 +  * sie die Bedingungen der zweiten Normalform erfüllt.
 +  * keine funktionalen Abhängigkeiten zwischen Nicht-Schlüsselattributen bestehen
 +(keine Redundanzen in Nicht-Schlüsselatributen).
 +
 +===== Bsp. =====
 +
 +  ID Album              Künstler
 +  4711 Not That Kind      Anastacia
 +  4712 Wish You Were Here   Pink Floyd  
 +  4713 Freak of Natur       Anastacia
 +
 +  ID Album
 +
 +  ID Künstler
 +
 +===== Vierte Normalform =====
 +Eine Tabelle ist in der vierten Normalform, wenn:
 +sie die Bedingungen der dritten erfüllt 
 +jeder determinierende Wert einen Schlüssel bilden kann
 +
 +  Werden in der Praxis wenig benutzt.
 +
 +===== Fünfte Normalform =====
 +
 +Die fünfte Normalform ist erfüllt, wenn:
 +  * alle Bedingungen der vierten Normalform erfüllt sind.
 +  * keine Rendundanzen über mehrere Zeilen in einem Attribut bestehen.
 +  
 +  Werden in der Praxis wenig benutzt.
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +===== Fehler beim Datenbankentwurf =====
 +  * in einer Tabelle werden inhaltlich nicht zusammengehörige Daten gespeichert
 +  * Doppelerfassungen bzw. Redundanzen
 +    - Speicherplatzverschwendung
 +    - zusätzlicher Arbeitsaufwand
 +    - fehleranfällig (Inkonsistenz)
 +  * Daten sind nicht atomar 
 +  * Wiederholfelder (z.B. mehrere Termine zu einem Teilnehmer)
 +
 +
 +===== SQL-Geschichte =====
 +  * entwickelt in den 70er Jahren von IBM für Buchhaltung und Verwaltung
 +  * Durchbruch erst in den 80er Jahren als ORACLE sql implementiert
 +  * weitere DB-Anbieter folgten (Informix, Sysbase, MS-Sql)
 +  * 1981 wurde SQL1 in Version SQL98 zum Industriestandard erklärt
 +
 +
 +
 +===== Datentypen (numerische)=====
 +  * TINYINT = Bereich zwischen -128 und 127, [UNSIGNED] zwischen 0 und 255
 +  * SMALLINT = Bereich zwischen -32768 und 32767, [UNSIGNED] zwischen 0 und 65535
 +  * MEDIUMINT = Bereich zwischen -8388608 und 8388607, [UNSIGNED] zwischen 0 und 16777215
 +  * INT = Bereich zwischen -2147483648 und 2147483647, [UNSIGNED] zwischen 0 und 4294967295
 +  * BIGINT = Bereich zwischen -9223372036854775808 und 9223372036854775807, [UNSIGNED] ...
 +  * FLOAT = Bereich zwischen -3.402823466E+38 und -1.175494351E-38, [UNSIGNED] ...
 +  * DOUBLE = Bereich zwischen -3.402823466E+38 und -1.175494351E-38, [UNSIGNED] ...
 +
 +
 +
 +===== Datentypen(Datum,Zeit) =====
 +  * DATE = Bereich liegt zwischen '1000-01-01' und '9999-12-31'
 +  * DATETIME = Bereich liegt zwischen '1000-01-01 00:00:00' und '9999-12-31 23:59:59'
 +  * TIMESTAMP = zwischen '1970-01-01 00:00:00' und 2037
 +  * TIME = 'HH:MM:SS'
 +  * YEAR = Bereich zwischen 1901 und 2155
 +
 +
 +
 +
 +
 +
 +===== Datentypen(Text)  =====
 +  - CHAR(M) = Zeichenkette fester Länge Max. 255
 +  - VARCHAR = Zeichenkette variabler Länge Max. 255
 +  - TINYTEXT = Maximallänge von 255
 +  - TEXT = Text variabler Länge Max. 65535
 +  - BLOB = Binärdaten
 +
 +
 +
 +===== Verbindung 1:n =====
 +<code>
 +mysql> select * from firma f, mitarbeiter m where f.id=id_firma;
 ++----+-----------+------+-------------+------+----+---------+---------+--------+-------------+----------+
 +| id | name      | ort  | mail        | ma   | id | name    | vorname | tel    | mail        | id_firma |
 ++----+-----------+------+-------------+------+----+---------+---------+--------+-------------+----------+
 +|  2 | Holz Gmbh | Bonn | Holz@web.de |   10 |  1 | Schmidt | Erna    | 33333  | ES@web.de          2 |
 +|  1 | Bau Gmbh  | Bonn | Bau@web.de  |  150 |  2 | Klose   | Otto    | 3773   | ko@web.de          1 |
 +|  2 | Holz Gmbh | Bonn | Holz@web.de |   10 |  3 | Klaue   | Ines    | 344773 | k~io@web.de |        2 |
 ++----+-----------+------+-------------+------+----+---------+---------+--------+-------------+----------+
 +3 rows in set (0,00 sec)
 +</code>
 +
 +
 +
 +===== Konfigurationsdateien =====
 +=== Win ===
 +  - C:\my.cnf Globale Konfiguration
 +  - C:\mysql\data\my.cnf Serverkonfiguration
 +=== Unix ===
 +  - /etc/my.cnf Globale Konfiguration
 +  - /mysql-data-dir/my.cnf Serverkonfiguration
 +  - ~./my.cnf Benutzerkonfiguration
 +
 +===== Netzfreigabe =====
 +
 +Der MySQL Server lauscht standardmäßig nur auf der localhost IP (127.0.0.1).
 +
 +  - Datei my.cnf öffnen.
 +  - bind-adresse ändern in 0.0.0.0
 +  - User Netzwerkzugriff erlauben.
 +
 +
 +  use mysql
 +  update user set host='%' where user='otto'
 +  update db set host='%' where user='otto'
 +  
 +===== Datenbank sichern  =====
 +<code>
 +// sichert die DB "meineDB" in Textdatei.
 +
 +mysqldump -u web5 -p meineDB  > c:\SmeineDB.sql
 +
 +mysqldump -u root -p1234 meineDB > /tmp/SmeineDB.sql 
 +</code>
 +
 +
 +===== Tabellen sichern  =====
 +<code>
 +// sichert die Tabelle "adressen" aus DB meineDB in Textdatei.
 +
 +mysqldump -u web5 -p meineDB adressen > c:\Sadressen.sql
 +
 +mysqldump -u root -p1234 meineDB adressen > /tmp/Sadressen.sql
 + </code>
 +
 +
 +
 +===== mehrere Datenbanken sichern =====
 +<code>
 +mysqldump -u root -p1234 --databases meineDB test mysql > c:\dreiDB.sql
 +
 +mysqldump -u root -p1234 --all-databases > /tmp/SalleDB.sql
 +
 +</code>
 +Komplette Datenbanksysteme können schneller mit **mysqlhotcopy** gesichert werden.
 +
 +
 +===== Datenbank wiederherstellen =====
 +<code>
 +mysql -u web5 -p meineDB < /tmp/SmeineDB.sql
 +</code>
 +Dabei bezeichnet der Parameter -u den User, der Parameter -p bewirkt die Abfrage des Passwortes. Anschliessend wird der Datenbankname angegeben. Der letzte Parameter bezeichnet den Datenfile.
 +
 +
 +
 +
 +
 +
 +
 +===== Datenbank prüfen =====
 +Mit mysqlcheck kann die Datenbank auf Fehler überprüft werden:
 +<code>
 +mysqlcheck -u root -p -A -e
 +</code>
 +Die Option -A prüft alle vorhandenen Datenbanken und -e führt eine ausführliche Konsistenzüberprüfung durch. 
 +
 +__Tabellen testen__
 +<code>
 +mysqlcheck -u root -p -e db_name tabll1 tabell2
 +</code>
 +Mehr Informationen zu mysqlcheck mit:
 +
 +http://dev.mysql.com/doc/refman/5.1/de/mysqlcheck.html
 +
 +
 +===== Daten importieren =====
 +__1.Tabele erstellen__
 +<code>
 +create table adr1 (id int not null auto_increment primary key,
 +     name varchar(50) not null, ort varchar(50), geb date);
 +</code>
 +__2.Textdatei erstellen__
 +<code>
 +\N  Schmidt  Bonn  2003-2-25
 +\N  Klose Stahl  \N  2003-3-25
 +</code>
 +__importieren__
 +<code>
 +LOAD DATA LOCAL INFILE '/tmp/x.txt' INTO TABLE adr1;                          //Linux
 +LOAD DATA LOCAL INFILE 'c:\x.txt' INTO TABLE adr1 LINES TERMINATED BY '\r\n'; //Win
 +</code>
 +
 +===== User mit db anlegen =====
 +<code>
 +CREATE USER 'paul'@'localhost' IDENTIFIED BY '****';
 +GRANT USAGE ON * . * TO 'paul'@'localhost' IDENTIFIED BY '****' WITH   MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
 +
 +CREATE DATABASE IF NOT EXISTS `paul` ;
 +
 +GRANT ALL PRIVILEGES ON `paul` . * TO 'paul'@'localhost';
 +
 +</code>
 +<code>
 +#! /bin/bash
 +clear
 +echo -n Bitte Username eingeben:
 +read userdb
 +#echo $userdb
 +
 +echo -n Bitte Passwort eingeben: 
 +read passdb                     
 +#echo $passdb
 +echo CREATE USER "$userdb"@'localhost' IDENTIFIED BY "'$passdb';" > /tmp/dbc.sql
 +echo GRANT USAGE ON '* . *' TO "$userdb"@'localhost' IDENTIFIED BY "'$passdb'" WITH   MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ";" >> /tmp/dbc.sql
 +echo CREATE DATABASE IF NOT EXISTS "$userdb;" >> /tmp/dbc.sql
 +echo GRANT ALL PRIVILEGES ON "$userdb" .' *' TO "$userdb"@'localhost;' >> /tmp/dbc.sql
 +mysql < /tmp/dbc.sql
 +</code>
 +
 +====== Einfache SQL-Befehle ======
 +
 +
 +
 +
 +
 +
 +
 +===== Anmelden an MySql =====
 +__Unix / Linux__
 +<code>
 +/opt/lampp/bin/mysql -u root 
 +</code>
 +__Windows__
 +<code>
 +c:\xampp\mysql\bin\mysql -u root
 +</code>
 +__mit Passwort__
 +<code>
 +/opt/lampp/bin/mysql -u root -p          //mit Passwortabfrage
 +/opt/lampp/bin/mysql -u root -p1234      //incl. Passwort (kein Leerzeichen)
 +/opt/lampp/bin/mysql -h host -u root -p  //an entfernten Server anmelden
 +/opt/lampp/bin/mysql -u root -p meineDB  //an meineDB anmelden
 +</code>
 +
 +
 +
 +
 +
 +
 +===== Version / Passwort =====
 +__erste Abfragen__
 +<code>
 +SELECT version() AS version;        //MySql Version anzeigen
 +SELECT CURRENT_DATE;                //akt. Datum
 +SELECT 22+6;
 +SELECT USER(), VERSION(), CURRENT_DATE;
 +</code>
 +__Passwort setzen__
 +<code>
 +SET PASSWORD = PASSWORD('1234');
 +</code>
 +__abmelden__
 +<code>
 +quit;
 +</code>
 +
 +
 +
 +
 +
 +===== Eingabeaufforderung =====
 +
 +|mysql> |Bereit für einen neuen Befehl. |
 +|- > |Erwartet die nächste Zeile einer mehrzeiligen Befehlseingabe. |
 +|'> |Erwartet die nächste Zeile und die Vervollständigung eines Strings, der mit einem einfachen Anführungszeichen ' begonnen wurde. |
 +|"> |Erwartet die nächste Zeile und die Vervollständigung eines Strings, der mit einem doppelten Anführungszeichen " begonnen wurde. |
 +|`> |Erwartet die nächste Zeile und die Vervollständigung eines Bezeichners, der mit einem Backtick ` begonnen wurde. |
 +|/*> |Erwartet die nächste Zeile und die Vervollständigung eines Kommentars, der mit /* begonnen wurde. |
 +
 +===== DB erstellen und anzeigen =====
 +__DB erstellen__
 +<code>
 +CREATE DATABASE meineDB;
 +</code>
 +__DB auflisten__
 +<code>
 +show databases;
 +</code>
 +__Ausgabe__
 +<code>
 ++--------------------+
 +| Database           |
 ++--------------------+
 +| information_schema |
 +| cdcol              |
 +| mysql              |
 +| phpmyadmin         |
 +| test               |
 +| meineDB            |
 ++--------------------+
 +6 rows in set (0,08 sec)
 +</code>
 +
 +
 +
 +
 +
 +
 +===== DB wählen =====
 +<code>
 +use meineDB;
 +</code>
 +__Namen der aktuellen Datenbank__
 +<code>
 +SELECT DATABASE();
 +</code>
 +
 +===== Tabellen in DB anzeigen =====
 +<code>
 +show tables;
 +</code>
 +
 +<code>
 ++---------------------------+
 +| Tables_in_mysql           |
 ++---------------------------+
 +| columns_priv              |
 +| db                        |
 +| func                      |
 +| help_category             |
 +| help_keyword              |
 +| help_relation             |
 +| help_topic                |
 +| host                      |
 +| proc                      |
 +| user                      |
 ++---------------------------+
 +</code>
 +
 +
 +===== Tabelle erzeugen 1 =====
 +__einfache Tabelle erzeugen__
 +<code>
 +CREATE TABLE adressen (id INT,name VARCHAR(35),
 +                       vorname VARCHAR(35));
 +</code>
 +__Test ob Tabelle vorhanden__
 +<code>
 +CREATE TABLE IF NOT EXISTS adr (id INT,name VARCHAR(35),
 +                                 vorname VARCHAR(35));
 +</code>
 +__ID automatisch hochzählen__
 +<code>
 +CREATE TABLE adr (id INT AUTO_INCREMENT PRIMARY KEY,
 +          name VARCHAR(35),vorname VARCHAR(35));
 +</code>
 +
 +
 +
 +
 +===== Tabelle erzeugen 1 =====
 +__Eingabe erforderlich__
 +<code>
 +CREATE TABLE adr (id INT NOT NULL,name VARCHAR(35) NOT NULL,
 +                  vorname VARCHAR(35));
 +</code>
 +__kompl. Beispiel__
 +<code>
 +CREATE TABLE IF NOT EXISTS adr (
 +    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
 +    name VARCHAR( 10 ) NOT NULL ,
 +    geburtstag DATE,
 +    geschl VARCHAR( 1 ) NOT NULL DEFAULT 'w'); 
 +</code>
 +
 +
 +
 +===== Struktur anzeigen =====
 +<code>
 +describe adr;
 +show columns from mitarbeiter;
 +</code>
 +__Ausgaben__
 +<code>
 ++-------+-------------+------+-----+---------+----------------+
 +| Field | Type        | Null | Key | Default | Extra          |
 ++-------+-------------+------+-----+---------+----------------+
 +| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
 +| firma | varchar(50) | NO                              |
 +| ort   | varchar(50) | YES  |     | NULL    |                |
 ++-------+-------------+------+-----+---------+----------------+
 +3 rows in set (0,01 sec)
 +</code>
 +
 +
 +===== Ändern des Tabellenlayouts  =====
 +__Tabellen umbenennen__
 +<code>
 +ALTER TABLE adressen RENAME adr;
 +</code>
 +
 +__Feld hinzufügen__
 +<code>
 +ALTER TABLE adr ADD mailx VARCHAR(20);
 +</code>
 +
 +__Feldtyp und Feldname ändern__
 +<code>
 +ALTER TABLE adr CHANGE mailx maily VARCHAR(50);
 +</code>
 +
 +
 +
 +
 +
 +===== Ändern des Tabellenlayouts =====
 +__Feldtyp ändern__
 +<code>
 +ALTER TABLE adr MODIFY maily varchar(10);
 +</code>
 +
 +__Feld löschen__
 +<code>
 +ALTER TABLE adr DROP maily;
 +</code>
 +
 +__Index und Primärschlüssel setzen__
 +<code>
 +ALTER TABLE adr ADD INDEX (maily);
 +ALTER TABLE adr ADD PRIMARY KEY (id);
 +ALTER TABLE tabelle ADD id INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
 +</code>
 +
 +
 +===== Tabellen mit Daten füllen =====
 +Bsp.1:
 +<code>
 +INSERT INTO adressen  VALUES (NULL , 'Otto', 'Paul','Bonn');
 +</code>
 +Bsp.2:
 +<code>
 +INSERT INTO adressen( name ) VALUES ('otto1');
 +</code>
 +Bsp.3:
 +<code>
 +INSERT INTO adressen VALUES 
 +    (NULL , 'Otto2', 'Paul','Bern'),
 +    (NULL , 'Otto3', 'Paul','Berlin'); 
 +</code>
 +
 +
 +
 +
 +
 +
 +===== Inhalt von Tabellen anzeigen =====
 +__alle Daten ausgeben__
 +<code>
 +select * from adressen;
 +</code>
 +__Spalte name und ort ausgeben__
 +<code>
 +select name, ort from adressen;
 +</code>
 +__die ersten 30 DS ausgeben__
 +<code>
 +SELECT * FROM adressen LIMIT 0 , 30 ;
 +</code>
 +
 +===== Inhalt von Tabellen anzeigen =====
 +__alle DS mit name Otto ausgeben__
 +<code>
 +SELECT * FROM 'test2' WHERE name='Otto';
 +</code>
 +__sortierte Ausgabe (aufsteigend)__
 +<code>
 +select * from adressen ORDER BY name;
 +</code>
 +__sortierte Ausgabe (absteigend)__
 +<code>
 +select * from adressen ORDER BY name DESC;
 +</code>
 +__sortierte Ausgabe (Zufall)__
 +<code>
 +select * from adressen ORDER BY rand();
 +</code>
 +
 +===== DB und Tabelle löschen  =====
 +__Tabelle löschen__
 +<code>
 +DROP TABLE adressen;
 +</code>
 +__DB löschen__
 +<code>
 +DROP DATABASE meineDB;
 +</code>
 +
 +
 +
 +
 +
 +====== weitere SQL Befehle ======
 +
 +
 +
 +===== Tabelleninhalte verändern =====
 +
 +ändert alle Datensätze
 +
 +  UPDATE adressen SET name='Otto';
 +  UPDATE adressen SET name='Schmidt', vorname='Paul';
 +
 +ändert nur Datensätze wo die id=5 ist
 +
 +  UPDATE adressen SET name='Otto' WHERE id=5;
 +
 +berechnet den Wert
 +
 +  UPDATE artikel SET preis=preis*1.1;
 +
 +  UPDATE ARTIKEL As A INNER JOIN UMSATZ AS U
 + On A.A_NR = U.A_NR
 + SET U.Gesamt = A.A_PREIS * U.A_STUECK
 +
 +===== Datensätze löschen =====
 +<code>
 +delete from artikel where id=4;
 +</code>
 +
 +
 +===== Wiederholungen (distinct) =====
 +
 +Alle Dopplungen von vorname werden ausgelassen.
 +<code>
 +select  distinct vorname  from kunden;
 +</code>
 +
 +
 +
 +
 +
 +===== Arithmetische Operatoren =====
 +<code>
 +SELECT * FROM adressen WHERE age<18;      //alle DS alter < 18
 +
 +SELECT * FROM adressen WHERE age%10=0;    //alle mit runden Geb.
 +
 +SELECT * FROM adressen WHERE age%10!=0;   //???
 +
 +SELECT name, age*365 FROM adressen;       //errechn. Tage
 +</code>
 +erlaubte Operatoren: +, -, *, /, %
 +
 +logische Operatoren:  =, <, < =, >, >=, <> oder !=, AND, &&, OR, ||, NOT, !
 +
 +
 +
 +
 +===== eigene Spaltenüberschriften =====
 +
 +<code>
 +
 +SELECT name, age AS Alter FROM adressen;
 +
 +SELECT name, age*365 AS Tage FROM adressen;
 +</code>
 +
 +
 +===== Operator LIKE =====
 +
 +<code>
 +SELECT * FROM adressen WHERE name LIKE 'A%';
 +
 +SELECT * FROM adressen WHERE strasse LIKE '%weg%';
 +
 +SELECT * FROM adressen WHERE name LIKE 'M_ier';
 +</code>
 +
 +**%** = steht für ein oder mehrere Zeichen
 +
 +**_** = steht für ein Zeichen
 +
 +
 +
 +
 +===== Zeichenverkettung  =====
 +
 +Zwei Strings lassen sich mit der Function concat() verbinden.
 +<code>
 +SELECT concat(name , '* ' , vorname)  FROM adressen;
 +SELECT concat(name , '* ' , vorname) AS Bezeichnung  FROM adressen;
 +
 +</code>
 +
 +
 +
 +
 +
 +===== Operatoren: IN und BETWEEN =====
 +__Operator IN__
 +<code>
 +SELECT * FROM adressen WHERE name='Otto' OR 
 +name='Klose' OR name='Schmidt';
 +oder
 +SELECT * FROM adressen  WHERE name 
 +IN('Otto','Klose','Schmidt');
 +</code>
 +
 +__Operator BETWEEN__
 +<code>
 +SELECT * FROM adressen WHERE age>17 AND age<66;
 +oder
 +SELECT * FROM adressen  WHERE age BETWEEN 17 AND 66;
 +</code>
 +
 +
 +
 +
 +
 +
 +
 +
 +===== Aggregatfunktionen 1 =====
 +__COUNT liefert die Anzahl der Zeilen__
 +<code>
 +SELECT count(*) FROM adressen WHERE age>17 
 +AND age<66;
 +
 +// eigene Überschrift
 +SELECT count(*) as Arbeitsfaehig FROM adressen 
 +WHERE age>17 AND age<66;
 +</code>
 +
 +__SUM liefert die Summe aller Werte__
 +<code>
 +SELECT SUM(age) FROM adressen;
 +
 +// eigene Überschrift
 +SELECT SUM(age) as Alter_gesamt FROM adressen;
 +</code>
 +
 +===== Aggregatfunktionen 2 =====
 +__AVG berechnet den Mittelwert einer Spalte__
 +<code>
 +SELECT AVG(alter) FROM adressen;
 +</code>
 +
 +__MAX liefert den größten Wert__
 +<code>
 +SELECT MAX(alter) FROM adressen;
 +</code>
 +
 +__MIN liefert den kleinsten Wert__
 +<code>
 +SELECT MIN(alter) FROM adressen;
 +</code>
 +
 +
 +===== Tabelle mitarbeiter =====
 +<code>
 ++----+---------+---------+--------+-------------+----------+-------+
 +| id | name    | vorname | tel    | mail        | id_firma | id_KK |
 ++----+---------+---------+--------+-------------+----------+-------+
 +|  1 | Schmidt | Erna    | 33333  | ES@web.de          2 |     3 |
 +|  2 | Klose   | Otto    | 3773   | ko@web.de          1 |     3 |
 +|  3 | Klaue   | Ines    | 344773 | k~io@web.de |        2 |     2 |
 ++----+---------+---------+--------+-------------+----------+-------+
 +</code>
 +
 +===== INNER JOIN =====
 +Der INNER JOIN führt Datensätze aus der linken und rechten Tabelle genau dann zusammen, wenn die angegebenen Kriterien alle erfüllt sind. Ist eines oder mehrere der Kriterien nicht erfüllt, so entsteht kein Datensatz in der Ergebnismenge.
 +
 +
 +**Explizite Schreibweise:**
 +  select * from kunden k inner join mitarbeiter m on k.id=m.id_firma
 +
 +===== LEFT JOIN =====
 +**LEFT JOIN:** 
 +Ein Datensatz aus der linken Tabelle kommt in jedem Fall in das Ergebnis. Wenn ein Datensatz der rechten Tabelle dem ON-Kriterium entspricht, so wird er entsprechend in den Spalten eingetragen, ansonsten bleiben die Spalten leer (null).
 +  select * from kunden k left join mitarbeiter m on k.id=m.id_firmen
 +<code>
 ++----+---------------+--------+-------+---------+------+---------+---------+----------+-------------+----------+
 +| id | name          | ort    | plz   | strasse | id   | name    | vorname | funk     | mail        | firmenid |
 ++----+---------------+--------+-------+---------+------+---------+---------+----------+-------------+----------+
 +|  1 | Holz GmbH     | Bonn   | 88888 | Weg 44  | NULL | NULL    | NULL    | NULL     | NULL        |     NULL | 
 +|  2 | Bau GmbH      | Bonn   | 88888 | Weg 66  |    2 | Klose   | Erna    | 0173 888 | erna@web.de |        2 | 
 +|  2 | Bau GmbH      | Bonn   | 88888 | Weg 66  |    3 | Schmidt | Karl    | 0173 888 | karl@web.de |        2 | 
 +|  3 | Stahl GmbH    | Bern   | 7777  | Weg 66  |    4 | Maier   | Ina     | 0177 888 | Ina@web.de  |        3 | 
 +|  4 | Abwasser GmbH | Berlin | 44444 | Weg 44  | NULL | NULL    | NULL    | NULL     | NULL        |     NULL | 
 ++----+---------------+--------+-------+---------+------+---------+---------+----------+-------------+----------+
 +</code>
 +===== RIGHT JOIN =====
 +Der RIGHT JOIN arbeitet genau entgegengesetzt dem LEFT JOIN.
 +  select * from kunden k RIGHT JOIN mitarbeiter m on k.id=m.id_firmen;
 +<code>
 ++------+------------+------+-------+---------+----+---------+---------+----------+-------------+----------+
 +| id   | name       | ort  | plz   | strasse | id | name    | vorname | funk     | mail        | firmenid |
 ++------+------------+------+-------+---------+----+---------+---------+----------+-------------+----------+
 +| NULL | NULL       | NULL | NULL  | NULL    |  1 | Klose   | Paul    | 0173 999 | paul@web.de |     NULL | 
 +|    2 | Bau GmbH   | Bonn | 88888 | Weg 66  |  2 | Klose   | Erna    | 0173 888 | erna@web.de |        2 | 
 +|    2 | Bau GmbH   | Bonn | 88888 | Weg 66  |  3 | Schmidt | Karl    | 0173 888 | karl@web.de |        2 | 
 +|    3 | Stahl GmbH | Bern | 7777  | Weg 66  |  4 | Maier   | Ina     | 0177 888 | Ina@web.de  |        3 | 
 ++------+------------+------+-------+---------+----+---------+---------+----------+-------------+----------+
 +</code>
 +
 +===== FULL OUTER JOIN =====
 +Die Logik für diesen Join: Jeder Datensatz der rechten und der linken Tabelle kommt in die Ergebnismenge.
 +
 +Er ist gewissermaßen die Kombination aus LEFT und RIGHT-JOIN. 
 +
 +===== MYSQL Befehle Anwendungen =====
 +<code>
 +select artikelnr,kat.artikelname, beschreibung, lieferant.lieferanten from artikel inner join lieferant inner join kat on artikel.lieferanten=lieferant.id and artikel.artikelname=kat.id;
 +
 +select artikelnr,kat.artikelname, beschreibung, lieferant.lieferanten from artikel inner join lieferant inner join kat on artikel.lieferanten=lieferant.id and artikel.artikelname=kat.id;
 +
 +select Artikelnr,Beschreibung,artikelname,lieferanten from artikel left join kat on id=kat_id left join lieferant on lief_id=idl
 +
 +select name,vor,ort from kunde left join kat on id=kat_id left join lieferant on lief_id=idl
 +
 +select distinct(leistungkd.svnr), name, vor, ort from kunde inner join leistungkd on leistungkd.svnr=kunde.svnr where renr=0;
 +
 +select svnr, def, preis, ust from leistungkd left join leistung on leistung.svnr=leistungkd.svnr;
 +
 +select def, preis, ust from leistungkd left join leistung on leistung.idl=leistungkd.idl where svnr=555444;
 +
 +</code>
 +
 +==== SQL User und Name anlegen skript ====
 +<code>
 +#! /bin/bash
 +clear
 +echo -n Bitte Username eingeben:
 +read userdb
 +#echo $userdb
 +
 +echo -n Bitte Passwort eingeben: 
 +read passdb                     
 +#echo $passdb
 +echo CREATE USER "$userdb"@'localhost' IDENTIFIED BY "'$passdb';" > /tmp/dbc.sql
 +echo GRANT USAGE ON '*.*' TO "$userdb"@'localhost' IDENTIFIED BY "'$passdb'" WITH   MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ";" >> /tmp/dbc.sql
 +echo CREATE DATABASE IF NOT EXISTS "$userdb;" >> /tmp/dbc.sql
 +echo GRANT ALL PRIVILEGES ON "$userdb" .' *' TO "$userdb"@'localhost;' >> /tmp/dbc.sql
 +mysql < /tmp/dbc.sql
 +</code>
 ====== Java ====== ====== Java ======
  
  
start.1766731331.txt.gz · Zuletzt geändert: 2025/12/26 06:42 von 85.25.210.70