DDL
:: 데이터베이스의 객체에 관하여 생성/수정/삭제를 할 수 있는 용어를 뜻함
명령어 | 설명 | ex |
CREATE | 생성 | CREATE DATABASE, CREATE TABLE ... |
ALTER | 수정 | ALTER TABLE (원본 명) RENAME TO (수정 명) ... |
DROP | 삭제 | DROP DATABASE, DROP TABLE ... |
테이블을 생성할 때는 괄호() 안에 컬럼 명과 해당 컬럼의 데이터 타입 및 제약 조건을 지정할 수 있다.
데이터 타입은 JAVA를 사용했을 때와 다른 점이 없으며, 그 중에서 CHAR와 VARCHAR의 차이만 이해하고 넘어가면 된다. CHAR타입은 지정된 크기보다 작은 값의 데이터가 들어와도 저장될 때 지정된 크기로만 저장이 된다. 반명 VARCHAR는 지정된 크기보다 작은 값의 데이터가 들어오면 해당 데이터의 크기로만 저장이 된다. 따라서 공간 효율은 VARCHAR이 더 우수한 편이지만, 대신 처리속도가 느리다는 단점이 있다.
제약 조건 | 설명 |
NOT NULL | 해당 컬럼에 NULL값을 허용하지 않는다. |
UNIQUE | 해당 컬럼에 중복된 값을 허용하지 않는다. |
PRIMARY KEY | 줄여서 PK라고 부르며, NOT NULL과 UNIQUE의 조건을 모두 갖춘 유일한 값을 말한다. |
FOREIGN KEY | 줄여서 FK라고 부르며, 다른 테이블과의 관계를 증명할 수 있는 외래키로 사용된다. |
CHECK | 해당 컬럼에 특정 조건을 만들어 조건식에 해당하는 값만 허용한다. |
DEFAULT | 해당 컬럼에 값이 입력되지 않을 경우 기본으로 지정되는 값을 설정한다. |
AUTO_INCREMENT | 자동으로 증가하는 숫자를 입력해준다. 값을 할당 할 시, 해당 숫자부터 카운터를 시작한다. |
DML
:: 테이블 데이터에 관하여 생성/수정/선택/삭제를 할 수 있는 용어를 뜻함
명령어 | 설명 | ex |
INSERT | 테이블에 값을 삽입할 때 사용 | INSERT INTO (테이블) VALUES( ... ) |
SELECT | 원하는 테이블의 값을 선택하여 RESERT 화면에 출력할 때 사용 | SELECT * FROM (테이블) |
UPDATE | 특정, 혹은 전체 테이블의 값을 바꿀 때 사용 | UPDATE (테이블) SET ( ... ) WHERE |
DELETE | 특정 테이블의 값을 삭제할 때 사용 | DELETE FROM (테이블) WHERE |
가장 많이 쓰이는 명령어로 이 중에서 SELECT 명령문이 가장 많이 사용된다. 데이터베이스는 개인이 사용할 수도 있겠지만, 보통 대량의 정보를 저장하는 공간으로 사용하기 때문에 수 천, 수 만건에 달하는 데이터를 모두 가져와서 확인하는 일은 효율도 떨어지고 그렇게 쉬운 일이 아니기 때문이다. 따라서 SELECT를 사용하여 필요한 데이터를 보다 편리하게 가져오는 여러가지 방법을 알아보도록 하겠다.
SELECT 컬럼 명 FROM 테이블 명
가장 기본이 되는 선택자이다. SELECT 다음에는 컬럼을 선택할 수 있는데, 모든 컬럼을 조회하고 싶다면 아스트릭(*) 기호를 사용하면 된다. 이렇게 조회했을 경우 해당 테이블의 모든 행이 나오게 되며, 특정 컬럼 명을 입력했을 때는 모든 행의 특정 컬럼내용만 출력하게 된다. 여러 개의 컬럼을 선택하고 싶다면 쉼표로 구분하여 나열하면 된다.
SELECT 컬럼 명 FROM 테이블 명 WHERE 조건식
모든 행이 아니라 일부 행을 찾고 싶을 때는 WHERE 명령어를 통해 특정 조건을 사용할 수 있다. 이 조건식은 말 그대로 식이기 때문에 찾고자 하는 값이 숫자인 경우, 사칙연산을 포함해 논리 연산자까지 포괄적으로 사용할 수 있다. 문자열의 경우 대입 연산자를 사용하여 해당 문자열이 같다, 같지 않다로만 구분할 수 있다.
SELECT mem_id, mem_name FROM member WHERE height <= 162 ;
SELECT 뒤에 표시하고 싶은 컬럼 명을 작성하고 FROM절로 어떤 테이블을 사용할 지 명시한다. 이 때 사용하고 있는 데이터베이스가 USE상태가 아니라면 해당 테이블 앞에 데이터베이스까지 명시해주어야 한다. 그런 다음 WHERE절에서 필요한 조건을 입력하는데 위에서는 특정 컬럼의 값이 162보다 작거나 같을 경우만 검색하도록 설정해두었다. 이런 식으로 숫자를 활용하면 다양한 정보를 찾을 수 있는데 AND와 OR를 사용하여 다양한 조건을 붙일 수도 있다.
하지만 AND와 OR를 사용하다보면 필연적으로 SQL 명령문의 길이가 길어질 수 있는데 이를 보완한 명령어가 존재한다.
SELECT mem_name, height FROM member WHERE height BETWEEN 163 AND 165 ;
BETWEEN을 사용하면 손쉽게 특정 범위를 지정할 수 있다. AND조건식을 사용하려면 height >= 163 AND height <=165 이런 식으로 같은 컬럼 명을 중복으로 적으면서 길어지게 된다. 위와 같은 방식으로 OR도 다른 함수를 활용하여 해결할 수 있다.
SELECT mem_name, addr FROM member WHERE addr IN( '경기', '전남', '경남' ) ;
이 조건문도 마찬가지로 OR를 사용하게 될 경우 컬럼 명을 중복해서 작성해야 하기 때문에 내용이 길어진다. 따라서 IN() 함수를 활용하면 위처럼 짧아진 명령문으로 쉽게 데이터 조회가 가능하다. 하지만 숫자와 다르게 문자는 반드시 문자열 전체가 일치해야 해당하는 행을 반환해준다. 그렇다면 일부 문자만 포함되어 있는 행을 검색하는 방법은 없을까?
SELECT * FROM member WHERE mem_name LIKE ' % 또는 언더바 (_) ' ;
바로 LIKE절을 사용하는 방법이 있다. 여기서 경기, 경남, 경북과 같이 '경'으로 시작하는 데이터를 가진 행을 가져오고 싶다면 '경%' 라고 입력하면 경으로 시작되는 데이터를 가져온다. %는 글자 수 상관없이 무엇이든 허용한다는 의미로, '경기'도 출력되고 '경기도' 도 출력이 될 수 있다. 다만 '경기도'는 제외하고 '경기' 만 출력되게 하기 위해서는 글자수를 제한할 수도 있는데, 그럴 때 사용하는 것이 바로 언더바(_) 이다. 언더바 하나가 한 글자를 의미하며, 허용하고 싶은 만큼 언더바를 작성해주면 된다.
SELECT 컬럼 명 FROM 테이블 명 ORDER BY 컬럼 명
ORDER BY는 테이블을 오름차순 또는 내림차순으로 정렬하기 위해 사용되는 명령어다. 어떤 컬럼을 기준으로 정렬을 할 지 선택한 후 정렬방식을 정하면 되는데 기본값은 오름차순(ASC)이며 내림차순을 사용하고 싶을 때는 DESC를 사용하면 된다. 단일 컬럼을 선택하여 정렬을 진행하면 해당 컬럼에 맞게 정렬이 진행되지만, 만약 복수의 컬럼을 선택하게 된다면 첫번째 컬럼을 제외한 두번째 혹은 세번째 컬럼은 후순위로 정렬이 진행된다. 즉, 첫번째 컬럼에서 중복된 값이 있을 경우 두번째 컬럼에서 정한 기준으로 정렬이 되며, 이 두번째 컬럼 또한 중복된 값이 있을 경우 세번째 컬럼에 지정된 순으로 정렬이 된다.
SELECT mem_name, height FROM member ORDER BY hight DESC LIMIT 3, 2;
LIMIT은 출력될 데이터의 갯수를 제한하는 명령어다. 하나의 숫자가 온다면 해당 숫자만큼 데이터를 가져온다는 뜻이 되며, 위와 같이 두개의 숫자가 있는 경우 첫번째 숫자는 시작 위치, 두번째 숫자는 가져올 데이터의 수를 나타낸다. 따라서 세번째 데이터부터 두 개의 데이터를 가져온다는 뜻이 된다. LIMIT은 RESULT화면에서 가장 위에 출력되는 값부터 가져오기 때문에 정렬에 따라 가져오는 데이터가 다를 수 있다. 따라서 LIMIT은 모든 테이블의 선택과 정렬이 끝난 이후 옵션으로 지정하는 편이다.
SELECT DISTINCT 컬럼 명 FROM 테이블 명
DISTINCT는 중복된 데이터를 없애겠다는 뜻이다. 중복된 데이터를 합치고 싶은 컬럼명 앞에 붙이면 된다.
컬럼에 받을 수 있는 데이터는 문자도 있지만 숫자도 있다. 숫자는 기본적인 산술과 더불어 범위를 지정한 것 처럼 연산자 사용이 가능한데, 이를 더 쉽게 사용할 수 있는 집계함수라는 것이 존재한다.
집계함수
함수명 | 설명 |
SUM() | 합계를 구함 |
AVG() | 평균을 구함 |
MIN() / MAX() | 최솟값 / 최댓값을 구함 |
COUNT() / COUNT(DISTINCT) | 행의 개수를 반환, DISTINCT를 붙일 경우 중복된 행은 한개로 간주 |
Java에서 배운것과 비슷하게 함수절에 들어가는 부분에 컬럼을 입력하면 해당 컬럼에 대한 값을 반환해준다. 하지만 해당 컬럼의 모든 값을 연산하게 되면 데이터가 한 줄이 되어버리는 일이 발생할 수 있다. 중복된 값에 따라 필요한 곳만 연산하여 출력하기 위해서는 이를 그룹으로 묶어주는 과정도 필요한데, 이 집계함수를 유용하게 쓰는 곳이 바로 GROUP BY절이다.
SELECT 컬럼 명 / 집계함수 등... FROM 테이블 명 GROUP BY 컬럼 명
GROUP BY를 사용하게 되면 집계함수가 실행되는 범위가 지정된 컬럼 명으로 바뀌게 된다. 만약 쇼핑몰의 주문내역 중, 같은 아이디의 회원이 구매한 내역을 합치고 싶다면 집계함수는 SUM(구매내역)이 될 것이고, 아이디 별로 묶어야 하니까 GROUP BY절 뒤에 올 컬럼명은 회원 아이디가 되는 것이다.
SELECT mem_id AS '회원 아이디' SUM( amount ) AS '총 내역' FROM buy GROUP BY mem_id;
여기서 AS는 Alias, 즉 별칭을 뜻하며 컬럼명이 너무 길거나 가독성이 떨어질 경우 테이블의 컬럼 제목을 임의로 바꿀 수 있다. AS는 생략 가능하며, 그냥 컬럼 뒤에 공백을 두고 작성해도 된다. 위와 같이 작성하게 되면 회원의 아이디 별로 총 주문 내역이 반영된 데이터 테이블이 완성된다. 이렇듯 SELECT문은 기존에 존재하는 테이블을 선택하여 보여줄 수도 있지만, 임의로 컬럼을 생성하고 가공하여 새로운 데이터를 가진 테이블을 보여줄 수 있다.
SELECT … (생략) … GROUP BY mem_id HAVING SUM( price*amount ) > 1000;
조건식을 통한 그룹을 진행하려 WHERE절을 쓰면 오류가 난다. 사유는 집계함수를 사용할 수 없기 때문인데, 이럴때 사용할 수 있는 절이 HAVING절이다. HAVING은 WHERE절과 비슷하게 조건을 제한하는 것이지만, 특히 집계함수에 대해 활용하는 것이라 생각하는 편이 좋다. 따라서 HAVING절은 단독으로 쓰일 수는 없으며, 반드시 GROUP BY절 다음으로 사용해야 한다.
'아이티에듀넷' 카테고리의 다른 글
2024-11-07 :: 071 SQL 용어 정리 ③ (0) | 2024.11.07 |
---|---|
2024-11-06 :: 070 SQL 용어 정리 ② (0) | 2024.11.06 |
2024-11-04 :: 068 SQL, 데이터베이스 (0) | 2024.11.04 |
2024-11-01 :: 067 게시판 (0) | 2024.11.01 |
2024-10-31 :: 066 로그인 (0) | 2024.10.31 |