SQL 문법

bolee·2022년 5월 22일
0

SQL에서 자주 사용되는 기본적인 문법을 살펴볼 것이다.

MySQL 공식 문서

SQL의 경우 아래의 처리 순서에 따라 처리된다.

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. WITH CUBE 또는 WITH ROLLUP
  7. HAVING
  8. SELECT
  9. DISTICT
  10. ORDER BY
  11. TOP

INSERT 구문

INSET는 테이블(table)에 행(데이터)를 추가하는데 사용된다.

mysql> INSERT INTO <table_name> (column_name1, column_name2, ...) VALUES (value1, value2, ...);

테이블의 구조가 기억나지 않는다면 아래 명령어를 통해 테이블 구조를 확인할 수 있다.

DESC <table_name>;

아래 명령어를 통해 테이블 내용을 확인해 행(데이터)가 잘 추가된 것을 볼 수 있다.

mysql> SELECT * FROM <table_name>;

SELECT 구문

SELECT는 테이블 내 데이터를 검색하여 보여주는 명령어이다.

기본적으로 아래와 같은 방법으로 사용하면 되고, []로 되어있는 부분은 생략 가능하다.

mysql> SELECT [ALL | DISTICT] <column_name1>, ... FROM <table_name>	// "*"은 모든 열을 나타내고, DISTINCT는 중복을 제거한다.
		[WHERE <conditions>]
        [GROUP BY <column_name>]
        [HAVING <search_conditions>]
        [ORDER BY <column_name> [ASC | DESC]]	// ASC: 오름차순, DESC: 내림차순

WHERE 조건

술어연산자사용 예
비교=, <>, <, <=, >, >=price < 2000
※ <>은 다음을 의미
범위BETWEENprice BETWEEN 1000 AND 2000
집합IN, NOT INprice IN (1000, 2000, 3000)
패턴LIKEbookname LIKE '축구의 역사'
NULLIS NULL, IS NOT NULLprice IS NULL
복합 조건AND, OR, NOT(price < 2000) AND (bookname LIKE '축구의 역사')

LIKE와 같이 사용하는 와일드 문자

와일드 문자의미사용 예
+문자열을 연결'골프' + '바이블': '골프 바이블'
%0개 이상의 문자열과 일치'%축구%': 축구를 포함하는 문자열
[]1개의 문자와 일치'[0-5]%': 0-5 사이의 숫자로 시작하는 문자열
[^]1개의 문자와 불일치'[^0-5]%': 0-5 사이 숫자로 시작하지 않는 문자열
_특정 위치의 1개 문자와 일치'_구%': 두 번째 위치에 '구'가 들어가는 문자열

집계 함수

집계 함수문법사용 예
SUMSUM([ALL or DISTINCT] <column_name>)SUM(price)
AVGAVG([ALL or DISTINCT] <column_name>)AVG(price)
COUNTCOUNT({[[ALL or DISTINCT] <column_name>] or *})COUNT(*)
MAXMAX([ALL or DISTINCT] <column_name>])MAX(price)
MINMIN([ALL or DISTINCT] <column_name>])MIN(price)

GROUP BY와 HAVING

GROUP BY를 사용한 SELECT 절에는 GROUP BY에서 사용한 속성(열)과 집계함수만 나올 수 있다.

HAVING 절은 GROUP BY 절의 결과 나타나는 그룹을 제한하는 역할을 한다. 검색 조건에는 집계함수가 와야한다. 또한 GROUP BY 절과 같이 작성해야 하고 WHERE 절보다 뒤에 나와야 한다.

mysql> SELECT custid, COUNT(*) AS 도서수량	// AS를 사용해 별칭 설정
			FROM Orders
            WHERE saleprice >= 8000
            GROUP BY custid
            HAVING COUNT(*) >= 2;

여러 테이블에서의 SQL 질의(쿼리)

조건 없이 테이블 간의 조인 (카티전 프로덕트, Cartesian Product)

mysql> SELECT * FROM Customer, Orders;

조건을 추가하여 적절히 매칭된 결과를 획득

mysql> SELECT * FROM Customer, Orders WHERE Customer.custid = Orders.custid;

동등 조인

mysql> SELECT * FROM Customer INNER JOIN Orders ON Customer.custid = Orders.custid;

외부 조인

mysql> SELECT <column_name1>, ...
			FROM <table_name1> { LEFT | RIGHT | FULL [OUTER]} JOIN <table_name2> ON <join_conditions>
            WHERE <conditions>

부속 쿼리 (중첩 쿼리)

SELECT 문의 WHERE 절에 또 다른 테이블 결과를 이용하기 위해 다시 SELECT 문을 괄호로 묶는 것을 부속 쿼리(질의)라고 한다. 일반적으로 데이터가 대량일 경우 데이터를 모두 함쳐 연산하는 조인보다 필요한 데이터만 찾아서 공급해주는 부속 쿼리가 성능에 더 좋다. 아래는 예제이다.

mysql> SELECT bookname FROM price = (SELECT MAX(price) FROM Book);

부속 쿼리의 종류는 아래와 같다.

명칭위치설명
스칼라 부속 쿼리SELECT 절단일 값을 반환하기 때문에 스칼라 부속 쿼리라고 한다. 결과 값은 단일 행, 단일 열의 스칼라 값으로 반환한다.
인라인 뷰FROM 절FROM 절에서 결과를 뷰 형태로 반환하기 때문에 인라인 뷰라고 한다. 조인에 참여하기 직전인 데이터만 추출이 가능하므로 성능의 손실을 줄일 수 있다.
중첩 쿼리WHERE 절WHERE 절에 술어와 같이 사용되며 결과를 한정시키기 위해 사용된다.

집합 연산

  • UNION: 합집합
  • EXCEPT (MINUS): 차집합
  • INTERSECT: 교집합

ALL, SOME(ANY)

비교 연산자를 예로 들면 > ALL은 모든 값보다 크다는 것을 의미한다. 즉, 최대값보다 크다는 것을 나타낸다. 예를 들어 > ALL (1, 2, 3)은 3보다 크다는 것을 의미한다.

> ANY는 적어도 하나의 값보다 크다는 것을 의미한다. 즉, 최소값보다 크다는 것을 나타낸다. 예를 들어 > ANY (1, 2, 3)은 1보다 크다는 것을 의미한다.

mysql> SELECT orderid, saleprice FROM Orders
			WHERE saleprice > ALL (SELECT saleprice FROM orders WHERE custid = '3');

EXISTS

EXISTS는 다른 연산자와 달리 왼쪽에 스칼라 값이나 열을 명시하지 않는다. 따라서 반드시 부속 쿼리의 열 이름이 제공되어야 한다. 조건에 맞는 튜플이 존재하면 결과에 포함시킨다. 즉, 부속 쿼리문의 어떤 행이 조건에 만족하면 참이다. 반면에 NOT EXISTS는 부속 쿼리문의 모든 행이 조건에 만족하지 않을 때만 참이다.

mysql> SELECT name, address FROM Customer cs
			WHERE EXISTS (SELECT * FROM Orders od WHERE cs.custid = od.custid);
  1. cs의 첫 행을 가져와 부속 쿼리문의 cs 값으로 입력한다.
  2. od의 어떤 행에서 cs의 고객 번호화 같은 것을 찾으면 EXISTS는 참이 되어 cs의 첫 행에 대한 name과 address가 반환된다.
  3. 다음으로 cs의 두 번때 행이 부속 쿼리문이 입력되고 이것은 cs의 모든 행에 대해 반복된다.

TOP n 쿼리

TOP n 쿼리는 SQL 실행 결과에서 상위 n개의 행만 반환한다.

mysql> SELECT TOP 2 custid, name, phone
			FROM Customer ORDER BY name;

UPDATE 구문

UPDATE는 테이블 내 데이터를 업데이트(변경)하는 명령어이다.
기본적으로 다음과 같이 사용된다.

mysql> UPDATE <table_name> SET <column_name>=<valu_to_change>, ... WHERE <conditions>;

DELETE 구문

DELETE는 테이블 내 데이터를 제거하는 명령어이다.
기본적으로 다음과 같이 사용된다.

mysql> DELETE FROM <table_name> WHERE <conditions>;

ALTER 구문

ALTER는 테이블 내 제약 조건이나 속성 등을 추가하는 명령어이다.
아래처럼 사용하면 되고, []로 되어있는 부분은 생략 가능하다.

mysql> ALTER TABLE <table_name>
		[ADD <column_name> <data_type>]	// 열 데이터 타입 추가
    	[DROP COLUMN <column_name>]	// 열 삭제
 	    [ALTER COLUMN <column_name> <data_type>]	// 열 데이터 타입 변경
    	[ALTER COLUMN <column_name> [NULL | NOT NULL]]	// 값 공백에 대한 설정 변경
    	[ADD PRIMARY KEY(<column_name>)]	;	// 해당 열을 기본(메인) 키로 추가

DROP 구문

DROP은 테이블을 삭제하는 명령어이다.
다음과 같이 사용하여 테이블을 삭제할 수 있다.

mysql> DROP TABLE <table_name>;

0개의 댓글