Table des matières
1. Fonction GROUP BY (agrégation)
2. GROUP BY修改程序
3. 具有隐含字段的GROUP BY
Maison base de données tutoriel mysql Tutoriel de base MySQL 13 — Fonctions utilisées simultanément avec la clause GROUP BY

Tutoriel de base MySQL 13 — Fonctions utilisées simultanément avec la clause GROUP BY

Feb 24, 2017 am 11:52 AM


1. Fonction GROUP BY (agrégation)

Ce chapitre traite de la fonction de groupe (ensemble) pour un ensemble d'opérations numériques. Sauf indication contraire, les fonctions de groupe ignorent les valeurs NULL.

Si vous utilisez une fonction de groupe dans une instruction qui ne contient pas de clause ROUP BY, cela équivaut à regrouper toutes les lignes.

  • AVG([DISTINCT] expr)

renvoie la moyenne de expr. L'option DISTINCT peut être utilisée pour renvoyer la moyenne des valeurs distinctes de expr.

Si aucune ligne correspondante n'est trouvée, AVG() renvoie NULL .

mysql> 
SELECT student_name, AVG(test_score)
-> 
FROM student
-> 
GROUP BY student_name;
Copier après la connexion


  • BIT_AND(expr)

Retour ET au niveau du bit de tous les bits dans expr. Les calculs sont effectués avec une précision de 64 bits (BIGINT).

Si aucune ligne correspondante n'est trouvée, cette fonction renvoie 18446744073709551615. (Il s'agit d'une valeur BIGINT non signée avec tous les bits définis sur 1).

  • BIT_OR(expr)

Renvoie le OU au niveau du bit de tous les bits dans expr. Les calculs sont effectués avec une précision de 64 bits (BIGINT).

Si aucune ligne correspondante n'est trouvée, la fonction renvoie 0.

  • BIT_XOR(expr)

Renvoie le XOR au niveau du bit de tous les bits dans expr. Les calculs sont effectués avec une précision de 64 bits (BIGINT).

Si aucune ligne correspondante n'est trouvée, la fonction renvoie 0.

  • COUNT(expr)

Renvoie le nombre de valeurs non NULL dans les lignes récupérées par le Instruction SELECT.

Si aucune ligne correspondante n'est trouvée, COUNT() renvoie 0.

mysql> SELECT student.student_name,COUNT(*)-> FROM student,course
-> WHERE student.student_id=course.student_id-> GROUP BY student_name;
Copier après la connexion

COUNT(*) est légèrement différent dans le sens où il renvoie le nombre de lignes récupérées, qu'elles contiennent ou non des valeurs NULL.

Lorsque SELECT récupère une table sans récupérer d'autres colonnes et qu'il n'y a pas de clause WHERE, COUNT(*) est optimisé pour la vitesse de retour la plus rapide. Par exemple :

mysql> SELECT COUNT(*) FROM student;

Cette optimisation s'applique uniquement aux tables MyISAM, car ces types de tables stockeront un enregistrement de retour de fonction Exact quantités et très facile d'accès. Pour les moteurs de stockage transactionnel (InnoDB, BDB), stocker un nombre exact de lignes est plus problématique car plusieurs transactions peuvent se produire, chacune pouvant affecter le nombre de lignes.

  • COUNT(DISTINCT expr,[expr...])

renvoie différents Le nombre de valeurs non NULL.

Si aucun élément correspondant n'est trouvé, COUNT(DISTINCT) renvoie 0.

mysql> SELECT COUNT(DISTINCT results) FROM student;

Dans MySQL, vous obtenez différentes combinaisons d'expressions qui ne contiennent pas NULL en donnant un numéro de liste d'expressions. En SQL standard, vous devrez concaténer toutes les expressions dans COUNT(DISTINCT ...).

  • GROUP_CONCAT(expr)

Cette fonction renvoie le caractère avec une valeur non NULL pour la concaténation d'un résultat de la chaîne de groupe. Sa syntaxe complète est la suivante :

GROUP_CONCAT([DISTINCT] expr [,expr ...]

[ORDER BY {unsigned_integer | >[SEPARATOR str_val])

Ou :

Dans MySQL, vous pouvez obtenir la valeur concaténée de la combinaison d’expressions. Vous pouvez utiliser DISTINCT pour supprimer les valeurs en double. Si vous souhaitez trier plusieurs valeurs de résultat, vous devez utiliser la clause ORDER BY. Pour trier dans l'ordre inverse, ajoutez le mot-clé DESC (décroissant) au nom de la colonne que vous souhaitez trier avec la clause ORDER BY. L'ordre par défaut est croissant ; il peut être spécifié explicitement à l'aide d'ASC. SEPARATOR est suivi de la valeur de chaîne qui doit être insérée dans la valeur résultante. La valeur par défaut est la virgule (','). En spécifiant SEPARATOR '' vous pouvez supprimer tous les séparateurs.

À l'aide de la variable système group_concat_max_len, vous pouvez définir la longueur maximale autorisée. La syntaxe de cette opération dans le programme est la suivante, où val est un entier non signé :

SET [SESSION | GLOBAL] group_concat_max_len = val;
mysql> SELECT student_name,-> GROUP_CONCAT(test_score)-> FROM student-> GROUP BY student_name;
Copier après la connexion

Si la longueur maximale a été définie, le le résultat sera à la hauteur de cette longueur maximale.

mysql> SELECT student_name,-> GROUP_CONCAT(DISTINCT test_score-> ORDER BY test_score DESC SEPARATOR ' ')-> FROM student-> GROUP BY student_name;
Copier après la connexion

MIN([DISTINCT]

expr

), MAX([DISTINCT]

expr

)

  • Renvoyer les valeurs minimales et maximales de

    expr. La valeur de MIN() et MAX() peut être un argument de chaîne ; dans ces cas, elles renvoient la valeur de chaîne minimale ou maximale. Le mot-clé DISTINCT peut être utilisé pour trouver le minimum ou le maximum de valeurs distinctes de expr , cependant, cela produit les mêmes résultats que l'omission de DISTINCT .

    Si aucune ligne correspondante n'est trouvée, MIN() et MAX() renvoient NULL.
  • mysql> SELECT student_name, MIN(test_score), MAX(test_score)-> FROM student-> GROUP BY student_name;
    Copier après la connexion

    对于MIN()、 MAX()和其它集合函数, MySQL当前按照它们的字符串值而非字符串在集合中的相关位置比较 ENUM和SET 列。这同ORDER BY比较二者的方式有所不同。这一点应该在MySQL的未来版本中得到改善。

    • STD(expr) STDDEV(expr)

    返回expr 的总体标准偏差。这是标准 SQL 的延伸。这个函数的STDDEV() 形式用来提供和Oracle 的兼容性。可使用标准SQL函数 STDDEV_POP() 进行代替。

    若找不到匹配的行,则这些函数返回 NULL 。

    • STDDEV_POP(expr)

    返回expr 的总体标准偏差(VAR_POP()的平方根)。你也可以使用 STD() 或STDDEV(), 它们具有相同的意义,然而不是标准的 SQL。

    若找不到匹配的行,则STDDEV_POP()返回 NULL。

    • STDDEV_SAMP(expr)

    返回expr 的样本标准差 ( VAR_SAMP()的平方根)。

    若找不到匹配的行,则STDDEV_SAMP() 返回 NULL 。

    • SUM([DISTINCT] expr)

    返回expr 的总数。 若返回集合中无任何行,则 SUM() 返回NULL。DISTINCT 关键词可用于 MySQL 5.1 中,求得expr不同值的总和。

    若找不到匹配的行,则SUM()返回 NULL。

    • VAR_POP(expr)

    返回expr 总体标准方差。它将行视为总体,而不是一个样本, 所以它将行数作为分母。你也可以使用 VARIANCE(),它具有相同的意义然而不是 标准的 SQL。

    若找不到匹配的项,则VAR_POP()返回NULL。

    • VAR_SAMP(expr)

    返回expr 的样本方差。更确切的说,分母的数字是行数减去1。

    若找不到匹配的行,则VAR_SAMP()返回NULL。

    • VARIANCE(expr)

    返回expr 的总体标准方差。这是标准SQL 的延伸。可使用标准SQL 函数 VAR_POP() 进行代替。

    若找不到匹配的项,则VARIANCE()返回NULL。

    2. GROUP BY修改程序

    GROUP BY子句允许一个将额外行添加到简略输出端 WITH ROLLUP 修饰符。这些行代表高层(或高聚集)简略操作。ROLLUP 因而允许你在多层分析的角度回答有关问询的问题。例如,它可以用来向OLAP (联机分析处理) 操作提供支持。

    设想一个名为sales 的表具有年份、国家、产品及记录销售利润的利润列:

    CREATE TABLE sales
    (
        year    INT NOT NULL,
        country VARCHAR(20) NOT NULL,
        product VARCHAR(32) NOT NULL,
        profit  INT
    );
    Copier après la connexion

    可以使用这样的简单GROUP BY,每年对表的内容做一次总结:

    mysql> SELECT year, SUM(profit) FROM sales GROUP BY year;+------+-------------+
    | year | SUM(profit) |
    +------+-------------+
    | 2000 |        4525 |
    | 2001 |        3010 |
    +------+-------------+
    Copier après la connexion

    这个输出结果显示了每年的总利润, 但如果你也想确定所有年份的总利润,你必须自己累加每年的单个值或运行一个加法询问。

    或者你可以使用 ROLLUP, 它能用一个问询提供双层分析。将一个 WITH ROLLUP修饰符添加到GROUP BY 语句,使询问产生另一行结果,该行显示了所有年份的总价值:

    mysql> SELECT year, SUM(profit) FROM sales GROUP BY year WITH ROLLUP;+------+-------------+
    | year | SUM(profit) |
    +------+-------------+
    | 2000 |        4525 |
    | 2001 |        3010 |
    | NULL |        7535 |
    +------+-------------+
    Copier après la connexion

    总计高聚集行被年份列中的NULL值标出。

    当有多重 GROUP BY 列时,ROLLUP产生的效果更加复杂。这时,每次在除了最后一个分类列之外的任何列出现一个 “break” (值的改变) ,则问讯会产生一个高聚集累计行。

    例如,在没有 ROLLUP的情况下,一个以年、国家和产品为基础的关于 sales 表的一览表可能如下所示:

    mysql> SELECT year, country, product, SUM(profit)-> FROM sales-> GROUP BY year, country, product;
    +------+---------+------------+-------------+
    | year | country | product    | SUM(profit) |
    +------+---------+------------+-------------+
    | 2000 | Finland | Computer   |        1500 |
    | 2000 | Finland | Phone      |         100 |
    | 2000 | India   | Calculator |         150 |
    | 2000 | India   | Computer   |        1200 |
    | 2000 | USA     | Calculator |          75 |
    | 2000 | USA     | Computer   |        1500 |
    | 2001 | Finland | Phone      |          10 |
    | 2001 | USA     | Calculator |          50 |
    | 2001 | USA     | Computer   |        2700 |
    | 2001 | USA     | TV         |         250 |
    +------+---------+------------+-------------+
    Copier après la connexion

    表示总值的输出结果仅位于年/国家/产品的分析级别。当添加了 ROLLUP后, 问询会产生一些额外的行:

    mysql> SELECT year, country, product, SUM(profit)
        -> FROM sales
        -> GROUP BY year, country, product WITH ROLLUP;+------+---------+------------+-------------+
    | year | country | product    | SUM(profit) |
    +------+---------+------------+-------------+
    | 2000 | Finland | Computer   |        1500 |
    | 2000 | Finland | Phone      |         100 |
    | 2000 | Finland | NULL       |        1600 |
    | 2000 | India   | Calculator |         150 |
    | 2000 | India   | Computer   |        1200 |
    | 2000 | India   | NULL       |        1350 |
    | 2000 | USA     | Calculator |          75 |
    | 2000 | USA     | Computer   |        1500 |
    | 2000 | USA     | NULL       |        1575 |
    | 2000 | NULL    | NULL       |        4525 |
    | 2001 | Finland | Phone      |          10 |
    | 2001 | Finland | NULL       |          10 |
    | 2001 | USA     | Calculator |          50 |
    | 2001 | USA     | Computer   |        2700 |
    | 2001 | USA     | TV         |         250 |
    | 2001 | USA     | NULL       |        3000 |
    | 2001 | NULL    | NULL       |        3010 |
    | NULL | NULL    | NULL       |        7535 |
    +------+---------+------------+-------------+
    Copier après la connexion

    对于这个问询, 添加ROLLUP 子句使村输出结果包含了四层分析的简略信息,而不只是一个下面是怎样解释 ROLLUP输出:

    • 一组给定的年份和国家的每组产品行后面, 会产生一个额外的总计行, 显示所有产品的总值。这些行将产品列设置为 NULL。

    • 一组给定年份的行后面,会产生一个额外的总计行,显示所有国家和产品的总值。这些行将国家和产品列设置为 NULL。

    • 最后, 在所有其它行后面,会产生一个额外的总计列,显示所有年份、国家及产品的总值。 这一行将年份、国家和产品列设置为 NULL。

    使用ROLLUP 时的其它注意事项

    以下各项列出了一些MySQL执行ROLLUP的特殊状态:

    当你使用 ROLLUP时, 你不能同时使用 ORDER BY子句进行结果排序。换言之, ROLLUP 和ORDER BY 是互相排斥的。然而,你仍可以对排序进行一些控制。在 MySQL中, GROUP BY 可以对结果进行排序,而且你可以在GROUP BY列表指定的列中使用明确的 ASC和DESC关键词,从而对个别列进行排序。 (不论如何排序被ROLLUP添加的较高级别的总计行仍出现在它们被计算出的行后面)。

    LIMIT可用来限制返回客户端的行数。LIMIT 用在 ROLLUP后面, 因此这个限制 会取消被ROLLUP添加的行。例如:

    mysql> SELECT year, country, product, SUM(profit)
        -> FROM sales
        -> GROUP BY year, country, product WITH ROLLUP
        -> LIMIT 5;+------+---------+------------+-------------+
    | year | country | product    | SUM(profit) |
    +------+---------+------------+-------------+
    | 2000 | Finland | Computer   |        1500 |
    | 2000 | Finland | Phone      |         100 |
    | 2000 | Finland | NULL       |        1600 |
    | 2000 | India   | Calculator |         150 |
    | 2000 | India   | Computer   |        1200 |
    +------+---------+------------+-------------+
    Copier après la connexion

    将ROLLUP同 LIMIT一起使用可能会产生更加难以解释的结果,原因是对于理解高聚集行,你所掌握的上下文较少。

    在每个高聚集行中的NULL 指示符会在该行被送至客户端时产生。服务器会查看最左边的改变值后面的GROUP BY子句指定的列。对于任何结果集合中的,有一个词匹配这些名字的列, 其值被设为 NULL。(若你使用列数字指定了分组列,则服务器会通过数字确定将哪个列设置为 NULL)。

    由于在高聚集行中的 NULL值在问询处理阶段被放入结果集合中,你无法将它们在问询本身中作为NULL值检验。例如,你无法将 HAVING product IS NULL 添加到问询中,从而在输出结果中删去除了高聚集行以外的部分。

    另一方面, NULL值在客户端不以 NULL 的形式出现, 因而可以使用任何MySQL客户端编程接口进行检验。

    3. 具有隐含字段的GROUP BY

    MySQL 扩展了 GROUP BY的用途,因此你可以使用SELECT 列表中不出现在GROUP BY语句中的列或运算。这代表 “对该组的任何可能值 ”。你可以通过避免排序和对不必要项分组的办法得到它更好的性能。例如,在下列问询中,你无须对customer.name 进行分组:

    mysql> SELECT order.custid, customer.name, MAX(payments)
        -> FROM order,customer
        -> WHERE order.custid = customer.custid
        -> GROUP BY order.custid;
    Copier après la connexion

    在标准SQL中, 你必须将 customer.name添加到 GROUP BY子句中。在MySQL中, 假如你不在ANSI模式中运行,则这个名字就是多余的。

    假如你从 GROUP BY 部分省略的列在该组中不是唯一的,那么不要使用这个功能! 你会得到非预测性结果。

    在有些情况下,你可以使用MIN()和MAX() 获取一个特殊的列值,即使他不是唯一的。下面给出了来自包含排序列中最小值的列中的值:

    SUBSTR(MIN(CONCAT(RPAD(sort,6,' '),column)),7)

    注意,假如你正在尝试遵循标准 SQL, 你不能使用GROUP BY或 ORDER BY子句中的表达式。你可以通过使用表达式的别名绕过这一限制:

    mysql> SELECT id,FLOOR(value/100) AS val
        -> FROM tbl_name
        -> GROUP BY id, val ORDER BY val;
    Copier après la connexion

    然而, MySQL允许你使用GROUP BY 及 ORDER BY 子句中的表达式。例如:

    mysql> SELECT id, FLOOR(value/100) FROM tbl_name ORDER BY RAND();
    Copier après la connexion

     以上就是MySQL基础教程13 —— 函数之与GROUP BY子句同时使用的函数的内容,更多相关内容请关注PHP中文网(www.php.cn)!



Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

MySQL: la facilité de gestion des données pour les débutants MySQL: la facilité de gestion des données pour les débutants Apr 09, 2025 am 12:07 AM

MySQL convient aux débutants car il est simple à installer, puissant et facile à gérer les données. 1. Installation et configuration simples, adaptées à une variété de systèmes d'exploitation. 2. Prise en charge des opérations de base telles que la création de bases de données et de tables, d'insertion, d'interrogation, de mise à jour et de suppression de données. 3. Fournir des fonctions avancées telles que les opérations de jointure et les sous-questionnaires. 4. Les performances peuvent être améliorées par l'indexation, l'optimisation des requêtes et le partitionnement de la table. 5. Prise en charge des mesures de sauvegarde, de récupération et de sécurité pour garantir la sécurité et la cohérence des données.

Puis-je récupérer le mot de passe de la base de données dans Navicat? Puis-je récupérer le mot de passe de la base de données dans Navicat? Apr 08, 2025 pm 09:51 PM

Navicat lui-même ne stocke pas le mot de passe de la base de données et ne peut récupérer que le mot de passe chiffré. Solution: 1. Vérifiez le gestionnaire de mots de passe; 2. Vérifiez la fonction "Remember Motway" de Navicat; 3. Réinitialisez le mot de passe de la base de données; 4. Contactez l'administrateur de la base de données.

Comment créer Navicat Premium Comment créer Navicat Premium Apr 09, 2025 am 07:09 AM

Créez une base de données à l'aide de NAVICAT Premium: Connectez-vous au serveur de base de données et entrez les paramètres de connexion. Cliquez avec le bouton droit sur le serveur et sélectionnez Créer une base de données. Entrez le nom de la nouvelle base de données et le jeu de caractères spécifié et la collation. Connectez-vous à la nouvelle base de données et créez le tableau dans le navigateur d'objet. Cliquez avec le bouton droit sur le tableau et sélectionnez Insérer des données pour insérer les données.

MySQL: Concepts simples pour l'apprentissage facile MySQL: Concepts simples pour l'apprentissage facile Apr 10, 2025 am 09:29 AM

MySQL est un système de gestion de base de données relationnel open source. 1) Créez une base de données et des tables: utilisez les commandes CreateDatabase et CreateTable. 2) Opérations de base: insérer, mettre à jour, supprimer et sélectionner. 3) Opérations avancées: jointure, sous-requête et traitement des transactions. 4) Compétences de débogage: vérifiez la syntaxe, le type de données et les autorisations. 5) Suggestions d'optimisation: utilisez des index, évitez de sélectionner * et utilisez les transactions.

Comment afficher le mot de passe de la base de données dans NAVICAT pour MARIADB? Comment afficher le mot de passe de la base de données dans NAVICAT pour MARIADB? Apr 08, 2025 pm 09:18 PM

NAVICAT pour MARIADB ne peut pas afficher directement le mot de passe de la base de données car le mot de passe est stocké sous forme cryptée. Pour garantir la sécurité de la base de données, il existe trois façons de réinitialiser votre mot de passe: réinitialisez votre mot de passe via Navicat et définissez un mot de passe complexe. Affichez le fichier de configuration (non recommandé, haut risque). Utilisez des outils de ligne de commande système (non recommandés, vous devez être compétent dans les outils de ligne de commande).

Comment exécuter SQL dans Navicat Comment exécuter SQL dans Navicat Apr 08, 2025 pm 11:42 PM

Étapes pour effectuer SQL dans NAVICAT: Connectez-vous à la base de données. Créez une fenêtre d'éditeur SQL. Écrivez des requêtes ou des scripts SQL. Cliquez sur le bouton Exécuter pour exécuter une requête ou un script. Affichez les résultats (si la requête est exécutée).

Comment créer une nouvelle connexion à MySQL dans Navicat Comment créer une nouvelle connexion à MySQL dans Navicat Apr 09, 2025 am 07:21 AM

Vous pouvez créer une nouvelle connexion MySQL dans NAVICAT en suivant les étapes: ouvrez l'application et sélectionnez une nouvelle connexion (CTRL N). Sélectionnez "MySQL" comme type de connexion. Entrez l'adresse Hostname / IP, le port, le nom d'utilisateur et le mot de passe. (Facultatif) Configurer les options avancées. Enregistrez la connexion et entrez le nom de la connexion.

Navicat se connecte au code et à la solution d'erreur de base de données Navicat se connecte au code et à la solution d'erreur de base de données Apr 08, 2025 pm 11:06 PM

Erreurs et solutions courantes Lors de la connexion aux bases de données: nom d'utilisateur ou mot de passe (erreur 1045) Blocs de pare-feu Connexion (erreur 2003) Délai de connexion (erreur 10060) Impossible d'utiliser la connexion à socket (erreur 1042) Erreur de connexion SSL (erreur 10055) Trop de connexions Résultat de l'hôte étant bloqué (erreur 1129)

See all articles