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 (100과 200의 평균)
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 |
'DB' 카테고리의 다른 글
(김영한 로드맵) JPA 프로그래밍 - 1 (mybatis VS JPA) (0) | 2024.08.24 |
---|---|
[데이터베이스]복수의 테이블의 데이터 결합하기 (0) | 2024.02.14 |