Derived TablesA subquery can be used inFROMinstead of named tables — this iscalled aderived table.SELECTGenre.name,COUNT(*)ASnumTracksFROMTrackJOINGenreONTrack.genreId = Genre.genreIdGROUP BYTrack.genreId;
Derived TablesWe can just “pretend” that this is an actual database table anduse it in a query.SELECTname, numTracksFROM(SELECTGenre.name,COUNT(*)ASnumTracksFROMTrackJOINGenreONTrack.genreId = Genre.genreIdGROUP BYTrack.genreId)WHEREname ='Rock'ORname ='Jazz';
Long tracksWhat is thelengthof the longest track in each genre?SELECTGenre.name,MAX(Track.milliseconds)FROMGenreJOINTrackONGenre.genreId = Track.genreIdGROUP BYTrack.genreId;
Dangerous SQLite magicWhat is thenameof the longest track in each genre?SELECTGenre.name, Track.name,MAX(Track.milliseconds)FROMGenreJOINTrackONGenre.genreId = Track.genreIdGROUP BYTrack.genreId;
This should not workIt is informative to recognise why this islogically incorrect.The issue is thatITheTrack.genreIdfield is one of theGROUP BYfieldsITheTrack.namefield isnotone of theGROUP BYfieldsTherefore,within each group,Ievery row has thesame valueforTrack.genreId, butIeach row may have adifferent valueforTrack.name.