Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Praktische Begrenzung der Länge der SQL-Abfrage (insbesondere MySQL)

Wenn ich Ihre Anfrage lese, möchte ich ein Rollenspiel spielen.

Das ist definitiv nicht zu lang. Solange sie gut formatiert sind, würde ich sagen, dass eine praktische Grenze bei etwa 100 Zeilen liegt. Danach ist es besser, Unterabfragen in Ansichten aufzuteilen, nur um zu verhindern, dass sich Ihre Augen kreuzen.

Ich habe mit einigen Abfragen gearbeitet, die mehr als 1000 Zeilen umfassen, und das ist schwer zu debuggen.

Übrigens, darf ich eine neu formatierte Version vorschlagen? Dies dient hauptsächlich dazu, die Bedeutung der Formatierung zu demonstrieren; Ich vertraue darauf, dass dies einfacher zu verstehen ist.

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