Sortie des sentiers battus en SQL

RobinFrcd

Sortie des sentiers battus en SQL

Message par RobinFrcd » 22 juin 2015 23:45

Bonsoir,
Passant l'épreuve d'info X-ENS dans deux jours, je voulais vérifier un point du programme (PSI) en informatique par rapport à la jointure en SQL.

La syntaxe de base est :

Code : Tout sélectionner

SELECT ... FROM <table gauche> JOIN <table droite> ON <condition de jointure>
Mais voilà, je n'ai jamais été très fan des jointures avec cette syntaxe et j'utilise une autre syntaxe depuis longtemps, que j'ai d'ailleurs employée aux autres épreuves écrites des autres concours, la voici.

On considère donc deux tables, disons:
Films: id, categorie(int), titre, date
Categories: id, titre

Disons que je veuille les titres/date des films d'action :

Code : Tout sélectionner

SELECT Films.titre, Films.date FROM Films, Categories WHERE Films.categorie = Categories.id AND Categories.titre='Action'
Alors je n'utilise pas le JOIN du programme, mais cette syntaxe fonctionne. Pour autant, est-ce qu'on me comptera une telle requête comme fausse ? Faut-il nécessairement utiliser le JOIN ?

Quelqu'un de bien renseigné pourrait-il m'en dire plus ?

Merci d'avance,

Messages : 944

Inscription : 01 juin 2010 22:35

Profil de l'utilisateur : Élève de lycée

Re: Sortie des sentiers battus en SQL

Message par train epicycloidal » 23 juin 2015 00:15

http://openclassrooms.com/courses/intro ... ntures-sql

Ta syntaxe ne sort pas réellement des sentiers battus et est couramment utilisée.
Il semblerait qu’il s’agisse d’une ancienne syntaxe, sans doute moins optimisée que la nouvelle.

Il est alors peu recommandable de ne pas se plier aux normes actuelles.
Employé.

Messages : 21

Inscription : 17 sept. 2009 22:19

Profil de l'utilisateur : Élève de lycée

Re: Sortie des sentiers battus en SQL

Message par babafou » 23 juin 2015 12:34

RobinFrcd a écrit :Bonsoir,
Passant l'épreuve d'info X-ENS dans deux jours, je voulais vérifier un point du programme (PSI) en informatique par rapport à la jointure en SQL.

La syntaxe de base est :

Code : Tout sélectionner

SELECT ... FROM <table gauche> JOIN <table droite> ON <condition de jointure>
Mais voilà, je n'ai jamais été très fan des jointures avec cette syntaxe et j'utilise une autre syntaxe depuis longtemps, que j'ai d'ailleurs employée aux autres épreuves écrites des autres concours, la voici.

On considère donc deux tables, disons:
Films: id, categorie(int), titre, date
Categories: id, titre

Disons que je veuille les titres/date des films d'action :

Code : Tout sélectionner

SELECT Films.titre, Films.date FROM Films, Categories WHERE Films.categorie = Categories.id AND Categories.titre='Action'
Alors je n'utilise pas le JOIN du programme, mais cette syntaxe fonctionne. Pour autant, est-ce qu'on me comptera une telle requête comme fausse ? Faut-il nécessairement utiliser le JOIN ?

Quelqu'un de bien renseigné pourrait-il m'en dire plus ?

Merci d'avance,
Je ne saurais dire si l'utilisation de cette syntaxe est pénalisante mais il est trivial de la transformer en jointure propre :

Code : Tout sélectionner

SELECT Films.titre, Films.date
FROM Films
   JOIN Categories ON Films.categorie = Categories.id
WHERE Categories.titre='Action'
L'avantage de cette syntaxe est de bien séparer la ou les conditions de jointure des conditions de sélection, ce qu'on voit bien dans cet exemple.
Marc Baudoin
Lycée Louis Thuiller, Amiens - mathématiques supérieures 1989-1990 - mathématiques spéciales M' 1990-1991
ingénieur ENSTA ParisTech - promotion 1994
formateur, professeur affilié à l'ENSTA ParisTech, professeur à CentraleSupélec et à l'ESIEE

Messages : 0

Inscription : 19 déc. 2014 17:35

Profil de l'utilisateur : Élève de lycée

Re: Sortie des sentiers battus en SQL

Message par CendreWapiti » 23 juin 2015 23:32

Tout est dans la complexité de ta requête.
La solution naïve que tu utilise a une complexité en n² où n est la taille de ton tableau SQL. En fait c'est un produit cartésien.
La solution avec JOIN est plus efficace, complexité en n*log(n).
C'est radicalement différent. Dans le premier cas tu réalise un produit cartésien, alors que dans le deuxième c'est une vraie jointure.
Alors oui pour des tableaux de 100 entrées la différence est minime, mais lorsqu'il s'agit de traiter des tableaux de taille 10000 c'est crucial.
Après cela est-il pénalisable :
oui et non. La jointure est plus efficace et figure explicitement au programme, mais le produit cartésien aussi. Le fait est que ce n'est pas la même opération qui réellement réalisée. Si on te demande une solution efficace => JOIN
2014 - 2015 : MPSI2
2015 - 2016 : MP*
X 2016

RobinFrcd

Re: Sortie des sentiers battus en SQL

Message par RobinFrcd » 24 juin 2015 22:22

Bonsoir et merci pour vos réponses.
Très bien, j'ignorais complètement la différence de complexité entre les deux requêtes !

Dans tous les cas, sans surprise, il n'y a pas eu de SQL à l'épreuve de l'X. Mais c'est toujours bon à savoir pour la suite.

Bonne soirée à tous.

Répondre