1. 程式人生 > >SQL語句學習筆記-sqlzoo

SQL語句學習筆記-sqlzoo

SQLZOO練習筆記

在練習過程中,首次出現的語法記錄下來,備忘。練習中基礎語句的巢狀使用就不在此記錄,多練才是王道~

1. Basic

SELCET name, population FROM world

WHERE name = 'Germany';

WHERE name IN ('Ireland','Iceland');

WHERE area > 1000000;

WHERE area BETWEEN 250000 AND 300000;

# 找出name中以F開頭'F%'的詞, F結尾'%F', 有F'的%F%', 第二個字母為n的詞'_n%'(_表示一個萬用字元)

WHERE name LIKE 'F%';

# 找出首都為國名+City,  SQL裡面等號為‘=’ 不是‘==’

WHERE capital = concat(name, ' City')

#找出名字由首都+延伸片語成,並顯示名字和延伸詞, replace(A, a, b) 將A中的a替換成b

SELECT name, replace(capital, name, '')
FROM world
WHERE capital LIKE concat(name, '_%') 

2. SELECT FROM world

# 使用ROUND(population/1000000,2)保留小數點後兩位, ROUND(,-3)保留到千位

SELECT name, ROUND(population/1000000,2), ROUND(gdp/1000000000,2) FROM world
WHERE continent = 'South America'

SELECT name, ROUND(gdp/population,-3) FROM world
WHERE gdp > 1000000000000

# CASE WHEN condition1 THEN value1

              WHEN condition2 THEN value2

              ELSE def_value

              END

SELECT name, population
      ,CASE WHEN population<1000000 
            THEN 'small'
            WHEN population<10000000 
            THEN 'medium'
            ELSE 'large'
       END
  FROM bbc

3. SELECT FROM nobel

#type character 'Ü'  mac OS: 'option+U' then  'shift+U'

#需要顯示單引號時,需要兩個單引號表示 'EUGENE O'NEILL'

SELECT * FROM nobel
WHERE winner = 'EUGENE O''NEILL'

# 將特定的多個專案排在最後 ORDER BY name IN ('A','B'), name   將name為A或B的排在最後,其他的按name排序(name為A或B排1,其他排0,所以在最後)

SELECT winner, subject FROM nobel
WHERE yr = 1984
ORDER BY subject IN ('Chemistry','Physics'), subject, winner

#  將特定的單個專案排在最前或最後,ORDER BY IF語句,ORDER BY IF (name='A', 0, 1), name   如果name為A則排0,其他排1,若後面加DESC,則反排

4. SELECT within SELECT

SELECT name FROM world
  WHERE population >
     (SELECT population FROM world
      WHERE name='Russia')

# 用ALL對一個列表中所有值比較

SELECT name
  FROM world
 WHERE population >= ALL(SELECT population
                           FROM world
                          WHERE population>0)

# 為表格命名,方便不同表格內容比較

SELECT continent, name, area FROM world x
  WHERE area >= ALL
    (SELECT area FROM world y
        WHERE y.continent=x.continent
          AND area>0)

5. SUM and COUNT(COUNT計數, SUM求和, AVG, MAX, DISTINCT去重(若用'DISTINCT name, continent'是對name和continent組合起來去重),GROUP BY分組計算)

# GROUP BY同時條件篩選時WHERE表示GROUP BY之前的條件篩選,HAVING表示分組之後的篩選

# WHERE :以下對於每一個洲份,顯示洲份和至少有1000萬人(10,000,000)口國家的數目

SELECT continent, COUNT(name) FROM world
WHERE population >= 10000000
GROUP BY continent

# HAVING : 列出有至少100百萬(1億)(100,000,000)人口的洲份。

SELECT continent FROM world
GROUP BY continent
HAVING SUM(population) >= 100000000

6. JOIN

SELECT player,stadium
  FROM game JOIN goal ON (game.id=goal.matchid)

# INNER JOIN內聯結、FULL JOIN全聯結、LEFT JOIN左聯結、RIGHT JOIN右聯結

# CROSS JOIN交叉聯結,返回兩表的笛卡爾積

7. More JOIN

是關於JOIN, SELECT IN SELECT, GROUP BY, ORDER BY的巢狀練習

8. Using NULL

# IS NULL選出是NULL的專案

SELECT name FROM teacher
WHERE dept IS NULL

# COALESCE聯結合並  coalesce(a, 'b')將a中的NULL值用'b'代替  

# 例子中,將party中是null值的用'None'代替

SELECT name, party
      ,COALESCE(party,'None') AS aff
  FROM msp WHERE name LIKE 'C%'

9. SELF JOIN

# 將同一個表分別命名為a和b, 再將這兩個一樣的表JOIN,就可以以兩個表的形式進行操作了

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)
WHERE a.stop=53

# 將兩個表分成四個表, 再兩兩self join

SELECT a.company, a.num FROM route a JOIN route b 
ON (a.company=b.company AND a.num=b.num) 
JOIN stops stopa ON stopa.id=a.stop JOIN stops stopb ON stopb.id=b.stop
WHERE stopa.name='Craiglockhart' AND stopb.name='Tollcross'

# 終極self join 

#Q10:Find the routes involving two buses that can go from Craiglockhart to Sighthill.
Show the bus no. and company for the first bus, the name of the stop for the transfer,
and the bus no. and company for the second bus.

SELECT DISTINCT bus1.num, bus1.company, name, bus2.num, bus2.company 
FROM 
(SELECT a1.num, a1.company, b1.stop FROM route a1 JOIN route b1 
ON a1.num=b1.num AND a1.company=b1.company AND a1.stop != b1.stop 
WHERE a1.stop = (SELECT id FROM stops WHERE name='Craiglockhart')) bus1 
JOIN 
(SELECT a2.num, a2.company, b2.stop FROM route a2 JOIN route b2 
ON a2.num=b2.num AND a2.company=b2.company AND a2.stop != b2.stop 
WHERE a2.stop = (SELECT id FROM stops WHERE name='Sighthill')) bus2 
ON bus1.stop=bus2.stop 
JOIN stops ON bus1.stop = stops.id