본문 바로가기
TIL

SQL 기본 문법 정리해보기 (22.11.24 TIL)

by winteringg 2022. 11. 24.

1. SQL 기본 문법
1) USE 문
  - SELECT 문을 실행하려면 먼저 사용할 데이터베이스를 지정해야 함.
    - 기본 형식 : USE 데이터베이스_이름;
  - 이렇게 지정해 놓은 후, 다시 USE문을 사용하거나, 다른 DB를 사용하겠다고 명시하지 않으면 앞으로 모든 SQL문은 이 데이터베이스에서 수행됨.

2) SELECT 문
  - 기본 형식 : SELECT (조회할 열 이름) FROM (테이블명) WHERE (조건식);

SELECT * FROM member WHERE mem_name = '블랙핑크';
-- member 테이블에서 mem_name 이 '블랙핑크'인 모든 열 조회
-- (*) 의미는 모든 항목이라는 뜻.

SELECT addr, height FROM member;
-- member 테이블에서 전체 열들의 addr, height 조회

SELECT addr 주소, height 키 FROM member;
-- 속성 이름 뒤에 별명을 지정할 수도 있음. 이 별명은 실제 값은 아니고 참조일 뿐임.

SELECT mem_name FROM member WHERE height >= 165;
-- member 테이블에서 height 가 165 이상인 mem_name 을 조회

SELECT mem_name FROM member WHERE height >= 165 AND mem_number > 6;
-- member 테이블에서 height 가 165 이상이면서, mem_number 가 6 미만인 mem_name 을 조회
-- 두 조건 모두 충족해야만 함.

SELECT mem_name FROM member WHERE height BETWEEN 163 AND 165;
-- member 테이블에서 height 가 163 이상~165 이하인 mem_name 을 조회
-- 두 조건 모두 충족해야만 함.

SELECT mem_name FROM member WHERE height >= 165 OR mem_number > 6;
-- member 테이블에서 height 가 165 이상이거나, mem_number 가 6 미만인 mem_name 을 조회
-- 두 조건 중 하나만 충족해도 됨.

SELECT mem_name, addr FROM member WHERE addr = '경기' OR addr = '전남' OR addr = '서울';
SELECT mem_name, addr FROM member WHERE addr IN('경기', '전남', '서울');
-- member 테이블에서 addr 이 '경기', '전남', '서울' 이면 mem_name, addr 을 조회
-- 둘 다 같은 의미의 쿼리문임.
-- 세 조건 중 하나만 충족해도 됨.

SELECT * FROM member WHERE mem_name LIKE '우%';
-- member 테이블에서 mem_name 이 '우' 로 시작하는 모든 항목 조회.

SELECT * FROM member WHERE mem_name LIKE '%우';
-- member 테이블에서 mem_name 이 '우' 로 끝나는 모든 항목 조회.

SELECT * FROM member WHERE mem_name LIKE '__핑크';
-- member 테이블에서 mem_name 의 문자가 4자리 이며, 끝이 '핑크'로 끝나는 모든 항목 조회
-- 문자 수에 따라 언더바(_) 를 붙여주면 됨.

3) SELECT 절을 좀 더 세분화 하기
  - ORDER BY : 결과의 정렬
  - ASC or DESC : 오름차순으로 정렬, 내림차순으로 정렬
  - LIMIT : 결과의 개수 제한
  - DISTINCT : 중복된 데이터 제거
  - GROUP BY : HAVING 과 함께 사용되며 지정한 열의 데이터들을 그룹으로 묶어서 같은 데이터끼리 묶어서 추출. 주로 그룹으로 묶는 경우는 합계, 평균, 개수 등을 처리할 때 사용하므로 집계 함수와 같이 사용됨.

-- 순서는 아래 항목에서 바뀌지 않음.
SELECT 열_이름
    FROM 테이블_이름
    WHERE 조건식
    GROUP BY 열_이름
    HAVING 조건식
    ORDER BY 열_이름
    LIMIT 숫자

4) ORDER BY 형식 
  - 결과의 값이나 개수에 대해서는 영향을 미치지 않지만, 결과가 출력되는 순서를 조절함.

-- debut_date 오름차순으로 정렬 (ASC 는 기본값이므로 생략해도 됨.)
SELECT mem_id, mem_name
    FROM member
    ORDER BY debut_date ASC;
    
-- debut_date 내림차순으로 정렬
SELECT mem_id, mem_name
    FROM member
    ORDER BY debut_date DESC;
    
-- height 가 164 이상인 mem_name을 height 는 내림차순, 만약에 동률이면 debut_date 별로 오름차순으로 정렬
SELECT mem_name
    FROM member
    WHERE height >= 164
    ORDER BY height DESC debut_date ASC;
    
-- 전부가 아닌 3개의 행만 보여줌
SELECT *
    FROM member
    LIMIT 3;
    
-- 전부가 아닌 3개의 행만 debut_date 오름차순으로 정렬해서 보여줌
SELECT mem_name
    FROM member
    ORDER BY debut_date
    LIMIT 3;
    
-- 전부가 아닌 3번째 부터 2개의 행만 보여줌
SELECT mem_name
    FROM member
    ORDER BY debut_date
    LIMIT 3,2;
    
-- member 테이블에서 addr를 조회하는데 중복된 데이터는 보여주지 않음.
SELECT DISTINCT addr FROM member;


5) GROUP BY 형식
  - 함께 쓰이는 집계 함수 (Aggregate Function)

함수명 설명
SUM() 합계를 구한다.
AVG() 평균을 구한다.
MIN() 최소값을 구한다.
MAX() 최대값을 구한다.
COUNT() 행의 개수를 센다.
COUNT(DISTINCT) 행의 개수를 세는데, 중복은 한 개만 인정한다.
-- buy 테이블에서 mem_id 별로 그룹으로 묶어서 mem_id와 amount의 합계를 조회
-- mem_id 는 "회원 아이디" 라는 닉네임으로, SUM(amount)은 "총 구매 개수" 라는 닉네임으로 출력
SELECT mem_id "회원 아이디", SUM(amount) "총 구매 개수" 
   FROM buy 
   GROUPY BY mem_id;

-- price 와 amount 를 곱한 것의 합계와 회원 아이디를 조회
SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액" 
   FROM buy 
   GROUPY BY mem_id;
   
-- amount 의 평균과 회원 아이디를 조회
SELECT mem_id "회원 아이디", AVG(amount) "평균 구매 개수" 
   FROM buy 
   GROUPY BY mem_id;
   
-- 모든 항목의 개수를 세어서 조회
SELECT COUNT(*) FROM member;

-- phone1 라는 열 이름의 개수를 세어서 조회
SELECT COUNT(phone1) "연락처가 있는 회원" FROM member;

-- 집계 함수는 WHERE 절에 쓸 수 없기 때문에 아래 쿼리문은 오류가 발생함.
SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액" 
   FROM buy 
   WHERE SUM(price*amount) > 1000
   GROUPY BY mem_id;
   
-- GROUP BY의 조건식은 HAVING 을 쓰면 됨.
SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액" 
   FROM buy 
   GROUPY BY mem_id
   HAVING SUM(price*amount) > 1000
   ORDER BY SUM(price*amount) DESC;


6) INSERT INTO : 테이블에 행 데이터를 입력하는 명령어.

-- 테이블 이름 다음에 나오는 열1, 열2 등은 생략 가능.
-- 열 이름을 생략할 경우, 
-- VALUES 다음에 나오는 값들의 순서 및 개수는 테이블을 정의할 때의 열 순서 및 개수와 동일해야 함.
INSERT INTO 테이블 [(열1, 열2, ...)] VALUES (값1, 값2, ...)

-- 테이블 생성 후 INSERT 로 데이터 입력
-- 입력하지 않은 값은 (NOT NULL로 지정하지 않은 경우) NULL 로 처리 됨.
CREATE TABLE toy (toy_id INT, toy_name CHAR(4), age INT);
INSERT INTO toy VALUES (1, '우디', 25);

-- AUTO_INCREMENT 를 쓸 경우 숫자가 자동으로 생성되며, 꼭 PRIMARY KEY 를 같이 써야 함.
CREATE TABLE toy2 (
    toy_id INT AUTO_INCREMENT PRIMARY KEY,
    toy_name CHAR(4),
    age INT);

-- NULL 로 입력한 곳에 자동으로 1, 2, 3, ... 번호가 생성됨.
INSERT INTO toy2 VALUES (NULL, '보핍', 25);
INSERT INTO toy2 VALUES (NULL, '슬링키', 22);
INSERT INTO toy2 VALUES (NULL, '렉스', 21);

-- 어디까지 자동으로 생성되었는지 알고 싶을 때는 LAST_INSERT_ID() 함수를 쓰면 됨.
SELECT LAST_INSERT_ID();

-- 자동 생성되던 번호를 중간에 지정해줘도 됨.
-- 아래 쿼리문은 자동 생성 번호를 100번부터 시작하겠다는 의미.
ALTER TABLE toy2 AUTO_INCREMENT=100;
INSERT INTO toy2 VALUES (NULL, '재남', 25);

-- 테이블을 만들 때 부터 1000 부터 시작하게 할 수 있음.
CREATE TABLE toy3 (
    toy_id INT AUTO_INCREMENT PRIMARY KEY,
    toy_name CHAR(4),
    age INT);
ALTER TABLE toy3 AUTO_INCREMENT=1000;
-- 1003, 1006 등 숫자를 3씩 건너뛰게 하고 싶을 때 사용할 수 있음.
SET @@auto_increment_increment=3;


7) INSERT INTO ~ SELECT
  - 많은 양의 데이터를 지금까지 했던 방식으로 직접 타이핑해서 입력하려면 오랜 시간이 걸림.
  - 다른 테이블에 이미 데이터가 입력되어 있다면 INSERT INTO ~ SELECT 구문을 사용해 해당 테이블의 데이터를 가져와서 한 번에 입력할 수 있음.
  - 기본 형식

INSERT INTO 테이블_이름 (열_이름1, 열_이름2, ...)
    SELECT 문 ;


8) UPDATE~SET 문 : 기존에 입력되어 있는 값을 수정하는 명령어.
  - 기본 형식

UPDATE 테이블_이름
    SET 열1=값1, 열2=값2, ...
    WHERE 조건 ;
    
-- 영문 'Seoul' 을 한글 '서울' 로 바꾸고 싶을 때
UPDATE city_popul
    SET city_name = '서울'
    WHERE city_name = 'Seoul';


8) DELETE 문 : 행 단위로 데이터를 삭제
  - 기본 형식

DELETE FROM 테이블이름 WHERE 조건 ;

DELETE FROM city_popul
    WHERE city_name LIKE 'New%';

 

 

 

 

참고 : 혼자 공부하는 SQL [한빛미디어]

댓글