-
Notifications
You must be signed in to change notification settings - Fork 0
SQL
SQL은 Structured Query Language라는 뜻으로, 관계형 데이터베이스 시스템(RDBMS, e.g. MySQL, Oracle, MS-SQL, etc)의 데이터를 관리하기 위해 많이 사용되는 언어이다. SQL이라는 언어를 통하여 관계형 데이터베이스 관리 시스템에서 자료의 검색과 관리, 데이터베이스 스키마 생성과 수정, 데이터베이스 객체 접근 조정 관리 등을 할 수 있다.
SQL에서 쓰이는 키워드(예약어, 혹은 명령어)는
- CREATE / ALTER / TRUNCATE / DROP
- INSERT / UPDATE / DELETE / SELECT
- FROM / IN
- NOT / AND / OR 등 여러 개가 있으나, 빈번히 사용되는 키워드는 몇 개 되지 않고, 나머지는 초반에 DB, 권한 등에 대한 설정을 위해 사용되거나, 복잡한 기능을 위한 키워드라서 잘 사용되지 않는다.
CREATE, ALTER, TRUNCATE, DROP 정도가 흔히 사용된다. 하지만 이 작업들도 console에서가 아니라 GUI기반의 툴을 통해 이루어 지는 경우가 대부분이다.
DB나 Table을 생성할 때 사용한다. 다음의 코드를 통하여 3개의 column을 가지는 My_table 이라는 Table을 만들 수 있다. CREATE TABLE My_table( my_field1 INT, my_field2 VARCHAR(50), my_field3 DATE NOT NULL, PRIMARY KEY (my_field1, my_field2) )
무언가를 바꿀 때 사용한다. 다음의 코드를 통하여 앞의 CREATE section에서 생성한 My_table의 my_field2 라는 column의 이름을 my_column2라고 바꿀 수 있다. ALTER TABLE My_table RENAME COLUMN my_field2 TO my_column2;
TABLE을 비울 때 흔히 사용한다. 다음의 코드를 통하여 My_table의 모든 row들을 지울 수 있다. (원래 setting한 대로 type과 column을 갖는, Schema는 있으나 데이터만 없는 상태)
TRUNCATE TABLE My_table;
TABLE을 지울 때 흔히 사용한다. 다음의 코드를 통하여 My_table을 아예 지워버릴 수 있다.
DROP TABLE My_table;
분야를 막론하고, 흔히 데이터를 가지고 하는 작업은 크게 다음의 4가지로 나뉜다.
- Create
- Read
- Update
- Delete
데이터를 생성하고, 읽고, 수정하고, 지우는 작업들이다. 이를 줄여서 흔히 CRUD라고 이야기 한다. SQL 역시 이러한 4가지 데이터 조작에 대한 명령을 가지고 있으며, 위의 목록에 각각 다음과 같이 대응된다.
사실상 가장 중요한 것이 SELECT 문 이라고 할 수 있다.
구체적인 문법은 다음과 같다.
SELECT [ALL | DISTINCT] 컬럼명 [,컬럼명...]
FROM 테이블명 [,테이블명...]
[WHERE 조건식]
[GROUP BY 컬럼명[,컬럼명...] [HAVING 조건식]]
[ORDER BY 컬럼명[,컬럼명...] [ASC | DESC]]
대부분은
SELECT 컬럼명_또는_* FROM 테이블명 WHERE 조건식
정도의 복잡도로 가장 빈번하게 많이 사용한다. GROUP BY는 묶는 것이고..(검색 고고), ORDER BY는 뒤에 명시한 이름을 갖는 column의 순서를 고려하여, ASC(오름차순), DESC(내림차순)으로 정렬하여 결과를 반환해준다. 중요한 조건식은 아래에서 따로 다룬다. ALL, DISTINCT는 일단 신경쓰지 말도록 하자. 나도 잘 모른다. 보통 걍 안쓴다. 알고 싶다면 인터넷 검색 고고.
뒤에 JOIN 키워드를 통해 다른 결과와 결합하거나, SQL 내부에서 지원하는 문자열 조작, 간단한 mathmatical 연산 등 다양한 함수를 통한 연산을 할 수도 있다. JOIN의 경우는 특히 중요하다. 자세한 내용은 Wiki를 참조하거나, 인터넷을 검색해보자.
테이블에 한개(이상)의 행을 삽입한다.
다음과 같은 두 가지 방법이 있다.
(1) INSERT INTO 테이블_또는_뷰_이름 values (값1, [값2, ...])
(2) INSERT INTO 테이블_또는_뷰_이름 (컬럼1, [컬럼2, ...]) values (값1, [값2, ...])
(1)의 경우, table schema에서 정의해 둔 column의 순서대로 값을 넣어주어야 한다. column마다 data type이 다를 수 있기 때문에, 순서가 틀리면 엉뚱한 값이 들어가는 것은 물론 오류가 발생한다.
때문에 (2)와 같이 사용하는 것이 흔하며, values앞에, 현재 프로그래밍 상황 및 맥락에 맞도록 ,편한대로 column의 이름을 나열해 주면 된다. 뒤에 values 는 (table에 정의된 column의 순서와 무관하게) 앞에 나열한 column의 순서에 맞게 값을 넣어주면 된다. 단, column이름이 틀려서는 안된다.
DELETE FROM 테이블_또는_뷰_이름 [WHERE 조건]
WHERE 조건에 맞는 모든 행은 테이블에서 삭제된다. WHERE 절을 생략하면, 모든 행을 삭제한다. DELETE문은 어떤 의미있는 결과도 리턴하지 않는다.
-
pies 테이블에서 flavour 열과 Lemon Meringue 열에서 행이 같으면 삭제한다:
DELETE FROM pies WHERE flavour=`Lemon Meringue`;
-
trees 테이블에서, height 값이 80보다 작으면 행을 삭제한다:
DELETE FROM trees WHERE height < 80;
-
mytable에서 모든 행을 삭제한다:
DELETE FROM mytable;
-
mytable에서 where 조건에 서브쿼리를 사용해 행을 삭제한다:
DELETE FROM mytable WHERE id IN (SELECT id FROM mytable2)
-
mytable에서 값 목록을 사용하여 행을 삭제한다:
DELETE FROM mytable WHERE id IN (value1, value2, value3, value4, value5)
C나 Java에서의 Switch-Case문과 유사한 CASE-WHEN 등을 이용한 조건문도 있으나, 이는 일단 제끼도록하자. 이는 SQL의 연산의 논리흐름을 전개하는 조건문이지, 직접적으로 어떤 값을 선택해서 가져올 것인가 기준을 세우는 조건문은 아니다.
더 중요하고 빈번히 사용되는, 어느 값을 가져올지 조건을 다는 조건문은 WHERE이다.
WHERE문은 뒤에 어떠한 연산자(=, <> or !=, >, <, >=, <=,BETWEEN LIKE, IN)가 붙느냐에 따라 다양한 결과를 만들어 낸다. 자주 쓰이는 =, LIKE, IN을 알아보자. =을 쓸 줄 안다면, !=(<>), >, <, >=, <=도 쉽게 사용할 수 있을 것이다.
다음과 같은 SQL문이 있다고 하자.
SELECT * FROM My_Table WHERE my_column2="value2";
위의 SQL문에서 굵게 표시된 WHERE이하의 부분을 조건문이라고 한다. SELECT문을 통하여 모든 column의 정보를 가져오되, 조건문 내용에 합당한 내용만 필터링해서 가져오라는 뜻이다. 위의 경우에는 'table 내의 row를 하나하나 살펴보면서, my_column2이라는 column의 값이 'vqlue2'라는 문자열인 row들을 보여주는데, 각 row의 모든(*) column의 값들을 가져오세요' 라는 뜻이 된다.
만약 한 row내에서 한 column의 값이 특정한 값과 완전히 일치하는게 아니라, 부분적으로 일치하는 경우를 찾고 싶을 경우가 있다.
다시 말하면, 학교의 한 반에서 이름이 '홍길동'인 사람을 찾는 것이 앞의 예 였다면, 성이 '홍'씨 인 사람을 찾고 싶을 경우가 있을 것이다. 'WHERE ='절을 통하여 '이름' column의 값이 '홍'인 사람을 찾자니, 성이 '홍'인 사람이 아니라, 이름 자체가 '홍'인 사람밖에 찾을 수 없다. 즉, 이름에서 부분적으로 '홍'만 겹치는, 홍**인 경우를 찾고자 한다면 다른 방식이 필요해진다.
이 때 사용하는 것이 LIKE 문과 와일드카드 % 이다. 와일드카드에는 어떤 문자열도 대입 되더라도 '참'이다. 빈 문자열도 가능하다(Roughly, 아무것도 안와도 된다는 뜻). WHERE절에 '=' 대신에 LIKE을 쓰고, 값에 %를 포함시켜 보자.
SELECT * FROM My_Class WHERE student_name LIKE "홍%";
위와 같은 SQL문을 실행하면, My_Class라는 table 내에서 student_name의 값이 '홍'으로 시작하고 뒤에 아무 문자열이 붙는, 즉 홍****인 경우를 모두 찾아준다. 이는 게시판 등에서 검색을 구현할 때 유용하게 사용되곤 한다.
비슷하게,
SELECT * FROM My_Class WHERE student_name LIKE "%홍%";
와 같이 한다면, 성이 홍씨인 사람을 포함해서 그냥 이름 안에 '홍'자가 포함되는 모든 학생들을 찾아준다.
조금 더 심화된 내용이다. column의 값이 '(와일드카드를 포함해서)특정한 어떤 값과 일치할 때'가 아니라, IN 이하에 제시되는 그룹 내에 존재하면 조건문을 참으로 여기는 방식이다.
(1) SELECT * FROM My_table WHERE col_A IN ("B", "C", "D", "E");
(2) SELECT product_price FROM product_info WHERE product_code IN (
SELECT product_code FROM sales_record WHERE sold_out="TRUE"
)
(1)은 WHERE (col_A="B") OR (col_A="C") OR (col_A="D") OR (col_A="E") 와 같은 뜻이다.
(2)는 중첩 SELECT문(Nested Select Statement ; mobile 등 제한적인 환경에서 실행되는 Database Engine에서는 지원되지 않기도 한다.)이다.
기울여 표시된 안쪽 SELECT문이 판매실적(sales_record)테이블에서 매진(sold_out colume의 값이 TRUE)된 상품들에 대한 상품코드(product_code)를 불러온 결과물이다.
바깥쪽 SELECT문에서, 안쪽 SELECT문의 결과물(상품코드들)들에 대한 상품가격(product_price)를 상품 정보(product_info)테이블에서 불러온다.
또 한 가지 중요한 내용이 SQL내에서의 Data Type이다. 여러가지 SQL Package들 (MySQL, MS-SQL, Oracle, SQLite 등)마다, 각각의 버전마다 추가적으로 지원하는 데이터 타입이 더 있을 수도 있으나(예를 들어 BOOL이 존재하기도 하는데 이는 SMALLINT를 사용하여 변환된다.), 공식적인 데이터 타입이 존재하고, 나는 이제 졸리니까 위키를 참조하세요.
자주 쓰이는 것들은 다음과 같습니다.
- INTEGER (SMALLINT)
- FLOAT, DOUBLE
- DATE, TIME, TIMESTAMP
- VARCHAR
- SQL @ Wikipedia
- [INSERT statement @ Wikipedia](http://ko.wikipedia.org/wiki/INSERT_(SQL\))
- [SELECT statement @ Wikipedia](http://ko.wikipedia.org/wiki/Select_(SQL\))
- [Update statement @ Wikipedia](http://ko.wikipedia.org/wiki/UPDATE_(SQL\))
- [Delete statement @ Wikipedia](http://ko.wikipedia.org/wiki/DELETE_(SQL\))
