0. 들어가며
2주차가 되었다 !! 저번 주에 혼자 공부해보겠다고 이런 저런 문법 잔뜩 써놨었는데 이번 주 수업 내용이 그거였다니... 그래서 이번 주 글은 저번 주와 겹치는 글이 아무래도 좀 있을 것 같다.
한 가지 하소연을 좀 하자면,,, 원래는 벨로그로 활동을 하려 했는데 사이트 오류인지 쓰던 게 절반이 싹 날아가서 홧김에 티스토리로 옮겨 왔는데 티스토리에서 2주차 블로그를 쓰다가 절반이 또 날라갔다........... 진짜 쓰지 말까 백만 번 고민했는데 그래도 공부는 해야하니......... 다시 복습하라는 신의 계시로 받아들이고 럭키비키의 마인드로 열심히 해야겠다...🍀
1. 데이터 조회, SELECT
이전 블로그에서 말했듯이 데이터를 조회하는 기본 문법은 `SELECT ... FROM`이다. 그러나 우리가 하나의 열에서도 특정 정보만을 조회하고 싶다면 어떻게 해야 할까? 바로 `WHERE`을 통해 조건을 주는 것이다.
use {database_name} -- 어떤 데이터베이스를 사용할지 미리 알려주면 이후에 데이터베이스에 대한 정보를 생략해도 된다.
SELECT {column_name} FROM {table_name} WHERE {condition}
조건 자리에는 특정 데이터가 들어갈 수도 있고, 관계 연산자를 이용하여 범위를 나타낼 수도 있다. SQL에서의 관계 연산자로는 >, <, <=, >=, = 등이 존재한다. (다른 언어와 착각하여 =을 ==으로 생각하지 말자) 또한 SQL에서는 AND, OR과 같은 논리 연산자를 사용하여 두 개 이상의 조건을 한 번에 표현할 수도 있다.
1-1. AND 연산자의 활용 'BETWEEN ... AND'
만일 AND를 이용하여 특정 값 사이에 있는 데이터를 조회하고자 한다면, `BETWEEN ~ AND` 를 사용해도 된다.
SELECT * from {table_name} WHERE {column_name} >= 10 AND {column_name} <= 15;
SELECT * from {table_name} WHERE {column_name} BETWEEN 10 AND 15;
위의 코드와 같이 첫째 줄 명령어를 둘째 줄 명령어와 같이 수정하여 작성할 수 있다.
(아무래도 사잇값을 구하는 것이다 보니, 해당 열의 데이터 형식은 int, float과 같은 숫자여야 한다)
1-2. OR 연산자의 활용 'IN( )'
다음으로 OR을 이용해 특정 데이터를 조회하고자 한다면, `IN()`을 사용해도 된다.
SELECT * FROM {table_name} WHERE {column_name} = {data1} OR {column_name} = {data2};
SELECT * FROM {table_name} WHERE {column_name} IN({data1}, {data2});
위의 코드와 같이 첫째 줄 명령어를 둘째 줄 명령어와 같이 수정하여 작성할 수 있다.
1-3. 특정 글자만 찾고 싶다면 'LIKE'
만일 특정 글자를 포함하고 있는 데이터를 조회하고 싶다면, 어떻게 해야 할까? 바로 `LIKE`를 사용해 주면 된다.
예를 들어 '우'로 시작하는 데이터가 들어있는 행을 출력하고 싶다면 다음과 같이 코드를 작성해주면 된다.
SELECT * FROM {table_name} WHERE {column_name} LIKE '우%';
위의 코드에서 사용한 `%`는 `우`라는 글자 뒤에 어떠한 글자들이 와도 상관없다는 의미이다. 그렇다면 글자 수를 제한하고 싶다면 어떻게 해야 할까? 그럴 땐 다음의 코드처럼 작성해 주면 된다.
SELECT * FROM {table_name} WHERE {column_name} LIKE '__핑크';
위의 코드는 `핑크`라는 글자 앞에 두 글자가 존재해야지만 조회를 하는 코드이다. 특정 글자 앞 혹은 뒤에 붙는 글자를 제한하고 싶다면 그 글자의 개수만큼 언더바를 붙여주면 된다.
1-4. 서브 쿼리
만일 조회를 하는 데에 있어 두 가지 조건을 사용하고 싶다면 어떻게 해야할까? 해결 방법은 select문 안에 select문을 중첩으로 사용해 주는 것이다. 사용방법은 다음과 같다.
SELECT * FROM {table_name} WHERE {column_name} < (SELECT {column_name} FROM {table_name} WHERE {condition});
-- 외부 select문의 where 조건은 임의로 작성함
우리가 앞서 봤던 select문의 where 뒤 조건에 select문을 중첩해서 사용해주기만 하면 된다. 위의 코드는 내부 쿼리의 조건 하에 외부 쿼리 조건에 맞는 데이터만을 찾아낸다.
그렇다면 이런 서브 쿼리는 어떤 장점이 있을까?
- 큰 쿼리를 작은 쿼리로 나누기 때문에 복잡한 쿼리를 이해하기 쉬워진다.
- 논리를 단순화할 수 있다.
- 코드의 가독성을 높일 수 있다.
그러나 서브 쿼리에는 다음과 같은 단점도 존재한다.
- 서브 쿼리는 메인 쿼리와 별도로 실행되기 때문에 추가적인 연산을 필요로 한다.
- 서브 쿼리가 길어질 경우, 가독성이 저하될 가능성이 높아진다.
서브 쿼리는 장단점이 명확하기 때문에, 상황에 따라 시기적절하게 사용하는 것이 중요하다.
1-5. 데이터의 정렬, ORDER BY
만일 우리가 데이터를 조회할 때 특정 열을 기준으로 정렬하여 조회하고 싶다면 어떻게 해야할까? 그럴 땐 `OREDER BY`를 사용하면 된다.
SELECT * FROM {table_name} ORDER BY {column_name};
위와 같이 코드를 작성하면, 해당 열의 데이터를 오름차순으로 정렬하여 데이터를 보여준다. 만일 데이터를 내림차순으로 정렬하고 싶다면, 그땐 `DESC`를 마지막에 붙여주기만 하면 된다. DESC는 descending의 약자로, 내림차순으로 정렬하겠다는 의미이다. 이 키워드를 붙여주지 않으면 기본값으로 ASC이 적용되는데, 이는 ascending의 약자로 오름차순으로 정렬하겠다는 의미이다.
ORDER BY는 앞서 설명한 WHERE 절로 조건을 부여할 수 있다. WHERE의 위치는 무조건 ORDER BY 위치해야 하므로, 이를 유의해서 사용하도록 하자.
1-6. 출력 개수 제한, LIMIT
전체 테이블에서 상위 데이터 n개, 혹은 특정 행의 데이터만 조회하고 싶다면 LIMIT을 사용해주면 된다.
SELECT * FROM {table_name} LIMIT {start}, {count};
SELECT * FROM {table_name} LIMIT {count} OFFSET {start};
위의 두 코드는 동일한 코드로, start 행부터 count의 수만큼 데이터를 조회하겠다는 의미이다. 만일 start의 값이 0이라면, 생략하여 작성해도 된다.
1-7. 중복 결과 제거, DISTINCT
만일 데이터의 종류를 확인하기 위해 데이터를 조회했는데, 중복된 데이터가 함께 출력되면 보는 데에 어려움이 생길 것이다. 그렇다면 중복된 데이터들은 어떻게 없애줄 수 있을까? 바로 `DISTINCT`를 사용하면 된다.
SELECT DISTINCT {column_name} FROM {table_name};
DISTINCT는 열 이름 앞에 붙여주기만 하면 중복된 데이터는 1개로 줄여 출력해준다.
1-8. 데이터의 그룹화, GROUP BY
앞서 살펴본 DISTINCT는 중복된 데이터를 하나로 줄여 출력하는 역할을 하였다. 그러나 중복된 데이터에 대해 합, 평균, 최솟값 등을 구하고 싶다면 어떻게 해야 할까? 바로 `GROUP BY`를 사용해 주면 된다. GROUP BY는 동일한 데이터를 가진 행을 하나의 그룹으로 묶은 후, 집계 함수를 통해 연산을 진행한다. 이때 집계함수란 GROUP BY와 함께 사용되는 함수로, 대표적인 집계함수는 다음과 같다.
- SUM() : 데이터를 합을 구한다.
- AVG() : 데이터의 평균을 구한다.
- MIN() : 데이터들 중 최솟값을 구한다.
- MAX() : 데이터들 중 최댓값을 구한다.
- COUNT() : 행의 개수를 센다.
- COUNT(DISTINCT) : 중복된 데이터는 1개만 인정하여 행의 개수를 센다.
집계 함수와 GROUP BY는 다음과 같이 사용하면 된다.
SELECT SUM(column_name) FROM {table_name} GROUP BY {column_name};
그룹으로 묶고자 하는 데이터가 포함된 열의 이름을 GROUP BY 뒤에 써주고, 집계함수를 통해 연산을 하고자 하는 데이터가 포함된 열의 이름을 집계함수로 묶어주면 된다.
그런데, 그룹화를 진행하는 과정에서 조건을 주고 싶다면 어떻게 해야 할까? ORDER BY와 같이 WHERE를 사용하면 이 문장에서는 오류가 날 것이다. GROUP BY에서는 `HAVING`을 통해 조건을 주어야 한다.
SELECT {column_name}
FROM {table_name}
GROUP BY {column_name}
HAVING {condition};
HAVING 절은 꼭 GROUP BY 뒤에 나온다는 것도 명심해야 한다.
지금까지 설명했던 문법들을 모두 사용하여 조회를 하고자 한다면, 다음의 형식을 잘 지켜야 한다.
SELECT {column_name}
FROM {table_name}
WHERE {condiiton}
GROUP BY {column_name}
HAVING {condition}
ORDER BY {column_name}
LIMIT {count};
2. AUTO_INCREMENT에 대하여
AUTO_INCREMENT란, 테이블의 열에 대한 속성 중 하나로, 해당 열의 값을 자동으로 증가시키는 기능이다. 한 가지 유의해야 할 점은 AUTO_INCREMENT로 설정해 두는 열은 무조건 primary key로 설정해야 한다. 테이블을 생성할 때 AUTO_INCREMENT는 다음과 같이 사용해 주면 된다.
CREATE TABLE {table_name} (
{column_name1} INT AUTO_INCREMENT PRIMARY KEY,
{column_name2} {data_type},
{column_name3} {data_type}
);
위의 코드는 column_name1 열을 primary key로 지정하고, 값은 AUTO_INCREMENT로 들어가도록 테이블을 생성한 코드이다. 이렇게 생성된 테이블에 데이터를 넣고자 한다면, 다음과 같이 INSERT 문을 써주면 된다.
INSERT INTO {table_name} VALUES (NULL, {data1}, {data2});
AUTO_INCREMENT로 지정되어 있는 열에 값을 넣고자 할 땐 NULL을 입력해 주면 된다. AUTO_INCREMENT는 데이터가 들어옴에 따라 자동으로 값이 입력되기 때문이다.
만일 마지막으로 들어온 데이터가 몇 번째에 위치해 있는지 알고 싶다면, `SELECT LAST_INSERT_ID();`를 입력하여 확인해 주면 된다.
기본적으로 AUTO_INCREMENT는 1부터 시작하여 1씩 더해가는 방식이다. 그런데 시작 값과 증가 값을 바꾸고 싶다면 어떻게 해야 할까? 테이블을 생성한 뒤 다음의 명령어들을 입력하면 된다.
ALTER TABLE {table_name} AUTO_INCREMENT=100;
@@auto_increment_increment=3;
위의 코드는 AUTO_INCREMENT의 시작 값을 100으로 설정하고 증가 값을 3으로 설정한 예제이다. 다음과 같이 설정을 마치면 테이블에 값을 넣을 때 100, 103, 106, 109... 의 형태로 값이 증가하게 된다.
3. 대용량 데이터를 삭제하는 법
우리가 이전 블로그에서 데이터를 삭제하기 위해선 DELETE를 사용하면 된다고 배웠다. 그러나 DELETE 문은 데이터를 삭제하는 데에 굉장히 오래 걸리기 때문에, 대용량의 데이터를 다룰 때엔 DELETE 대신 다른 문법을 사용해 주는 것이 있다. 크게 두 가지가 존재하는데, 바로 `DROP`과 `TRUNCATE`이다. 먼저 DROP을 사용할 경우 테이블 전체를 삭제한다. 그렇기에 삭제를 하는 시간이 적게 걸린다. TRUNCATE의 경우에는 테이블의 형태만 남긴 채로 데이터는 모두 지운다. DROP과 TRUNCATE는 조건 없이 전체 행을 삭제하기 때문에 WHERE절을 사용하지 않는 것이 특징이다.
즉, 대용량 테이블의 전체 내용을 삭제하고자 할 때, 테이블의 남김 유무를 따져 둘을 시기적절하게 사용하는 것이 좋다.
4. 2주차 숙제
4-1. 기본 숙제 : p. 138 2번 문제 풀고 인증
4-2. 추가 숙제 : 데이터의 입력, 삭제하는 기본 형식 작성
<테이터의 입력>
INSERT INTO {table_name} (column_name1, column_name2) VALUES (data1, data2);
INSERT INTO {table_name} VALUES (data1, data2, data3); -- 열의 개수와 동일한 데이터 입력 시
<데이터 삭제>
DELETE FROM {table_name} WHERE {condition};
DROP TABLE {table_name};
TRUNCATE TABLE {table_name};
5. 2주차를 마치며
아직은 다행히도 쉬운 SQL인 것 같습니당 ...🤭 1주차 글을 올리고 족장님한테 그런 소소한 당근을 받는다는 것이 이리도 좋은지 몰랐어요 칭찬 글 하나가 저를 춤추게 하고 더욱 공부를 열심히 할 수 있도록 도와주는 것 같아여 남은 4주 동안도 열시미 해서 칭찬 받을 수 있도록 해야겠슴미다
다음 블로그부터는 그저 배운 내용을 다 적는 방식이 아닌, 배운 점이나 스스로 공부했던 부분에 대해 더 적는 방식으로 적어볼까 합니당 그게 뭔가 더 공부에 도움될 것 같아서...!! 그리고 3주차 글을 올리기 전에 맥북에서 mySQL과 SQL workbench를 다운받는 과정을 짤막하게 써볼까 합니다. 왜냐믄 제가 맥북으로 바꿨거든ㅇ료 ㅎㅎ 그럼 앞으로도 열시미 해서 성장하는 사람이 되어보도록 하겠씁니다 🫡
'SQL' 카테고리의 다른 글
[혼공s] 4주차 학습 내용 정리 (0) | 2024.07.27 |
---|---|
[혼공s] 3주차 학습 내용 정리 (0) | 2024.07.18 |
mySQL workbench와 git hub 연동 방법 (0) | 2024.07.13 |
macOS mySQL 및 workbench 설치 방법 (1) | 2024.07.10 |
[혼공s] 대망의 1주차 시작! (0) | 2024.07.01 |
댓글