SELECT 열_이름
FROM 테이블_이름
WHERE 조건식
GROUP BY 열_이름
HAVING 조건식
ORDER BY 열_이름
LIMIT 숫자
SELECT 외엔 모두 생략 가능하다.
사용하게 된다면 순서가 중요해진다.
SELECT * FROM member;
애스터리스크(*)는 전체를 의미한다.
여기서 원하는 열만 선택하면 특정 column만 조회할 수 있다.
📌 Output 패널
초록색 체크 표시 : SQL 정상 실행
빨간색 X 표시 : SQL 오류
# : 실행한 SQL 순번. 실행한 SQL이 여러 개면 점차 증가한다.
Time : SQL을 실행한 시각
Action : 실행된 SQL 표시
Message : SELECT 문이 조회된 행의 개수. 오류 발생 시, 오류 번호 및 오류 메시지 표시
Duration/Fetch : SQL 문이 실행되는데 걸린 시간(초), Fetch는 데이터베이스에서 가져온 시간(초)
📌 alias
SELECT addr 주소, debut_date "데뷔 일자", mem_name FROM member;
열 이름에 별칭(alias)를 지정할 수 있다.
테이블 명에도 같은 방식으로 별칭을 정할 수 있다.
📌 WHERE
• 관계 연산자, 논리 연산자 • BETWEEN ~ AND • IN() • LIKE
SELECT 열_이름 FROM 테이블_이름 WHERE 조건식;
특정 조건에 해당하는 결과만 조회하고 싶을 때 사용한다.
1️⃣ 관계 연산자, 논리 연산자의 사용
SELECT * FROM member WHERE height >= 165;
SELECT * FROM member WHERE height >= 165 AND mem_number > 6;
관계 연산자: <, <=, >=, >, =
논리 연산자: AND, OR
2️⃣ BETWEEN ~ AND
SELECT * FROM member WHERE height BETWEEN 163 AND 165;
163 <= height AND height <= 165와 동일하다.
3️⃣ IN()
SELECT * FROM member WHERE addr IN('경기', '전남');
addr = '경기' OR addr = '전남'과 동일하다.
4️⃣ LIKE
SELECT * FROM member WHERE mem_name LIKE '우%';
문자열의 일부 글자를 검색할 때 사용
'우'로 시작하는 모든(%) 문자열을 검색한다.
SELECT * FROM member WHERE mem_name LIKE '__핑크';
한 글자 매칭은 언더바를 사용한다.
📌 서브 쿼리 (Sub Query)
SELECT height FROM member WHERE mem_name = '에이핑크'; -- 164
SELECT mem_name, height FROM member WHERE height > 164;
특정 이름(mem_name)의 그룹명인 회원의 평균 키(height)보다 큰 회원을 검색하고 싶은 경우
두 쿼리 문을 합치는 방법 필요
SELECT mem_name, height FROM member
WHERE height > (SELECT height FROM member WHERE mem_name = '에이핑크');
출력값을 그대로 입력값으로 사용하기 위해 해당 위치에 쿼리문을 삽입하면 된다.
2개의 쿼리문을 하나로 줄여 관리하기가 편해졌다.
2. SELECT 옵션
• ORDER BY : 결과 정렬 • LIMIT : 결과 개수 제한 • DISTINCT : 중복 데이터 제거 • GROUP BY : 데이터 묶기 • HAVING : group by절에 쓰이는 where
📌 ORDER BY : 결과 정렬
SELECT mem_id, mem_name, debut_date FROM member ORDER BY debut_date; -- 오름차순
SELECT mem_id, mem_name, debut_date FROM member ORDER BY debut_date DESC; -- 내림차순
데뷔 일자(debut_date) 기준 정렬 방법
DESC를 추가하면 역정렬 (기본값은 ASC)
SELECT mem_id, mem_name, debut_date, height
FROM member
where height >= 164
ORDER BY height >= 164 DESC, debut_date;
ORDER BY절은 WHERE절 다음에 나와야 한다. (그렇지 않으면 query error)
ORDER BY 정렬 기준은 여러 개 열로 지정 가능하다. (지정 순서 중요)
📌 LIMIT : 결과 개수 제한
SELECT * FROM member LIMIT 3;
SELECT * FROM member LIMIT 3, 2;
LIMIT 시작, 개수 형식을 따른다.
인수를 하나만 넘기면 0부터 (개수)까지
📌 DISTINCT : 중복 데이터 제거
SELECT DISTINCT addr FROM member;
중복된 데이터를 제거하고 종류만 빠르게 파악할 수 있다.
📌 GROUP BY : 데이터 묶기
1️⃣ 집계 함수(aggregate function)
집계 함수
설명
SUM()
합계
AVG()
평균
MIN()
최소값
MAX()
최대값
COUNT()
행의 개수
COUNT(DISTINCT)
행의 개수(중복 허용 안함)
2️⃣ 집계 함수와 GROUP BY
SELECT mem_id, SUM(amount) "총 구매 개수" FROM buy GROUP BY mem_id;
SELECT mem_id, SUM(amount * price) "총 구매 금액" FROM buy GROUP BY mem_id;
각 회원(mem_id)별로 구매한 개수(amount)를 집계 함수(SUM)로 합쳐서 조회
SELECT mem_id, AVG(amount) "평균 구매 개수" FROM buy;
SELECT mem_id, AVG(amount) "평균 구매 개수" FROM buy GROUP BY mem_id;
GROUP BY를 적용하지 않았을 때는 전체에 대한 평균을 적용한다.
GROUP BY mem_id 적용 시, 멤버 별 평균을 적용하여 결과를 산출한다.
📌 HAVING : group by절에 쓰이는 where
결과 중에 총 구매액이 1,000 이상인 회원을 고르기 위해 WHERE 절을 사용하면 에러가 발생한다.
오류 메시지에 따르면, 집계 함수는 WHERE 절에 나타날 수 없다.
SELECT mem_id, SUM(amount * price) "총 구매 금액"
FROM buy
GROUP BY mem_id
HAVING SUM(amount * price) > 1000;
WHERE과 비슷한 개념이지만 집계 함수에 대해서 조건을 제한한다.
HAVING 절은 반드시 GROUP BY 절 다음에 나와야 한다.
SELECT mem_id, SUM(amount * price) "총 구매 금액"
FROM buy
GROUP BY mem_id
HAVING SUM(amount * price) > 1000
ORDER BY SUM(amount * price) DESC;
결과를 정렬하고 싶다면 ORDER BY 절을 추가하면 된다.
3. INSERT, UPDATE, DELETE
📌 INSERT
INSERT INTO 테이블 [(열1, 열2, ...)] VALUES (값1, 값2, ...)
테이블 이름 다음의 열은 생략이 가능하다
만약 생략한다면 테이블을 정의할 때의 열 순서 및 개수와 동일해야 한다.
CREATE TABLE jayang (toy_id INT, toy_name CHAR(4), age INT);
INSERT INTO jayang VALUES(1, '화산', 18);
이렇게 하면 jayang이라는 테이블이 생성되고, 각각의 컬럼에 지정한 값이 들어간다.
만약, 나이 정보는 입력하고 싶지 않다고 무턱대고 정보를 빼면 sql error가 발생한다. (column이 매칭되지 않아서)
age에 NULL값을 넣고 싶다면 컬럼명을 명시해야 한다.
INSERT INTO jayang (toy_id, toy_name) VALUES(2, 'null');
INSERT INTO jayang (age, toy_name, toy_id) VALUES(20, 'hye', 3);