데이터 결과를 조작하는 법(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 |