Maison >base de données >tutoriel mysql >Comment la priorité des opérateurs affecte-t-elle la logique « OU » et « ET » de MySQL dans les requêtes ?

Comment la priorité des opérateurs affecte-t-elle la logique « OU » et « ET » de MySQL dans les requêtes ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-14 22:10:12532parcourir

How Does Operator Precedence Affect MySQL's `OR` and `AND` Logic in Queries?

Précédence MySQL OR/AND

Dans MySQL, l'ordre des opérations pour les opérateurs logiques, tels que OR et AND, détermine l'interprétation des requêtes complexes. Cet article explique les règles de priorité et leur impact sur les résultats des requêtes.

Explication

La documentation MySQL fournit une liste complète des priorités des opérateurs, comme suit :

INTERVAL
BINARY, COLLATE
!
- (unary minus), ~ (unary bit inversion)
^
*, /, DIV, %, MOD
-, +
<<, >>
&
|
= (comparison), <=, >=, >, <, <>, !=, IS, LIKE, REGEXP, IN
BETWEEN, CASE, WHEN, THEN, ELSE
NOT
&&, AND
XOR
||, OR
= (assignment), :=

Selon à cette hiérarchie de priorité, la requête suivante serait interprétée comme :

SELECT *
FROM tablename
WHERE
    display = 1
    OR (
        display = 2 AND content LIKE "%hello world%"
    )
    OR tags LIKE "%hello world%"
    OR title = "%hello world%"

Interprétation

La requête ci-dessus recherche les lignes où soit :

  • l'affichage est égal à 1
  • l'affichage est égal à 2 et le contenu contient "Bonjour tout le monde"
  • les balises contiennent "bonjour monde"
  • le titre contient "hello world"

La clause WHERE est évaluée dans l'ordre suivant :

  1. l'affichage est vérifié en premier.
  2. Si display n'est pas 1, alors la deuxième sous-requête est évaluée.
  3. Dans la sous-requête, display est vérifié égalité avec 2. Si vrai, le contenu est vérifié pour "hello world".
  4. Enfin, les clauses restantes pour les balises et le titre sont évaluées, avec un opérateur OR les liant.

Problèmes de priorité et solutions

Pour garantir une interprétation sans ambiguïté, il est recommandé d'utiliser explicitement les parenthèses. Par exemple :

SELECT *
FROM tablename
WHERE
    ((display = 1) OR (display = 2)) AND
    ((content LIKE "%hello world%") OR (tags LIKE "%hello world%") OR (title LIKE "%hello world%"))

Cette requête garantit que les lignes sont récupérées si elles remplissent l'une des conditions suivantes :

  • l'affichage est égal à 1 ou 2
  • contenu, les balises ou le titre contiennent "hello world"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
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