Outils pour utilisateurs

Outils du site


c_sqlite3

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
c_sqlite3 [2009/12/24 16:53]
thierry
c_sqlite3 [2010/09/28 19:47] (Version actuelle)
thierry
Ligne 107: Ligne 107:
  
 | :!: Pour quelques exemples qui suivent, on est dans un shell | | :!: Pour quelques exemples qui suivent, on est dans un shell |
 +
 +=== base ===
  
 Avec la date: Avec la date:
Ligne 131: Ligne 133:
 Et voila la conversion faite. Et voila la conversion faite.
  
 +=== comparaisons ===
  
 +En supposant des colonnes initialisés avec **''​DATETIME('​now','​localtime'​)''​** , c'est facile:
 +  $ sqlite3 test.db "​DELETE FROM MyTable WHERE ( Last_Access_Date < DATETIME('​now','​localtime','​-2 hours'​) ) OR ( Create_Date < DATETIME('​now','​localtime','​-10 days') );"
 +
 +Lorque qu'une colonne specifie une durée, par exemple la colonne **''​TTL''​** exprime en heures, on peut faire aussi:
 +  $ sqlite3 test.db "​DELETE FROM MyTable WHERE ( Last_Access_Date < DATETIME('​now','​localtime','​-'​||TTL||'​ hours'​) );
 +Le **''​||''​** permet de concatener une chaine...
  
 ==== trigger ==== ==== trigger ====
Ligne 161: Ligne 170:
  
 ==== plusieurs databases ==== ==== plusieurs databases ====
 +
 +=== ATTACH ===
  
 On a parfois besoin d'​ouvrir plusieurs "​database"​ , notamment pour faire des jointures... On a parfois besoin d'​ouvrir plusieurs "​database"​ , notamment pour faire des jointures...
Ligne 176: Ligne 187:
  
   *On peut en '​attacher'​ plusieurs.   *On peut en '​attacher'​ plusieurs.
-  *On peut aussi ouvrir une base principale en même temps. ''​$ sqlite3 mabase.sqlite''​+  *On peut aussi ouvrir une base principale en même temps. ​__''​$ sqlite3 mabase.sqlite''​__ 
 +=== Nommage === 
 +Pour utiliser l'une autre des databases, il faut les nommés par leur Alias. 
 + 
 +Ainsi: ''​source.MyTable''​ est une table dans la database dont alias est ''​source''​. 
 + 
 +Pour nommé la base principale, utilisé l'​alias:​ ''​main.''​. 
 + 
 +Exemple: 
 +  sqlite> CREATE TABLE source.MyTable ( Name TEXT, Age INTEGER ); 
 + 
 +Ou encore: 
 +  sqlite> SELECT dst.Name,​src.* FROM main.MyTable dst LEFT JOIN source.MyTable src ON src.Name=dst.Name;​ 
 + 
 +  * ''​dst''​ est un alias de ''​main.MyTable''​ 
 +  * ''​src''​ est un alias de ''​source.MyTable''​ 
 +  * ''​src.*''​ signifie: toutes les colonnes de ''​src''​ (et donc de ''​source.MyTable''​)
  
 === DBI Perl === === DBI Perl ===
Ligne 185: Ligne 212:
   }   }
 Sans "​hack"​ autour de "​AutoCommit",​ l'​attache n'est pas possible. Sans "​hack"​ autour de "​AutoCommit",​ l'​attache n'est pas possible.
 +
 +==== Left Join (Jointure) ====
 +
 +=== Dans Table_A et Table_B ===
 +Soit une **''​Table_A''​** et une **''​Table_B''​** .
 +Soit un champ commun de fonction commune entre elle (par exemple, un numéro de carte bancaire).
 +
 +On veut la liste des rangées (row) qui sont dans **''​Table_A''​** (left) et **''​Table_B''​** (right).
 +
 +  SELECT Table_A.CB, Table_B.CB FROM Table_A LEFT JOIN Table_B ON Table_A.CB=Table_B.CB ;
 +
 +ATTENTION: **toutes** les rangées de **''​Table_A''​** sont retournées ! \\
 +Toutefois, lorsqu'​une rangée de la **''​Table_A''​** n'a pas de jointure correspondant,​ alors la rangée de **''​Table_B''​** est entièrement **NULL**.
 +
 +Donc, pour avoir vraiment la "​jointure"​ de **''​Table_A''​** et **''​Table_B''​**,​ sans **NULL** , il faut ajouter un petit **''​WHERE''​** comme ça:
 +  SELECT Table_A.CB, Table_B.CB FROM Table_A LEFT JOIN Table_B ON Table_A.CB=Table_B.CB WHERE Table_B.CB IS NOT NULL ;
 +
 +Et voila.
 +
 +=== Dans Table_A et pas dans Table_B ===
 +Maintenant, on veut les rangées qui sont dans la **''​Table_A''​**,​ et PAS dans la **''​Table_B''​** ...
 +
 +Il suffit d'​inverser le "​WHERE"​...
 +  SELECT Table_A.CB FROM Table_A LEFT JOIN Table_B ON Table_A.CB=Table_B.CB WHERE Table_B.CB IS NULL ;
 +
 +=== plusieurs databases ===
 +Lorsqu'​on travaille avec plusieurs databases (grâce à la commande **''​ATTACH DATABASE''​** ), et que les tables ont les mêmes noms...
 +
 +Ainsi, soit 2 databases:
 +  * main
 +  * source
 +
 +Leurs tables sont identiques, et particulièrement une table commune nommé **''​MyTable''​** ...\\
 +
 +On peut créer le même genre de jointure que ci-dessus... mais faut faire attention au nommage...
 +
 +== Sans alias ==
 +  SELECT main.MyTable.CB,​ source.MyTable.CB FROM main.MyTable LEFT JOIN source.MyTable ON main.MyTable.CB=source.MyTable.CB WHERE source.MyTable.CB IS NOT NULL ;
 +
 +== Avec alias ==
 +On peut créer le même genre de jointure que ci-dessus, mais avec plein d'​aliases !
 +
 +Exemple:
 +  SELECT dst.CB, src.CB FROM main.MyTable dst LEFT JOIN source.MyTable src ON dst.CB=src.CB WHERE src.CB IS NOT NULL ;
 +C'est un peu plus court grâce aux alias créés dans le **''​FROM ...''​**
  
 ===== Perl ===== ===== Perl =====
Ligne 217: Ligne 289:
  
  
-  ​+==== Safe copy ==== 
 + 
 +Lien: http://​stuvel.eu/​archive/​55/​safely-copy-a-sqlite-database 
c_sqlite3.1261670021.txt.gz · Dernière modification: 2009/12/24 16:53 par thierry