sql >> Databasteknik >  >> RDS >> Mysql

Hur kan man välja alla poster utom de tre första posterna?

Du måste i princip lägga in sådana frågor i lagrade procedurer på grund av vissa begränsningar på LIMIT . Du kan inte använda underval eller variabler i vanlig sql. I lagrade procedurer kan du använda variabler.

Det här fungerar, tyvärr kan jag inte visa det i sqlfiddle eftersom de verkar ha begränsat stöd för lagrade procedurer.

drop procedure if exists all_but_3;

delimiter //
create procedure all_but_3()
begin
   declare v_max bigint unsigned default ~0;
   select * from your_table limit 3, v_max;
end//

delimiter ;

drop procedure if exists last_3;
delimiter //
create procedure last_3()
begin
   declare v_max bigint;
   declare v_mid bigint;
   select count(*) from your_table into v_max;
   set v_mid := v_max - 3;
   select * from your_table limit v_mid, v_max;
end//

delimiter ;

call all_but_3();
call last_3();

Utveckling av InnoDB-klustrade index

Efter diskussioner i ett av de andra svaren med @fthiella har jag bestämt mig för att utveckla lite om hur detta kan fungera.

En tabell som använder InnoDB som motor kommer alltid att ha ett klustrat index. Alltid. Det är deras sätt att lagra data i InnoDB och det är inte på något sätt möjligt att skapa en tabell utan ett klustrat index.

InnoDB kommer att välja primärnyckeln om det finns ett eller det första unika indexet med alla kolumner inställda på inte null. Om inget sådant index finns kommer InnoDB att skapa en dold kolumn med ett rad-id. Detta rad-id fungerar på samma sätt som automatisk ökning och om det hjälper att tänka på det som en osynlig kolumn med automatisk ökning tycker jag att det är bra.

Vidare kommer InnoDB att returnera rader enligt det index som används. Det kommer alltid att använda något index (enda sättet att hämta data är att använda antingen ett sekundärt index, det klustrade indexet eller en kombination) så i de fall där det inte finns några explicit skapade index returneras rader av det dolda klustrade indexet.

Detta innebär att en fråga mot en tabell utan primärnyckel och inga unika index med alla kolumner inställda på inte null och ingen ORDER BY returnerar rader i den ordning de infogades.

Detta är fallet för den här frågan och grunden för mina och många andra svar.

Jag menar inte att det här är ett bra sätt att arbeta med data. Här är några saker som du bör tänka på innan du använder den här lösningen:

  • Om ett index som kan användas som ett klustrat index någonsin skapas kommer tabellen att skrivas om för att använda det indexet och genom att göra det ordna data på disken. Om indexet senare släpps förloras den ursprungliga infogningsordningen och kan inte hämtas.
  • Om ett index skapas, även om det inte är unikt, kan det väljas av optimeraren som ska användas och raderna kommer att ordnas efter det indexet istället.

Allt detta är dokumenterat och för 5.5 är det den tredje punkten på den här sidan



  1. En teknisk jämförelse:Microsoft Access 2016 vs SQL Server 2016

  2. Vänster JOIN snabbare eller Inner Join snabbare?

  3. Beräknar den totala mängden utrustning för ett datumintervall

  4. Kan vi ha flera MED AS i singel sql - Oracle SQL