Small Steps Every Day

매일 천천히 조금씩 앞으로 나아가다.

새싹(SeSAC) | 전Z전능 데이터분석가/#5 SQL 실무 프로젝트

[성동3기 전Z전능 데이터 분석가] DAY 38 _ SQL _ NOT, LIKE, ORDER BY, LIMIT, OFFSET, 연산자

mindata1 2025. 2. 18. 17:07
NOT 연산자

 

  • 오른쪽에 지정한 조건식의 반대값을 반환 (단항 연산자)
SELECT * FROM sample24 WHERE NOT (a<>0 OR b<>0);

 
 

엔티티 관계도

 
테이블 간 관계를 알아볼 수 있는 기능이며, 전처리 전 데이터를 이해하는 데 도움이 된다.

  • 테이블 우클릭 → '다이어그램 보기' 클릭

 
 

실습해보기

 

# Q1. Employee 테이블을 모두 출력해보기 
SELECT * FROM Employee;

# Q2. Employee 테이블에서 reportsto 가 null 아닌 사람을 출력해보기 
SELECT * FROM Employee WHERE ReportsTo IS NOT NULL;

# Q3. Employee 테이블에서 Title 이 IT Staff 인 사람만 출력해보기 
SELECT * FROM Employee WHERE Title = 'IT Staff';

# Q4. Employee 테이블에서 IT Staff 와 Sales Manager 를 출력해보기
SELECT * FROM Employee WHERE Title = 'IT Staff' OR Title = 'Sales Manager';

# Q5. Employee 테이블에서 title 이 IT Staff 가 아닌 사람들 출력해보기
SELECT * FROM Employee WHERE Title != 'IT Staff';

# Q6. Customer 테이블에서 Company 가 null 이 아닌 사람들만 출력해보기
SELECT * FROM Customer WHERE Company IS NOT NULL;

# Q7. Customer 테이블에서 Supportrepid 가 4나 5 가 아닌 사람만 출력해보기
SELECT * FROM Customer WHERE SupportRepId = 4 AND SupportRepId = 5;

# Q8-1. Track 테이블에서 Genre 가 Rock 이나 JAZZ 인 것만 출력해보기
SELECT * FROM Track WHERE GenreId = 1 OR GenreId = 2;

# Q8-2. JOIN 으로 응용해보기
SELECT T.Name, G.Name, T.Composer
FROM Track T
JOIN Genre G ON T.GenreId = G.GenreId
WHERE G.Name = 'Rock' OR G.Name = 'Jazz';

 
 

테이블 검색 _ LIKE

 

  • 'LIKE' 를 사용해 문자열 일부분을 비교하는 '부분 검색' 해보기
  • = 연산자로 검색하는 경우 셀의 데이터 값이 완전히 동일한지 확인하는데, '특정 문자나 문자열을 포함하는지' 검색해보기
  • Syntax
    • SELECT 열명 FROM 테이블명 WHERE 열명 LIKE 문자열

 

LIKE 술어의 메타문자

 

  • 이항 연산자 '열 LIKE 문자열'
  • 메타문자 : "와일드 카드" 라고도 불리며, 임의의 문자 또는 문자열을 나타낼 수 있음, 빈 문자열과도 매치됨
    • % : 임의의 문자열
    • _ : 임의의 문자 (하나)
  • 활용사례
    • 이메일 검색 : 이메일 주소에서 특정 도메인 또는 이름을 포함
    • 제품명 찾기 : 제품 데이터베이스에서 특정 키워드가 포함된 제품명을 검색할 때 사용

 

LIKE 술어

 

  • 전방일치 : SQL% → ex. 'SQL 은 RDBMS 를 ...'
  • 중간일치 : %SQL% → ex. 'LIKE 는 SQL 에서 사용 ...'
  • 후방일치 : %SQL   ex. '입문 SQL'

만약, LIKE 로 % 를 검색하고 싶다면?  \(백슬래시)를 앞에 붙여 문자화 시키기

 WHERE text LIKE '%\%%'

 
 

문자열 상수 ' 의 이스케이프

 

  • 메타문자를 검색할 때처럼 문자열 상수를 검색할 때도 같은 문제가 존재
  • 표준 SQL 에서는 ' 를 연속해서 2개 기술하는 것으로 이스케이프 처리
    •  It's  'IT''s'
➡️ 간단한 패턴매칭을 하기에는 좋지만 더 복잡한 매칭을 원할 때는 정규 표현식을 사용하는 것을 권장 (REGEXP)

 
주요 정규 표현식 패턴

  • ^ : 특정 문자로 시작하는 패턴
  • $ : 특정 문자로 끝나는 패턴
  • .(dot) : 임의의 문자

 

직접 해보기

 

# Q1. Employee 테이블에서 전화번호가 +1 로 시작하는 직원들 찾아보
SELECT * FROM Employee WHERE Phone LIKE '+1%';

# Q2. Customer 테이블에서 전화번호에 3이 들어가는 고객의 이름 찾아보
SELECT FirstName, LastName, Phone FROM Customer WHERE Phone LIKE '%3%';

# Q3. Customer 테이블에서 Lastname 이 'n' 으로 끝나는 사람 찾아보
SELECT FirstName, LastName FROM Customer WHERE LastName LIKE '%n';

 
 

정렬과 연산

 

  • ORDER BY 를 통한 행 정렬
  • LIMIT 로 결과행 수 제한
  • 함수와 연산자
  • 수치, 문자열, 날짜 연산
  • CASE 문

 

ORDER BY

 

  • 검색 결과의 행 순서를 바꿀 수 있음
  • 순서를 지정하지 않은 경우에는 데이터베이스 내부에 저장된 순서대로 반환 !
  • Syntax
    • SELECT 열명 FROM 테이블명 WHERE 조건문 ORDER BY 열명
  • 기본 정렬 조건은 오름차순(ASC) 이기 때문에 'ASC' 은 생략 가능
  • 내림차순을 위해서는 ORDER BY ~ DESC 를 덧붙여줘야 함
  • 숫자가 아닌 문자열을 기준으로도 정렬 가능
    • 문자열 데이터 : 영어(알파벳순), 한글(자음, 모음순) 으로 정렬 → 사전에 나오는 순서에 의해 결정
❗️ 주의할 점: 애트리뷰트의 타입이 정확하게 설정되었는지를 확인할 필요가 있다.

 
예를 들어, 아래 a 애트리뷰트는 데이터 타입이 'text' 이기 때문에, 정렬이 작동되지 않는다.

 

ORDER BY 복수의 열 지정

 

  • a 열은 오름차순, b 는 내림차순으로 정렬하기
SELECT * FROM sample32 ORDER BY a ASC, b DESC;

 
 

직접 해보기

 

# Q1. customer 테이블에서 모든 고객의 이름을 알파벳순으로 정렬하여 출력하기 
SELECT * FROM Customer c ORDER BY FirstName;

# Q2.track 테이블에서 곡의 길이가 긴 순서대로 정렬하여 곡 이름과 길이를 출력하기 
SELECT NAME, Milliseconds FROM Track ORDER BY Milliseconds DESC;

# Q3. employee 테이블에서 모든 직원의 이름, 직책, 생년월일을 조회
#     결과는 먼저 직책별로 알파벳 순서로 정렬하고, 같은 직책 내에서는 나이가 많은 순서대로 정렬하기 
SELECT FirstName, LastName, Title, BirthDate FROM Employee ORDER BY Title, BirthDate;

 
 

LIMIT _ 결과 행 제한하기

 

  • SELECT 명령문에서 결과값으로 반환되는 행을 제한할 수 있음 (최대행수 지정)
  • Syntax
    • SELECT 열명 FROM 테이블명 LIMIT 행수

 

OFFSET 지정

 

  • 커뮤니티 게시판 같은 경우에는 페이지 단위로 화면에 표시
  • "몇 개의 행을 뛰어 넘어 출력"
  • Syntax
    • SELECT 열명 FROM 테이블명 LIMIT 행수 OFFSET 시작행

 

직접 해보기

 

# Q1. 트랙 테이블에서 가장 긴 10개의 곡을 찾아 길이가 긴 순서대로 정렬하여 곡 이름과 길이를 조회  
SELECT Name, Milliseconds FROM Track ORDER BY Milliseconds DESC LIMIT 10;

# Q2. 트랙 테이블에서 곡의 길이가 긴 순서대로 정렬
#     11번째부터 20번째까지의 곡을 조회
#     결과는 곡 이름, 길이, 앨범ID 를 포
SELECT Name, AlbumId, Milliseconds FROM Track ORDER BY Milliseconds DESC LIMIT 10 OFFSET 10;

 
 

수치연산

 

  • 산술 연산자
연산자연산
+덧셈1 + 2 ⇢ 3
-뺄셈1 - 2 ⇢ -1
*곱셈1 * 2 ⇢ 2
/나눗셈1 / 2 ⇢ 0.5
%나머지(모듈러)7 % 4 ⇢ 3

 

  • 연산자의 우선순위
우선순위연산자
1* / %
2+ -

 

  • 예시
SELECT *, price * quantity AS amount FROM sample34;
❗️ 열에 별명(Alias) 짓기 → 열명 AS 열의 별명 (AS 생략 가능)

 
 

WHERE 구에서 연산하기

 

SELECT *, price * quantity AS amount FROM sample34
WHERE price * quantity <= 2000;
  • 데이터 처리 순서 때문에 별명(Alias)을 WHERE 구에서 사용할 수 없음
  • WHERE → SELECT 순서로 처리되기 때문 !

 

ORDER BY 구에서 연산하기

 

SELECT *, price * quantity AS amount FROM sample34
ORDER BY amount DESC;
  • ORDER BY 에서는 별명(Alias) 사용 가능 !
  • WHERE  SELECT → ORDER BY 순으로 DBMS 내부처리 진행

 

직접 해보기

 

# Q1. 트랙 테이블에서 재생 시간이 4분(240000 밀리초) 이상인 트랙들의 이름과 재생시간을 조회 
SELECT Name, Milliseconds FROM Track WHERE Milliseconds >= 240000;

# Q2. 트랙 테이블에서 각 트랙의 이름과 재생시간을 분 단위로 변환하여 조회
#     결과를 재생 시간이 긴 순서대로 정렬 
SELECT Name, Milliseconds/60000 AS Minutes FROM Track ORDER BY Minutes DESC;

 
 

함수를 통해 연산하기

 
ROUND

  • 소수점을 반올림하는 함수 ROUND 를 사용하는 방법
  • amount 의 Type 은 double 타입 (float 타입)
SELECT amount, ROUND(amount) FROM sample341;
  • 기본적으로 소수점 첫째자리를 기준으로 반올림
  • -1 지정하면 1단위, -2 지정하면 10 단위 반올림


SIN, COS

  • SIN, COS 등의 삼각함수
SELECT amount, SIN(amount), COS(amount) FROM sample341;

 
SQRT

  • 루트 계산
SELECT amount, SQRT(amount) FROM sample341;

 
LOG

  • 대수를 계산
SELECT amount, LOG(amount) FROM sample341;

 
 

문자열 계산

 

  • CONCAT : 문자열 결합
SELECT * FROM sample35;
SELECT CONCAT(quantity, unit) FROM sample35;

 

  • SUBSTRING : 일부 문자열 반환 → 날짜 처리에서 종종 사용됨
SELECT * FROM item2;
SELECT SUBSTRING(상품명, 3, 1) AS 상품넘버 FROM item2;
❗️SUBSTRING의 첫번째 인자에 들어가는 열 → " " 로 가두면 문자상수로 취급
      SUBSTRING의 두번째 인자에 들어가는 인덱스 → 파이썬과 다르게 1부터 셈
  • TRIM : 문자열 앞 뒤 공백 제거
    • TRIM('ABS ') → 'ABC'
    • DBeaver 파일 임포트 시 자동 TRIM 을 설정해 놓을 수 있음
SELECT '      20250218' AS Backspace, TRIM('   20250218') AS TRIM FROM item2;

 
 

직접 해보기

 

# Q1. 트랙 테이블의 Name 칼럼에서 앞 뒤 공백 제거
#     결과가 'The' 로 시작하는 트랙들만 조회 
SELECT TRIM(Name) FROM Track WHERE Name LIKE 'The%';

# Q2. 트랙 테이블에서 각 트랙의 Name 과 장르ID 를 결합하여 "트랙명(장르ID)" 형식으로 출력 
SELECT CONCAT(Name," (", GenreId, ")") AS "트랙명(장르ID)" FROM Track;

# Q3. 트랙 테이블에서 각 트랙 Name 의 첫 5글자만 추출하여 출력 
SELECT SUBSTRING(Name, 1, 5) FROM Track;

 
 

Reflection

 
연산자 진도를 들어가면서 부터 약간의 혼동스러움이 밀려왔지만, 그래도 아직까지 버틸만 하다. 파이썬 언어를 배우면서 담력이 어느 정도 키워졌기 때문일도 모르겠다. 일단, 실제로 부딪혀보는 과정에서 출력창과 답안과 비교해보며, 그리고 무엇보다도 에러창을 마주하며 차근차근 해결해나가면 된다는 것을 이제는 안다. 1일 1쿼리 문제 풀이를 진행한 후 깃허브에 기록 중인데, 요며칠 바쁘다는 핑계로 빼먹은 날이 있었다. 하지만, 하루 한 문제는 꾸준하게 풀 수 있도록 다시 마음을 다잡아야 겠다.