본문 바로가기
카테고리 없음

[혼공S] 2주차 - SQL

by 망쇼 2023. 7. 16.

기본 미션: p.138의 확인 문제 2번

SELECT * FROM member ORDER BY height;
SELECT * FROM member LIMIT 5.2;
SELECT DISTINCT phone1 FROM member;

SQL의 기본 중에 기본: SELECT ~ FROM ~ WHERE

SELECT 열 이름
    FROM 테이블_이름
    WHERE 조건식
    GROUP BY 열_이름
    HAVING 조건식
    ORDER BY 열_이름
    LIMIT 숫자
  • SELECT: 구축이 완료된 테이블에서 데이터를 추출. 기존의 데이터가 변경되지 않는다
  • SELECT 이하의 절은 생략 가능하지만 사용해야 한다면 순서를 지켜야한다.

WHERE

  • WHERE 없이 SELECT ~ FROM으로 테이블을 조회하면 테이블의 모든 행이 출력된다.
  • WHERE의 조건절은 관계 연산자(<, >)와 논리 연산자(OR, AND)를 사용할 수 있다
  • AND, OR, BETWEEN A AND B, IN(A, B, C), LIKE '_A%'
  • %는 그 무엇이든 허용하고, _는 한 글자와 매치한다

서브쿼리: select 안의 select문

-- 이름이 에이핑크인 회원의 키보다 큰 회원을 검색하는 SQL문
SELECT mem_name, height FROM member
    WHERE height > (SELECT height FROM member WHERE mem_name = '에이핑크');
  • 서브쿼리는 1줄 이상을 return하면 안된다!

SELECT문 심화

ORDER BY

SELECT mem_id, mem_name, debut_date, height
    FROM member
    WHERE height >= 164
    ORDER BY height DESC, debut_date ASC;
  • 결과의 값이나 개수에 영향은 없음
  • 결과가 출력되는 순서를 조절
  • 기본값은 오름차순(ASC), 내림차순도 가능(DESC)

LIMIT

-- 평균 키가 큰 순으로 정렬하되, 3번쨰부터 2건만 조회
SELECT mem_name, height
    FROM member
    ORDER BY height DESC
    LIMIT 3, 2;
  • 출력하는 개수 제한
  • LIMIT 시작, 개수

DISTINCT

SELECT DISTINCT addr FROM member;
  • 조회된 결과에서 중복된 데이터를 1개만 남김
  • 열 이름 앞에 붙이면 중복된 값은 1개만 출력된다

GROUP BY

SELECT mem_id "회원 아이디", SUM(amount) "총 구매 개수"
    FROM buy GROUP BY mem_id;
  • GROUP BY 열_이름 = 열에서 같은 이름을 가진 행을 그룹으로 묶고, 집계함수를 같이 써서 결과를 낸다.

  • COUNT(*)은 모든 행의 개수를 세고 COUNT(열_이름)은 값이 NULL이 아닌 값을 센다
  • 집계함수는 WHERE절에서 사용할 수 없다

HAVING

SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
    FROM buy
    GROUP BY mem id
    HAVING SUM(price*amount) > 1000
    ORDER BY SUM(price*amount) DESC;
  • WHERE과 비슷하지만 집계함수에 대해서 조건을 제한하는 것
  • 무조건 GROUP BY 다음에 온다

데이터 변경을 위한 SQL문

INSERT: 데이터 입력

INSERT INTO 테이블 [(열1, 열2, ...)] VALUES (값1, 값2, ...);

  • 열1, 열2 ...는 생략 가능하지만 그럴 경우에 값들의 순서 및 개수는 테이블을 정의할 때와 같아야한다.

AUTO_INCREMENT

  • 테이블을 정의할 때 AUTO_INCREMENT를 사용했다면 INSERT에서는 해당 열이 없다고 생각하고(NULL) 입력하면 된다. 해당 열은 무조건 PK이다.
  • SELECT LAST_INSERT_ID();를 사용하면 어느 숫자까지 증가되었는지 확인할 수 있다.
  • ALTER TABLE tb3 AUTO_INCREMENT = 1000; -> 시작값 1000으로 지정
  • SET @@auto_increment_increment = 3; -> 증가값 3 지정
  • 앞에 @@가 붙는 것은 시스템 변수. SHOW GLOBAL VARIABLES를 통해 확인 가능

INSERT INTO ~ SELECT

-- world.city 테이블의 Name, Population을 city 테이블에 입력
INSERT INTO city_popul
    SELECT Name, Population FROM world.city;
  • 다른 테이블의 데이터를 한 번에 입력

UPDATE: 데이터 수정

UPDATE 테이블_이름
    SET 열1=값1, 열2=값2, ...
    WHERE 조건;
  • 기존에 입력되어 있는 값을 수정
  • WHERE절을 생략하면 테이블의 모든 행의 값이 변경됨

DELETE: 데이터 삭제

DELETE FROM 테이블_이름 WHERE 조건;

  • 행 단위로 삭제
  • WHERE절을 생략하면 테이블의 모든 행의 값이 변경됨

테이블 삭제법

  • DELETE: 오래걸림. 빈 테이블 남김. WHERE절 사용 가능
  • TRUNCATE: DELETE와 동일한 효과이지만 WHERE 사용 불가. 속도 매우 빠름. 빈 테이블 남김
  • DROP: 속도 빠름. 테이블 자체를 삭제.