SQL(Structured Query Language)
- 데이터베이스(DB) 활용 시 데이터베이스에서 원하는 정보를 검색하거나 삽입, 수정, 삭제 등 자료를 처리하는 용도로 사용되는 구조적 데이터 질의 언어이다.
- 어느 데이터베이스에서나 기본으로 제공하기 때문에 배워두면 여러 곳에서 활용가능성이 있다. 다만, NoSQL 계열(MongoDB, Redis 등)에서는 SQL 문을 사용하지 않는다.
- 만약 당신이 MySQL, MariaDB, Oracle 등의 데이터베이스를 처음 접하게 된다면 가장 기초가 되는 CRUD(Create, Read, Update, Delete)를 다룰 줄 알아야 다양한 데이터베이스 질의를 응용할 수 있다.
- MySQL과 MariaDB는 기본적인 쿼리 문법은 동일하다. (MariaDB는 MySQL이 오라클에 인수된 이후 불확실한 라이선스 문제를 해결하려고 나온 오픈소스 RDBMS이기 때문.)
CRUD(Create, Read, Update, Delete)
요소 | SQL 문 | 설명 |
---|---|---|
CREATE | INSERT | 삽입 |
READ | SELECT | 조회 |
UPDATE | UPDATE | 수정 |
DELETE | DELETE | 삭제 |
CRUD란 SQL 문에서 가장 기초가 되는 4가지 요소를 가르킨다.
데이터베이스 관리자가 아니더라도 개발자라면 꼭 알고 있어야 하는 부분으로 데이터베이스 요소가 가미된 프로그래밍에서는 가장 기초적이며 중요한 상식이라고 할 수 있다.
이제 MySQL과 MariaDB에서 각 요소를 어떻게 쿼리로 작성하여 활용하는 지 알아보자.
이후 설명할 항목에서는 다음과 같은 테이블(STUDENT)을 예시로 활용한다.
ID | NAME | MATH | ENGLISH |
---|---|---|---|
1001 | 철수 | 85 | 90 |
1002 | 영희 | 100 | 90 |
2000 | 길동 | 70 | 90 |
2001 | 진구 | 50 | 50 |
2002 | 미희 | 100 | 100 |
CREATE(INSERT)
STUDENT 테이블에서 새로운 인원이 추가되었다고 가정하였을 때에는 새로운 행을 추가하여야 할 것이다.
테이블에 행을 새로 추가하는 기본적인 INSERT문은 다음과 같다.
INSERT INTO 테이블이름(필드1, 필드2, 필드3, ...) VALUES (값1, 값2, 값3, ...)
따라서 현재 5명의 정보를 가지고 있는 STUDENT 테이블에 학생 한 명을 삽입하는 INSERT문과 그에 따른 결과 테이블은 다음과 같다.
INSERT INTO STUDENT(ID, NAME, MATH, ENGLISH) VALUES ('3000', '영미', 80, 80)
ID | NAME | MATH | ENGLISH |
---|---|---|---|
1001 | 철수 | 85 | 90 |
1002 | 영희 | 100 | 90 |
2000 | 길동 | 70 | 90 |
2001 | 진구 | 50 | 50 |
2002 | 미희 | 100 | 100 |
3000 | 영미 | 80 | 80 |
앞서 설명한 쿼리 외에 조금 더 간단하게 행을 삽입할 수 있는 INSERT문도 존재한다. 다만, 별도로 필드를 정의하지 않았기 때문에 필드의 순서에 맞게 값을 정의할 필요가 있다.
INSERT INTO 테이블이름 VALUES (값1, 값2, 값3, ...)
마지막으로, 꼭 모든 필드의 값을 채워야 하는 것은 아니다. 만약 Schema를 정의할 때 따로 NOT NULL 속성을 부여한 필드가 아닐 경우 NULL값이 자동으로 채워질 것이다.
READ(SELECT)
데이터베이스 내 존재하는 테이블에서 모든 내용이나 내가 원하는 내용 등 값을 조회할 때 사용하는 쿼리문이다. 테이블 내 존재하는 모든 행에 대한 출력을 요청할 수도 있고, 조건을 걸어 조건에 부합하는 행에 대한 출력을 요청할 수도 있다. 심지어 다른 두 개의 테이블의 내용을 조합하여 추출할 수도 있다. 하지만 본 포스팅에선 하나의 테이블을 다루는 방법에 대해서만 설명하도록 한다.
가장 먼저 하나의 테이블 내 존재하는 모든 행을 조회하는 SELECT문은 다음과 같다.
SELECT * FROM 테이블이름
위에서 ‘영미’에 대한 정보를 추가한 STUDENT 테이블의 모든 내용을 조회해 보자.
SELECT * FROM STUDENT
ID | NAME | MATH | ENGLISH |
---|---|---|---|
1001 | 철수 | 85 | 90 |
1002 | 영희 | 100 | 90 |
2000 | 길동 | 70 | 90 |
2001 | 진구 | 50 | 50 |
2002 | 미희 | 100 | 100 |
3000 | 영미 | 80 | 80 |
이제 해당 테이블에서 ID, NAME, MATH 필드에 대한 조회를 해보자.
SELECT ID, NAME, MATH FROM STUDENT
ID | NAME | MATH |
---|---|---|
1001 | 철수 | 85 |
1002 | 영희 | 100 |
2000 | 길동 | 70 |
2001 | 진구 | 50 |
2002 | 미희 | 100 |
3000 | 영미 | 80 |
이처럼 ‘*’ 대신 필드를 나열해주면 해당 필드들의 값만 출력을 하게 되는데, 모든 행을 조회할 때 사용한 *의 의미는 와일드카드이며, 와일드카드에 대해 궁금한 분을 위해 위키백과를 인용하니 참고하길 바란다.
와일드카드 문자
와일드카드 문자(wildcard character)는 컴퓨터에서 특정 명령어로 명령을 내릴 때, 여러 파일을 한꺼번에 지정할 목적으로 사용하는 기호를 가리킨다. 이 문자는 어느 곳에서 사용하느냐에 따라 약간의 차이를 보인다. 주로 특정한 패턴이 있는 문자열 혹은 파일을 찾거나, 긴 이름을 생략할 때 쓰인다.
이제 추가적으로 위 결과에서 MATH 값이 80이상인 행을 조회해보자. SELECT문에는 조건문을 다음과 같이 WHERE절로 추가할 수 있다.
SELECT ID, NAME, MATH FROM STUDENT WHERE MATH >= 80
ID | NAME | MATH |
---|---|---|
1001 | 철수 | 85 |
1002 | 영희 | 100 |
2000 | 길동 | 70 |
2001 | 진구 | 50 |
2002 | 미희 | 100 |
3000 | 영미 | 80 |
WHERE절에는 하나의 조건이 아닌 다수의 조건을 부여할 수 있는데 AND와 OR로 가능하며 이는 AND연산과 OR연산에 대한 이해가 필요하므로 문법적인 부분에 대해서만 설명한다.
SELECT * STUDENT WHERE MATH >= 80 AND ENGLISH >= 80
SELECT * STUDENT WHERE MATH >= 80 AND ENGLISH >= 90 OR ENGLISH = 50
등등 무궁무진한 조건으로 조건을 부여할 수 있다.
참고 자료
- https://namu.wiki/w/SQL – 나무위키 SQL
- https://namu.wiki/w/MariaDB – 나무위키 MariaDB
- https://ko.wikipedia.org/wiki/와일드카드_문자 – 위키백과 와일드카드 문자