SQL 기본
이번에는 기본적인 SQL 문장인 SELECT, INSERT, UPDATE, DELETE에 대해 알아볼 것이다.
실습을 통해 진행할 것인데
샘플 데이터베이스로 emplyees라는 이름을 가진 데이터베이스를 사용할 것이다
SELECT
: SELECT는 데이터베이스 내의 테이블에서 원하는 정보를 추출하는 명령이다.
SELECT문이 매우 간단해 보이지만 다양한 옵션이 존재한다. 하지만 많이 사용되는 형태로 구조를 요약해보면
SELECT select_expr
[FROM table-references]
[WHERE where_condition]
[GROUP BY {col_name | expr | position}]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}]
위의 내용도 복잡해 보인다면 좀더 자주 사용하고 간단한 형태로 구조를 나타내면
SELECT 열 이름
FROM 테이블 이름
WHERE 조건
간단히 SELECT 구문은 이러한 형태임을 알 수 있고 지금부터는 하나하나 옵션을 붙여가며 SELECT에 대해 알아보자.
USE 구문
SELECT문 뿐만 아니라 다른 명령어를 사용하기 전에 사용할 데이터베이스를 지정해야 한다.
따라서 해당 데이터베이스를 지정하거나 변경해야할 경우 USE 구문을 사용한다.
현재 사용하는 데이터베이스를 지정하거나 변경하는 구문은 아래와 같다.
USE 데이터베이스_이름;
만약 employees라는 이름을 가진 데이터베이스를 사용하기 위해 쿼리 창에 아래와 같이 입력하면 된다.
USE employees;
만약 이렇게 데이터베이스를 지정해둔다면 다시 USE문을 사용한다던지 다른 DB를 사용하겠다는 명시를 하지 않는다면 모든 SQL문은 employees라는 이름을 가진 데이터베이스에서 수행된다.
SELECT와 FROM
USE employees;
SELECT * FROM titles;
-> employees 데이터베이스를 선택한 후
-> titles라는 테이블에서 모든 열의 내용을 가져와라
*이 나온 위치는 해당 테이블의 열 이름이 나오는 위치이다.
그런데 열 이름대신 *가 나오면 모든 열을 의미한다.
FROM 다음에는 테이블/뷰의 항목이다.
사실 원칙적으로는 테이블의 전체 이름은
“데이터베이스이름.테이블이름” 형식으로 표현된다.
따라서 위의 SELECT 구문을 정확히 작성하면
SELECT * FROM emplyees.titles;
가 된다.
그러나 데이터베이스 이름을 생략해도 이전에 USE를 이용하여 선택된 데이터베이스 이름이 자동으로 붙게 된다.
titles 테이블의 모든 열을 가져오니 결과가 아래와 같다
데이터가 무수히 많지만 일부분만 보인 것이다.
그럼 이제는 전체 열이 아닌 특정 열만 가져와보자
사원 테이블의 이름만 가져와 보쟈
SELECT first_name FROM employees;
titles 테이블의 first_name 열만을 가져오면 아래와 같다.
여러개의 열을 가져오고 싶다면 콤마(,)로 구분하면 되고
열 이름의 순서는 마음대로 바꿔도 된다.
결과 또한 명령어에서 작성한 열 이름 순서대로 나온다.
SELECT first_name, last_name, gender FROM employees;

결과를 보니 first_name, last_name, gender 열이 작성한 순서대로 나왔음을 확인할 수 있다.
특정한 조건의 데이터만 조회하는 <SELECT … FROM … WHERE>
기본적인 WHERE 절
WHERE절은 조회하는 결과에 특정한 조건을 줘서 원하는 데이터만 보고 싶을 때 사용
다음과 같은 형식을 갖는다.
SELECT 필드이름 FROM 테이블이름 WHERE 조건식;
비교를 위해 WHERE 조건 없이 조회를 해보자
아 그전에 앞으로 미리 만들어둔 DB인 sqldb를 사용할 것임
sqldb에 usertbl, buytbl 2개의 테이블이 있을 것임
SELECT * FROM usertbl;

usertbl 테이블에 있는 모든 열을 나타내야 한다.
보면 10개의 행 즉 10개의 데이터가 확인된다.
SELECT * FROM usertbl WHERE name = '김경호';

usertbl 테이블에 모든 열을 나타내는데 name = ‘김경호’ 를 만족하는 행 (데이터)를 나타낸다.
관계 연산자의 사용
이전에 사용한 테이블로 1970년 이후에 출생하고 신장이 182 이상인 사람의 아이디와 이름을 조회 해볼 것이다.
SELECT userID, Name FROM usertbl WHERE birthYear >= 1970 AND height >= 182;
그 결과는
.png)
1970년 이후에 출생했거나 신장이 182 이상인 사람의 아이디와 이름을 조회해보면
SELECT userID, Name FROM usertbl WHERE birthYear >= 1970 OR height >= 182;
.png)
~ 했거나, ~ 또는 등 : OR 연산자를 사용
~ 하고, ~ 면서, ~ 그리고 등 : AND 연산자를 사용
위 처럼 조건 연산자(=, <, >, <=, >=, <>, != 등)와 관계 연산자(NOT, AND, OR 등)을 잘 조합하면 다양한 조건의 쿼리를 생성할 수 있다.
BETWEEN~~~ AND와 IN() 그리고 LIKE
이번에는 키가 180 ~ 183인 사람의 이름과 키를 조회해보면
SELECT name, height FROM usertbl WHERE height >= 180 AND height <= 183;

이것을 동일한 결과를 내놓는 다른 방법으로 BETWEEN~~~ AND를 사용할 수 있다.
SELECT name, height FROM usertbl WHERE height BETWEEN 180 AND 183;

같은 결과를 내놓는다.
키의 경우 숫자로 구성되어 있고 연속된 값을 가지기 때문에 BETWEEN~~~ AND를 사용이 가능하다.
하지만 지역이 ‘경기’, ‘강원’인 사람을 찾는 경우에는 연속된 값이 아니므로 BETWEEN~~~ AND 사용이 불가능 하다.
그렇다면 지역이 ‘경남’, ‘경북’인 사람의 이름과 지역을 확인해 보자.
SELECT name, addr FROM usertbl WHERE addr = '경남' OR addr = '경북';

위 경우처럼 연속적인 값이 아닌 이산적인 값을 위해 IN을 사용할 수 있다.
SELECT name, addr FROM usertbl WHERE addr IN ('경남', '경북');

이전과 동일한 결과를 확인할 수 있다.
문자열 내용을 검색하기 위해서는 LIKE 연산자를 사용할 수 있다.
SELECT name, height FROM usertbl WHERE name LIKE '김%';
위 코드의 조건은 성이 ‘김’씨이고 그 뒤에는 무엇이든 허용한다는 의미로 %로 나타낸다.

결과를 보면 이름이 ‘김’이 제일 앞 글자인 경우의 이름과 키를 나타낸다.
만약 %처럼 무엇이든 허용하지말고 한 글자만을 허용하고 싶을떄는 어떻게 하지?
그럴땐 _를 사용한다.
SELECT name, height FROM usertbl WHERE name LIKE '_종신';

위 sql문을 보면 이름이 ‘_종신’ 으로 종신 앞에 딱 한글자 아무거나 들어가는 모든 이름에 해당하는 이름과 키 정보를 조회하는 것이고
결과를 보면 이름 윤종신, 키 170에 해당하는 한 사람만이 존재하는 것을 확인할 수 있다.
위에서 배운 ‘_’, ‘%’를 조합해서 사용할 수 도 있다.
‘_123%’ 경우 123 앞에 아무거나 딱 한 문자가 있고 뒤에는 아무 문자 무엇이든 허용한다는 의미로
예를들어 01234, 012356, 가123나3디2
등등 이 가능하다.