<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Pascal Kleindienst</title>
    <description>The latest articles on Forem by Pascal Kleindienst (@informatik-ninja).</description>
    <link>https://forem.com/informatik-ninja</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1738301%2F155da902-0628-464d-81f9-9f29ec5b6625.png</url>
      <title>Forem: Pascal Kleindienst</title>
      <link>https://forem.com/informatik-ninja</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/informatik-ninja"/>
    <language>en</language>
    <item>
      <title>🇩🇪 PHP 8.4: Was ist neu?</title>
      <dc:creator>Pascal Kleindienst</dc:creator>
      <pubDate>Sat, 23 Nov 2024 08:12:25 +0000</pubDate>
      <link>https://forem.com/informatik-ninja/php-84-was-ist-neu-3f0p</link>
      <guid>https://forem.com/informatik-ninja/php-84-was-ist-neu-3f0p</guid>
      <description>&lt;p&gt;Es dauert nicht mehr lange bis am &lt;a href="https://wiki.php.net/todo/php84" rel="noopener noreferrer"&gt;21. November 2024&lt;/a&gt; die nächste PHP Version veröffentlicht wird. &lt;strong&gt;PHP 8.4&lt;/strong&gt; bringt einige interessante Neuerungen und Änderungen mit sich. Ein paar davon werde ich in diesem Beiträg näher vorstellen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Property Hooks
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Property Hooks&lt;/strong&gt; gehören mit zu den größten Änderungen in der jüngsten PHP Vergangenheit - doch was sind &lt;strong&gt;property hooks&lt;/strong&gt; überhaupt? Es kommt oft vor, dass man für Eigenschaften unterschiedliche Sichtbarkeiten oder Logiken für den lesenden und schreibenden Zugriff &lt;em&gt;(get und set)&lt;/em&gt; braucht. Bisher hieß das meistens, dass man dafür eigene Methoden &lt;em&gt;(getter und setter)&lt;/em&gt; geschrieben oder die magischen Methoden &lt;em&gt;__get&lt;/em&gt; und &lt;em&gt;__set&lt;/em&gt; benutzt hat. &lt;strong&gt;Property Hooks&lt;/strong&gt; sollen dafür nun eine native Lösungen bieten und überflüssigen Boilerplate Code verhindern. Die Idee an sich ist nicht neu und daher hat man sich bei der Syntax von anderen Sprachen wie &lt;em&gt;Kotlin, C#, und Swift&lt;/em&gt; inspirieren lassen.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$fullName&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lesezugriff/Getter überschreiben&lt;/span&gt;
        &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;firstName&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;" "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;lastName&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$firstName&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Schreibzugriff/Setter überschreiben. $value ist der zu setzende Wert.&lt;/span&gt;
        &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Lastname must not be empty"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;firstName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$lastName&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Lastname must not be empty"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;lastName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$firstName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$lastName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;firstName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$firstName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;lastName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$lastName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Die Hooks sind optional und benötigen nicht beide Varianten &lt;em&gt;(get und set)&lt;/em&gt;. Im Beispiel oben entspricht &lt;code&gt;$fullName&lt;/code&gt; einer &lt;em&gt;virtual property&lt;/em&gt;, da nur ein &lt;code&gt;get&lt;/code&gt; Hook vorhanden ist. Eine weitere interessante Tatsache ist, dass &lt;strong&gt;property hooks&lt;/strong&gt; auch in Interfaces benutzt werden können:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;HasFullName&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Objekte die dieses Interface implementieren müssen eine lesbare $fullName Eigenschaft haben.&lt;/span&gt;
    &lt;span class="c1"&gt;// Das kann entweder eine traditionelle Eigenschaft oder ein "get" property hook sein.&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$fullName&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;HasFullName&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Implementiert `HasFullName`, da $fullName eine lesbare Eigenschaft ist.&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$fullName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;RCF:&lt;/strong&gt; &lt;a href="https://wiki.php.net/rfc/property-hooks" rel="noopener noreferrer"&gt;https://wiki.php.net/rfc/property-hooks&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;new&lt;/code&gt; ohne Klammern
&lt;/h2&gt;

&lt;p&gt;Eine weitere große Änderungen die mit &lt;strong&gt;PHP 8.4&lt;/strong&gt; kommt und Boilerplate Code reduziert: Aufrufe mit &lt;code&gt;new&lt;/code&gt; müssen nicht mehr in Klammern eingeschlossen werden, um Methoden mit ihnen zu verketten.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Vor PHP 8.4&lt;/span&gt;
&lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ReflectionClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$objectOrClass&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getShortName&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Ab PHP 8.4&lt;/span&gt;
&lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ReflectionClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$objectOrClass&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getShortName&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Die Änderung betrifft aber nicht nur Methoden sondern funktioniert auch für Eigenschaften, Konstanten, statische Methoden etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RCF:&lt;/strong&gt; &lt;a href="https://wiki.php.net/rfc/new_without_parentheses" rel="noopener noreferrer"&gt;https://wiki.php.net/rfc/new_without_parentheses&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  JIT Änderungen
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PHP 8.4&lt;/strong&gt; hat ein paar Änderungen wie der JIT aktiviert bzw deaktiviert wird. Bisher musste man &lt;code&gt;opcache.jit_buffer_size&lt;/code&gt; auf &lt;code&gt;0&lt;/code&gt; setzen, um den JIT zu deaktivieren. Mit der neuen PHP Version gibt es dafür eine extra Einstellung:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;opcache.jit=disable
opcache.jit_buffer_size=64m
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;RCF:&lt;/strong&gt; &lt;a href="https://wiki.php.net/rfc/jit_config_defaults" rel="noopener noreferrer"&gt;https://wiki.php.net/rfc/jit_config_defaults&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Neuer HTML5 Support
&lt;/h2&gt;

&lt;p&gt;Obwohl &lt;em&gt;HTML 5&lt;/em&gt; jetzt schon seit über 15 Jahren existiert, wird es von PHP bis jetzt nicht offiziell unterstützt. Mit &lt;strong&gt;PHP 8.4&lt;/strong&gt; wird nun die neue Klasse &lt;code&gt;\Dom\HTMLDocument&lt;/code&gt; eingeführt, welche HTML5 Code vernünftig parsen soll. Die alte &lt;code&gt;\DOMDocument&lt;/code&gt; Klasse, welche in der Theorie HTML 4 unterstützt, bleibt aus Gründen der Abwärtskompatibilität erhalten.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;\Dom\HTMLDocument&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;createFromString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$contents&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;RCF:&lt;/strong&gt; &lt;a href="https://wiki.php.net/rfc/domdocument_html5_parser" rel="noopener noreferrer"&gt;https://wiki.php.net/rfc/domdocument_html5_parser&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Neue Array Methoden: &lt;code&gt;array_find&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Frameworks wie &lt;em&gt;Laravel&lt;/em&gt; haben solche &lt;a href="https://laravel.com/docs/11.x/helpers#method-array-first" rel="noopener noreferrer"&gt;Hilfsfunktionen&lt;/a&gt; schon etwas länger, sodass man es kaum glauben mag, dass &lt;code&gt;array_find&lt;/code&gt;  tatsächlich eine neue Funktion in &lt;strong&gt;PHP 8.4&lt;/strong&gt; ist.&lt;/p&gt;

&lt;p&gt;Der Name mag evtl. etwas verwirrend sein, da &lt;code&gt;array_find&lt;/code&gt; das erste(!) Element aus einem Array zurückliefert auf das eine bestimmte Bedingung zutrifft.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Findet den ersten Benutzer mit mehr als 10 Zeichen im Namen&lt;/span&gt;
&lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;array_find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;User&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;strlen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zu &lt;code&gt;array_find&lt;/code&gt; kommen auch noch weitere Funktionen die ähnlich funktionieren: &lt;code&gt;array_find_key&lt;/code&gt;, &lt;code&gt;array_any&lt;/code&gt; und &lt;code&gt;array_all&lt;/code&gt;. Wenn du mehr darüber erfahren möchtest, dann schaue dir doch den Beitrag &lt;em&gt;"&lt;a href="https://dev.to/post/php-84-array_find"&gt;Neue Array Funktionen in PHP 8.4: array_find, array_find_key, array_any, und array_all&lt;/a&gt;"&lt;/em&gt; an.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RCF:&lt;/strong&gt; &lt;a href="https://wiki.php.net/rfc/array_find" rel="noopener noreferrer"&gt;https://wiki.php.net/rfc/array_find&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Implizite nullable Parametertypen werden abgeschafft
&lt;/h2&gt;

&lt;p&gt;PHP ein ein komisches Verhalten, bei dem eine typisierte Variable, welche als Standardwert &lt;code&gt;null&lt;/code&gt; hat, automatisch nullbar &lt;em&gt;(nullable)&lt;/em&gt; gemacht wurde.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Bar&lt;/span&gt; &lt;span class="nv"&gt;$bar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="c1"&gt;// Veraltet! Wurde von PHP automatisch umgewandelt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dieses Verhalten ist jetzt veraltet und wird mit &lt;strong&gt;PHP 9&lt;/strong&gt; entfernt werden. Die betroffenen Parameter müssen jetzt explizit als nullbar &lt;em&gt;(nullable)&lt;/em&gt; ausgewiesen werden.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;?Bar&lt;/span&gt; &lt;span class="nv"&gt;$bar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Deprecation:&lt;/strong&gt; &lt;a href="https://wiki.php.net/rfc/deprecate-implicitly-nullable-types" rel="noopener noreferrer"&gt;https://wiki.php.net/rfc/deprecate-implicitly-nullable-types&lt;/a&gt;&lt;/p&gt;

</description>
      <category>german</category>
      <category>php</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🇩🇪 Datenmanipulation und Abfragen mit SQL</title>
      <dc:creator>Pascal Kleindienst</dc:creator>
      <pubDate>Sat, 23 Nov 2024 08:07:30 +0000</pubDate>
      <link>https://forem.com/informatik-ninja/datenmanipulation-und-abfragen-mit-sql-m4i</link>
      <guid>https://forem.com/informatik-ninja/datenmanipulation-und-abfragen-mit-sql-m4i</guid>
      <description>&lt;p&gt;SQL &lt;em&gt;(Structured Query Langauge)&lt;/em&gt; ist die die Basis für Datenbank Manipulationen und Abfragen. In diesem Beitrag schauen wir uns die fortgeschrittenen Konzepte der Datenmanipulation und komplexere Abfragen genauer an.&lt;/p&gt;

&lt;h2&gt;
  
  
  Daten aktualisieren und löschen
&lt;/h2&gt;

&lt;p&gt;Im letzten Beitrag haben wir gelernt wie man Einträge speichert und ausließt. Da sich Daten aber natürlich ändern können, ist die Fähigkeiten diese zu aktualisieren und zu löschen entscheidend bei der Datenbankverwaltung.&lt;/p&gt;

&lt;h3&gt;
  
  
  UPDATE
&lt;/h3&gt;

&lt;p&gt;Der &lt;code&gt;UPDATE&lt;/code&gt;-Befehl ermöglicht es einem die bestehenden Datensätze einer Tabelle zu aktualisieren. Die allgemeine Syntax ist dabei wie folgt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;tabelle&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;spalte1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wert1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spalte2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wert2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;bedingung&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Beispiel&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'neu@beispiel.de'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;telefon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'0123456789'&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;kunden_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1001&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hier wird sowohl die E-Mail Adresse als auch die Telefonnummer eines bestehenden Kunden mit der ID 1001 aktualisiert.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Achtung!&lt;/strong&gt;&lt;br&gt;
Die &lt;code&gt;WHERE&lt;/code&gt;-Bedingung ist wichtig, da wir nur gewünschten Datensatz ändern möchten. Ohne &lt;code&gt;WHERE&lt;/code&gt;-Bedingung würden wir &lt;strong&gt;alle&lt;/strong&gt; Datensätze der Tabelle aktualisieren!&lt;/p&gt;
&lt;h3&gt;
  
  
  DELETE
&lt;/h3&gt;

&lt;p&gt;Mit dem &lt;code&gt;DELETE&lt;/code&gt;-Befehl können Datensätze aus einer Tabelle gelöscht werden. Die grundlegende Syntax ist dabei wie folgt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;tabelle&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;bedingung&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Beispiel&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Bestellungen&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;bestelldatum&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="s1"&gt;'2024-01-01'&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'storniert'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In diesem Beispiel werden alle &lt;em&gt;stornierten&lt;/em&gt; Bestellungen entfernt, die vor 2024 erstellt wurden.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Achtung!&lt;/strong&gt;&lt;br&gt;
Auch hier gilt: Die &lt;code&gt;WHERE&lt;/code&gt;-Bedingung ist wichtig, da wir nur gewünschten Datensatz löschen möchten. Ohne &lt;code&gt;WHERE&lt;/code&gt;-Bedingung würden wir &lt;strong&gt;alle&lt;/strong&gt; Datensätze der Tabelle löschen!&lt;/p&gt;
&lt;h3&gt;
  
  
  Sicherheitsaspekte bei Datenmanipulation
&lt;/h3&gt;

&lt;p&gt;Bei der Arbeit mit &lt;code&gt;UPDATE&lt;/code&gt; und &lt;code&gt;DELETE&lt;/code&gt; gibt es ein paar Dinge die man beachten sollte&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;WHERE&lt;/code&gt;-Bedingung: Man sollte immer eine präzise &lt;code&gt;WHERE&lt;/code&gt;-Bedingung verwenden, um nicht aus Versehen Datensätze zu ändern oder zu löschen, welche nicht geändert werden sollten.&lt;/li&gt;
&lt;li&gt;Backups: Es ist immer gut Backups seiner Datenbank zu haben, besonders dann wenn man größere Änderungen vornimmt.&lt;/li&gt;
&lt;li&gt;Transaktionen: Transaktionen ermöglichen es einem, mehrere Abfragen eine Einheit auszuführen und bei Bedarf rückgängig zu machen - Perfekt für komplexere Operationen.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Beispiel für eine Transaktion:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;BEGIN&lt;/span&gt; &lt;span class="n"&gt;TRANSACTION&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;Konten&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;guthaben&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;guthaben&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;konto_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;Konten&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;guthaben&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;guthaben&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;konto_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;COMMIT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Erweiterte Abfragen
&lt;/h2&gt;

&lt;h3&gt;
  
  
  JOIN-Operationen
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;JOIN&lt;/code&gt;-Operationen sind essentiell bei der Verwendung von relationalen Datenbanken, da Sie es einem ermöglichen, Daten aus mehreren Tabellen zu verknüpfen. Die Verknüpfung der Daten geschieht dabei über Primär- und Fremdschlüssel &lt;em&gt;(Primary Key und Foreign Keys)&lt;/em&gt;. Die gängisten Arten von Join-Typen sind: &lt;em&gt;Inner Join&lt;/em&gt;, &lt;em&gt;Left&lt;/em&gt; und der &lt;em&gt;Right Join&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Die Grundlegende Syntax ist wie folgt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Tabelle&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;LEFT&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="k"&gt;RIGHT&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="k"&gt;INNER&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Tabelle2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Bedingung&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Hinweis&lt;/strong&gt;: JOINs sind, gerade bei Anfängern, oft ein missverstandenes Thema. Zum besseren Verständnis nutzen wir die folgenden Tabellen zur Erklärungen&lt;/p&gt;

&lt;h4&gt;
  
  
  Tabelle: Bestellungen
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;bestell_nr&lt;/th&gt;
&lt;th&gt;kunden_id&lt;/th&gt;
&lt;th&gt;produkt_id&lt;/th&gt;
&lt;th&gt;gesamtbetrag&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1001&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1002&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;1003&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Tabelle: Produkte
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;produkt_name&lt;/th&gt;
&lt;th&gt;preis&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Uhr&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;PlayStation 5&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Final Fantasy&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Skull and Bones&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Tabelle: Kunden
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;John Doe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Jane Doe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Max Mustermann&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Maria Musterfrau&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  INNER JOIN
&lt;/h4&gt;

&lt;p&gt;Der &lt;code&gt;INNER JOIN&lt;/code&gt; gibt nur die Daten zurück, die in beiden Tabellen übereinstimmende Werte haben, also die Schnittmenge beider Tabellen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Finformatik-ninja.de%2Fimg%2Ftutorials%2Fmysql%2Finner_join.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Finformatik-ninja.de%2Fimg%2Ftutorials%2Fmysql%2Finner_join.svg" alt="INNER JOIN: Die Schnittmenge aus den verknüpften Tabellen" width="240" height="180"&gt;&lt;/a&gt; &lt;em&gt;INNER JOIN: Die Schnittmenge aus den verknüpften Tabellen&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Angenommen du möchtest alle Bestellungen samt Kundennamen und Produktnamen auflisten, dann kannst du die 3 Tabellen mit &lt;code&gt;INNER JOIN&lt;/code&gt;s wie folgt verbinden:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;Bestellungen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bestell_nr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Bestellungen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gesamtbetrag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Produkte&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;produkt_name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Bestellungen&lt;/span&gt;
&lt;span class="k"&gt;INNER&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;Bestellungen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kunden_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
&lt;span class="k"&gt;INNER&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;Produkte&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;Bestellungen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;produkt_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Produkte&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Das Ergebnis der obigen Abfrage ist dann:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;bestell_nr&lt;/th&gt;
&lt;th&gt;gesamtbetrag&lt;/th&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;th&gt;produkt_name&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;John Doe&lt;/td&gt;
&lt;td&gt;PlayStation 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1001&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;Jane Doe&lt;/td&gt;
&lt;td&gt;Uhr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1002&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;Max Mustermann&lt;/td&gt;
&lt;td&gt;Uhr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1003&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;John Doe&lt;/td&gt;
&lt;td&gt;Final Fantasy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  LEFT JOIN und RIGHT JOIN
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Finformatik-ninja.de%2Fimg%2Ftutorials%2Fmysql%2Fleft_right_join.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Finformatik-ninja.de%2Fimg%2Ftutorials%2Fmysql%2Fleft_right_join.svg" alt="LEFT/RIGHT JOIN: Die Schnittmenge und die Datensätze aus der linken bzw. rechten Tabelle" width="480" height="180"&gt;&lt;/a&gt; &lt;em&gt;LEFT/RIGHT JOIN: Die Schnittmenge und die Datensätze aus der linken bzw. rechten Tabelle&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ein &lt;code&gt;LEFT JOIN&lt;/code&gt; gibt alle Datensätze der linken (ersten) Tabelle zurück, auch wenn keine Übereinstimmungen mit der rechten Tabellen gefunden werden. Wenn in der Tabelle rechts keine Übereinstimmungen gefunden werden, wird für diese Werte &lt;code&gt;NULL&lt;/code&gt; zurückgegeben.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Bestellungen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bestell_nr&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt;
&lt;span class="k"&gt;LEFT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;Bestellungen&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Bestellungen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kunden_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Diese Abfrage zeigt alle Kunden an, auch solche ohne Bestellungen. Das Ergebnis der obigen Abfrage ist dann:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;th&gt;bestell_nr&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;John Doe&lt;/td&gt;
&lt;td&gt;1003&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;John Doe&lt;/td&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jane Doe&lt;/td&gt;
&lt;td&gt;1001&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max Mustermann&lt;/td&gt;
&lt;td&gt;1002&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maria Musterfrau&lt;/td&gt;
&lt;td&gt;&lt;code&gt;NULL&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ein &lt;code&gt;RIGHT JOIN&lt;/code&gt; funktioniert ähnlich wie ein &lt;code&gt;LEFT JOIN&lt;/code&gt;, es ist praktisch das Gegenteil von einem &lt;code&gt;LEFT JOIN&lt;/code&gt;. Der &lt;code&gt;RIGHT JOIN&lt;/code&gt; behält alle Zeilen der rechten Tabelle, auch wenn in der linken Tabelle keine passenden Zeilen gefunden werden. Für nicht gefundene Übereinstimmungen wird auch hier &lt;code&gt;NULL&lt;/code&gt; zurückgegeben.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;Bestellungen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bestell_nr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Produkte&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;produkt_name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Bestellungen&lt;/span&gt;
&lt;span class="k"&gt;RIGHT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;Produkte&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;Bestellungen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;produkt_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Produkte&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Die Abfrage zeigt alle Produkte an, auch solche die nie bestellt wurden. Das Ergebnis der obigen Abfrage ist dann:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;bestell_nr&lt;/th&gt;
&lt;th&gt;produkt_name&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1002&lt;/td&gt;
&lt;td&gt;Uhr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1001&lt;/td&gt;
&lt;td&gt;Uhr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;td&gt;PlayStation 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1003&lt;/td&gt;
&lt;td&gt;Final Fantasy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NULL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Skull and Bones&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  FULL OUTER JOIN
&lt;/h4&gt;

&lt;p&gt;Der &lt;code&gt;FULL OUTER JOIN&lt;/code&gt; gibt alle Datensätze aus beiden Tabellen zurück. Auch alle &lt;code&gt;NULL&lt;/code&gt;-Werte werden dabei berücksichtigt, wodurch dieser JOIN die größte Zeilenzahl zurückgibt.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Finformatik-ninja.de%2Fimg%2Ftutorials%2Fmysql%2Fouter_join.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Finformatik-ninja.de%2Fimg%2Ftutorials%2Fmysql%2Fouter_join.svg" alt="FULL OUTER JOIN: Alle Datensätze aus beiden Tabellen" width="240" height="180"&gt;&lt;/a&gt; &lt;em&gt;FULL OUTER JOIN: Alle Datensätze aus beiden Tabellen&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Da der &lt;code&gt;FULL OUTER JOIN&lt;/code&gt; nicht Teil von MySQL ist, gehen wir hier nicht weiter darauf ein. Bedenke aber, dass andere relationale Datenbanksysteme durchaus diese Art von JOIN unterstützen können!&lt;/p&gt;

&lt;h4&gt;
  
  
  Warum sollten JOINs verwendet werden
&lt;/h4&gt;

&lt;p&gt;JOINs sollten aus den folgenden Gründen verwendet werden:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;anstatt mehrerer einzelner Abfragen, welche "per Hand" kombiniert werden müssen, benötigt es nur eine einzelne Abfrage&lt;/li&gt;
&lt;li&gt;bessere Performance, da Datenbanksysteme wie MySQL auf solche Abfragen optimiert sind + die Nutzung von Indizes erhöht die Performance beim Kombinieren der Ergebnisse&lt;/li&gt;
&lt;li&gt;mehrere Abfragen auszuführen, führt zu einem höheren Overhead, da mehr Daten zwischen dem Datenbankserver und der Anwendung &lt;em&gt;(Client)&lt;/em&gt; übertragen werden müssen&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Aggregate Funktionen
&lt;/h3&gt;

&lt;p&gt;Aggregate Funktionen führen Berechnungen auf einer Menge von Werten durch und geben einen einzelnen Wert zurück. Sie sind besonders nützlich in Verbindung mit &lt;code&gt;GROUP BY&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  COUNT
&lt;/h4&gt;

&lt;p&gt;Die &lt;code&gt;COUNT&lt;/code&gt;-Funktion zählt die Anzahl der Zeilen oder nicht-NULL-Werte in einer Spalte. Beispiel: Berechnen der Mitarbeiter-Anzahl pro Abteilung (die &lt;code&gt;GROUP BY&lt;/code&gt; Anweisung wird hier verwendet um die Ergebnissmenge anhand der Abteilung zu gruppieren).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;abteilung&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;mitarbeiteranzahl&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Mitarbeiter&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;abteilung&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  SUM
&lt;/h4&gt;

&lt;p&gt;Die &lt;code&gt;SUM&lt;/code&gt;-Funktion summiert die numerischen Werte einer Spalte. Beispiel: Berechnen wie oft jedes Produkt bisher bestellt wurde.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;produkt_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;menge&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;gesamtmenge&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Bestellungen&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;produkt_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  AVG
&lt;/h4&gt;

&lt;p&gt;Die &lt;code&gt;AVG&lt;/code&gt;-Funktion ermittelt den Durschsnitt der numerischen Werte einer Spalte. Beispiel: Berechnen des Durschschnittgehalts der Mitarbeiter pro Abteilung, sofern das Durschnittsgehalt über 50.000 liegt.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;abteilung&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gehalt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;durchschnittsgehalt&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Mitarbeiter&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;abteilung&lt;/span&gt;
&lt;span class="k"&gt;HAVING&lt;/span&gt; &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gehalt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;50000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In diesem Beispiel benutzen wir die &lt;code&gt;HAVING&lt;/code&gt;-Klausel. HAVING wird verwendet, um Bedingungen auf aggregierte Daten anzuwenden, während WHERE für Bedingungen auf einzelne Zeilen verwendet wird.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unterabfragen
&lt;/h2&gt;

&lt;p&gt;Bei Unterabfragen &lt;em&gt;(Subqueries)&lt;/em&gt;, auch verschachtelte Abfragen genannt, handelt es sich um SQL Abfragen innerhalb anderer Abfragen. Dies ermöglicht komplexe Datenmanipulationen und vereinfacht Abfragen.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;produktname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;preis&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;produkte&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;preis&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;preis&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;produkte&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In diesem Beispiel werden alle Produkte selektiert, deren Preis über dem Durchschnittspreis liegt. Die Unterabfrage &lt;code&gt;(SELECT AVG(preis) FROM produkte)&lt;/code&gt; wird von SQL zuerst ausgewertet und liefert einen einzelnen Wert, welcher dann in der Hauptabfrage verwendet wird. Diese Art von Subquery nennt man &lt;em&gt;"skalare Subquery"&lt;/em&gt;, da sie einen einzelnen Wert zurückgibt.&lt;/p&gt;

&lt;p&gt;Verschachtelte Abfragen können in verschiedenen Teilen einer SQL-Anweisung verwendet werden:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In der &lt;code&gt;WHERE&lt;/code&gt;-Klausel &lt;em&gt;(wie im obigen Beispiel)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;In der &lt;code&gt;FROM&lt;/code&gt;-Klausel als &lt;strong&gt;abgeleitete Tabelle&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;In der &lt;code&gt;SELECT&lt;/code&gt;-Klausel für &lt;strong&gt;berechnete Spalten&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Beispiel einer Unterabfrage in der &lt;code&gt;FROM&lt;/code&gt;-Klausel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;abteilung&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;durchschnittsgehalt&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;abteilung&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gehalt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;durchschnittsgehalt&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;mitarbeiter&lt;/span&gt;
    &lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;abteilung&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;abteilungsdurchschnitte&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;durchschnittsgehalt&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;50000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In diesem Beispiel berechnet die Unterabfrage zuerst das Durchschnittsgehalt für jede Abteilung. Sie wird als eigenständige Tabelle behandelt und erhält den Alias &lt;code&gt;abteilungsdurchschnitte&lt;/code&gt;. Die Hauptabfrage selektiert dann aus dieser &lt;strong&gt;"virtuellen Tabelle"&lt;/strong&gt; die Abteilungen aus, deren Durchschnittsgehalt über 50.000 liegt. Diese Art der Unterabfrage nennt man auch &lt;strong&gt;"abgeleitete Tabelle&lt;/strong&gt; oder &lt;strong&gt;"inline view&lt;/strong&gt;, da sie wie eine temporäre Tabelle in der &lt;code&gt;FROM&lt;/code&gt;-Klausel verwendet wird.&lt;/p&gt;

&lt;h2&gt;
  
  
  Übungen
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Übung 1&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Angenommen, du hast eine Tabelle "produkte" mit den Spalten &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;produkt_name&lt;/code&gt; und &lt;code&gt;preis&lt;/code&gt;.
Die Geschäftsleitung hat beschlossen, die Preise für die "PlayStation 5" um 10% zu erhöhen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aufgabe:&lt;/strong&gt;  Schreibe eine SQL-Anweisung, die diese Preiserhöhung umsetzt&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Übung 2&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Angenommen, du hast eine Tabelle "bestellungen" mit den Spalten &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;kunden_id&lt;/code&gt;, &lt;code&gt;bestelldatum&lt;/code&gt; und &lt;code&gt;status&lt;/code&gt;.
Das Unternehmen möchte alte, stornierte Bestellungen aus der Datenbank entfernen, um Speicherplatz zu sparen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aufgabe:&lt;/strong&gt; Schreibe eine SQL-Anweisung, die alle stornierten Bestellungen löscht. die älter als ein Jahr sind.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Übung 3&lt;/strong&gt;: Schreibe eine SQL Abfrage, die alle Kunden mit ihren Bestellungen anzeigt, auch wenn sie keine Bestellungen haben. Sortieren Sie das Ergebnis nach dem Kundennamen.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Übung 4&lt;/strong&gt;: Berechne den Gesamtumsatz pro Kunde und sortiere das Ergebnis nach dem höchsten Umsatz.
Zeige nur Kunden mit einem Gesamtumsatz von mehr als 10.000 an.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Übung 5&lt;/strong&gt;: Finde alle Produkte, die teurer als der Durchschnittspreis sind. Zeige die Produktname, den Preis und um wie viel Prozent der Preis über dem Durchschnitt liegt.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Übung 6&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Angenommen es gibt eine Tabelle &lt;code&gt;mitarbeiter&lt;/code&gt; mit den Spalten &lt;code&gt;abteilung&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt; und &lt;code&gt;gehalt&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aufgabe&lt;/strong&gt;: Erstelle eine Abfrage, die für jede Abteilung den Mitarbeiter mit dem höchsten Gehalt anzeigt.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Übung 7&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Angenommen, du hast eine Tabelle "bestellungen" mit den Spalten &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;produkt_id&lt;/code&gt;, &lt;code&gt;bestelldatum&lt;/code&gt;, und eine Tabelle "produkte" mit den Spalten &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;produkt_name&lt;/code&gt; und &lt;code&gt;preis&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Schreibe eine Abfrage, die alle Produkte auflistet, die in den letzten 30 Tagen nicht bestellt wurden.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Diese Übungen decken die wichtigsten Konzepte ab, die wir in diesem Tutorial behandelt haben. Versuche sie selbstständig zu lösen, bevor du nach Lösungen suchst. Die praktische Anwendung ist der beste Weg, um SQL zu lernen und zu beherrschen.&lt;/p&gt;

&lt;p&gt;Die Lösungen zu den Übungen findest du in unserem &lt;a href="https://github.com/InformatikNinja/einfuehrung-in-datenbanken/blob/master/datenmanipulation-und-abfragen-mit-sql.md" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fazit
&lt;/h2&gt;

&lt;p&gt;SQL bietet eine leistungsstarke Möglichkeit zur Datenmanipulation und -abfrage. Durch die Verwendung von &lt;code&gt;UPDATE&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt;, &lt;code&gt;JOIN&lt;/code&gt;s, Unterabfragen und Aggregatfunktionen können komplexe Datenbankoperationen effizient durchgeführt werden.&lt;/p&gt;

&lt;p&gt;Um das hier gelernte zu festigen und die eigenen SQL-Fähigkeiten zu verbessern, hilft nur kontinuierliches Lernen und Üben. Die hier vorgestellten Übungen sind ein guter Anfang, du solltest aber auch weitere Online-Ressourcen, Fachbücher und praktische Projekte nutzen, um dein Wissen zu erweitern und auf dem neuesten Stand zu bleiben. Eine kleine Auswahl findest du im folgenden Punkt "Referenzen".&lt;/p&gt;

&lt;h2&gt;
  
  
  Referenzen
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.w3schools.com/sql/" rel="noopener noreferrer"&gt;W3Schools SQL Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.postgresql.org/docs/" rel="noopener noreferrer"&gt;PostgreSQL Dokumentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://amzn.to/3TTeVOg" rel="noopener noreferrer"&gt;Markus Winand (2012), &lt;em&gt;"SQL Performance Explained: Everything developers need to know about SQL performance"&lt;/em&gt;&lt;/a&gt; *&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://amzn.to/47XKHja" rel="noopener noreferrer"&gt;Anthony Molinaro und  Robert de Graaf (2020), &lt;em&gt;"SQL Cookbook: Query Solutions and Techniques for All SQL Users"&lt;/em&gt;&lt;/a&gt; *&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://amzn.to/482tx3J" rel="noopener noreferrer"&gt;Alan Beaulieu (2020), &lt;em&gt;"Learning SQL: Generate, Manipulate, and Retrieve Data"&lt;/em&gt;&lt;/a&gt; *&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;* &lt;strong&gt;Affiliatelinks/Werbelinks&lt;/strong&gt;: Wenn du auf einen Affiliate-Link klickst und über diesen Link einkaufst, bekomme ich von dem betreffenden Online-Shop oder Anbieter eine Provision. Du unterstützt den Blog und für dich ändert sich nichts am Preis.&lt;/p&gt;

</description>
      <category>german</category>
      <category>sql</category>
      <category>database</category>
      <category>beginners</category>
    </item>
    <item>
      <title>🇩🇪 Grundlegende SQL-Befehle für Einsteiger</title>
      <dc:creator>Pascal Kleindienst</dc:creator>
      <pubDate>Sun, 14 Jul 2024 14:00:00 +0000</pubDate>
      <link>https://forem.com/informatik-ninja/grundlegende-sql-befehle-fur-einsteiger-40l1</link>
      <guid>https://forem.com/informatik-ninja/grundlegende-sql-befehle-fur-einsteiger-40l1</guid>
      <description>&lt;h2&gt;
  
  
  Einführung in SQL und Datenbanken
&lt;/h2&gt;

&lt;p&gt;Wie im letzten Eintrag erwähnt sind Datenbanken aus der heutigen Zeit nicht mehr wegzudenken. SQL &lt;em&gt;(Structured Query Language)&lt;/em&gt; ist dabei die Basis für Datenbank Manipulationen und Abfragen. Egal ob Datenbankadministrator, oder Web-/Softwareentwickler, Kenntnisse in SQL sind unerlässlich.&lt;/p&gt;

&lt;h3&gt;
  
  
  Was ist SQL
&lt;/h3&gt;

&lt;p&gt;Bei SQL (&lt;em&gt;Structured Query Language&lt;/em&gt;) handelt es sich um eine standardisierte Sprache für die Verwaltung und Manipulation von relationalen Datenbanken. Sie wurde in den 1970er Jahren von IBM entwickelt und hat sich zum De-facto Standard bei relationalen Datenbanken entwickelt.&lt;/p&gt;

&lt;p&gt;SQL ermöglicht es einem Daten zu erstellen, zu lesen, zu aktualisieren und zu löschen (&lt;em&gt;CRUD&lt;/em&gt;-Operationen, &lt;em&gt;CREATE-READ-UPDATE-DELETE&lt;/em&gt;). Außerdem können damit auch komplexe Abfragen durchgeführt werden und die Struktur von Datenbanken verwaltet werden.&lt;/p&gt;

&lt;h2&gt;
  
  
  Datenbank und Tabellen erstellen
&lt;/h2&gt;

&lt;p&gt;Bevor man mit einer Datenbank arbeiten kann, muss diese aber erst erstellt und die Struktur definiert werden. Im ersten Schritt wird also die DB und die Tabellen erstellt und deren Struktur definiert.&lt;/p&gt;

&lt;h3&gt;
  
  
  CREATE DATABASE
&lt;/h3&gt;

&lt;p&gt;Um eine neue Datenbank zu erstellen, wird der Befehl CREATE DATABASE verwendet. Die Syntax ist dabei wie folgt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;mein_datenbank_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dieser Befehl erstellt eine neue, leere Datenbank namens "mein_datenbank_name". Nach dem Erstellen müssen wir die Datenbank noch auswählen, um mit ihr zu arbeiten. Das geschieht mit dem &lt;code&gt;USE&lt;/code&gt; Befehl, welcher MySQL mitteilt, dass alle nachfolgenden Befehle im Kontext der gewählten Datenbank ausgeführt werden sollen.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="n"&gt;mein_datenbank_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  CREATE TABLE
&lt;/h3&gt;

&lt;p&gt;Da eine leere Datenbank nicht allzu sinnvoll ist, können wir nun ein paar Tabellen erstellen. Tabellen sind die grundlegenden Strukturen, in denen die Daten einer relationalen Datenbank gespeichert werden. Die Syntax sieht dabei wie folgt aus:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;tabellen_name&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;spalte1&lt;/span&gt; &lt;span class="n"&gt;datentyp&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;einschr&lt;/span&gt;&lt;span class="err"&gt;ä&lt;/span&gt;&lt;span class="n"&gt;nkungen&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;spalte2&lt;/span&gt; &lt;span class="n"&gt;datentyp&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;einschr&lt;/span&gt;&lt;span class="err"&gt;ä&lt;/span&gt;&lt;span class="n"&gt;nkungen&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tabelleneinschr&lt;/span&gt;&lt;span class="err"&gt;ä&lt;/span&gt;&lt;span class="n"&gt;nkungen&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lass uns als Beispiel eine "Kunden" Tabelle erstellen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;kunden_id&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="n"&gt;AUTO_INCREMENT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;vorname&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;nachname&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;UNIQUE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;geburtstag&lt;/span&gt; &lt;span class="nb"&gt;DATE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;registrierungsdatum&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;kundenstatus&lt;/span&gt; &lt;span class="nb"&gt;ENUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'aktiv'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'inaktiv'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'gesperrt'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="s1"&gt;'aktiv'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;kreditlimit&lt;/span&gt; &lt;span class="nb"&gt;DECIMAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Die einzelnen Befehle kurz erklärt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;kunden_id INT PRIMARY KEY AUTO_INCREMENT&lt;/code&gt;: Definiert eine Ganzzahl (&lt;code&gt;Integer&lt;/code&gt;)-Spalte als Primärschlüssel, deren Wert automatisch für jeden neuen Eintrag erhöht wird (&lt;code&gt;AUTO_INCREMENT&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vorname VARCHAR(50) NOT NULL&lt;/code&gt;: Definiert Zeichenkette mit variabler Länge (max. 50 Zeichen), die nicht leer (NULL) sein darf&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nachname VARCHAR(50) NOT NULL&lt;/code&gt;: siehe &lt;code&gt;vorname&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;email VARCHAR(100) UNIQUE&lt;/code&gt;: Definiert eine email Spalte, die eindeutig sein muss&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;geburtstag DATE&lt;/code&gt;: Ein Datumswert für den Geburtstag eines Kunden&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;registrierungsdatum TIMESTAMP DEFAULT CURRENT_TIMESTAM&lt;/code&gt;P: Ein Zeitstempel, welcher als Standardwert die aktuelle Zeit gesetzt hat, wenn ein neuer Datensatz eingefügt wird.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kundenstatus ENUM('aktiv', 'inaktiv', 'gesperrt') DEFAULT 'aktiv'&lt;/code&gt;: Ein Aufzählungstyp mit vordefinierten Werten und dem Standardwert 'aktiv'&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kreditlimit DECIMAL(10,2) DEFAULT 1000.00&lt;/code&gt;: Ein Dezimalwert mit einem Standardwert&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Datentypen in MySQL
&lt;/h3&gt;

&lt;p&gt;Ein paar Datentypen haben wir im Beispiel eben ja schon kennengelernt, aber MySQL bietet noch eine Vielzahl &lt;a href="https://dev.mysql.com/doc/refman/8.4/en/data-types.html" rel="noopener noreferrer"&gt;weiterer Datentypen&lt;/a&gt;. Die Wahl des richtigen Datentyps ist wichtig, um die Informationen effizient zu speichern und die Integrität der Datenbank zu gewährleisten. Ein paar der am häufigsten verwendeten Datentypen:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Numerische Typen:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;TINYINT&lt;/code&gt;: Für ganze Zahlen (Integers) zwischen -128 und 127&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;INT&lt;/code&gt;: Für ganze Zahlen (Integers) zwischen -2.147.483.648 und 2.147.483.647 (-2&lt;sup&gt;31&lt;/sup&gt; und 2&lt;sup&gt;31&lt;/sup&gt; - 1)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;BIGINT&lt;/code&gt;: Für ganze Zahlen (Integers) zwischen -2&lt;sup&gt;63&lt;/sup&gt; und 2&lt;sup&gt;63&lt;/sup&gt; - 1&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DECIMAL(M, D)&lt;/code&gt;: Für Festkommazahlen. M ist die Gesamtzahl der Ziffern (&lt;em&gt;Präzision&lt;/em&gt;); D ist die Anzahl der Dezimalstellen&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;FLOAT&lt;/code&gt;: Für Gleitkommazahlen mit einfacher Genauigkeit&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DOUBLE&lt;/code&gt;: Für Gleitkommazahlen mit doppelter Genauigkeit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Zeichenketten:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;CHAR(n)&lt;/code&gt;: Für Zeichenketten mit fester Länge &lt;code&gt;n&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;VARCHAR(n)&lt;/code&gt;: Für Zeichenketter mit variabler Länge (max. &lt;code&gt;n&lt;/code&gt; Zeichen)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;TEXT&lt;/code&gt;: Für lange Texte mit bis zu 65.535 Zeichen&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;LONGTEXT&lt;/code&gt;: Für sehr lange Texte mit bis zu 4 GB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Datum- und Zeittypen:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;DATE&lt;/code&gt;: Für Datumswerte. Format: &lt;code&gt;YYYY-MM-DD&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;TIME&lt;/code&gt;: Für Zeitwerte. Format: &lt;code&gt;HH:MM:SS&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DATETIME&lt;/code&gt;: Für Datums- und Zeitwerte. Format: &lt;code&gt;YYYY-MM-DD HH:MM::SS&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;TIMESTAMP&lt;/code&gt;: Ähnlich wie DATETIME; Speichert den UNIX Timestamp zwischen &lt;code&gt;1970-01-01 00:00:01&lt;/code&gt; UTC bis &lt;code&gt;2038-01-19 03:14:07&lt;/code&gt; UTC.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Sonstige Typen:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;BOOLEAN&lt;/code&gt;: Für Wahrheitswerte (&lt;code&gt;true/false&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ENUM&lt;/code&gt;: Für vordefinierte Listen von Werten&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SET&lt;/code&gt;: Ähnlich wie &lt;code&gt;ENUM&lt;/code&gt;, erlaubt aber die Auswahl mehrerer Werte&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;BLOB&lt;/code&gt;: Für binäre Daten (&lt;em&gt;binary large object&lt;/em&gt;) wie zum Beispiel Bilder&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Die Wahl des richtigen Datentypen kann erheblichen Einfluss auf die Leistung und Speichereffizienz der Datenbank haben. Zum Beispiel:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verwenden von &lt;code&gt;INT&lt;/code&gt; für ganze Zahlen anstelle von &lt;code&gt;FLOAT&lt;/code&gt; oder &lt;code&gt;DOUBLE&lt;/code&gt;, wenn keine Dezimalstellen benötigt werden&lt;/li&gt;
&lt;li&gt;Benutzen von &lt;code&gt;VARCHAR&lt;/code&gt; anstelle von &lt;code&gt;CHAR&lt;/code&gt; für Zeichenketten variabler Länge, um Speicherplatz zu sparen&lt;/li&gt;
&lt;li&gt;Verwenden von &lt;code&gt;ENUM&lt;/code&gt; oder &lt;code&gt;SET&lt;/code&gt; für Spalten mit einer begrenzten Anzahl möglicher Werte, um Datenintegrität zu verbessern und Speicherplatz zu sparen&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Primärschlüssel und Fremdschlüssel
&lt;/h3&gt;

&lt;p&gt;Primärschlüssel und Fremdschlüssel sind entscheidend für die Strukturierung relationaler Datenbanken und die Gewährleistung der Datenintegrität.&lt;/p&gt;

&lt;h4&gt;
  
  
  Primärschlüssel (Primary Key)
&lt;/h4&gt;

&lt;p&gt;Bei einem Primärschlüssel handelt es sich um ein Feld (oder eine Kombination von Feldern), welches den Datensatz eindeutig identifiziert. Im obigen Beispiel mit der &lt;code&gt;Kunden&lt;/code&gt;-Tabelle ist das Feld &lt;code&gt;kunden_id&lt;/code&gt; der Primärschlüssel. Die Eigenschaften von Primärschlüsseln sind:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Eindeutigkeit (&lt;em&gt;uniqueness&lt;/em&gt;) - keine zwei Datensätze können den gleichen Schlüsselwert haben&lt;/li&gt;
&lt;li&gt;Sie dürfen nicht &lt;code&gt;NULL&lt;/code&gt; sein&lt;/li&gt;
&lt;li&gt;Unveränderbarkeit (&lt;em&gt;immutability&lt;/em&gt;) - einmal zugewiesen, sollte der Wert konstant bleiben&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Primärschlüssel können auf verschiedene Weise definiert werden:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Als Teil der Spaltendefinition&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;beispiel1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Als separate Einschränkung&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;beispiel2&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Zusammengesetzter Primärschlüssel&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;beispiel3&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id1&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;id2&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fremdschlüssel
&lt;/h3&gt;

&lt;p&gt;Ein Fremdschlüssel (&lt;em&gt;FK&lt;/em&gt;) ist ein Feld in der Tabelle, welches auf einen Primärschlüssel in einer anderen Tabelle verweist. Das ermöglicht es Beziehungen (Relationen) zwischen Tabellen zu erstellen und die referenzielle Integrität zu gewährleisten. Hier ein Beispiel für eine &lt;code&gt;Bestellungen&lt;/code&gt;-Tabelle, welche einen Fremdschlüssel auf unsere &lt;code&gt;Kunden&lt;/code&gt; Tabelle enthält. In dem Beispiel verweist &lt;code&gt;kunden_id&lt;/code&gt; in der &lt;code&gt;Bestellungen&lt;/code&gt; Tabelle auf &lt;code&gt;kunden_id&lt;/code&gt; in der &lt;code&gt;Kunden&lt;/code&gt; Tabelle. Dies stellt eine Beziehung zwischen Kunden und ihren Bestellungen her.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;Bestellungen&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;bestell_id&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="n"&gt;AUTO_INCREMENT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;kunden_id&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;bestelldatum&lt;/span&gt; &lt;span class="nb"&gt;DATE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;gesamtbetrag&lt;/span&gt; &lt;span class="nb"&gt;DECIMAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="k"&gt;FOREIGN&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kunden_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kunden_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fremdschlüssel haben mehrere wichtige Funktionen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stellen sicher, dass nur gültige Daten in die FK Spalte eingefügt werden können&lt;/li&gt;
&lt;li&gt;ermöglichen das Löschen und Aktualisieren von verknüpften Datensätzen in mehreren Tabellen (&lt;em&gt;kaskasierende Aktionen&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;verbessern die Datenintegrität und -konsitenz&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Das Verhalten von Fremdschlüsseln bei Aktualisierungen oder Löschungen kann mit den Klauseln &lt;code&gt;ON UPDATE&lt;/code&gt; und &lt;code&gt;ON DELETE&lt;/code&gt; gesteuert werden:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;Bestellungen&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;bestell_id&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="n"&gt;AUTO_INCREMENT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;kunden_id&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;bestelldatum&lt;/span&gt; &lt;span class="nb"&gt;DATE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;gesamtbetrag&lt;/span&gt; &lt;span class="nb"&gt;DECIMAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="k"&gt;FOREIGN&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kunden_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kunden_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;CASCADE&lt;/span&gt;
        &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="k"&gt;RESTRICT&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hier würde das Löschen eines Kunden automatisch alle seine Bestellungen löschen (&lt;code&gt;CASCADE&lt;/code&gt;), während eine Änderung der &lt;code&gt;kunden_id&lt;/code&gt; verhindert würde (&lt;code&gt;RESTRICT&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Daten einfügen und abfragen
&lt;/h2&gt;

&lt;p&gt;Daten einfügen und abfragen gehört zu den grundlegendsten Operation, da man Sie am häufigsten nutzt.&lt;/p&gt;

&lt;h3&gt;
  
  
  INSERT INTO
&lt;/h3&gt;

&lt;p&gt;Mit dem &lt;code&gt;INSERT INTO&lt;/code&gt; Befehl können neue Datensätze in eine Tabelle eingefügt werden. Die grundlegende Syntax sieht dabei wie folgt aus:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;tabellen_name&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spalte1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spalte2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spalte3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wert1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wert2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wert3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hier einige Beispiele für unsere &lt;code&gt;Kunden&lt;/code&gt;-Tabelle&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Einzelnen Datensatz hinzufügen&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vorname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nachname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;geburtstag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Max'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Mustermann'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'max@example.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'1990-01-01'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Mehrere Datensätze gleichzeitig einfügen&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vorname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nachname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;geburtstag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; 
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'John'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Doe'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'john.doe@example.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'1970-01-01'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Jane'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Doe'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'jane.doe@example.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'1980-01-01'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Maria'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Musterfrau'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'maria@example.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'1990-11-11'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Alle Spalten in der definierten Reihenfolge (nicht empfohlen !)&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Peter'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Meier'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2000-01-01'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'aktiv'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wichtige Punkte die man beachten sollte:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Wenn nicht alle Spalten angegeben werden, werden die ausgelassenen Spalten mit den Standardwerten oder &lt;code&gt;NULL&lt;/code&gt; befüllt&lt;/li&gt;
&lt;li&gt;Die Reihenfolge der Spalten in der &lt;code&gt;INSERT&lt;/code&gt;-Anweisung muss mit der Reihenfolge der Werte übereinstimmen&lt;/li&gt;
&lt;li&gt;Für Spalten mit &lt;code&gt;AUTO_INCREMENT&lt;/code&gt; (z.B. &lt;code&gt;kunden_id&lt;/code&gt;) kann &lt;code&gt;NULL&lt;/code&gt; oder &lt;code&gt;0&lt;/code&gt; eingegeben werden, um den nächsten verfügbaren Wert zu benutzen&lt;/li&gt;
&lt;li&gt;Datum- und Zeitwerte sollten im Format &lt;code&gt;YYYY-MM-DD&lt;/code&gt; bzw &lt;code&gt;YYYY-MM-DD HH:MM:SS&lt;/code&gt; angegeben werden&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  SELECT Abfragen
&lt;/h3&gt;

&lt;p&gt;Der &lt;code&gt;SELECT&lt;/code&gt;-Befehl ist der Grundstein für das Abfragen von Daten in einer Datenbank. Die grundlegende Syntax sieht wie folgt aus:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;spalte1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spalte2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;tabellen_name&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;bedingung&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;spalte1&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;ASC&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;...]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="n"&gt;anzahl&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Einige Beispiele mit unserer &lt;code&gt;Kunden&lt;/code&gt;-Tabelle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Alle Spalten aller Kunden abrufen&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Nur bestimmte Spalten abrufen&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;vorname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nachname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Daten sortieren (ORDER BY spalte1 [ASC|DESC], spalte2 [ASC|DESC], ...)&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;nachname&lt;/span&gt; &lt;span class="k"&gt;ASC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vorname&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Begrenzte Anzahl von Ergebnissen&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt; &lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  WHERE-Bedingungen
&lt;/h3&gt;

&lt;p&gt;Die &lt;code&gt;WHERE&lt;/code&gt; Klausel ermöglicht es die &lt;code&gt;SELECT&lt;/code&gt;-Abfrage zu filtern und nur bestimmte Datensätze zurückzugeben. Dabei können verschiedene Operatoren und logische Ausdrücke verwendet werden:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Einfache Vergleiche&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;geburtstag&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="s1"&gt;'1990-01-01'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;kundenstatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'aktiv'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Logische Operatoren&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;geburtstag&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="s1"&gt;'1990-01-01'&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;kreditlimit&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;kundenstatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'aktiv'&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="n"&gt;kreditlimit&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- IN-Operator -&amp;gt; überprüft ob der Wert in einer Liste aus Werten ist&lt;/span&gt;
&lt;span class="c1"&gt;-- Bsp: Selektiert alle Kunden, deren kundenstatus entweder 'aktiv' oder 'inaktiv' ist&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;kundenstatus&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'aktiv'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'inaktiv'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- BETWEEN-Operator -&amp;gt; überprüft ob ein Datums-/Zeitwert zwischen zwei Werten ist&lt;/span&gt;
&lt;span class="c1"&gt;-- Bsp: Selektiert alle Kunden die in den 1980ern geboren wurden&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;geburtstag&lt;/span&gt; &lt;span class="k"&gt;BETWEEN&lt;/span&gt; &lt;span class="s1"&gt;'1980-01-01'&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="s1"&gt;'1989-12-31'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- NULL-Werte prüfen&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;geburtstag&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Komplexe Bedingungen&lt;/span&gt;
&lt;span class="c1"&gt;-- Bsp: Selektiert alle Kunden, die 'aktiv' sind und ein Kreditlimit &amp;gt; 1000 haben &lt;/span&gt;
&lt;span class="c1"&gt;-- ODER die inaktiv sind mit einem Kreditlimit &amp;gt; 5000&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kundenstatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'aktiv'&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;kreditlimit&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kundenstatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'inaktiv'&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;kreditlimit&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  LIKE-Operator
&lt;/h4&gt;

&lt;p&gt;Der &lt;code&gt;LIKE&lt;/code&gt;-Operator wird für Mustervergleiche in Zeichenketten verwendet. Das &lt;code&gt;%&lt;/code&gt; ist dabei als Platzhalter zu verwenden:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Kunden, deren Nachname mit 'M' beginnt, zb Mustermann&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;nachname&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'M%'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Kunden, deren Nachname mit 'er' endet, zb Becker, Müller&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;nachname&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'%er'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Kunden mit 'ei' irgendwo im Nachnamen, zb Meier, oder Schneider&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Kunden&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;nachname&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'%ei%'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Übungen
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Übung 1&lt;/strong&gt;: Erstelle eine neue Tabelle &lt;code&gt;Benutzer&lt;/code&gt; in der &lt;code&gt;Bibliothek&lt;/code&gt;-Datenbank mit den Feldern &lt;code&gt;user_id&lt;/code&gt; (Primärschlüssel), &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;adresse&lt;/code&gt;, &lt;code&gt;geburtstag&lt;/code&gt;, &lt;code&gt;eMail&lt;/code&gt; und &lt;code&gt;telefonnummer&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Übung 2&lt;/strong&gt;: Füge mindestens 10 Benutzer in die &lt;code&gt;Benutzer&lt;/code&gt; Tabelle ein, mit verschiedenen Namen, Adressen und Geburtstagen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Übung 3&lt;/strong&gt;: Schreibe eine &lt;code&gt;SELECT&lt;/code&gt;-Abfrage, die alle Benutzer zurückgibt die mindestens 18 Jahre alt sind.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Übung 4&lt;/strong&gt;: Schreibe eine &lt;code&gt;SELECT&lt;/code&gt;-Abfrage, die alle Benutzer zurückgibt die eine E-Mail-Adresse von Googlemail haben (&lt;code&gt;...@googlemail.com&lt;/code&gt; oder &lt;code&gt;...@gmail.com&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Übung 5&lt;/strong&gt;: Schreibe eine &lt;code&gt;SELECT&lt;/code&gt;-Abfrage, die die 10 ältestens Benutzer zurückgibt.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Diese Übungen decken die wichtigsten Konzepte ab, die wir in diesem Tutorial behandelt haben. Versuche sie selbstständig zu lösen, bevor du nach Lösungen suchst. Die praktische Anwendung ist der beste Weg, um SQL zu lernen und zu beherrschen.&lt;/p&gt;

&lt;p&gt;Die Lösungen zu den Übungen findest du in unserem &lt;a href="https://github.com/InformatikNinja/einfuehrung-in-datenbanken/blob/master/grundlegende-sql-befehle.md" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Fazit
&lt;/h2&gt;

&lt;p&gt;In diesem Eintrag haben wir die grundlegenden SQL-Befehle und Konzepte kennengelernt, die für die Arbeit mit relationalen Datenbanksystemen unerlässlich sind. Wir haben uns angeschaut, wie man Datenbanken und Tabellen erstellt und wie man Daten einfügt und abfragt.&lt;/p&gt;

&lt;p&gt;Die beste Art, SQL zu lernen, ist durch praktische Übung. Versuche also die Übungsaufgaben selbständig zu lösen und experimentiere selbst mit verschiedenen Abfragen. Je mehr Übung man hat, desto vertrauter wird man mit der Sprache.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referenzen
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.mysql.com/doc/refman/8.4/en/" rel="noopener noreferrer"&gt;Die offizielle MySQL-Dokumentation - Eine umfassende Quelle für alle MySQL-spezifischen Details.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3schools.com/sql/default.asp" rel="noopener noreferrer"&gt;SQL Tutorial von W3Schools mit Übungen zum selber ausprobieren&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>german</category>
      <category>sql</category>
      <category>database</category>
      <category>beginners</category>
    </item>
    <item>
      <title>🇩🇪 Grundlagen von Datenbanksystemen</title>
      <dc:creator>Pascal Kleindienst</dc:creator>
      <pubDate>Sat, 06 Jul 2024 10:12:15 +0000</pubDate>
      <link>https://forem.com/informatik-ninja/grundlagen-von-datenbanksystemen-id0</link>
      <guid>https://forem.com/informatik-ninja/grundlagen-von-datenbanksystemen-id0</guid>
      <description>&lt;p&gt;Hast du dich je gefragt, wie deine Lieblings-Apps blitzschnell auf deine Daten zugreifen? Oder wie Online-Shops Millionen von Produkten verwalten? Die Antwort liegt in der faszinierenden Welt der Datenbanken. In diesem Beitrag tauchen wir in die Grundlagen ein und schauen uns an, wie du mit MySQL, einem der beliebtesten Datenbanksysteme, loslegen kannst.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was sind Datenbanken?
&lt;/h2&gt;

&lt;p&gt;Stell dir vor, du hast eine riesige Tabelle mit allen deinen Kontakten, Terminen und Notizen. Super für dich, aber eine App wie WhatsApp müsste das für Milliarden von Nutzern tun - nicht so optimal. Hier kommen Datenbanken ins Spiel. Eine Datenbank ist eine organisierte Sammlung von Daten. Statt alles in einer endlosen Tabelle zu haben, strukturieren Datenbanken Informationen in Tabellen mit Zeilen (Datensätze) und Spalten (Eigenschaften)&lt;sup&gt;1&lt;/sup&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+-------------+---------+---------------+
| Name        | Alter   | E-Mail        |
+-------------+---------+---------------+
| Anna Müller | 27      | anna@web.de   |
| John Doe    | 32      | john@mail.com |
+-------------+---------+---------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Der Clou? Datenbanken können diese Tabellen verknüpfen. So kannst du schnell und effizient Beziehungen zwischen Daten herstellen, ohne alles mehrfach zu speichern.&lt;/p&gt;

&lt;p&gt;Für einen verständlichen Einstieg empfehle ich "Database Design for Mere Mortals" von Michael J. Hernandez&lt;sup&gt;2&lt;/sup&gt;. Er erklärt die Konzepte wirklich gut für Anfänger.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unterschied zwischen relationalen und nicht-relationalen Datenbanken
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Relationale Datenbanksysteme
&lt;/h3&gt;

&lt;p&gt;Die relationalen Datenbankverwaltungssystem (&lt;em&gt;Relational Database Management System, RDBMS&lt;/em&gt;) basieren auf einem Modell von Edgar F. Codd aus den 70ern&lt;sup&gt;3&lt;/sup&gt;. Denk an sie wie an ein gut organisiertes Bücherregal, wo jedes Buch (&lt;em&gt;Datensatz&lt;/em&gt;) einen festen Platz hat.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bekannte Vertreter&lt;/strong&gt;: MySQL, PostgreSQL, Oracle Database&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sprache&lt;/strong&gt;: SQL (Structured Query Language)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gut für&lt;/strong&gt;: Banken, E-Commerce, alles mit stark strukturierten Daten
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- SQL in Aktion: Finde alle Kontakte mit "@web.de"&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eMail&lt;/span&gt; 
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Kontakte&lt;/span&gt; 
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;eMail&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'%@web.de'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Nicht relationale (NoSQL) Datenbanksysteme
&lt;/h3&gt;

&lt;p&gt;NoSQL bedeutet "Not Only SQL". Sie entstanden, weil das Internet plötzlich mit Daten überflutet wurde, die nicht gut in Tabellen passten.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bekannte Vertreter&lt;/strong&gt;: MongoDB (&lt;em&gt;Dokumente&lt;/em&gt;), Cassandra (&lt;em&gt;Spalten&lt;/em&gt;), Redis (&lt;em&gt;Key-Value&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gut für&lt;/strong&gt;: Social Media, Internet-of-Things (&lt;em&gt;IoT&lt;/em&gt;), schnell ändernde Datenstrukturen
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;MongoDB-Stil:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Ein&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Kontakt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;und&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;seine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Notizen&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Anna Müller"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"alter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"anna@web.de"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"notizen"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"datum"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-05-15"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Meeting für Projekt X"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"datum"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-05-20"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Annas Geburtstag!"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Vorteile von Datenbanksystemen
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Zentrale Datenverwaltung&lt;/strong&gt;: Alles an einem Ort, leicht zu warten und zu sichern.&lt;/li&gt;
&lt;li&gt;Datensicherheit:

&lt;ul&gt;
&lt;li&gt;ACID-Prinzipien (Atomicity, Consistency, Isolation, Durability)

&lt;ul&gt;
&lt;li&gt;mehr dazu in den folgenden Einträgen 😉&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Benutzerverwaltung und Zugriffskontrolle&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Effiziente Abfragen&lt;/strong&gt;: Komplexe Daten schnell finden und analysieren.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Datenintegrität&lt;/strong&gt;: Keine Duplikate, keine Inkonsistenzen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mehrere Nutzer&lt;/strong&gt;: Gleichzeitiger Zugriff ohne Datenkonflikte.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Einführung in MySQL
&lt;/h2&gt;

&lt;p&gt;MySQL ist ein beliebtes Open-Source-Datenbanksystem - schnell, zuverlässig und einfach zu benutzen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation und Tools
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Besuche &lt;a href="https://mysql.com/" rel="noopener noreferrer"&gt;mysql.com&lt;/a&gt; und lade MySQL Comunity Server herunter&lt;/li&gt;
&lt;li&gt;Folge den Installationsanweisungen für dein Betriebssystem&lt;/li&gt;
&lt;li&gt;Verwende Tools wie &lt;a href="https://www.mysql.com/products/workbench/" rel="noopener noreferrer"&gt;MySQL Workbench&lt;/a&gt; oder &lt;a href="https://tableplus.com" rel="noopener noreferrer"&gt;Tableplus&lt;/a&gt; (grafisch), oder die Kommandozeile&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Erste Schritte mit MySQL
&lt;/h3&gt;

&lt;p&gt;Als erstes öffne MySQL Workbench oder die Konsole (oder ein anderes Tool deiner Wahl) und verbinde dich mit deinem Server. In den folgenden Beispielen nutzen wir die Kommandozeile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lass uns nun unsere erste Datenbank und eine Tabelle erstellen&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;meinprojekt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="n"&gt;meinprojekt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;aufgaben&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;titel&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="n"&gt;abgabe&lt;/span&gt; &lt;span class="nb"&gt;DATE&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sei unbesorgt, falls dir nicht ganz klar ist, was die einzelnen SQL Befehle genau machen - das schauen wir uns im nächsten Beitrag genauer an.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fazit
&lt;/h2&gt;

&lt;p&gt;Datenbanken sind das Rückgrat moderner Anwendungen. MySQL ist ein toller Einstieg in die Welt der relationalen Datenbanken. Bleib dran, in den nächsten Beiträgen tauchen wir tiefer in SQL und fortgeschrittene MySQL-Themen ein!&lt;/p&gt;

&lt;h2&gt;
  
  
  Übungen
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Übung 1&lt;/strong&gt;: Recherchiere und beschreibe die Unterschiede zwischen relationalen und nicht-relationalen Datenbanken. Gebe Beispiele für beide Typen und diskutiere die Vor- und Nachteile von beiden.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Übung 2&lt;/strong&gt;: Installiere MySQL und MySQL Workbench auf deinem Computer. Erstelle eine neue Datenbank namens &lt;code&gt;Bibliothek&lt;/code&gt; und überprüfen, ob du erfolgreich eine Verbindung herstellen kannst&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Referenzen
&lt;/h2&gt;

&lt;p&gt;Referenzen und weiterführende Lektüre&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;span id="fn-1"&gt;&lt;/span&gt;&lt;a href="https://amzn.to/3KBbMxs" rel="noopener noreferrer"&gt;C.J. Date (2003), &lt;em&gt;"An Introduction to Database Systems: International Edition"&lt;/em&gt;&lt;/a&gt; *&lt;/li&gt;
&lt;li&gt;
&lt;span id="fn-2"&gt;&lt;/span&gt;&lt;a href="https://amzn.to/3KC3Ufo" rel="noopener noreferrer"&gt;Hernandez, Michael J. (2013), &lt;em&gt;"Database Design for Mere Mortals: A Hands-On Guide to Relational Database Design"&lt;/em&gt;&lt;/a&gt; *&lt;/li&gt;
&lt;li&gt;
&lt;span id="fn-3"&gt;Codd, E.F. (1970), &lt;em&gt;"A Relational Model of Data for Large Shared Data Banks"&lt;/em&gt;&lt;/span&gt; *&lt;/li&gt;
&lt;li&gt;
&lt;span id="fn-4"&gt;&lt;/span&gt;&lt;a href="https://amzn.to/4cflG3P" rel="noopener noreferrer"&gt;Alfons Kemper und André Eickler (2015), &lt;em&gt;"Datenbanksysteme: Eine Einführung (De Gruyter Studium)"&lt;/em&gt;&lt;/a&gt; *&lt;/li&gt;
&lt;li&gt;
&lt;span id="fn-5"&gt;&lt;/span&gt;&lt;a href="https://amzn.to/4aOJb2B" rel="noopener noreferrer"&gt;Michael Kofler (2024), &lt;em&gt;"Datenbanksysteme: Das umfassende Lehrbuch für Ausbildung, Beruf und Studium"&lt;/em&gt;&lt;/a&gt; *&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;* &lt;strong&gt;Affiliatelinks/Werbelinks&lt;/strong&gt;: Wenn du auf einen Affiliate-Link klickst und über diesen Link einkaufst, bekomme ich von dem betreffenden Online-Shop oder Anbieter eine Provision. Du unterstützt den Blog und für dich ändert sich nichts am Preis.&lt;/p&gt;

</description>
      <category>german</category>
      <category>sql</category>
      <category>database</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
