10
votes

Section SQL débutant: Éviter l'expression répétée

Je suis entièrement nouveau chez SQL, mais disons que sur le Stackexchange Data Explorer , je viens de vouloir énumérer les 15 meilleurs utilisateurs par réputation, et j'ai écrit quelque chose comme ceci: xxx

actuellement ceci donne une erreur : nom de colonne invalide 'repink' , ce qui fait sens, je pense, parce que RepInK est pas une colonne dans utilisateurs . Je peux facilement résoudre ce problème en disant où la réputation / 1000> 10 , répétant essentiellement la formule.

afin que les questions sont les suivantes:

  • Puis-je réellement utiliser le repink "colonne" dans le clause?
    • Dois-je peut-être créer une table virtuelle / une vue avec cette colonne, puis effectuez un Sélectionner / où interroge dessus?
    • Puis-je nommer une expression, par exemple Réputation / 1000 , il suffit donc de répéter les noms dans quelques endroits au lieu de la formule?
      • Comment appelez-vous cela? Une macro de substitution? Une fonction? Une procédure stockée?
      • Y a-t-il une feuille de sql rapide, glossaire de termes, spécification linguistique, tout ce que je peux utiliser pour récupérer rapidement la syntaxe et la sémantique de la langue?
        • Je comprends qu'il existe différentes "saveurs"?

1 commentaires

Vous ne pouvez pas utiliser Sélectionner des instructions comme conditions, dans votre cas repink , car ils seront résolus après le où < / Code>, c'est un paradoxe et le serveur explosera avec l'ensemble du bâtiment.


5 Réponses :


9
votes

Puis-je réellement utiliser la "colonne" repink dans la clause WHERE?

Non, mais vous pouvez être assuré que votre base de données évaluera (réputation / 1000) une fois, même si vous l'utilisez à la fois dans les champs et dans le < code> où clause.

Dois-je peut-être créer une table / une vue virtuelle avec cette colonne, puis effectuez une sélection / la requête sur elle?

Oui, une vue est une option pour simplifier les requêtes complexes.

Puis-je nommer une expression, par exemple Réputation / 1000, il suffit donc de répéter les noms dans quelques endroits au lieu de la formule?

Vous pouvez créer une fonction définie par l'utilisateur que vous pouvez appeler quelque chose comme converttok , qui recevrait la valeur REP comme argument et renvoie cet argument divisé par 1000. Cependant, il n'est souvent pas pratique pour un cas trivial comme celui de votre exemple.

Y a-t-il une fiche rapide, glossaire de termes, spécification linguistique, tout ce que je peux utiliser pour récupérer rapidement la syntaxe et la sémantique de la langue?

Je suggère de pratique. Vous voudrez peut-être commencer à suivre le Tag MySQL sur le débordement de la pile, où de nombreuses questions débutantes sont posées tous les jours. Téléchargez MySQL , et quand vous pensez qu'il y a une question à votre portée, essayez d'aller pour le Solution. Je pense que cela vous aidera à ramasser de la vitesse, ainsi que de conscience des caractéristiques des langues. Il n'est pas nécessaire de poster la réponse au début, car il y a des armes à feu assez rapides sur le sujet ici, mais avec une certaine pratique, je suis sûr que vous pourrez apporter des points à la maison :)

Je comprends qu'il existe différentes "saveurs"?

Les saveurs sont en réalité des extensions de ANSI SQL . Les fournisseurs de base de données augmentent généralement la langue SQL avec des extensions telles que transact-sql et PL / SQL .


3 commentaires

Seriez-vous conseiller contre l'apprentissage SQL par l'explorateur de données Exchange Stack Exchange? Parce que c'était mon plan. Pas besoin d'installer quelque chose, beaucoup de personnes qui l'interrogent déjà afin que je puisse rechercher les requêtes des autres, les données réelles que je connais et stipistes, etc.


@polygenelubrançants: non pas du tout. C'est certainement une bonne pratique, surtout si vous avez des curiosités spécifiques que vous souhaitez satisfaire des décharges de données SE :) ... J'ai suggéré de suivre des questions simplement parce que les vrais problèmes révèlent souvent beaucoup plus de situations pour des trucs sql pratiques. De plus, vous verrez également comment les experts répondent, de qui il y a beaucoup à apprendre. La balise MySQL rassemble généralement des problèmes plus simples que les balises SQL-Server, ou d'autres. La syntaxe n'est pas si différente: la plupart des requêtes seront exécutées sur toutes les bases de données.


@polygenLubrançants: on dirait que vous n'êtes pas le seul intéressées par l'apprentissage SQL de l'Exchange Stack Exchange Data Exporer :)



8
votes

Vous pouvez simplement ré-écrire la clause où la clause xxx

Ce n'est pas toujours pratique. En tant que alternativement, vous pouvez utiliser une vue en ligne: xxx


0 commentaires

1
votes

vous peut se référer à repink dans la clause par , mais dans la clause , vous devez répéter l'expression. Mais, comme d'autres l'ont dit, il ne sera exécuté qu'une seule fois.


0 commentaires

1
votes

Il existe déjà de bonnes réponses pour le problème technique, donc je ne vais donc aborder que certaines des autres questions.

Si vous travaillez avec le dataExplorer, vous voudrez vous familiariser avec SQL Server Syntax depuis que c'est en cours d'exécution. Le meilleur endroit pour trouver que, bien sûr, est MSDN Référence .

Oui, il existe différentes variations de la syntaxe SQL. Par exemple, la clause top dans la requête que vous avez donnée est SQL Server spécifique; Dans MySQL, vous utiliseriez la clause limite plutôt (et ces mots-clés n'apparaissent pas nécessairement dans le même endroit de la requête!).


0 commentaires

2
votes

En ce qui concerne quelque chose comme des expressions nommées, tandis qu'il y a plusieurs alternatives possibles, l'optimiseur de requêtes va faire de mieux simplement écrire la formule réputation / 1000 longue main. Si vous avez vraiment besoin d'exécuter tout un groupe de requêtes en utilisant la même valeur évaluée, votre meilleur pari est de créer une vue avec le champ défini, mais vous ne voudriez pas le faire pour une requête unique.

en tant que alternative, (et dans les cas où la performance n'est pas une grande partie du problème), vous pouvez essayer quelque chose comme: xxx

si je ne crois pas que ce soit supporté par tous les dialectes SQL et Encore une fois, l'optimiseur est susceptible de faire un travail bien pire que ce genre de chose (puisqu'il exécutera la sélection de la table des utilisateurs complète, puis de filtrer ce résultat). Néanmoins, pour certaines situations, ce type de requête est approprié (il y a un nom pour cela ... je dessine un vide pour le moment).

Personnellement, quand j'ai commencé avec SQL, j'ai trouvé < Un href = "http://www.w3schools.com/sql/default.asp" rel = "Nofollow NOREFERRER"> Les écoles W3 font référence à mon point d'arrêt constant. Cela correspond à mon style pour être quelque chose que je peux jeter un coup d'œil pour trouver une réponse rapide et passer à autre chose. Finalement, cependant, profiter vraiment de la base de données, il est nécessaire de plonger dans la documentation des fournisseurs.

Bien que SQL soit "STULARISÉ", malheureusement (cependant, heureusement, heureusement), chaque fournisseur de base de données implémente sa propre version avec leurs propres extensions, ce qui peut entraîner une syntaxe très différente (pour Une discussion sur les incompatibilités de diverses bases de données sur un numéro Voir le Documentation SQLITE sur NULL Manipulation . Dans Les fonctions standard, par exemple pour la manutention des dates et des temps ont tendance à différer par fournisseur, et il existe d'autres différences plus drastiques (notamment dans les sous-éléments de support ni de manipulation correctement). Si vous vous souciez de certains des détails, Ce document fournit à la fois les formulaires standard et les écarts pour plusieurs bases de données principales.


1 commentaires

(Re: nommé requêtes et optimiseur) À ce stade, je me soucie de l'écriture de bonnes requêtes lisibles; Je m'inquiète de l'optimisation / de la performance plus tard. Je pense que c'est le meilleur moyen d'apprendre la plupart des langues; J'espère que c'est aussi vrai pour SQL.