본문 바로가기

Back-End/DataBase

SQL 기초 1

DB는 쉽게 말해서 '데이터가 저장되어 있는 큰 폴더'이다.
DB라는 큰 폴더 안에 '테이블'이란 파일이 들어있다고 생각하면 쉽다.
그런 테이블 에는 엑셀과 같이 열(컬럼)이 있는데 이것들이 모여서 테이블을 만든다.

 

테이블 조회하기 (select, from)

select : from을 통해 가져온 테이블에서 컬럼을 조회하는 방법
from : 데이터를 가져올 테이블을 특정해주는 문법
select *
from student

위 코드를 해석해보면 "student라는 테이블에서 *(모든) 컬럼을 가져와" 라는 뜻이다.


특정 컬럼 가져오고 컬럼명 (별칭)바꿔보기

select student_name as st_name , student_address as "주소" /* as(alias)는 취향차이 */
from student

"student 라는 테이블에서 student_name 이라는 컬럼명을 name으로 바꾸고 student_address 라는 컬럼명을 "주소" 로 바꿔줘" 라는 뜻의 코드이다.

참고) 영문과 언더바는 별칭을 줄 때 " " 을 주지 않아도 되지만 한글, 특수기호(- 포함)등" "꼭! 붙여줘야한다.


조건에 맞게 데이터 가져오기 (where)

where 절은 개념을 설명하기 보다는 바로 실습 고고
select *
from student
where age >= 20

"student 라는 테이블에서 age가 20세 이상인 사람의 *(모든 컬럼)을 가져와줘" 라는 뜻이다.

참고) 연산자에서 부정은 != 가 아님. <> 임


조건문 심화 (between, in, like)

between : ~~ 사이 ex) age가 20세와 30세 사이의 데이터
in : 특정 조건 포함 ex) age가 20세, 25세, 30세 들의 데이터
like : 완전 똑같지 아니하고 비슷한 값 ex) 이름이 김으로 시작하는 사람들의 데이터
/* between 부터 */
select *
from student
where age 20 between 30

"student 테이블로부터 age가 20세부터 30세 사이의 사람들의 데이터를 *(모든 컬럼)을 가져와줘"

/* in */
select * 
from student
where age in (20, 25, 30)
/*
where name in ('김개발', '박자바') 이름이 '김개발', '박자바'인 사람만
*/

"student 테이블로부터 age가 20세, 25세, 30세인 사람들의 데이터만 *(전부) 가져와줘"

/* like */
select *
from student
where name like '김%'
/* 
where name like '%준' '준'으로 끝나는 이름.
where name like '%수%' '수'를 포함하는 이름.
*/

"student 테이블로부터 name이 김으로 시작하는 사람들의 데이터만 *(전부) 가져와줘"


논리 연산으로 여러 조건문 쓰기 (and, or, not)

이것도 바로 실습 레츠기릿
/* and */
select * 
from student
where age >= 20 AND name like '김%'

"student 테이블로부터 age가 20세 이상인 사람들 중에서 이름이 김씨인 사람의 데이터를 *(전부) 불러와줘"

 

/* or */
select *
from student
where age in (20, 30) or addr = '서울'

"student 테이블로부터 나이가 20세와 30세 중 주소가 서울인 사람들의 데이터를 *(전부) 가져와줘"


종합

이름이 김씨이고 서울에 사는 학생들의 성별과 나이를 조회하라
/*이름이 김씨이고 서울에 사는 학생들의 성별과 나이를 조회하라*/
select gender, age
from student
where name like '김%' AND address = '서울'

 


계산하기 (sum, average, min, max, count)

이것도 실전으로 바로 레츠고
/* sum, avg */
select sum(age) as sum_age,
	avg(age) as avg_age
from student
/* min, max */
select min(age) as min_age,
	max(age) as max_age
from student
sum, avg, min, max 는 딱히 설명이 필요없어 보인다..!

 

/* count */
select count(age) as count_of_age
	count(*) 
	count(DISTINCT student_id) as distinct_count_of_age
from student
id age
1 21
2 null
3 28
4 21
count는 헷갈릴 수 있으니 짚고 넘어가보자! 
먼저, count(컬럼명)은 데이터의 null 값을 제외하고 user 컬럼의 개수를 세어준다. 그럼 표에서 개수는 3.
두 번째, count(*)null값을 포함하고 개수를 세준다. 그럼 표에서 개수는 4.
세 번째, count(DISTINCT 컬럼명)중복을 제외하고 개수를 센다. 그럼 표에서 개수는 2 (null제외하고, 21은 중복이니 합친다)

범주(Group By)

컬럼명으로 그룹화 하는건데.. 이렇게 말하면 어려우니 쉽게 설명하자면 학생들의 과목별 성적이 있는데 평균을 구해야 할 때
 group by를 사용하면 같은 과목별 평균을 쉽게 구할 수 있다.
student_id subject score
1 수학 85
1 영어 90
1 과학 80
2 수학 78
2 영어 88
2 과학 82
3 수학 92
3 영어 85
3 과학 89
select 과목, AVG(점수) as avg_score
from student
group by 과목

이렇게 하면 과목별 평균 점수를 구할 수 있다! 설명 보다는 시각자료가 이해하기 쉽다.

과목 avg_score
수학 85
영어 87.7
과학 83.7

순서 정렬 (order by)

말 그대로 순서 정렬 해주는 절이다.
select * 
from student
order by score /* ASC가 디폴트다 */

/* 만약 내림차순으로 하고 싶다면*/
order by score DESC

/* 다중 정렬하고 싶다면 */
order by student_id DESC , socre 
/* 이러면 student_id 내림차순으로 먼저 정렬한 다음, score를 오름차순으로 정렬한다.​

요까지! 복습을 열심히 합시다!!

'Back-End > DataBase' 카테고리의 다른 글

Spring JdbcTemplate의 RowMapper()  (1) 2024.12.09
커넥션 풀과 데이터소스  (0) 2024.12.06
JDBC - CRUD  (0) 2024.12.06
SQL 기초 3 (Join)  (1) 2024.11.08
SQL 기초 2  (2) 2024.11.07