J'utilise habituellement max () ou min () d'un DBMS n'a aucune fonction () d'agrégat. p>
Y a-t-il quelque chose de moins cher dans MySQL et MS-SQL? P>
5 Réponses :
min et max sont également coûteux. P>
Je sais, mais y a-t-il d'autres moins chers?
@Luis - Si le champ est indexé, non. min code> et max code> sur un champ indexé vient d'aller à la première ou dernière entrée de l'index.
@Jnk: mais min () ou max () ne pas?
@Parkyprg: non, min code> et max code> utilisera l'index (s'il y en a une).
@Jnk - Cela n'est vrai que si vous obtenez un seul max code> plutôt que d'utiliser groupe par code>. Si vous faites un groupe par code> Même si un index existe sur group_column, agrégé_column code> Il ne passera pas au groupe suivant. Donc, pour certaines cardinalités, une CTE récursive peut être meilleure
@Martinsmith - Si je dois faire beaucoup d'agrégation, je fais normalement un index sur (groupfield) (granulats) code>, mais oui, cela pourrait être différent en fonction de l'agrégation
Il y a aucun em> tout agrégat dans ANSI SQL-92 P>
là est em> le qualificatif pour correspondre à une partie et à tous p>
min et max sont des agrégats appropriés ... complètement sans rapport et ne devrait pas être comparé p>
EDIT: P>
Seul MySQL a cette ambiguïté d'un agrégat "Tout": SQL Server, Sybase, Oracle, Postgres non. Voir Toutes les colonnes d'une liste de sélection doivent apparaître dans un groupe par clause p>
J'ai sélectionné un mauvais nom à la fonction "My Aggregate". Mais je veux dire un moyen d'avoir une alternative moins chère de max () ou de min () s'il existe
super!! lien < / a>
SQL Server a un tout code> agrégat
@GBN - Je ne sais pas s'il y aurait un avantage pour réécrire une requête pour l'obtenir. Peut-être une réduction mineure du temps de la CPU potentiellement car il n'est pas nécessaire de faire des comparaisons?
@Martin Smith: Je dirais que c'est une optimisation interne pour traiter de tels cas que celles-ci ci-dessus. Si utilisable directement, cela provoquerait une confusion comme le groupe MySQL par un non-sens
Cette réponse n'est plus exacte à partir de 2015 - Voir cette mise à jour pour MySQL 5.7+.
mysql fait Si je fais un p> microsofts t-sql se plaindre mais < / p> mySQL exécutera silencieusement exécuté silencieusement p> ce qui est bien sûr plus rapide que mySQL prend en charge J'aime MySQL em> p> p> p> P> Sélectionnez max (champ1), champ2, somme (.... Groupe par champ2 code> p> tout code>, mais sélectionnez n'importe quel (champ1) ... code> ne fonctionne pas car tout code> est un opérateur similaire à dans code> et tout code>.
Voir: http://dev.mysql.com /doc/refman/5.0/fr/any-in-some-subqueries.html P>
Ambigu et pas explicite = dangereux.
@GBN, de nombreux outils vous donnent une arme à feu pour tirer, c'est pourquoi vous devez connaître votre outil, de sorte que vous ne vous tirez pas dans le pied. Que les armes à feu tuent des gens ou des personnes tuent les gens est une autre discussion entièrement.
@Johan génial !! J'ai vu Select Field1, Field2, Somme (Field3) de Table1 Group par Field2, Field1 ... mais le champ 1 est REUUDUNAT car il dépend du champ2. Je pense que c'est pire que Min (Field1) aussi
Mauvaise analogie: non comparable. Dans cette situation, je ne vois pas besoin de faire deviner une colonne de RDBMS en mon nom. Seulement i> MySQL a cette ambiguïté aussi: SQL Server, Sybase, Oracle, Postgres Ne pas B>. Voir Stackoverflow.com/q/5986127/27535
@gbn, personnellement, je pense que le mot-clé tout () est la meilleure solution, en ce qui concerne les docs MySQL le soutenir, mais que SOOO beaucoup de requêtes MySQL dépendent de l'ancien comportement code> dangereux code> que ça ne va pas partir . Toute l'idiologie de MySQL doit être aussi pardonnante que possible, pour certaines choses que cela en fait l'outil droit pour le travail B> TM, pour d'autres emplois non. Connaissez vos outils et choisissez judicieusement.
Quelle monnaie fantastique et très appropriée: idiologie i>, comme dans Idio [TIC] [Ideo] Logy, comme dans "l'idiologie de MySQL". Je me souviendrai d'un. (L'orthographe correcte est idéologie i>, BTW.)
@ Johan - Pour porter votre analogie d'armes à feu à sa conclusion - des pistolets de qualité (tous les autres RDBM) vous donnent un interrupteur de sécurité pour empêcher la cuisson accidentelle. MySQL vous donne une gâchette de cheveux et des munitions surchargées pour vous rendre beaucoup plus facile de vous blesser.
Me frappe comme une erreur sujette. Dans DBS qui gérent le fenêtrage, vous pouvez obtenir ce comportement de manière plus évidente.
@Jnk, @johan, @andrew Lazarus: un exemple de pourquoi ce comportement MySQL est stupide Stackoverflow.com/q/6642241/27535 a>
@GBN - Je n'ai pas besoin de convaincre, mais merci pour le lien.
@Jnk: Je sais d'en haut, mais certaines munitions en cas de Bunfight ... ;-)
En tant que note, ce n'est plus le cas avec les paramètres de connexion par défaut, en particulier dans MySQL Workbench - Ceci est contrôlé par sql_mode = seulement_full_group_by code>. L'émission d'une telle requête montrera les éléments suivants: Code d'erreur: 1055. Expression #Number de la liste de sélection n'est pas en groupe par clause et contient la colonne non contenue "Tableau.Column" qui ne dépend pas fonctionnellement des colonnes de la clause de groupe par la clause; Ceci est incompatible avec sql_mode = seulement_full_group_by code>
Bien, rephasons la question initiale. Au lieu de tout, ce qui est ambigu et non standard SQL, ce serait génial si une fonction d'agrégation était fournie. P>
à plusieurs reprises que j'ai utilisé "Compte (externe.column)> 0" pour imiter "Exist (externe.column)", qui serait sans doute moins chère puisque le comptage est jeté quand même. P>
AS de MySQL 5.7 (publié en octobre 2015), il existe une fonction pour cela! Cependant, il est important de noter qu'il semble toujours ne pas garantir un court-circuit et peut toujours effectuer une analyse complète, donc l'objectif d'une efficacité accrue. peut ne pas être satisfait. Si MySQL est intelligent à ce sujet, il y a une chance, bien que les tests soient sages. Il y a deux circonstances dans lesquelles il peut être utile de toute façon: p> échantillon de jouet: p> Any_Value (Col) Code> rencontre explicitement ce besoin - voir le documentation pour plus de détails.
max code> ou un autre agrégat d'espace réservé. Par exemple, un max code> peut impliquer une raison quelconque de son existence plutôt que d'obtenir "quoi que ce soit" du regroupement, mais any_value code> définirait explicitement l'intention sans commentaire supplémentaire. < / li>
ul>
Pourquoi n'existe-t-il aucune fonction totale () d'agrégat?
Pourquoi une fonction d'agrégation () existerait-elle? Quelle serait sa spécification?
Que voulez-vous dire avec
tout () code>? Il devrait renvoyer une ligne aléatoire?Tout (expression) code>: renvoie toute valeur de l'expression dans le groupe. Afin d'avoir de bonnes performances avec des colonnes dépendantes triviales dans les cas où tous sont les mêmes ou tout simplement une bonne filleAucun agrégat dans ANSI-92 SQL contrib.Adrew.cmu.edu / tshadow/sql/sql1992.txt
@ypercube: moins cher pour le SGBD
SQL Server a
premier () code> etDernier () code> pour "Ne pas prendre en charge" les champs dans les requêtes groupées. MySQL ne nécessite rien de faire quoi que ce soit pour obtenir des champs non agrégés dans les requêtes groupées, utilisez simplement le nom de terrain comme vous le feriez dans n'importe quel autre SELECT.@Mark B: Je les connais sur l'accès mais pas sur SQL Server, je ne connaissais pas la voie MySQL, je viens d'apprendre. Merci
@Luissiquot - Voir aussi ma réponse ici a>