SQLZOO練習(全)

SELECT basics/zh

SELECT population FROM world
WHERE name = 'Germany';
SELECT name, gdp/population FROM world
WHERE area > 5000000;
SELECT name, population FROM world
WHERE name IN ('Ireland', 'Iceland', 'Denmark');
SELECT name, area FROM world
WHERE area BETWEEN 200000 AND 250000;

SELECT names/zh

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 LIKE capital;					# name = capital
SELECT name FROM world
WHERE capital LIKE CONCAT(name,' City');	# capital = concat(name,' City')
SELECT capital,name FROM world
WHERE capital LIKE CONCAT('%',name,'%');
  • 方法一
SELECT name,capital FROM world
WHERE capital LIKE CONCAT(name,'%') AND capital != name;
  • 方法二
SELECT name,capital FROM world
WHERE capital LIKE CONCAT(name, '_%');		# '_%'表示至少大於1個字符
  • 方法一
SELECT name,REPLACE(capital,name,'') AS extension FROM world
WHERE capital Like CONCAT(name, '_%'); 
  • 方法二
SELECT name,MID(capital,length(name)+1) AS extension FROM world	
WHERE capital Like CONCAT(name, '_%');		# MID()與SUBSTRING()相同

SELECT Quiz/zh

  1. C
  2. E
  3. E
  4. C
  5. C
  6. C
  7. C

SELECT from WORLD Tutorial/zh

SELECT name, continent, population FROM world;
SELECT name FROM world
WHERE population > 200000000;
SELECT name, gdp/population FROM world
WHERE population > 200000000;
SELECT 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/1000)*1000 FROM world
WHERE gdp > 1000000000000;
SELECT name,
       CASE WHEN continent='Oceania' THEN 'Australasia'
            ELSE continent 
       END AS continent
FROM world
WHERE name LIKE 'N%';
SELECT name,
       CASE WHEN continent IN ('Europe','Asia') THEN 'Eurasia'
            WHEN continent IN ('North America','South America','Caribbean') THEN 'America'
            ELSE continent 
       END AS continent
FROM world
WHERE name LIKE 'A%' OR name LIKE 'B%';
SELECT name,continent AS original_continent,
       CASE WHEN continent = 'Oceania' THEN 'Australasia'
            WHEN continent IN ('Eurasia','Turkey') THEN 'Europe/Asia'
            WHEN continent = 'Caribbean' AND name LIKE 'B%' THEN 'North America'
            WHEN continent = 'Caribbean' THEN 'South America'
            ELSE continent
            END AS new_continent
FROM world;

BBC QUIZ/zh

  1. E
  2. D
  3. B
  4. D
  5. B
  6. D
  7. C

SELECT from Nobel Tutorial/zh

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 yr >= 2000
AND subject = 'Peace';
SELECT *
FROM nobel
WHERE yr BETWEEN 1980 AND 1989
AND subject = 'Literature';
SELECT * 
FROM nobel
WHERE winner IN ('Theodore Roosevelt',
                  'Woodrow Wilson',
                  'Jimmy Carter');
SELECT winner
FROM nobel
WHERE winner LIKE 'John%';
SELECT *
FROM nobel
WHERE (yr = 1980 AND subject = 'physics')
OR (yr = 1984 AND subject = 'chemistry');
SELECT *
FROM nobel
WHERE yr = 1980
AND subject NOT IN ('Chemistry','Medicine');
SELECT *
FROM nobel
WHERE (yr < 1910 AND subject = 'Medicine')
OR (yr >= 2004 AND subject = 'Literature');

Harder Questions

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,winner;
SELECT winner,subject
FROM nobel
WHERE yr=1984
ORDER BY subject IN ('Physics','Chemistry'),subject,winner;

-- 當把subject in ('Physics','Chemistry')放在select後面的時候,出來的結果subject in ('Physics','Chemistry')作爲一個column顯示的是1或0
-- 這就是說當把subject in ('Physics','Chemistry')放在order by後面的時候,先是0,後是1,也就是先排序非物理和化學領域,再排序化學和物理領域。因此把subject in ('Physics','Chemistry')放在ORDER BY後第一個可以保證物理和化學領域在最後

Nobel Quiz/zh

  1. E
  2. C
  3. B
  4. C
  5. C
  6. C
  7. D

SELECT within SELECT Tutorial/zh

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 IN ('Argentina','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,0),'%') AS population
FROM world
WHERE continent = 'Europe';
  • 方法一
SELECT name FROM world
WHERE gdp > ALL(SELECT gdp FROM world
                 WHERE continent = 'Europe'
                 AND gdp > 0);
  • 方法二
SELECT name FROM world
WHERE gdp > (SELECT MAX(gdp) FROM world 
             WHERE continent = 'Europe');
  • 方法一
SELECT continent,name,area FROM world x
WHERE area >= ALL (SELECT area FROM world y
                   WHERE y.continent = x.continent
                   AND area > 0);
  • 方法二
SELECT continent,name,area FROM world
WHERE area IN (SELECT MAX(area) FROM world 
               GROUP BY continent);	
  • 方法一
SELECT continent,name FROM world x
WHERE name <= ALL(SELECT name FROM world y
                  WHERE y.continent = x.continent);
  • 方法二
SELECT continent,name FROM world
WHERE name IN (SELECT MIN(name) FROM world
               GROUP BY continent);
SELECT name,continent,population FROM world x
WHERE 25000000 >= ALL(SELECT population FROM world y
                      WHERE y.continent = x.continent
                      AND y.population > 0);
SELECT name,continent FROM world x
WHERE population >= ALL(SELECT 3*population 
                        FROM world y
                        WHERE y.continent = x.continent
                        AND y.name != x.name);

Nested SELECT Quiz/zh

  1. C
  2. B
  3. A
  4. D
  5. B
  6. B
  7. B

SUM and COUNT

SELECT SUM(population)
FROM world;
SELECT DISTINCT continent 
FROM world;
SELECT SUM(gdp) FROM world
WHERE continent = 'Africa';
SELECT COUNT(name) FROM world
WHERE area >= 1000000;
SELECT SUM(population) FROM world
WHERE name IN ('France','Germany','Spain');
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;

The nobel table can be used to practice more SUM and COUNT functions./zh

SELECT COUNT(winner) FROM nobel;
SELECT DISTINCT subject 
FROM nobel;
SELECT COUNT(winner) FROM nobel
WHERE subject = 'Physics';
SELECT subject,COUNT(winner) FROM nobel
GROUP BY subject;
SELECT subject,MIN(yr) FROM nobel
GROUP BY subject;
SELECT subject,COUNT(winner)
FROM nobel
WHERE yr = 2000
GROUP BY subject;
SELECT subject,COUNT(DISTINCT winner)
FROM nobel
GROUP BY subject;
SELECT subject,COUNT(DISTINCT yr)
FROM nobel
GROUP BY subject;
SELECT yr FROM nobel
WHERE subject = 'Physics'
GROUP BY yr
HAVING COUNT(winner) = 3;
SELECT winner
FROM nobel
GROUP BY winner
HAVING COUNT(subject) > 1;
SELECT winner
FROM nobel
GROUP BY winner
HAVING COUNT(DISTINCT subject) > 1;
SELECT yr,subject FROM nobel
WHERE yr >= 2000
GROUP BY yr,subject
HAVING COUNT(winner) = 3;

SUM and COUNT Quiz

  1. C
  2. A
  3. D
  4. E
  5. B
  6. E
  7. D
  8. D

The JOIN operation/zh

SELECT matchid,player FROM goal 
WHERE teamid = 'GER';
SELECT id, stadium, team1, team2 
FROM game
WHERE id = '1012';
SELECT player,teamid,stadium,mdate
FROM game JOIN goal ON id = matchid
WHERE teamid = 'GER';
SELECT team1,team2,player
FROM goal JOIN game ON matchid = id
WHERE player LIKE 'Mario%';
SELECT player,teamid,coach,gtime
FROM goal 
JOIN eteam on id = teamid
WHERE gtime <= 10;
SELECT mdate,teamname 
FROM game 
JOIN eteam ON eteam.id = team1
WHERE coach = 'Fernando Santos';
SELECT player 
FROM goal 
JOIN game ON id = matchid
WHERE stadium = 'National Stadium, Warsaw';
SELECT DISTINCT player 
FROM goal 
JOIN game ON id = matchid
WHERE (team1 = 'GER' OR team2 = 'GER')
AND teamid != 'GER';
SELECT teamname,COUNT(*) 
FROM eteam 
JOIN goal ON teamid =id
GROUP BY teamname;
SELECT stadium,COUNT(*)
FROM game 
JOIN goal ON matchid = id
GROUP BY stadium;
SELECT matchid,mdate,COUNT(*)
FROM game
JOIN goal ON matchid = id 
WHERE (team1 = 'POL' OR team2 = 'POL')
GROUP BY matchid,mdate;
SELECT matchid,mdate,COUNT(*)
FROM goal 
JOIN game ON id = matchid
WHERE teamid = 'GER'
GROUP BY matchid,mdate;
SELECT mdate,
       team1,
       SUM(CASE WHEN teamid=team1 THEN 1 ELSE 0 END) score1,
       team2,
       SUM(CASE WHEN teamid=team2 THEN 1 ELSE 0 END) score2
FROM game 
LEFT JOIN goal ON matchid = id
GROUP BY mdate,matchid,team1,team2
ORDER BY mdate,matchid,team1,team2;		-- LEFT JOIN是爲了防止缺少比賽中雙方都沒進球的情況

JOIN Quiz

  1. D
  2. C
  3. A
  4. A
  5. B
  6. C
  7. B

More JOIN operations/zh

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 title 
FROM movie
WHERE id IN (11768,11955,21191);
SELECT id
FROM actor
WHERE name = 'Glenn Close';
SELECT id
FROM movie
WHERE title = 'Casablanca';
SELECT name
FROM casting
JOIN actor ON actor.id = actorid
JOIN movie ON movie.id = movieid
WHERE title = 'Casablanca';
SELECT name
FROM casting 
JOIN actor ON actor.id = actorid
JOIN movie ON movie.id = movieid
WHERE title = 'Alien';
SELECT title
FROM casting
JOIN actor ON actor.id = actorid
JOIN movie ON movie.id = movieid
WHERE name = 'Harrison Ford';
SELECT title
FROM casting
JOIN actor ON actor.id = actorid
JOIN movie ON movie.id = movieid
WHERE name = 'Harrison Ford'
AND ord != 1;
SELECT title,name
FROM casting
JOIN actor ON actor.id = actorid
JOIN movie ON movie.id = movieid
WHERE yr = 1962
AND ord = 1;
SELECT yr,COUNT(title)
FROM casting
JOIN actor ON actor.id = actorid
JOIN movie ON movie.id = movieid
WHERE name = 'John Travolta'
GROUP BY yr
HAVING COUNT(title) = (SELECT MAX(count)
                       FROM (SELECT yr,COUNT(title) AS count
                             FROM casting
                             JOIN actor ON actor.id = actorid
                             JOIN movie ON movie.id = movieid
                             WHERE name = 'John Travolta'
                             GROUP BY yr)AS table)
SELECT title,name
FROM casting
JOIN actor ON actor.id = actorid
JOIN movie ON movie.id = movieid
WHERE ord = 1
AND movieid IN (SELECT movieid
                FROM casting
                JOIN actor ON actor.id = actorid
                WHERE name = 'Julie Andrews')
SELECT name
FROM actor
WHERE id IN (SELECT id
             FROM casting
             JOIN actor ON id = actorid
             WHERE ord = 1
             GROUP BY id
             HAVING COUNT(*) >= 30)
ORDER BY name;
SELECT title,COUNT(actorid)
FROM casting
JOIN movie ON id = movieid
WHERE yr = 1978
GROUP BY id,title
ORDER BY COUNT(actorid) DESC;
SELECT DISTINCT name
FROM casting 
JOIN actor ON id = actorid
WHERE name != 'Art Garfunkel' 
AND movieid IN (SELECT movieid
                FROM casting
                JOIN actor ON actor.id = actorid
                JOIN movie ON movie.id = movieid
                WHERE name = 'Art Garfunkel') 

JOIN Quiz 2

  1. C
  2. E
  3. C
  4. B
  5. D
  6. C
  7. B

Using Null/zh

SELECT name 
FROM teacher
WHERE dept IS NULL;
SELECT teacher.name,dept.name
FROM teacher 
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')
FROM teacher;
SELECT teacher.name,
       COALESCE(dept.name,'None')
FROM teacher 
LEFT JOIN dept ON teacher.dept = dept.id;
SELECT COUNT(name),COUNT(mobile)
FROM teacher;
SELECT dept.name,COUNT(teacher.name)
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 AS dept
FROM teacher;
SELECT name,
       CASE WHEN dept IN (1,2) THEN 'Sci'
            WHEN dept = 3 THEN 'Art'
            ELSE 'None' END AS dept
FROM teacher;

Using Null Quiz

  1. E
  2. C
  3. E
  4. B
  5. A
  6. A

Self join

SELECT COUNT(*) FROM stops;
SELECT id FROM stops WHERE name = 'Craiglockhart';
SELECT id,name
FROM stops
JOIN route ON id = stop
WHERE num = 4 AND company = 'LRT'
ORDER BY 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 
JOIN route b ON a.company = b.company AND a.num = b.num
JOIN stops c ON c.id = a.stop
JOIN stops d ON d.id = b.stop
WHERE c.name = 'Craiglockhart' AND d.name = 'London Road';
SELECT a.company, a.num, c.name, d.name
FROM route a 
JOIN route b ON a.company = b.company AND a.num = b.num
JOIN stops c ON c.id = a.stop
JOIN stops d ON d.id = b.stop
WHERE c.name = 'Craiglockhart' AND d.name = 'London Road';
SELECT DISTINCT a.company,a.num
FROM route a 
JOIN route b ON a.company = b.company AND a.num = b.num
JOIN stops c ON c.id = a.stop
JOIN stops d ON d.id = b.stop
WHERE c.name = 'Haymarket' AND d.name = 'Leith';
SELECT DISTINCT a.company,a.num
FROM route a 
JOIN route b ON a.company = b.company AND a.num = b.num
JOIN stops c ON c.id = a.stop
JOIN stops d ON d.id = b.stop
WHERE c.name = 'Craiglockhart' AND d.name = 'Tollcross';
SELECT d.name,a.company,a.num
FROM route a 
JOIN route b ON a.company = b.company AND a.num = b.num
JOIN stops c ON c.id = a.stop
JOIN stops d ON d.id = b.stop
WHERE c.name = 'Craiglockhart';
SELECT DISTINCT a.num,a.company,stop_b.name,c.num,c.company
FROM route a 
JOIN route b ON a.company = b.company AND a.num = b.num
JOIN route c 
JOIN route d ON c.company = d.company AND c.num = d.num
JOIN stops stop_a ON a.stop = stop_a.id
JOIN stops stop_b ON b.stop = stop_b.id
JOIN stops stop_c ON c.stop = stop_c.id
JOIN stops stop_d ON d.stop = stop_d.id
WHERE stop_a.name = 'Craiglockhart' 
AND stop_d.name = 'Lochend'
AND stop_b.name = stop_c.name;		    -- 排序不會 

Self join Quiz

  1. C
  2. E
  3. D
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章