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 [한빛미디어]
'TIL' 카테고리의 다른 글
SQL - JOIN (22.11.26 TIL) (1) | 2022.11.26 |
---|---|
Spring Boot - @Embeddable, @Embedded, @AttributeOverride, @AttributeOverrides (22.11.25 TIL) (0) | 2022.11.25 |
스프링 @ActiveProfiles (22.11.23 TIL) (0) | 2022.11.23 |
애매한 완벽주의 버리기 (22.11.22 TIL) (0) | 2022.11.22 |
Java - enum 타입 (22.11.21 TIL) (0) | 2022.11.21 |
댓글