Linuxhotel Wiki

Wie ging das nochmal?

Benutzer-Werkzeuge

Webseiten-Werkzeuge


lpi1:sql

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Nächste Überarbeitung
Vorherige Überarbeitung
lpi1:sql [2010/07/28 15:26] – Externe Bearbeitung 127.0.0.1lpi1:sql [2015/08/17 13:07] (aktuell) – [Dokumentation] ingo_wichmann
Zeile 1: Zeile 1:
 ====== Installation Pakete ====== ====== Installation Pakete ======
-SuSE, Debian: +SuSE, Debian: ''sqlite3''
-  sqlite3+
  
-CentOS: +CentOS: ''sqlite''
-  sqlite+
  
 ====== Unix Benutzer in SQLite Datenbank überführen ====== ====== Unix Benutzer in SQLite Datenbank überführen ======
 Ein einfaches Beispiel als Schnell-Einstieg in SQL Ein einfaches Beispiel als Schnell-Einstieg in SQL
  
-==== SQLite Datenbank anlegen ====+==== SQLite erstmals aufrufen ====
   sqlite3 accounts.db   sqlite3 accounts.db
   .help   .help
Zeile 19: Zeile 17:
 Aufbau gemäß ''/etc/passwd'' : Aufbau gemäß ''/etc/passwd'' :
  
-  sqlite3 accounts.db <<SQL 
 <code sql> <code sql>
 +sqlite3 accounts.db <<SQL
 +
 CREATE TABLE users (  CREATE TABLE users ( 
  uid text,   uid text, 
Zeile 30: Zeile 29:
  shell text   shell text 
 ); );
 +
 +SQL
 </code> </code>
-  SQL 
  
 ==== Benutzer importieren ==== ==== Benutzer importieren ====
Zeile 44: Zeile 44:
  
 SQL INSERT Statement zum Einfügen der Daten in die Tabelle ''users'': SQL INSERT Statement zum Einfügen der Daten in die Tabelle ''users'':
-  cat <<SQL  
 <code sql> <code sql>
 +cat <<SQL 
 +
 INSERT INTO users ( uid, password, uidNumber, gidNumber, gecos, home, shell )  INSERT INTO users ( uid, password, uidNumber, gidNumber, gecos, home, shell ) 
   VALUES ( '$uid', '$password', '$uidNumber', '$gidNumber', '$gecos', '$home', '$shell' );   VALUES ( '$uid', '$password', '$uidNumber', '$gidNumber', '$gecos', '$home', '$shell' );
 +
 +SQL 
 </code> </code>
-  SQL  
  
 === Mit ''while''-Schleife alle Benutzer importieren === === Mit ''while''-Schleife alle Benutzer importieren ===
Zeile 66: Zeile 68:
 Für die ''/etc/group'' werden zwei Tabellen benötigt: Für die ''/etc/group'' werden zwei Tabellen benötigt:
  
-  sqlite3 accounts.db <<SQL  
 <code sql> <code sql>
-  CREATE TABLE groups ( gid text, password text, gidNumber integer ); +sqlite3 accounts.db <<SQL 
-  CREATE TABLE members ( gidNumber integer, uid text ); +
-</code> +
-  SQL  +
  
 +CREATE TABLE groups ( gid text, password text, gidNumber integer );
 +CREATE TABLE members ( gidNumber integer, uid text );
  
 +SQL 
 +</code>
  
 ==== Gruppen importieren ==== ==== Gruppen importieren ====
Zeile 118: Zeile 119:
 ... können die Mitglieder dann einer nach dem anderen in die Variable ''$member'' eingelesen und zusammen mit der ''$gidNumber'' in die Tabelle ''members'' geschrieben werden. ... können die Mitglieder dann einer nach dem anderen in die Variable ''$member'' eingelesen und zusammen mit der ''$gidNumber'' in die Tabelle ''members'' geschrieben werden.
  
 +==== Das Skript in einer Datei ====
 +<file bash unix_users2sql.sh>
 +#!/bin/bash
 +
 +# Tabelle für Benutzer anlegen
 +sqlite3 accounts.db <<SQL
 +  CREATE TABLE users ( 
 +    uid text, 
 +    password text, 
 +    uidNumber integer, 
 +    gidNumber integer, 
 +    gecos text, 
 +    home text, 
 +    shell text 
 +  );
 +SQL
 +
 +# Benutzer importieren
 +while IFS=':' read uid password uidNumber gidNumber gecos home shell;   
 +do
 +  cat <<SQL
 +    INSERT INTO users ( uid, password, uidNumber, gidNumber, gecos, home, shell ) 
 +    VALUES ( '$uid', '$password', '$uidNumber', '$gidNumber', '$gecos', '$home', '$shell' ); 
 +SQL
 +done < /etc/passwd | sqlite3 accounts.db
 +
 +## Tabellen für Gruppen anlegen
 +sqlite3 accounts.db <<SQL
 +  CREATE TABLE groups ( gid text, password text, gidNumber integer );
 +  CREATE TABLE members ( gidNumber integer, uid text );
 +SQL
 +
 +## Gruppen importieren
 +while IFS=':' read gid password gidNumber members;  
 +do  
 +  cat <<SQL
 +    INSERT INTO groups ( gid, password, gidNumber ) 
 +      VALUES ( '$gid', '$password', '$gidNumber' );
 +SQL
 +done < /etc/group | sqlite3 accounts.db 
 +
 +## Gruppenmitglieder importieren
 +while IFS=':' read gid password gidNumber members;
 +do
 +  for uid in $(echo $members | tr ',' ' ');
 +  do
 +    echo "INSERT INTO members ( gidNumber, uid ) VALUES ( '$gidNumber', '$uid' );" 
 +  done
 +done < /etc/group | sqlite3 accounts.db
 +</file>
  
 ==== Der fertige SQL-Dump ==== ==== Der fertige SQL-Dump ====
Zeile 182: Zeile 233:
  
 ===== einfache SELECT Abfragen ===== ===== einfache SELECT Abfragen =====
-==== Alle Benutzer wie in ''/etc/passwd'' ausgeben ====+==== Alle Benutzer in ''/etc/passwd'' ausgeben ====
 <code sql>select * from users;</code> <code sql>select * from users;</code>
 +analog zu
 +  cat /etc/passwd
  
 ==== Benutzer root ausgeben ==== ==== Benutzer root ausgeben ====
 <code sql>select * from users where uid = 'root';</code> <code sql>select * from users where uid = 'root';</code>
 +analog zu 
 +  grep '^root' /etc/passwd
 ==== Shell des Benutzers root ausgeben ==== ==== Shell des Benutzers root ausgeben ====
 <code sql>select shell from users where uid = 'root';</code> <code sql>select shell from users where uid = 'root';</code>
 +analog zu
 +  grep '^root' /etc/passwd | cut -d: -f 7
  
 ==== Benutzer nach Name sortiert ausgeben ==== ==== Benutzer nach Name sortiert ausgeben ====
-<code sql>select * from users order by uid;</code>+<code sql>select * from users order by uidNumber;</code> 
 +analog zu 
 +  sort -n -t: -k3 /etc/passwd
  
 ==== Anzahl der Benutzer ausgeben ==== ==== Anzahl der Benutzer ausgeben ====
 <code sql>select count(*) from users;</code> <code sql>select count(*) from users;</code>
 +analog zu 
 +  wc -l /etc/passwd
 ==== Wie viele Benutzer verwenden welche Shell ? ==== ==== Wie viele Benutzer verwenden welche Shell ? ====
 <code sql>select shell, count(shell) from users group by shell;</code> <code sql>select shell, count(shell) from users group by shell;</code>
 +analog zu 
 +  cut -d : -f 7 /etc/passwd|sort|uniq -c
 ===== JOIN ===== ===== JOIN =====
 Alle Benutzer, ihre Passwörter und ihre primäre Gruppe namentlich ausgeben Alle Benutzer, ihre Passwörter und ihre primäre Gruppe namentlich ausgeben
Zeile 226: Zeile 286:
   on users.gidNumber = groups.gidNumber;   on users.gidNumber = groups.gidNumber;
 </code> </code>
- 
  
 ==== JOIN USING ==== ==== JOIN USING ====
Zeile 244: Zeile 303:
   natural join groups;   natural join groups;
 </code> </code>
- 
- 
  
 ===== Subselect ===== ===== Subselect =====
-Die Durchschnitt der Gruppennummern aus der Tabelle ''users'' berechnen:+Den Durchschnitt der Gruppennummern aus der Tabelle ''users'' berechnen:
 <code sql> <code sql>
   select avg(gidNumber) from users;   select avg(gidNumber) from users;
 </code> </code>
  
-Alle Gruppen, deren Nummer größer als dieser Durchschnitt ist:+Alle Gruppen, deren Nummer größer als der Durchschnitt ist:
 <code sql> <code sql>
   select gid from groups where gidNumber > ( select avg(gidNumber) from users );   select gid from groups where gidNumber > ( select avg(gidNumber) from users );
 </code> </code>
- 
- 
- 
- 
  
 Join mit Hilfe von Subselect: Join mit Hilfe von Subselect:
Zeile 273: Zeile 326:
   );   );
 </code> </code>
- 
  
 Bei allen Benutzern mit Benutzernummern zwischen 500 und 10000 die Benutzernummer um 500 erhöhen: Bei allen Benutzern mit Benutzernummern zwischen 500 und 10000 die Benutzernummer um 500 erhöhen:
Zeile 282: Zeile 334:
 </code> </code>
  
 +====== Datenbank verändern ======
 +===== Datensätze verändern =====
 +==== Zeile hinzufügen ====
 +Gruppe mit neuer uidNumber hinzufügen
 +  INSERT INTO groups (gid, password, gidNumber) VALUES ( 'projekt-y', 'x', ( SELECT MAX(gidNumber) FROM groups WHERE gidNumber < 65000)+1);
 +==== Zeile kopieren ====
 +  INSERT INTO groups SELECT * FROM groups WHERE gid = 'projekt-y';
 +==== Zeile verändern ====
 +  UPDATE groups SET gid = 'projekt-z' WHERE gid = 'projekt-y';
 +==== Zeile löschen ====
 +  DELETE FROM groups WHERE gid = 'projekt-y';
 +==== Spalte hinzufügen ====
 +  
 +  
 ====== Übung ====== ====== Übung ======
 Schreiben sie Skripte mit SQL Anweisungen, die als Ersatz für die Linuxbefehle Schreiben sie Skripte mit SQL Anweisungen, die als Ersatz für die Linuxbefehle
Zeile 297: Zeile 363:
 ====== Dokumentation ====== ====== Dokumentation ======
   * [[http://www.sqlite.org/lang.html]]   * [[http://www.sqlite.org/lang.html]]
 +  * {{:visual_sql_joins_orig.jpg?200|}} ( [[http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins| Quelle]] ) 
  
lpi1/sql.1280330772.txt.gz · Zuletzt geändert: 2011/06/11 11:50 (Externe Bearbeitung)