My solutions to the the tutorials and quizzes of SQL Zoo. Uses MySQL engine.
- SELECT basics
- SELECT names
- SELECT Quiz
- SELECT from WORLD Tutorial
- BBC QUIZ
- SELECT from Nobel Tutorial
- Nobel Quiz
- SELECT within SELECT Tutorial
- Nested SELECT Quiz
- SUM and COUNT
- SUM and COUNT Quiz
- Nobel Prizes Aggregate functions
- The JOIN operation
- JOIN Quiz
- Old JOIN Tutorial
- More JOIN operations
- JOIN Quiz 2
- Using Null
- Numeric Examples
- Window function
- Self join
- Self join Quiz
SELECT population
FROM world
WHERE name = 'Germany';SELECT name, population
FROM world
WHERE name IN ('Sweden', 'Norway', 'Denmark');SELECT name, area
FROM world
WHERE area BETWEEN 200000 AND 250000;SELECT name, population
FROM world
WHERE population BETWEEN 1000000 AND 1250000Table-E
SELECT name FROM world
WHERE name LIKE '%a' OR name LIKE '%l'3rd Table
4th Table
SELECT name, area, population
FROM world
WHERE area > 50000 AND population < 10000000SELECT name, population/area
FROM world
WHERE name IN ('China', 'Nigeria', 'France', 'Australia')SELECT name
FROM world
WHERE name LIKE 'Y%';SELECT name
FROM world
WHERE name LIKE '%Y';SELECT name
FROM world
WHERE name LIKE '%x%';SELECT name
FROM world
WHERE name LIKE '%land';SELECT name
FROM world
WHERE name LIKE 'C%ia';SELECT name
FROM world
WHERE name LIKE '%oo%';SELECT name
FROM world
WHERE name LIKE '%a%a%a%';SELECT name
FROM world
WHERE name LIKE '_t%'
ORDER BY name;SELECT name
FROM world
WHERE name LIKE '%o__o%';SELECT name
FROM world
WHERE name LIKE '____';SELECT name
FROM world
WHERE name = capital;SELECT name
FROM world
WHERE capital = CONCAT(name, ' City');SELECT capital, name
FROM world
WHERE capital LIKE CONCAT('%', name, '%');SELECT capital, name
FROM world
WHERE capital LIKE CONCAT(name, '%')
AND capital <> name;SELECT name,
SUBSTRING(capital, LENGTH(name) + 1, LENGTH(capital)) as ext
FROM world
WHERE capital LIKE CONCAT(name, '%')
AND capital <> name;SELECT name, continent, population FROM worldSELECT name FROM world
WHERE population >= 200000000;SELECT name, (gdp / population)
FROM world
WHERE population >= 200000000SELECT name, (population / 1000000)
FROM world
WHERE continent = 'South America';SELECT name, population
FROM world
WHERE name in ('France', 'Germany', 'Italy')SELECT name
FROM world
WHERE name LIKE 'United%';SELECT name, population, area
FROM world
WHERE area > 3000000 OR population > 250000000;SELECT name, population, area
FROM world
WHERE area > 3000000 XOR population > 250000000;SELECT name, ROUND(population / 1000000, 2), ROUND(gdp / 1000000000, 2)
FROM world
WHERE continent = 'South America';SELECT name, ROUND(gdp / population, -3) as per_capita_gdp
FROM world
WHERE gdp >= 1000000000000;SELECT name, capital
FROM world
WHERE LENGTH(name) = LENGTH(capital);SELECT name, capital
FROM world
WHERE LEFT(name, 1) = LEFT(capital, 1) AND name <> capital;SELECT name
FROM world
WHERE
name LIKE '%a%' AND
name LIKE '%e%' AND
name LIKE '%i%' AND
name LIKE '%o%' AND
name LIKE '%u%' AND
name NOT LIKE '% %';SELECT name
FROM world
WHERE name LIKE 'U%'SELECT population
FROM world
WHERE name = 'United Kingdom''name' should be name
Nauru | 990
SELECT name, population
FROM world
WHERE continent IN ('Europe', 'Asia')SELECT name FROM world
WHERE name IN ('Cuba', 'Togo')Brazil Colombia
SELECT yr, subject, winner
FROM nobel
WHERE yr = 1950;SELECT winner
FROM nobel
WHERE yr = 1962
AND subject = 'Literature'SELECT yr, subject
FROM nobel
WHERE winner = 'Albert Einstein';SELECT winner
FROM nobel
WHERE subject = 'Peace'
AND yr >= 2000;SELECT *
FROM nobel
WHERE subject = 'Literature'
AND yr BETWEEN 1980 AND 1989;SELECT *
FROM nobel
WHERE winner IN ('Theodore Roosevelt',
'Woodrow Wilson',
'Jimmy Carter',
'Barack Obama');SELECT winner
FROM nobel
WHERE winner LIKE 'John%';SELECT *
FROM nobel
WHERE (subject = 'Physics' AND yr = 1980) OR
(subject = 'Chemistry' AND yr = 1984);SELECT *
FROM nobel
WHERE yr = 1980 AND
subject NOT IN ('Chemistry', 'Medicine');SELECT *
FROM nobel
WHERE (subject = 'Medicine' AND yr < 1910) OR
(subject = 'Literature' AND yr > 2003);SELECT *
FROM nobel
WHERE winner = 'PETER GRĂśNBERG';SELECT *
FROM nobel
WHERE winner = "EUGENE O'NEILL";SELECT winner, yr, subject
FROM nobel
WHERE winner LIKE 'Sir%'
ORDER BY yr DESC;SELECT winner, subject
FROM nobel
WHERE yr = 1984
ORDER BY CASE WHEN subject IN ('Physics', 'Chemistry') THEN 1 ELSE 0 END,
subject, winner;SELECT winner FROM nobel
WHERE winner LIKE 'C%' AND winner LIKE '%n'SELECT COUNT(subject) FROM nobel
WHERE subject = 'Chemistry'
AND yr BETWEEN 1950 and 1960SELECT COUNT(DISTINCT yr) FROM nobel
WHERE yr NOT IN (SELECT DISTINCT yr FROM nobel WHERE subject = 'Medicine')Medicine | Sir John Eccles
Medicine | Sir Frank Macfarlane Burnet
SELECT yr FROM nobel
WHERE yr NOT IN(SELECT yr
FROM nobel
WHERE subject IN ('Chemistry','Physics'))SELECT DISTINCT yr
FROM nobel
WHERE subject='Medicine'
AND yr NOT IN(SELECT yr FROM nobel
WHERE subject='Literature')
AND yr NOT IN (SELECT yr FROM nobel
WHERE subject='Peace')Chemistry | 1
Literature | 1
Medicine | 2
Peace | 1
Physics | 1
SELECT name
FROM world
WHERE population > (
SELECT population from world WHERE name = 'Russia');SELECT name
FROM world
WHERE continent = 'Europe' AND
(gdp / population) > (SELECT (gdp / population)
from world
WHERE name = 'United Kingdom');SELECT name, continent
FROM world
WHERE continent IN (SELECT continent
FROM world
WHERE name = 'Argentina' OR name = 'Australia')
ORDER BY name;SELECT name, population
FROM world
WHERE population > (
SELECT population
FROM world
WHERE name = 'Canada')
AND population < (
SELECT population
FROM world
WHERE name = 'Poland');SELECT
name,
CONCAT(ROUND((population / (SELECT population FROM world WHERE name = 'Germany') * 100)), '%')
FROM world
WHERE continent = 'Europe';SELECT name
FROM world
WHERE gdp > ALL(SELECT gdp
FROM world
WHERE (continent = 'Europe') AND (gdp > 0));SELECT continent, name, area
FROM world AS x
WHERE area >= ALL
(SELECT area
FROM world AS y
WHERE y.continent = x.continent AND
area > 0);SELECT continent, name
FROM world
GROUP BY continent;SELECT name, continent, population
FROM world AS x
WHERE 25000000 > ALL (
SELECT population
FROM world AS y
WHERE y.continent = x.continent
AND population > 0
);SELECT name, continent
FROM world AS x
WHERE population > ALL (
SELECT population * 3
FROM world as y
WHERE y.continent = x.continent
AND y.name <> x.name
); SELECT region, name, population FROM bbc x WHERE population <= ALL (SELECT population FROM bbc y WHERE y.region=x.region AND population>0) SELECT name,region,population FROM bbc x WHERE 50000 < ALL (SELECT population FROM bbc y WHERE x.region=y.region AND y.population>0)SELECT name, region FROM bbc x
WHERE population < ALL (SELECT population/3 FROM bbc y WHERE y.region = x.region AND y.name != x.name)Table-D
SELECT name FROM bbc
WHERE gdp > (SELECT MAX(gdp) FROM bbc WHERE region = 'Africa')SELECT name FROM bbc
WHERE population < (SELECT population FROM bbc WHERE name='Russia')
AND population > (SELECT population FROM bbc WHERE name='Denmark')Table-B
SELECT SUM(population)
FROM world;SELECT DISTINCT continent
FROM world;SELECT SUM(gdp)
FROM world
WHERE continent = 'Africa';SELECT COUNT(area)
FROM world
WHERE area >= 1000000;SELECT SUM(population)
FROM world
WHERE name IN ('Estonia', 'Latvia', 'Lithuania');SELECT continent, COUNT(name)
FROM world
GROUP BY continent;SELECT continent, COUNT(name)
FROM world
WHERE population > 10000000
GROUP BY continent;SELECT continent
FROM world
GROUP BY continent
HAVING SUM(population) >= 100000000;SELECT SUM(population) FROM bbc WHERE region = 'Europe'SELECT COUNT(name) FROM bbc WHERE population < 150000AVG(), COUNT(), MAX(), MIN(), SUM()
No result due to invalid use of the WHERE function
SELECT AVG(population) FROM bbc WHERE name IN ('Poland', 'Germany', 'Denmark')SELECT region, SUM(population)/SUM(area) AS density FROM bbc GROUP BY regionSELECT name, population/area AS density FROM bbc WHERE population = (SELECT MAX(population) FROM bbc)Table-D
SELECT COUNT(winner) FROM nobel;SELECT DISTINCT subject
FROM nobel;SELECT COUNT(subject)
FROM nobel
WHERE subject = 'Physics';SELECT subject, COUNT(subject) as prices
FROM nobel
GROUP BY subject;SELECT subject, MIN(yr) as first_year
FROM nobel
GROUP BY subject;SELECT subject, COUNT(subject) as awards_in_2000
FROM nobel
WHERE yr = 2000
GROUP BY subject;SELECT subject, COUNT(DISTINCT winner) as distinct_winners
FROM nobel
GROUP BY subject;SELECT subject, COUNT(DISTINCT yr) as distinct_yr
FROM nobel
GROUP BY subject;SELECT yr
FROM nobel
WHERE subject = 'Physics'
GROUP BY yr
HAVING COUNT(yr) = 3;SELECT winner
FROM nobel
GROUP BY winner
HAVING COUNT(winner) > 1;SELECT winner
FROM nobel
GROUP BY winner
HAVING COUNT(DISTINCT subject) > 1SELECT yr, subject
FROM nobel
WHERE yr > 1999
GROUP BY yr, subject
HAVING COUNT(yr) > 2;SELECT matchid, player
FROM goal
WHERE teamid = 'GER';SELECT id,stadium,team1,team2
FROM game
WHERE id = 1012;SELECT goal.player, goal.teamid, game.stadium, game.mdate
FROM game
INNER JOIN goal
ON game.id = goal.matchid
WHERE goal.teamid = 'GER';SELECT game.team1, game.team2, goal.player
FROM game
INNER JOIN goal
ON game.id = goal.matchid
WHERE goal.player LIKE 'Mario%';SELECT goal.player, goal.teamid, eteam.coach, goal.gtime
FROM goal
INNER JOIN eteam
ON goal.teamid = eteam.id
WHERE goal.gtime <= 10;SELECT game.mdate, eteam.teamname
FROM game
INNER JOIN eteam
ON game.team1 = eteam.id
WHERE eteam.coach = 'Fernando Santos';SELECT goal.player
FROM game
INNER JOIN goal
ON goal.matchid = game.id
WHERE game.stadium = 'National Stadium, Warsaw';SELECT DISTINCT goal.player
FROM game
INNER JOIN goal
ON goal.matchid = game.id
WHERE goal.teamid <> 'GER'
AND (game.team1 = 'GER' OR game.team2 = 'GER');SELECT eteam.teamname, COUNT(goal.teamid)
FROM goal
INNER JOIN eteam
ON eteam.id = goal.teamid
GROUP BY eteam.teamname;SELECT game.stadium, COUNT(goal.matchid)
FROM game
INNER JOIN goal
ON game.id = goal.matchid
GROUP BY game.stadium;SELECT goal.matchid, game.mdate, COUNT(goal.matchid)
FROM game
INNER JOIN goal
ON goal.matchid = game.id
WHERE game.team1 = 'POL' OR game.team2 = 'POL'
GROUP BY goal.matchid;SELECT goal.matchid, game.mdate, COUNT(goal.matchid) AS german_goals
FROM game
INNER JOIN goal
ON game.id = goal.matchid
WHERE goal.teamid = 'GER'
GROUP BY goal.matchid;SELECT
game.mdate,
game.team1,
SUM(CASE WHEN goal.teamid = game.team1 THEN 1 ELSE 0 END) AS score1,
game.team2,
SUM(CASE WHEN goal.teamid = game.team2 THEN 1 ELSE 0 END) AS score2
FROM game
LEFT JOIN goal
ON game.id = goal.matchid
GROUP BY game.id, game.mdate
ORDER BY game.mdate, goal.matchid, game.team1, game.team2game JOIN goal ON (id=matchid)matchid, teamid, player, gtime, id, teamname, coach
SELECT player, teamid, COUNT(*)
FROM game JOIN goal ON matchid = id
WHERE (team1 = "GRE" OR team2 = "GRE")
AND teamid != 'GRE'
GROUP BY player, teamidDEN | 9 June 2012
GER | 9 June 2012
SELECT DISTINCT player, teamid
FROM game JOIN goal ON matchid = id
WHERE stadium = 'National Stadium, Warsaw'
AND (team1 = 'POL' OR team2 = 'POL')
AND teamid != 'POL'SELECT DISTINCT player, teamid, gtime
FROM game JOIN goal ON matchid = id
WHERE stadium = 'Stadion Miejski (Wroclaw)'
AND (( teamid = team2 AND team1 != 'ITA') OR ( teamid = team1 AND team2 != 'ITA'))Netherlands | 2
Poland | 2
Republic of Ireland | 1
Ukraine | 2
SELECT who, country.name
FROM ttms JOIN country
ON (ttms.country=country.id)
WHERE games = 2000SELECT ttms.who, ttms.color
FROM ttms
INNER JOIN country
ON ttms.country = country.id
WHERE country.name = 'Sweden';SELECT ttms.games
FROM ttms
INNER JOIN country
ON ttms.country = country.id
WHERE country.name = 'China' AND ttms.color = 'gold';SELECT ttws.who AS 'barcelona_winners'
FROM ttws
INNER JOIN games
ON ttws.games = games.yr
WHERE games.city = 'Barcelona';SELECT games.city, ttws.color
FROM ttws
INNER JOIN games
ON ttws.games = games.yr
WHERE ttws.who = 'Jing Chen';SELECT ttws.who, games.city
FROM ttws
INNER JOIN games
ON ttws.games = games.yr
WHERE ttws.color = 'gold';SELECT ttmd.games, ttmd.color
FROM ttmd
INNER JOIN team
ON ttmd.team = team.id
WHERE team.name LIKE '%Yan Sen%';SELECT team.name
FROM ttmd
INNER JOIN team
ON ttmd.team = team.id
WHERE ttmd.color = 'gold' AND ttmd.games = 2004;SELECT team.name
FROM ttmd
INNER JOIN team
ON ttmd.team = team.id
WHERE ttmd.country = 'FRA';SELECT id, title
FROM movie
WHERE yr = 1962;SELECT yr
FROM movie
WHERE title = 'Citizen Kane';SELECT id, title, yr
FROM movie
WHERE title LIKE '%Star Trek%'
ORDER BY yr;SELECT id
FROM actor
WHERE name = 'Glenn Close';SELECT id
FROM movie
WHERE title = 'Casablanca';SELECT actor.name AS casablanca_cast_list
FROM movie
INNER JOIN casting
ON movie.id = casting.movieid
INNER JOIN actor
ON casting.actorid = actor.id
WHERE casting.movieid = (
SELECT id
FROM movie
WHERE title = 'Casablanca'
);SELECT actor.name AS alien_cast_list
FROM movie
INNER JOIN casting
ON movie.id = casting.movieid
INNER JOIN actor
ON casting.actorid = actor.id
WHERE casting.movieid = (
SELECT id
FROM movie
WHERE title = 'Alien'
);SELECT movie.title
FROM movie
INNER JOIN casting
ON movie.id = casting.movieid
INNER JOIN actor
ON casting.actorid = actor.id
WHERE casting.actorid = (
SELECT id
FROM actor
WHERE name = 'Harrison Ford'
);SELECT movie.title
FROM movie
INNER JOIN casting
ON movie.id = casting.movieid
INNER JOIN actor
ON casting.actorid = actor.id
WHERE casting.actorid = (
SELECT id
FROM actor
WHERE name = 'Harrison Ford'
)
AND casting.ord <> 1;SELECT
movie.title,
(CASE WHEN casting.ord = 1 THEN actor.name END) AS name
FROM movie
INNER JOIN casting
ON movie.id = casting.movieid
INNER JOIN actor
ON casting.actorid = actor.id
WHERE movie.yr = 1962
AND (CASE WHEN casting.ord = 1 THEN actor.name END) IS NOT NULL;SELECT yr, COUNT(movie.title)
FROM movie
INNER JOIN casting
ON movie.id = casting.movieid
INNER JOIN actor
ON casting.actorid = actor.id
WHERE actor.name = 'Rock Hudson'
GROUP BY movie.yr
HAVING COUNT(movie.title) > 2;SELECT
movie.title,
(CASE WHEN casting.ord = 1 THEN actor.name END) as leading_actor
FROM movie
INNER JOIN casting
ON movie.id = casting.movieid
INNER JOIN actor
ON casting.actorid = actor.id
WHERE (CASE WHEN casting.ord = 1 THEN actor.name END) IS NOT NULL
AND casting.movieid IN (
SELECT casting.movieid
FROM casting
INNER JOIN actor
ON casting.actorid = actor.id
WHERE actor.name = 'Julie Andrews'
);SELECT actor.name
FROM movie
INNER JOIN casting
ON movie.id = casting.movieid
INNER JOIN actor
ON casting.actorid = actor.id
GROUP BY actor.name
HAVING SUM(CASE WHEN casting.ord = 1 THEN 1 ELSE 0 END) >= 15;SELECT movie.title, COUNT(actor.id) as actors
FROM movie
INNER JOIN casting
ON movie.id = casting.movieid
INNER JOIN actor
ON casting.actorid = actor.id
WHERE movie.yr = 1978
GROUP BY movie.title
ORDER BY actors DESC, movie.title;SELECT DISTINCT actor.name
FROM movie
INNER JOIN casting
ON movie.id = casting.movieid
INNER JOIN actor
ON casting.actorid = actor.id
WHERE casting.movieid IN (
SELECT casting.movieid
FROM casting
INNER JOIN actor
ON casting.actorid = actor.id
WHERE actor.name = 'Art Garfunkel'
)
AND actor.name <> 'Art Garfunkel';SELECT name
FROM actor INNER JOIN movie ON actor.id = director
WHERE gross < budgetSELECT *
FROM actor JOIN casting ON actor.id = actorid
JOIN movie ON movie.id = movieidSELECT name, COUNT(movieid)
FROM casting JOIN actor ON actorid=actor.id
WHERE name LIKE 'John %'
GROUP BY name ORDER BY 2 DESCTable-B
SELECT name
FROM movie JOIN casting ON movie.id = movieid
JOIN actor ON actor.id = actorid
WHERE ord = 1 AND director = 351link the director column in movies with the primary key in actor connect the primary keys of movie and actor via the casting table
Table-B
SELECT name
FROM teacher
WHERE dept IS NULL;SELECT teacher.name, dept.name
FROM teacher
INNER JOIN dept
ON teacher.dept = dept.id;SELECT teacher.name, dept.name
FROM teacher
LEFT JOIN dept
ON teacher.dept = dept.id;SELECT teacher.name, dept.name
FROM teacher
RIGHT JOIN dept
ON teacher.dept = dept.id;SELECT
name,
COALESCE(mobile, '07986 444 2266') as mobile
FROM teacher;SELECT
teacher.name,
COALESCE(dept.name, 'None') as dept
FROM teacher
LEFT JOIN dept
ON teacher.dept = dept.id;SELECT Count(name), Count(mobile)
FROM teacher;SELECT dept.name, COUNT(teacher.name) as number_of_teacher
FROM teacher
RIGHT JOIN dept
ON teacher.dept = dept.id
GROUP BY dept.name;SELECT
name,
(CASE WHEN dept IN (1, 2) THEN 'Sci' ELSE 'Art' END)
FROM teacher;SELECT
name,
(CASE WHEN dept IN (1, 2) THEN 'Sci'
WHEN dept = 3 THEN 'Art'
ELSE 'None' END)
FROM teacher; SELECT teacher.name, dept.name FROM teacher LEFT OUTER JOIN dept ON (teacher.dept = dept.id) SELECT dept.name FROM teacher JOIN dept ON (dept.id = teacher.dept) WHERE teacher.name = 'Cutflower' SELECT dept.name, COUNT(teacher.name) FROM teacher RIGHT JOIN dept ON dept.id = teacher.dept GROUP BY dept.namedisplay 0 in result column for all teachers without department
'four' for Throd
Table-A
SELECT A_STRONGLY_AGREE
FROM nss
WHERE question='Q01'
AND institution = 'Edinburgh Napier University'
AND subject = '(8) Computer Science'SELECT institution, subject
FROM nss
WHERE score >= 100 AND question = 'Q15';SELECT institution, score
FROM nss
WHERE subject = '(8) Computer Science'
AND score < 50
AND question = 'Q15';SELECT subject, SUM(response)
FROM nss
WHERE question = 'Q22'
AND subject IN ('(8) Computer Science',
'(H) Creative Arts and Design')
GROUP BY subject;SELECT subject,
SUM((A_STRONGLY_AGREE / 100) * response)
FROM nss
WHERE question = 'Q22'
AND subject IN ('(8) Computer Science',
'(H) Creative Arts and Design')
GROUP BY subject;SELECT subject,
ROUND(SUM(A_STRONGLY_AGREE * response) / SUM(response))
FROM nss
WHERE question = 'Q22'
AND subject IN ('(8) Computer Science',
'(H) Creative Arts and Design')
GROUP BY subject;SELECT institution,
ROUND(SUM((score * response)) / SUM(response))
FROM nss
WHERE question = 'Q22' AND institution LIKE '%Manchester%'
GROUP BY institution;SELECT
institution,
SUM(sample) AS sample_size,
SUM(CASE WHEN subject = '(8) Computer Science' THEN sample ELSE 0 END) AS comp
FROM nss
WHERE question = 'Q01' AND institution LIKE '%Manchester%'
GROUP BY institution;SELECT lastName, party, votes
FROM ge
WHERE constituency = 'S14000024' AND yr = 2017
ORDER BY votes DESC;SELECT
party,
votes,
RANK() OVER (ORDER BY votes DESC) as posn
FROM ge
WHERE constituency = 'S14000024' AND yr = 2017
ORDER BY party;SELECT
yr,
party,
votes,
RANK() OVER (PARTITION BY yr ORDER BY votes DESC) as posn
FROM ge
WHERE constituency = 'S14000021'
ORDER BY party, yr;SELECT
constituency,
party,
votes,
RANK() OVER (PARTITION BY constituency ORDER BY votes DESC) AS posn
FROM ge
WHERE yr = 2017
AND constituency BETWEEN 'S14000021' AND 'S14000026'
ORDER BY posn, constituency;SELECT
constituency,
party,
votes,
RANK() OVER (PARTITION BY constituency ORDER BY votes DESC) AS posn
FROM ge
WHERE yr = 2017
AND constituency BETWEEN 'S14000021' AND 'S14000026'
ORDER BY posn, constituency;SELECT party, COUNT(party)
FROM (
SELECT constituency,
party,
RANK() OVER (PARTITION BY constituency ORDER BY votes DESC) as posn
FROM ge
WHERE yr = 2017 AND constituency LIKE 'S%'
) AS party_ranking
WHERE party_ranking.posn = 1
GROUP BY party;SELECT COUNT(*)
FROM stops;SELECT id
FROM stops
WHERE name = 'Craiglockhart';SELECT stops.id, stops.name
FROM stops
INNER JOIN route
ON stops.id = route.stop
WHERE route.num = 4 AND route.company = 'LRT'
ORDER BY route.pos;SELECT company, num, COUNT(*)
FROM route
WHERE stop = 149 OR stop = 53
GROUP BY company, num
HAVING COUNT(*) = 2;SELECT a.company, a.num, a.stop, b.stop
FROM route a
INNER JOIN route b
ON (a.company = b.company AND a.num = b.num)
WHERE a.stop = 53
AND b.stop = (
SELECT id
FROM stops
WHERE name = 'London Road'
);SELECT a.company, a.num, stopa.name, stopb.name
FROM route a
INNER JOIN route b
ON (a.company = b.company AND a.num = b.num)
INNER JOIN stops stopa
ON a.stop = stopa.id
INNER JOIN stops stopb
ON b.stop = stopb.id
WHERE stopa.name = 'Craiglockhart' AND stopb.name = 'London Road';SELECT DISTINCT a.company, a.num
FROM route a
INNER JOIN route b
ON (a.company = b.company AND a.num = b.num)
WHERE a.stop = 115 AND b.stop = 137;SELECT a.company, a.num
FROM route a
INNER JOIN route b
ON (a.company = b.company AND a.num = b.num)
INNER JOIN stops stopa
ON (a.stop = stopa.id)
INNER JOIN stops stopb
ON (b.stop = stopb.id)
WHERE stopa.name = 'Craiglockhart' AND stopb.name = 'Tollcross';SELECT stopb.name, a.company, a.num
FROM route a
INNER JOIN route b
ON (a.company = b.company AND a.num = b.num)
INNER JOIN stops stopa
ON (a.stop = stopa.id)
INNER JOIN stops stopb
ON (b.stop = stopb.id)
WHERE stopa.name = 'Craiglockhart' AND a.company = 'LRT';SELECT DISTINCT a.num, a.company, stops.name, b.num, b.company
FROM (
SELECT x.company, x.num, y.stop
FROM route x
INNER JOIN route y
ON (x.company = y.company AND x.num = y.num)
INNER JOIN stops stopx
ON (x.stop = stopx.id)
INNER JOIN stops stopy
ON (y.stop = stopy.id)
WHERE stopx.name = 'Craiglockhart'
) AS a
INNER JOIN (
SELECT x.company, x.num, y.stop
FROM route x
INNER JOIN route y
ON (x.company = y.company AND x.num = y.num)
INNER JOIN stops stopx
ON (x.stop = stopx.id)
INNER JOIN stops stopy
ON (y.stop = stopy.id)
WHERE stopx.name = 'Lochend'
) AS b
ON (a.stop = b.stop)
INNER JOIN stops
ON (a.stop = stops.id)
ORDER BY a.num, stops.name, b.numSELECT DISTINCT a.name, b.name
FROM stops a JOIN route z ON a.id=z.stop
JOIN route y ON y.num = z.num
JOIN stops b ON y.stop=b.id
WHERE a.name='Craiglockhart' AND b.name ='Haymarket'SELECT S2.id, S2.name, R2.company, R2.num
FROM stops S1, stops S2, route R1, route R2
WHERE S1.name='Haymarket' AND S1.id=R1.stop
AND R1.company=R2.company AND R1.num=R2.num
AND R2.stop=S2.id AND R2.num='2A'SELECT a.company, a.num, stopa.name, stopb.name
FROM route a JOIN route b ON (a.company=b.company AND a.num=b.num)
JOIN stops stopa ON (a.stop=stopa.id)
JOIN stops stopb ON (b.stop=stopb.id)
WHERE stopa.name='Tollcross'