SQLZOO 문제풀이

이윤설·2023년 3월 31일
0

https://sqlzoo.net/wiki/SQL_Tutorial

SELECT basics

2)
SELECT FROM WHERE ... IN ()

포인트: WHERE 절 다음에는 and, or, (not)in 등이 올 수 있다.
이 때 IN을 쓸 때는 뒤에 괄호를 쳐야하며, NOT과 같이 쓸 때는
WHERE 일치하지 않길 원하는 컬럼명 NOT IN (조건1, 조건2, 조건3 .....)
로 써야한다.

3)
숫자에 콤마를 넣으면 인식을 못한다.

SELECT name

LIKE문(특정 문자 포함되어있는지 검색)

게시판에서 제목에 아디다스가 들어가는 게시물을 찾고싶다?

select * from tbl_board where title = '아디다스'; 라고 한다면
원하는 검색 결과가 나오지 않는다.
이 명령어는 제목이 아디다스 인 게시물만 뽑아오기 때문이다.

우리가 원하는 결과를 얻으려면 like문을 써야한다.

아디다스로 시작하는 데이터 검색
SELECT * FROM tbl_board WHERE title LIKE '아디다스%';

아디다스로 끝나는 데이터 검색
SELECT * FROM tbl_board WHERE title LIKE '%아디다스';

아디다스가 들어가는 데이터 검색
SELECT * FROM tbl_board WHERE title LIKE '%아디다스%';

첫글자가 어떤 한 글자()이고, 그 다음에 아디다스가 들어가는 데이터 검색
SELECT * FROM tbl_board WHERE title LIKE '
아디다스%';
->김아디다스(O), 김김아디다스(X)

만약 '% 아디다스 %' 라고 한다면, 앞 뒤 공백까지 포함해서 검색하므로 유의해야한다.
이런건 클라이언트가 검색할때 실수 할 수 있으므로
클라이언트측에서든 DB에서든 trim을 이용하여 공백제거를 해야 한다.
<출처: https://bactoria.tistory.com/22>

LIKE, %, _

LIKE 연산자에서 %와 _는 와일드카드 문자다.
(컴퓨터에서 특정 명령어로 명령을 내릴 때, 여러 파일을 한꺼번에 지정할 목적으로 사용하는 기호를 가리킨다. 이 문자는 어느 곳에서 사용하느냐에 따라 약간의 차이를 보인다. 주로 특정한 패턴이 있는 문자열 혹은 파일을 찾거나, 긴 이름을 생략할 때 쓰인다.)

%는 0개 이상의 임의의 문자열을 의미한다. 예를 들어, LIKE 'a%'는 'a'로 시작하는 모든 문자열을 찾습니다. LIKE '%abc%'는 'abc'를 포함하는 모든 문자열을 찾는다. 맨앞뒤에 %가 있다고 해서, 맨앞 또는 맨뒤에 %가 있다고해서 맨앞뒤는 비어야한다고 생각할 수도 있는데, 그건 아니다. 따라서 맨 앞에서 abc로 시작하는 'abcdefg'도 %abc%에 부합한다.

_는 하나의 임의의 문자를 의미합니다. 예를 들어, LIKE 'a_c'는 'a'로 시작하고 'c'로 끝나는 세 글자 문자열을 찾습니다.

따라서, LIKE 연산자에서 %와 _는 패턴 매칭을 위한 와일드카드로 사용되며, 특정 문자열을 찾기 위해 사용됩니다.

1)
SELECT name FROM world WHERE name LIKE '%Y';
포인트: MySQL 에서는 문자열에 무조건 ''를 붙어야 한다. ""를 쓰면 에러가 난다.

3)
SELECT name FROM world WHERE name LIKE '%x%';
포인트: 앞,뒤로 %가 붙어있으면 당연히 x를 포함하는 것이다.

5)
C로 시작하고 ia로 끝나는 것?!
-> SELECT name FROM world WHERE name LIKE 'C%ia';

7)
어떤 문자가 포함되어있는지 검색하는 것은 아는데, 그 문자가 n개 이상일 경우는 알지 못하였음.
-> SELECT name FROM world WHERE name LIKE '%a%a%a%'

9)
countries that have two "o" characters separated by two others
두 개의 o 사이에 두 문자열이 있는 경우?(ex. moldova, lesotho)
-> SELECT name FROM world WHERE name LIKE '%o__o%';
언더바가 두 개이다. 만약 언더바가 네개라면, 두 개의 o 사이에 네 문자열이 있는 경우를 뜻한다.

10) 정확히 네 개의 문자로 이루어진 경우?
-> SELECT name FROM world
WHERE name LIKE '____'

언더바 네 개를 쓰면 된다.

11~15는 나중에 하도록...

SELECT from WORLD

3) Give the name and the per capita GDP for those countries with a population of at least 200 million.

()는 안써도 되고, at least는 초과를 의미한다.

내가 쓴 코드:

SELECT name, (gdp / population) 
AS 'per capita GDP' FROM world WHERE population >= 20000000;

정답:

SELECT name, gdp/population FROM world AS 'per capita GDP'
  WHERE population > 200000000
;

4) Show the name and population in millions for the countries of the continent 'South America'. Divide the population by 1000000 to get population in millions.

내가 쓴 코드(정답):

SELECT name, population/1000000 FROM world 
WHERE continent = 'South America';

일반적으로 관계형 db 에선 ==는 안쓰이므로 =를 써야함.

5) Show the name and population for France, Germany, Italy(중요)

내가 쓴 코드:

SELECT name, population FROM world 
WHERE name = France AND Germany AND Italy;

정답:

SELECT name, population FROM world
  WHERE name IN ('France','Germany','Italy');

6) Show the countries which have a name that includes the word 'United'

내가 쓴 코드(정답):

SELECT name FROM world WHERE name LIKE '%United%';

8) Exclusive OR (XOR). Show the countries that are big by area (more than 3 million) or big by population (more than 250 million) but not both. Show name, population and area.

Australia has a big area but a small population, it should be included.
Indonesia has a big population but a small area, it should be included.
China has a big population and big area, it should be excluded.
United Kingdom has a small population and a small area, it should be excluded.

내가 쓴 코드: OR 인 동시에 BOTH인 경우는 제외하는 것을 어떻게 써야하는지 몰랐음

SELECT name, population, area FROM world WHERE
area > 3000000 OR population > 250000000;

정답:

SELECT name, population,area
  FROM world
  WHERE
  (population>250000000 OR area>3000000)
  AND NOT(population>250000000 AND area>3000000)
;

a 이면서 b가 아닌 경우 -> WHERE a AND NOT b

참고: column1의 값이 1인 동시에 column2의 값이 2가 아닌 경우

SELECT * FROM table_name 
WHERE column1 = 1 AND column2 <> 2;

참고2: NOT의 쓰임새(조건을 만족하지 않을 경우 데이터 검색)

SELECT *
FROM table
WHERE NOT gender = 'F';

-> 여성이 아닌 데이터, 즉 남자들을 출력

SELECT  *
FROM CELAB
WHERE (BRITHDAY>19970316 AND NOT gender = 'F') 
OR(BRITHDAY <19901231 AND NOT AGENCY = 'YSL');

-> 생일이 19970316 이후이면서 여자가 아닌 데이터를 출력하거나,
생일이 19901231 이면서 소속사가 YSL이 아닌 데이터를 출력한다.

9번까지 풀이 완료 -> 23/4/6

10)
Show the name and per-capita GDP for those countries with a GDP of at least one trillion (1000000000000; that is 12 zeros). Round this value to the nearest 1000. Show per-capita GDP for the trillion dollar countries to the nearest $1000.

내가 쓴 코드:

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

정답:

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

-> 문제를 잘못 보고 gdp/population이 1000000000000 이상인 줄로 알았다. 그리고 1000의 단위로 ROUND하려면 -3을 해줘야 한다.

12)
The capital of Sweden is Stockholm. Both words start with the letter 'S'.
Show the name and the capital where the first letters of each match. Don't include countries where the name and the capital are the same word.
You can use the function LEFT to isolate the first character.
You can use <> as the NOT EQUALS operator.

SELECT name, capital
from WORLD
where LEFT(name, 1) = LEFT(capital, 1) 
AND
name <> capital;

11번 -> 에러 발생. 입력한게 정답임.
13번 나중에 꼭 풀어보기!!!!!!!!!!!!!!!!!

SELECT from Nobel

Show the winners with first name John

내가 쓴 코드

SELECT winner FROM nobel 
WHERE winner LIKE 'John%';

-> first name 을 찾는거니까 John%를 써주면 된다.

8) Show the year, subject, and name of physics winners for 1980 together with the chemistry winners for 1984.(중요.. 헷갈리기 쉬움)

내가 쓴 코드)
없음. 왜냐하면 A다중조건 또는 B다중조건일 경우 모두 출력하라는 코드가 생각이 나지 않았음.

정답)

SELECT * FROM nobel 
WHERE 
(subject ='Physics' AND yr='1980') 
OR 
(subject='Chemistry' and yr='1984')
 

(subject ='Physics' AND yr='1980')
OR (subject='Chemistry' and yr='1984')
-> 물리 1980년 수상자 또는 화학 1984년 수상자 모두 출력하라는 것이다. 만약 OR 대신 AND를 쓰면, 물리 1980년 수상자이면서 화학 1984년 수상자인 사람을 찾으라는 것이다. 헷갈리기 쉬우니 주의.

9) Show the year, subject, and name of winners for 1980 excluding chemistry and medicine

내가 쓴 코드

SELECT *
FROM nobel
WHERE yr = 1980 
AND NOT subject='chemistry' AND 'medicine';  

정답

SELECT * FROM nobel 
 WHERE yr = 1980 
 AND subject NOT IN ('CHEMISTRY',
                     'MEDICINE')

->

11,12,13 은 나중에

SELECT within SELECT

2) Show the countries in Europe with a per capita GDP greater than 'United Kingdom'.

내가 쓴 거(정답)

SELECT name FROM world
WHERE (gdp/population > 
      (SELECT gdp/population FROM world WHERE name = 'United Kingdom'))
AND (continent = 'Europe');

3)List the name and continent of countries in the continents containing either Argentina or Australia. Order by name of the country.

4) Which country has a population that is more than United Kingdom but less than Germany? Show the name and the population.

SELECT name, population 
FROM world
WHERE population > 
(SELECT population FROM world WHERE name = 'United Kingdom') 
AND population < 
(SELECT population FROM world WHERE name = 'Germany');

다만 BETWEEN을 쓰면 United Kingdom과 Germany를 포함하게 되므로 부등호를 써야한다.

profile
화려한 외면이 아닌 단단한 내면

0개의 댓글