Différence sqliteman/sqlite3
Bonjour,
je suis novice sur les bases de données, mais je voudrais savoir faire quelques requêtes simples, puis dans un second temps savoir créer une base de données.
Pour cela, j'ai tenté de faire le TP téléchargeable à cette adresse : http://blog.psi945.fr/pages/Informatique-commune-en-première-année
Précisément, celui nommé "Bases de données (1/3; écosystème, découverte de SQL)". On part d'une base de données base_triangles.db, constituée d’une seule table, dont le schéma relationnel est :
triangle( idt:integer, ab:integer, ac:integer, bc:integer)
Puis, on demande de faire diverses requêtes (donner l'identifiant des triangles de périmètre >= 100, les triangles équilatéraux, etc) qui se passent bien.
Enfin, on veut récupérer la plus petite valeur des produits AB.AC.BC, pour les triangles (ABC) de périmètre supérieur ou égal à 100, ce que je fais avec
Je ne comprends donc pas ce que je fais de mal dans sqliteman (et de bien dans Python en fait...).
Petite question plus générale sur les bases de données : j'ai cru comprendre que le langage SQL permet de faire des opérations sur les bases de données. Mais je suis assez surpris par le fait que j'ai l'impression (probablement fausse) que c'est le seul ! J'imagine bien qu'il en existe d'autres mais comment se fait-il qu'il est à ce point incontournable ?
je suis novice sur les bases de données, mais je voudrais savoir faire quelques requêtes simples, puis dans un second temps savoir créer une base de données.
Pour cela, j'ai tenté de faire le TP téléchargeable à cette adresse : http://blog.psi945.fr/pages/Informatique-commune-en-première-année
Précisément, celui nommé "Bases de données (1/3; écosystème, découverte de SQL)". On part d'une base de données base_triangles.db, constituée d’une seule table, dont le schéma relationnel est :
triangle( idt:integer, ab:integer, ac:integer, bc:integer)
Puis, on demande de faire diverses requêtes (donner l'identifiant des triangles de périmètre >= 100, les triangles équilatéraux, etc) qui se passent bien.
Enfin, on veut récupérer la plus petite valeur des produits AB.AC.BC, pour les triangles (ABC) de périmètre supérieur ou égal à 100, ce que je fais avec
SELECT min(ab*ac*bc) FROM triangles WHERE ab+ac+bc>=100Je récupère 99. Puis, on veut assez logiquement les longueurs correspondants au triangle pour lequel le minimum précédent est atteint. Je fais :
SELECT ab,ac,bc,min(ab*ac*bc) FROM triangles WHERE (ab+ac+bc>=100)Je récupère dans l'ordre $94, 26, 25, 99$, ce qui est aberrant. J'ai tapé cette requête dans sqliteman. Pour tester, j'ai aussi tapé cette commande dans une console Python après avoir importé sqlite3. Et j'obtiens la liste $[(1, 99, 1, 99)]$, ce qui me paraît plus convenable.
Je ne comprends donc pas ce que je fais de mal dans sqliteman (et de bien dans Python en fait...).
Petite question plus générale sur les bases de données : j'ai cru comprendre que le langage SQL permet de faire des opérations sur les bases de données. Mais je suis assez surpris par le fait que j'ai l'impression (probablement fausse) que c'est le seul ! J'imagine bien qu'il en existe d'autres mais comment se fait-il qu'il est à ce point incontournable ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
C'est peut-être le genre de requête qui n'a pas un résultat défini dans le standard SQL ce qui expliquerait que tu as des valeurs différentes suivant l'implémentation de SQL que tu utilises. Mais bon, j'ai déjà vu sqilte3 faire des choses bizarres donc ma phrase précédente est peut-être complètement fausse.
Tu veux en fait faire un "argmin", le premier résultat google intéressant semble celui-là : https://stackoverflow.com/questions/4556653/is-there-something-equivalent-to-argmax-in-sql
Et pour les bases de données, tu en as de pleins de types différentes : de pas structuré du tout (genre t'as un tas de fichiers avec des informations mis à la va-vite dedans**) à hyper structuré comme les bases de données relationnelles. Ces dernières sont effectivement très largement (pour ne pas dire uniquement) décrite et manipulées avec du SQL.
Mais pour être précis, SQL est un "standard" qui a plusieurs implémentations (sqlite3, mysql, postgresql, ...) qui doivent suivre la sémantique définie par SQL mais peuvent différer légèrement sur les cas non définis (comme tu as pu t'en rendre compte) ou rajouter leur propres commandes.
Il y a aussi depuis peu (5-10 ans peut-être) émergence de bases "NoSql" qui comme son nom l'indique n'utilise pas le paradigme SQL (je te laisse googler ça pour en savoir plus).
** ouioui, certains osent appeler ça une "base de données"... C'est bien sûr un m**dier pas possible dès qu'on veut modifier un truc.
Petite question subsidiaire : ma requête est présentée de manière pas très jolie, est-ce qu'il existe comme en Python "classique" des indentations à respecter en SQL pour arriver à quelque chose de lisible ? (en gros, un document comme PEP8).
Je regarde les liens pour écrire des requêtes intelligibles.