SQL 기본 문법

haejun-kim·2020년 9월 17일
0

[DATABASE]

목록 보기
4/7
post-custom-banner

특정 조건의 데이터만 조회하는 <SELECT ~ FROM ~ WHERE>

기본적인 WHERE절

select field_name from table_name where 조건식;
select * from userTb1 where name = '김경호';

관계 연산자의 사용

SELECT userID, Name FROM userTb1 WHERE birthYear >= 1970 AND height >= 182;
SELECT userID, Name FROM userTb1 WHERE birthYear >= 1970 OR height >= 182;

BETWEEN~AND 와 IN() 그리고 LIKE

숫자로 구성됭어 있어 연속적인 값을 가지는 경우 BEETWEEN ~ AND를 사용할 수 있다.

SELECT Name, height FROM userTb1 WHERE height BETWEEN 180 AND 183;

연속적인 값이 아닌 이산적인 값인 경우 IN()을 사용할 수 있다.

SELECT Name, addr FROM userTb1 WHERE addr IN ('경남','전남','경북');

문자열의 내용을 검색하기 위해 LIKE 연산자를 사용할 수 있다.

SELECT Name, height FROM userTb1 WHERE name LIKE '김%';
SELECT Name, height FROM userTb1 WHERE name Like '_종신';
  • %는 무엇이든 허용한다는 의미이다. 따라서 위의 예는 '김'이 제일 앞글자이고 뒤의 글자는 무엇이든 찾는 검색 조건이다.
  • _는 한글자와 매치한다는 의미이다. 따라서 위의 예는 맨 앞 글자가 한 글자이고, 그 다음이 '종신'인 사람을 조회해준다.
  • %와 _는 함께 사용할 수 있다.

%나 _가 문자열의 제일 앞에 들어가는 것은 인덱스를 사용하지 않고 전체 데이터를 검색하게 되기 때문에 비효율적인 결과를 낳는다.

ANY, SOME, ALL

조건에 해당하는 row를 모두 (returns more than 1 row 같은 error가 출력 됐을 경우 사용)

SELECT Name, height FROM userTb1 WHERE height >= ANY (SELECT height FROM userTb1 WHERE addr = '경남');

ANY는 서브쿼리의 여러 개의 결과 중 한가지만 만족해도 되며, ALL은 서브쿼리의 여러 개의 결과를 모두 만족시켜야 된다. 참고로 SOMEANY와 동일한 의미로 사용된다. 또한 ANYIN과 동일한 의미이다.

원하는 순서대로 정렬하여 출력 : ORDER_BY

ORDER_BY절은 결과물에 대해 영향을 미치지는 않지만, 결과가 출력되는 순서를 조절하는 구문

ASCDESC를 사용하여 오름차순, 내림차순으로 정렬할 수 있다.

또한, ORDER BY는 SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY 중에서 제일 뒤에 와야한다.

SELECT Name, mDate FROM userTb1 ORDER BY mDate;

중복을 제거시키는 DISTINCT

SELECT DISTINCT addr FROM userTb1;

출력하는 갯수를 제한하는 LIMIT

SELECT emp_no, hire_date FROM employees ORDER BY hire_date ASC LIMIT 5; -- 상위 5개만 출력
SELECT emp_no, hire_date FROM employees ORDER BY hire_date ASC LIMIT 0, 5; -- 0개부터 5개까지만 출력

GROUP BY 및 HAVING 그리고 집계 함수

--형식:
SELECT select_expr
	FROM table_references
	WHERE where_condition
	GROUP BY {col_name|expr|position}
	HAVING where_condition
	ORDER BY {col_name|expr|position}

GROUP BY

그룹을 묶어주는 역할

SELECT userID, SUM(amount) FROM buyTb1 GROUP BY userID;

이렇게 할 경우 열에는 제목이 함수 이름 그대로(SUM(amount)) 나온다. alias를 사용하자.

SELECT userID AS '사용자 아이디', SUM(amount) AS '총 구매 개수'
FROM buyTb1 GROUP BY userID;

집계 함수 (aggregate function)

SUM() 외에 GROUP BY 와 함께 자주 사용되는 집계함수는 다음과 같다.

AVG() - 평균

MIN() - 최솟값

MAX() - 최댓값

COUNT() - 행의 갯수

COUNT(DISTINCT) - 행의 갯수 ( 중복은 1개만 인정)

STDEV() - 표준편차

VAR_SAMP() - 분산

HAVING

예를 들어, 총 구매액이 1,000 이상인 사용자에게만 사은품을 증정하고 싶다면 앞에서 배운 조건을 포함하는 WHERE 구문으로 작성 할 경우 다음과 같다.

SELECT userID AS '사용자', SUM(price*amount) AS '총구매액'
	FROM buyTb1
	WHERE SUM(price*amount) > 1000
	GROUP BY userID;

하지만 위와 같이 작성 할 경우 Error Code: 1111. Invalid use of group function 이라는 에러를 마주치게 된다. 집계 함수는 WHERE 절에 나타날 수 없다는 뜻이다.

이럴 때 사용되는 것이 HAVING절이다

WHERE와 비슷한 개념으로 조건을 제한하는 것이지만, 집계 함수에 대해서 조건을 제한하는 것이라고 생각하면 된다. 그리고 순서는 꼭 GROUP BY 다음에 나와야 한다.

데이터의 변경을 위한 SQL문

INSERT

INSERT INTO 테이블(1,2,...) VALUES (1,2,...);
  • 테이블 이름 다음에 나오는 열은 생략이 가능하다.
  • 생략 할 경우 VALUES 다음에 나오는 값들의 순서 및 갯수가 테이블이 정의 된 열 순서 및 갯수와 동일해야 한다.

대량의 샘플 데이터 생성

--형식:
INSERT INTO 테이블이름(열이름1, 열이름2, ...)
	SELECT;
--ex)
CREATE TABLE testTbl5
	(SELECT emp)no, first_name, last_name, FROM employees.employees);

데이터의 수정. UPDATE

UPDATE 테이블이름 SET1=1,2=2 WHERE 조건;
  • WHERE절은 생략이 가능하다.
  • WHERE절을 생략했을 경우 테이블 전체의 행이 변경된다.

데이터의 삭제. DELETE FROM

DELETE FROM 테이블이름 WHERE 조건;

상위 n 건만 삭제하기

DELETE FROM 테이블이름 WHERE 조건 LIMIT n;
post-custom-banner

0개의 댓글