Mysql
 sql >> Database >  >> RDS >> Mysql

Limite pratico alla lunghezza della query SQL (in particolare MySQL)

Leggere la tua domanda mi fa venire voglia di giocare a un gioco di ruolo.

Questo non è sicuramente troppo lungo. Finché sono ben formattati, direi che un limite pratico è di circa 100 righe. Dopodiché, è meglio suddividere le sottoquery in visualizzazioni solo per evitare che gli occhi si incrocino.

Ho lavorato con alcune query che superano le 1000 righe ed è difficile eseguire il debug.

A proposito, posso suggerire una versione riformattata? Questo serve principalmente a dimostrare l'importanza della formattazione; Spero che sarà più facile da capire.

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.
*/