[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part5: SELECT FROM WHERE, ORDER BY

참치와돌고래·2022년 8월 19일
0
post-custom-banner

SELECT FROM WHERE

SQL에서 SELECT FROM WHERE절은 흡사 어디(FROM)에서 무엇(WHERE)을 갖고(SELECT) 와주세요라고 이해하면 쉽다.

해당 코드는 players 테이블에서 birthyear가 1974인 모든 열을 가져오는 코드이다. *는 모든 열이라는 뜻이다.

참고로 sql에서 드래그를 한 후 실행하면 그 영역만 실행된다. 연습하기엔 제격.

SELECT *
FROM players
WHERE birthYear=1974;

반대로 열의 이름을 ,단위로 입력하면 해당 열의 정보만 가져온다.

SELECT nameFirst,nameLast,birthYear,birthCountry
FROM players
WHERE birthYear=1974

이때 열 뒤에 AS를 붙이고 원하는 문자열 입력시 해당 문자열로 열의 이름이 바뀌어 나타난다.

SELECT nameFirst AS name,nameLast,birthYear,birthCountry
FROM players
WHERE birthYear=1974

if문을 여러개 중첩해서 쓸 수 있는 것처럼, WHERE 절에도 여러 조건을 추가할 수 있다.

SELECT nameFirst AS name,nameLast,birthYear,birthCountry
FROM players
WHERE birthYear=1974 AND birthCountry='USA';

AND: C계열 언어의 &&와 같은 역할.
OR: C계열 언어의 ||와 같은 역할.
=: C계열 언어의 ==와 같은 역할.
!=: C계열 언어의 그것과 같다.

이거 말고도 >, <, <=,>=도 쓸 수 있다. 여담으로, sql에서도 각각 연산자 우선순위가 존재하므로 모르는 경우 괄호로 닫는 등의 조치가 필요하다.

NULL의 경우 같은 원리로 적용하려면 적용이 안된다.

SELECT *
FROM players
WHERE birthYear<=1974 AND birthCountry!=NULL;

이런 경우 is, is not으로 구별해야 한다. NULL은 어떤 값이 들어있는 것이 아니기 때문.

SELECT *
FROM players
WHERE birthYear<=1974 AND birthCountry is not ULL;

문자열의 경우 =, !=로만 비교할 수 있나?라고 의심할 수 있지만, 그렇지 않다. 문자열 패턴을 이용하면 된다. LIKE를 이용하면 된다. 다음과 같은 코드를 치니, 고향이 Havana, Hamilton, Hayward처럼 H뒤에 아무 문자열이 오는 고향인 선수들만 잘 나오는 것을 확인할 수 있다.

SELECT *
FROM players
WHERE birthCity LIKE 'H%';

%:아무 문자, 길이는 상관 없음.
_:아무 문자, 단 딱 그 자리 한 곳만.

ORDER BY, TOP

데이터베이스에도 당연히 정렬을 하는 기능이 있다. 이는 ORDER BY 절에서 구현할 수 있다. 그러나, ORDER BY는 NULL이 있는 경우도 여과 없이 보여주기 때문에, 코드처럼 별도로 NULL을 없애주는 작업이 필요하다. 기본적으론 오름차순으로 설정되어 있다.

SELECT *
FROM players
WHERE birthYear is not NULL
ORDER BY birthYear
/*
ASC: 오름차순 
DESC: 내림차순
*/

WHERE 절에 여러 조건을 추가할 수 있는 것처럼, ORDER BY도 열 별로 추가 정렬이 가능하다. 해당 코드는 생년월일 모두 내림차순으로 정렬되게끔 결과가 나올 것이다.

SELECT *
FROM players
WHERE birthYear is not NULL
ORDER BY birthYear DESC,birthMonth DESC,birthDay DESC

TOP

상위 데이터만 보여주는 기능이다. SELECT 절에 다음과 같이 쓰면 태어난 년도가 내림차순으로 정렬된 데이터 상위 1000개만 보여줄 것이다.

SELECT TOP 1000 *
FROM players
WHERE birthYear is not NULL
ORDER BY birthYear DESC

갯수가 아닌, 상위 ~퍼센트로 쓰고 싶다면 다음과 같이 적으면 된다. 해당 코드는 상위 1퍼센트만 결과로 반환할 것이다.

SELECT TOP 1 PERCENT *
FROM players
WHERE birthYear is not NULL
ORDER BY birthYear DESC

그러나 상위가 아닌, 100위부터 200위까지와 같은 중간 범위만 나오게 하려면 어떻게 해야할까... 이럴 땐 OFFSET FETCH를 이용하면 된다곤 한다.

SELECT *
FROM players
WHERE birthYear is not NULL
ORDER BY birthYear DESC
OFFSET 100 ROWS FETCH NEXT 100 ROWS ONLY;

많이 쓰이지 않지만, 그냥 이런게 있다고만 인지해도 될 것같다.


post-custom-banner

0개의 댓글