[SQL] SELECT, WHERE, ORDER BY, GROUP BY

현서황·2024년 10월 5일

SQL

목록 보기
2/2

SELECT, WHERE

SELECT <col> FROM [table] WHERE [value]
  • <col>: 테이블에서 조회하고싶은 데이터의 필드 리스트를 기술
    • 여러 개의 필드를 읽을 때에는 콤마(,)로 구분하여 연결함.
    • 테이블 전체를 조회할 때 select * from ...
      • 하지만, 불필요한 데이터 조회 금지! -> 필요한 칼럼만 기술하기
    • select top 1 from ~ : 조회된 데이터의 1행 반환
    • select top @n from ~ : 조회된 데이터의 변수 행만큼 반환
    • select count(*) from ~ : 조회된 데이터의 ROW 카운트 반환
  • [table]: 데이터가 저장되어있는 테이블 이름 기술
    • 스키마명 적용하여 기술 가능
    • [테이블] AS [별칭]으로 별명 사용 가능
    • 링크드 조회시 [링크명][DB명][스키마명][테이블명]기술
  • [value]: 필요한 정보만 조회할 수 있도록 필터 적용
    • =,>=,<=,>,< 사용
      • 비교연산자라 true 또는 false 반환!
      • <(less than)
      • =(equals)
      • <=(less than or equal to)
      • =(greater than or equal to)

      • !=, <>(not equal to)
      • !<(not less than)
      • !>(not greater than)
    • AND,OR,IN,NOT IN 사용
      • 예시: 아래의 두 구문은 동일한 역할을 한다.
        select * from company 
        where symbol = 'AAPL' or symbol = 'MSFT' or symbol = 'TSLA'
        select * from company 
        where symbol in('AAPL','MSFT', 'TSLA')
    • Like 명령을 사용한 구문 검색 사용 가능
      • 특정 문자로 시작하는 데이터 검색
        SELECT * FROM users
        			WHERE name LIKE '홍%'; //홍으로 시작하는 이름을 찾아줌
      • 특정 문자로 끝나는 데이터 검색: '%현서'
      • 특정 문자가 포함된 데이터 검색: '%준%'
      • 특정 패턴을 가진 데이터 검색: '김_호' - '김민호', '김철호' 등
      • 특정 문자가 없는 데이터 검색
        SELECT * FROM users
        			WHERE name NOT LIKE '%현서%'; //현서가 포함되지 않은 이름 검색해줌
    • 범위 검색시 Between 사용 가능
      • SELECT * FROM company
        WHERE year BETWEEN 2010 AND 2011 //2010~2011 범위에 해당하는 값 반환

ORDER BY

ORDER BY문의 기본 형식

SELECT [열] FROM [테이블] WHERE [열] = [조건값] ORDER BY [열] [ASC, DESC]
  • [열]: 정렬할 열 이름을 입력
  • [ASC, DESC]: ASC을 쓰면 오름차순 정렬, DESC를 쓰면 내림차순 정렬이다.
SELECT * FROM company 
WHERE sector IS NOT NULL sector <> ''
ORDER BY sector ASC, symbol DESC
  • WHERE sector IS NOT NULL AND sector <> '' : sector열의 값이 NULL이 아니고, 빈 문자열('')이 아닌 레코드를 필터링한다.
  • ORDER BY sector ASC, symbol DESC: sector열을 기준으로 오름차순(ASC)으로 정렬하고, 같은 sector값을 가진 행들에 대해서는 symbol열을 기준으로 내림차순(DESC)으로 정렬한다.

ORDER BY로 데이터를 정렬한 다음, 상위나 하위가 아닌 특정 구간의 데이터를 검색해야 하는 경우도 있다.
게시판을 예로 들면, 최근에 작성한 글이 첫 페이지에 나타나기 마련인데 2페이지나 3페이지에 있는 데이터를 보고 싶은 경우를 말한다.
이럴 땐 OFFSET ... FETCH NEXT를 이용한다.

SELECT * FROM company
ORDER BY symbol
OFFSET 1000 ROWS //1000개의 데이터를 건너뛰고 출력
FETCH NEXT 10 ROWS ONLY // 1001번째부터 10개의 데이터만 출력

FETCH NEXT는 반드시 OFFSET과 함께 사용해야 한다.
출력할 행의 개수를 지정할 수 있다. 게시판을 예로들면 한 페이지에 10개만 보여주는 기능과 같다.

GROUP BY, HAVING

GROUP BY와 HAVING 문의 기본 형식은 다음과 같다.
SELECT [열] FROM [테이블] WHERE [열] = [조건값] GROUP BY [열] HAVING [열] = [조건값]

  • GROUP BY: 데이터를 그룹화하는 구문이다.
  • [열] : 그룹화 기준의 열 이름을 지정한다. 1개 이상 그룹화할 수 있다.
  • HAVING : WHERE과 비슷한 기능을 하며 그룹화된 결과의 필터링 기능을 한다.
  • [조건값]: HAVING 필터에 적용할 조건값을 입력한다.
SELECT sector, industry FROM company
GROUP BY industry, sector

industry열로 우선 그룹화한 다음 sector열 순서로 그룹화한 결과를 출력한다.

SELECT sector, COUNT(*) AS cnt FROM company
GROUP BY sector

sector 열 기준으로 그룹화한 각 행의 개수를 검색해주는 쿼리이다.
AS cnt를 붙였는데, 이는 개수를 센 결과를 출력할 때 열 이름을 cnt로 한다는 뜻이다.

SELECT sector, industry FROM company
GROUP BY sector, industry
HAVING industry = 'Advertising'

HAVING문은 SELECT문이나 GROUP BY문에 사용한 열에만 적용할 수 있다.
위 코드는 sector, industry열을 기준으로 그룹화한 데이터에서 industry가 'Advertising'인 데이터만 검색한다.

profile
노는 게 제일 좋은 뽀로로

0개의 댓글