DB 기초 초작에 관련된 포스팅을 진행합니다.

 

붉은색 -> row

주황색 -> 레코드

노란색 -> column

 

단일 테이블에 존재하는 데이터 가져오기 (전체)

// select * from Table_name;
//member 테이블의 전체 데이터 가져오기
select * from member;

//select * from Table_name where condition;
//member 테이블에서 member_id가 1 인것만 가져오기
select * from member where member_id = 1;

 

//member_id의 alise를 a로 정의,
//a와 nickname을 member테이블에서 가져오되 이름이 '가가가', id가 10 넘을것 (where에선 alise 사용불가)
select member_id as a ,member_nickname
from member
where member_nickname ='가가가' and member_id >10;

 

단일 테이블에서 몇몇 칼럼만 데이터만 가져오기

//selct column_name from table_name
//id, name순서로 출력
select member_id,member_name from member

//name, id순서로 출력
select member_name,member_id from member

 

 

실제 응용

//사칙 연산도 가능하다.
select member_id*2 ,member_nickname from member;

//as를 사용할경우 member_id를 a로 변경하여 출력
select member_id*2 as a, member_nickname from member;

 

 

요약

select는 데이터 값을 가져오는 쿼리문

*를 사용할경우 전체, 특정 값만 가져오고 싶을경우는 column_name을 입력하되 as(alies)로 이름을 변경할수 있다.

where부분은 as로 변경한 이름을 사용 불가능하다 (column_name만 인식된다)

 

Order by

어떤 기준으로 결과를 정렬할지 보여주는 명령어

//select * from Table_name by column_name desc; (내림차순)
//select * from Table_name by column_name asc; (오름차순)
//select * from Table_name by column_name1 asc, column_name2 desc; (column_name1 우선 정렬)

select * from member order by member_id desc;

 

like

일부 문자만 검색하기

//select column_name from Table_name where column_name like 조건식;
// % -> 어떤 문자와도 일치
// _ 어떤 한 문자와도 일치
// ab_cd -> ab와 cd 사이에 1글자만 존재하는것들
// ab%cd -> ab와 cd에 글자가 있는것들

select member_id, member_name from `member` where member_name like '%sd%'; (좌측)
select member_id, member_name from `member` where member_name like 'as__'; (우측)

 

 

and

where에 추가로 조건 더하기

//select column_name from Table_name where column_name=조건 and column_name2 = 조건;

SELECT * FROM member WHERE member_name LIKE 'asd%' AND member_nickname = '가가가';
SELECT * FROM member WHERE member_id > 30 AND member_nickname = '가가가';
SELECT * FROM member WHERE member_id > 3 and member_id <20 AND member_nickname = '가가가';
select * from member where member_id between 3 and 10;

 

 

avg (평균), count (갯수)

평균값을 구할땐 avg를 사용, ()안에 칼럼명 써야 정상적으로 작동

테이블에 몇개의 튜플이 존재하는지 확인 

count에선 distinct사용이 불가하다

//select avg (column_name) from Table_name;
//select count (*) fro Table_name;

SELECT AVG(member_money) as money FROM member;
select count(*) from member;

 

 

group by

여러 튜플 집합에 대해 집계함수를 적용할경우 사용

특정 열의 값에 따라 행을 그룹화하고, 각 그룹에 대해 집계 함수를 적용할 때 사용

//select avg (column_name) as a,member_name from member group by member_name;

select avg (member_money) as a,member_name from member group by member_name;

member_name | a
------------|-----
Alice       | 150  (100200의 평균)
Bob         | 150


//member 테이블에서 member_name과 member_id의 갯수를 가져오되
//member_id가 3보다 큰 모든 멤버와 그들이 작성한 답변의 수를 가져오는 것
select member_name, count(member_id) as member_answer_count
from member
natural join
answer
where member_id >3 group by member_name,member_id;

 

Having

집계 함수(COUNT, SUM, AVG, MAX, MIN 등)의 결과에 대한 조건을 적용할 때 사용됩니다.

WHERE 절과 비슷하지만, WHERE 절은 집계 함수를 실행하기 전의 개별 행에 대한 조건을 적용

HAVING 절은 집계 함수의 결과에 대한 조건을 적용, GROUP BY과 함께 사용

  • where은 집계 작업 전에 데이터를 줄이기 때문에, 처리할 데이터 양이 감소하고 결과적으로 쿼리의 성능이 향상
  • having은 집계 작업이 수행된 후에 결과에 대해 필터링을 진행하며  이미 집계된 결과에 대한 추가작업으 where절과는 다른 시점에 작동
//SELECT column_name FROM Table_name GROUP BY column_name HAVING 조건;

select * from member group by member_id having MAX(member_id) < 20;


	<select id="test1" resultType="noticeVO" parameterType="int">
		select * from notice
		where notice_id = #{notice_id}
	</select>
    
	<select id="test2" resultType="noticeVO" parameterType="int">
		SELECT * FROM notice GROUP BY notice_id HAVING notice_id = #{notice_id}
	</select>

성능 차이를 위하여 test1과 test2를 실행하였고  확연한 차이를 위해 해당 코드를 100번씩 반복해보았다.

그 결과 test1(where)과 test2(having)의 차이는 다음과 같았으며 단순하게 값을 가져오는건  차이가 있진 않았다.

구분 test1 test2
1 41 35
2 28 31
3 25 25
4 24 23
5 20 23
6 23 20

 

+ Recent posts