본문 바로가기

Back-End/DataBase

SQL 기초 2

데이터 결과를 조작하는 법(replace, substring, concat)

replace(바꿀 컬럼, 현재 값, 바꿀 값) : 문자 데이터 중에서 값을 바꾸고 싶은 부분이 있을 때
select replace (st_addr, '서울', '경기') 
from student
where st_name like '%수영'
수영이라는 이름을 가진 학생의 주소'서울'에서 '경기'로 바꿔줘.

 

substr(조회 할 컬럼, 시작 위치, 글자 수) :문자 데이터 중에서 필요한 부분만 잘라 오고 싶을 때
/*address : 서울특별시 강서구 ...*/
/* 에서 강서구만 가져오고 싶을 때 */
select substr(addr, 7, 3) as "지역구"
from student
'강'이 7번째부터 시작하니깐 7, '강서구' 3글자를 가져오고 싶으니깐 3 
addr 지역구
서울특별시 강서구 **동  강서구

 

concat(붙이고 싶은 값1, 붙이고 싶은 값2, 붙이고 싶은 값3, .....) : 데이터들을 합치고 싶을 때
select concat('(',st_name,')',addr) as '이름_주소 합치기'
from student
st_name addr 이름_주소 합치기
박자바 서울특별시 강남구 **동 (박자바)서울특별시 강남구 **동

종합

위 concat 예제에서 이름넣고 주소 넣는건 좋은데 주소가 너무 길어서 '시'만 넣고 이름을 넣었으면 좋겠어 예시 [서울] 박자바
/*위에 concat에서 */

select concat('[',substr(addr, 1, 2),']', name) as '[지역]이름'
from student
where name in ('박자바')

 


조건 지정하기(if, case)

if(조건, 조건을 충족할 때, 조건을 충족하지 못할 때)
ex) 수학 과목이 70점 이상인 학생들은 합격, 미만이면 불합격
select if(math_score >= 70, '합격', '불합격') as 합격여부
from student
/* 각 전공별로 (이름: 수학 점수/영어 점수) 형식으로 결합하고, 수학 점수가 50점 이상인 학생들만 표시합니다.  
   수학 점수가 50 미만인 경우 ‘점수 낮음’으로 표시됩니다. */

select major,
	concat( '(',
		substr(st_name, 2,3),
       		': ',
		if(math_score >= 50, concat(math_score, '/', eng_score), '점수 낮음') 
	        as '이름_점수'
from student
where math_score >= 50;
group by major

 

case when 조건1 then 값(수식)1
          when 조건2 then 값(수식)2
          else 값(수식)3
          end
해석하는 법 : 조건 1일 때는 값(수식)1, 조건 2일 때는 값(수식)2, 조건1,2도 아니라면 값(수식)3 
/*  수학 점수가
	90점 이상: “A”
	80점 이상 90점 미만: “B”
	70점 이상 80점 미만: “C”
	그 외: “F” */
select case 	when score >= 90 then "A",
		when score between 80 and 89 then "B",
            	when score between 70 and 79 then "C",
            	else "F"
       end as '성적'
from student
/* 점수와 전공에 따른 합격 여부
	student 테이블에서 각 학생의 수학과 영어 점수를 기준으로 합격 여부를 표시하세요. 단, 전공에 따라 기준이 다릅니다.
	- 전공이 “컴퓨터”인 학생은 수학과 영어 점수가 모두 75점 이상이어야 “합격”
	- 전공이 “전자”인 학생은 수학 점수만 80점 이상이면 “합격”
	- 그 외의 전공은 수학과 영어 점수 평균이 70점 이상이어야 “합격”
	- 위 조건을 만족하지 않으면 “불합격”
*/

select
    case 
        when major = '컴퓨터' AND math_score >= 75 AND english_score >= 75 THEN '합격'
        when major = '전자' AND math_score >= 80 THEN '합격'
        when major NOT IN ('컴퓨터', '전자') AND (math_score + english_score) / 2 >= 70 THEN '합격'
        else '불합격'
    end as '전공별_합격여부'
from student;

 

한번에 연산하기 (subquery)

subquery는 여러번 연산을 해야할 때나 조건에 query 결과를 사용하고 싶을 때 사용된다.
/* subquery 구조 */
select 컬럼명
from
(
	select 컬럼명
   	from 테이블
)as a

/*또는 where에서도 사용이 가능하다 */
where 컬럼명 (
	~~
)
/*
1. student 테이블
   - student_id (학생 ID)
   - name (이름)
   - age (나이)

2. course 테이블
   - course_id (과목 ID)
   - course_name (과목 이름)
   - credits (학점)

3. enrollment 테이블 (수강 정보)
   - enrollment_id (수강 ID)
   - student_id (학생 ID)
   - course_id (과목 ID)
   - score (성적)
 */
/* enrollment 테이블에서 모든 과목의 평균 점수보다 높은 성적을 받은 학생의 ID와 점수를 출력하시오.*/
select student_id, socre
from enrollment
where scroe >
(	
	select AVG(socre)
	from enrollment
)

Join은 기초 3에서 만나요.. 갑자기 빡세졌네요 ㅠ

'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 기초 1  (3) 2024.11.06