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
- C
- E
- E
- C
- C
- C
- 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
- E
- D
- B
- D
- B
- D
- 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
- E
- C
- B
- C
- C
- C
- 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
- C
- B
- A
- D
- B
- B
- 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
- C
- A
- D
- E
- B
- E
- D
- 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
- D
- C
- A
- A
- B
- C
- 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
- C
- E
- C
- B
- D
- C
- 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
- E
- C
- E
- B
- A
- 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
- C
- E
- D