Mysql
 sql >> Base de données >  >> RDS >> Mysql

Limite pratique à la longueur de la requête SQL (spécifiquement MySQL)

Lire votre requête me donne envie de jouer à un RPG.

Ce n'est certainement pas trop long. Tant qu'ils sont bien formatés, je dirais qu'une limite pratique est d'environ 100 lignes. Après cela, vous feriez mieux de diviser les sous-requêtes en vues juste pour éviter que vos yeux ne se croisent.

J'ai travaillé avec des requêtes de plus de 1000 lignes, et c'est difficile à déboguer.

Au fait, puis-je suggérer une version reformatée ? C'est surtout pour démontrer l'importance du formatage; J'espère que ce sera plus facile à comprendre.

select *  
from
  4e_magic_items mi
 ,4e_magic_item_levels mil
 ,4e_monster_sources ms
where mi.id = mil.itemid
  and mi.source = ms.id
  and itemlevel between 1 and 30
  and source not in(16,2,5,13,15,3,4,12,7,14,11,10,8,1,6,9)  
  and type not in(
                  'Arms' ,'Feet' ,'Hands' ,'Head' ,'Neck' ,'Orb' ,
                  'Potion' ,'Ring' ,'Rod' ,'Staff' ,'Symbol' ,'Waist' ,
                  'Wand' ,'Wondrous Item' ,'Alchemical Item' ,'Elixir' ,
                  'Reagent' ,'Whetstone' ,'Other Consumable' ,'Companion' ,
                  'Mount'
                 )
  and ((type != 'Armor') or (false))
  and ((type != 'Weapon') or (false))
order by
  type asc
 ,itemlevel asc
 ,name asc

/*
Some thoughts:
==============
0 - Formatting really matters, in SQL even more than most languages.
1 - consider selecting only the columns you need, not "*"
2 - use of table aliases makes it short & clear ("MI", "MIL" in my example)
3 - joins in the WHERE clause will un-clutter your FROM clause
4 - use NOT IN for long lists
5 - logically, the last two lines can be added to the "type not in" section.
    I'm not sure why you have the "or false", but I'll assume some good reason
    and leave them here.
*/