sql >> Databáze >  >> RDS >> Mysql

Praktické omezení délky SQL dotazu (konkrétně MySQL)

Když si přečtu váš dotaz, chci si zahrát RPG.

To rozhodně není příliš dlouhé. Pokud jsou dobře naformátované, řekl bych, že praktický limit je asi 100 řádků. Poté je lepší rozdělit poddotazy na pohledy, aby se vám nekřížily oči.

Pracoval jsem s některými dotazy, které mají více než 1000 řádků a je těžké je odladit.

Mimochodem, mohu navrhnout přeformátovanou verzi? Jde především o demonstraci důležitosti formátování; Věřím, že to bude srozumitelnější.

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


  1. Rozdělte řetězec a procházejte hodnoty v Proceduře MySql

  2. Ukládání negregoriánských dat v typu data Mysql

  3. Pochopení skupiny redo log vs soubor vs člen

  4. SQL seskupit podle data, ale také získat data bez záznamů