J'ai une table SQL dans laquelle j'utilise l'opérateur BETWEEN .
L'opérateur BETWEEN sélectionne les valeurs dans la plage. Les valeurs peuvent être des nombres, du texte, des dates.
SELECT * FROM student WHERE stu_id BETWEEN 2 AND 4 //including 2 & 4 SELECT * FROM `student` WHERE name between 'A' and 'K' //including A & not K
J'ai une requête comme celle-ci: -
stu_id name city pin
1 Raj Ranchi 123456
2 sonu Delhi 652345
3 ANU KOLKATA 879845
4 K.K's Company Delhi 345546
5 J.K's Company Delhi 123456
Ici Ma question est pourquoi ne pas inclure K.
mais je veux K aussi dans les recherches.
4 Réponses :
N'utilisez pas entre - jusqu'à ce que vous le compreniez vraiment. Ce ne sont que des conseils généraux. BETWEEN est inclusif, donc votre deuxième requête est équivalente à:
WHERE name >= 'A' AND
name < 'L'
En raison de l'égalité, 'K' est inclus dans le jeu de résultats. Cependant, les noms de plus d'un caractère et commençant par 'K' ne sont pas - "Ka" par exemple.
Au lieu de cela, soyez explicite:
WHERE name >= 'A' AND
name <= 'K'
Bien sûr, BETWEEN peut être utile. Cependant, il est utile pour les valeurs discrètes , telles que les entiers. C'est un peu dangereux avec des nombres avec des décimales, des chaînes et des valeurs de date / heure. C'est pourquoi je vous encourage à exprimer la logique comme des inégalités.
Et ici, je me suis dit que les traiteraient comme des valeurs discrètes et ne permettraient même pas plus d'un personnage, quel comportement étrange
@Gordon Linoff monsieur donc quelle requête j'ai écrite pour que «K» également dans les recherches.
@MohitKumar J'ai mis à jour la requête dans ma réponse. Veuillez cocher la case qui inclura «K» dans vos recherches.
@MohitKumar. . . J'ai inclus cette question, le dernier exemple dans la réponse.
En complément de la réponse de Gordon, une façon d'obtenir ce que vous attendez est de transformer votre nom en un ensemble discret de valeurs:
SELECT * FROM `student` WHERE name >= 'A' and name < 'L'
Vous devez comprendre que KK La société de est alphabétiquement APRÈS la lettre K seule donc elle n'est pas ENTRE, de la même manière que 4.1 n'est pas ENTRE 2 et 4 p>
En le réduisant à un seul caractère à partir du début de la chaîne, cela fonctionnera comme prévu, mais attention, vous devez toujours éviter d'exécuter des fonctions sur des valeurs dans les tables, car si vous aviez un million de noms , c'est un million de chaînes que mysql doit supprimer uniquement à la première lettre et il pourrait ne plus être en mesure d'utiliser un index sur le nom, ce qui nuit aux performances.
À la place, vous pouvez:
SELECT * FROM `student` WHERE LEFT(name, 1) between 'A' and 'K'
qui est plus susceptible de permettre l'utilisation d'un index car vous ne manipulez pas les valeurs stockées avant de les comparer
Cela fonctionne car il demande tout jusqu'à, mais non compris, L .. Ce qui inclut tous vos noms commençant par K, même kzzzzzzzz . Numériquement, cela revient à dire nombre> = 2 et nombre qui vous donne tous les nombres commençant par 2, 3 ou 4 (comme le 4.1 d'avant) mais pas le 5
N'oubliez pas que BETWEEN est inclusif aux deux extrémités. Revenez toujours à un modèle de a> = b et a a> = c et a
Comparez dans l'ordre lexicographique, 'K.K's Company'> 'K'
Nous devons convertir la chaîne en entier. Vous pouvez essayer ce script mysql avec CAST et SUBSTRING. J'ai mis à jour votre script ici. Il inclura également le dernier enregistrement.
SELECT * FROM student WHERE name CAST(SUBSTRING(username FROM 1) AS UNSIGNED) BETWEEN 'A' AND 'K';
Le script fonctionnera. J'espère que cela vous aidera.
J'ai joint ici mon échantillon de test.
Le
Entresautera le dernier enregistrement de la table. Ainsi, le «K» ne sera pas inclus.@SathishChelladurai pourquoi Between sautera le dernier enregistrement de la table?
L'opérateur
BETWEENest un opérateur logique qui vous permet de spécifier si une valeur dans une plage ou non. Vous pouvez vous référer à MySQL BETWEEN ici mysqltutorial.org/mysql-between@SathishChelladurai si 'A' & 'K' dans la plage alors pourquoi 'K' n'est pas inclus en sortie?
Vérifiez ma réponse, espérons que cela fonctionnera pour vous.
De la même manière que
Entre 1 et 2ne renverra pas 2.1.