SQL에서 자주 사용되는 기본적인 문법을 살펴볼 것이다.
SQL의 경우 아래의 처리 순서에 따라 처리된다.
INSET
는 테이블(table)에 행(데이터)를 추가하는데 사용된다.
mysql> INSERT INTO <table_name> (column_name1, column_name2, ...) VALUES (value1, value2, ...);
테이블의 구조가 기억나지 않는다면 아래 명령어를 통해 테이블 구조를 확인할 수 있다.
DESC <table_name>;
아래 명령어를 통해 테이블 내용을 확인해 행(데이터)가 잘 추가된 것을 볼 수 있다.
mysql> SELECT * FROM <table_name>;
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: 내림차순
술어 | 연산자 | 사용 예 |
---|---|---|
비교 | =, <>, <, <=, >, >= | price < 2000 ※ <>은 다음을 의미 |
범위 | BETWEEN | price BETWEEN 1000 AND 2000 |
집합 | IN, NOT IN | price IN (1000, 2000, 3000) |
패턴 | LIKE | bookname LIKE '축구의 역사' |
NULL | IS NULL, IS NOT NULL | price IS NULL |
복합 조건 | AND, OR, NOT | (price < 2000) AND (bookname LIKE '축구의 역사') |
와일드 문자 | 의미 | 사용 예 |
---|---|---|
+ | 문자열을 연결 | '골프' + '바이블': '골프 바이블' |
% | 0개 이상의 문자열과 일치 | '%축구%': 축구를 포함하는 문자열 |
[] | 1개의 문자와 일치 | '[0-5]%': 0-5 사이의 숫자로 시작하는 문자열 |
[^] | 1개의 문자와 불일치 | '[^0-5]%': 0-5 사이 숫자로 시작하지 않는 문자열 |
_ | 특정 위치의 1개 문자와 일치 | '_구%': 두 번째 위치에 '구'가 들어가는 문자열 |
집계 함수 | 문법 | 사용 예 |
---|---|---|
SUM | SUM([ALL or DISTINCT] <column_name>) | SUM(price) |
AVG | AVG([ALL or DISTINCT] <column_name>) | AVG(price) |
COUNT | COUNT({[[ALL or DISTINCT] <column_name>] or *}) | COUNT(*) |
MAX | MAX([ALL or DISTINCT] <column_name>]) | MAX(price) |
MIN | MIN([ALL or DISTINCT] <column_name>]) | MIN(price) |
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;
조건 없이 테이블 간의 조인 (카티전 프로덕트, 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
은 모든 값보다 크다는 것을 의미한다. 즉, 최대값보다 크다는 것을 나타낸다. 예를 들어 > 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
는 다른 연산자와 달리 왼쪽에 스칼라 값이나 열을 명시하지 않는다. 따라서 반드시 부속 쿼리의 열 이름이 제공되어야 한다. 조건에 맞는 튜플이 존재하면 결과에 포함시킨다. 즉, 부속 쿼리문의 어떤 행이 조건에 만족하면 참이다. 반면에 NOT EXISTS
는 부속 쿼리문의 모든 행이 조건에 만족하지 않을 때만 참이다.
mysql> SELECT name, address FROM Customer cs
WHERE EXISTS (SELECT * FROM Orders od WHERE cs.custid = od.custid);
EXISTS
는 참이 되어 cs의 첫 행에 대한 name과 address가 반환된다.TOP n 쿼리는 SQL 실행 결과에서 상위 n개의 행만 반환한다.
mysql> SELECT TOP 2 custid, name, phone
FROM Customer ORDER BY name;
UPDATE
는 테이블 내 데이터를 업데이트(변경)하는 명령어이다.
기본적으로 다음과 같이 사용된다.
mysql> UPDATE <table_name> SET <column_name>=<valu_to_change>, ... WHERE <conditions>;
DELETE
는 테이블 내 데이터를 제거하는 명령어이다.
기본적으로 다음과 같이 사용된다.
mysql> DELETE FROM <table_name> WHERE <conditions>;
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
은 테이블을 삭제하는 명령어이다.
다음과 같이 사용하여 테이블을 삭제할 수 있다.
mysql> DROP TABLE <table_name>;