알고리즘
삽입정렬
•
카드 놀이에서의 정렬 방식과 유사하게 작동하는 간단한 정렬 알고리즘
•
정렬된 부분과 정렬되지 않은 부분으로 나눌 수 있음
•
정렬되지 않은 부분의 값이 선택되어, 정렬된 부분에 올바른 위치에 배치됨
◦
두 번째 요소 부터 시작하여 그 앞(왼쪽)의 요소들과 비교하여 삽입할 위치를 지정한다.
삽입 정렬의 특성
•
이미 부분적으로 정렬된 데이터들을 정렬하는데 효과적입니다.
•
아마 이 특성은 동작 과정을 보면, 이해가 더 쉽게 될 것 입니다.
삽입 정렬의 동작 과정
삽입 정렬이 부분적으로 정렬된 데이터에서 효율적인 이유
삽입 정렬의 동작 원리를 나타낸 그림
•
노란색으로 표시된 부분은 5가 타겟 인덱스 일 경우 정렬 되는 방식이다.
•
5는 10과 12보다 작기 때문에 오름차순 정렬을 위해 swap 해준다.
•
여기서 중요한 것은, 4와 5도 비교가 될 텐데, 4<5 이므로 앞에 나머지 요소 [1,2,3] 과 비교 해주는 과정을 생략하고 이미 제대로 정렬되어 있다고 가정한다.
•
따라서, [1,2,3,5,6,4]와 같이 이미 부분적으로 정렬이 되어 있다면, 데이터를 교환해주는 횟수가 적어지기 때문에 효율적이다.
삽입 정렬의 시간 복잡도
•
비교 횟수
◦
이동 없이 1번의 비교만 이루어짐
◦
외부 루프: (n-1)번
◦
따라서 O(n) <빅오 표기법 기준>
•
비교 횟수
◦
외부 루프 안의 각 반복마다 i번의 비교 수행
◦
외부 루프: (n-1 + (n-2) + (n-3) + … + 2 + 1 = n(n-1)/2
◦
따라서, 최악의 경우는 O(n^2)
•
교환 횟수
◦
외부 루프의 각 단계 마다 (i+2)번의 이동 발생
▪
( target index, target index의 값, target index 앞에 있는 요소의 값 )
◦
n(n-1)/2 + 2(n-1) = (n^2 + 3n -4) / 2 = O(n^2)
삽입 정렬 코드
Select 문 활용
2.1 Select문과 함께 사용하는 다양한 키워드
상세 조건 : where 절
SELECT subdivision, name FROM seoul_hospital where subdivision = “” limit 1000;
SQL
복사
•
where절에 조건을 명시 해줌으로써, 특정 데이터만 검색해낼 수 있다.
•
select 문과 주로 사용
and 조건과 like 검색
SELECT subdivision, name FROM seoul_hospital where subdivision = "" and
name like "%이비인후과%" limit 1000;
SQL
복사
•
and 키워드 : A and B : A와 B의 조건을 둘 다 만족하는 경우를 표현할 때 사용
•
like 키워드 : 위와 같이 % 사이에 원하는 글자를 입력하면, 관련된 레코드를 검색해낼 수 있음.
Count : 특정 조건인 데이터 개수 세기
#세부 분과가 "" 이고, 병원명에 이비인후과가 포함된 name 컬럼의 수를
# 1000개 이내로 seoul_hospital 테이블에서 조회해라.
select count(name) FROM seoul_hospital
where subdivision = “” and name like “%이비인후과%” limit 1000;
SQL
복사
•
limit 키워드를 뒤에 붙혀주는 것이 좋다.
•
count(컬럼명) 함수 : 컬럼의 개수를 반환해주는 함수
Update 쿼리 by id
Update seoul_hospital set subdivision=”이비인후과”
where id = “A1100196”
SQL
복사
•
업데이트 쿼리 시 Safe 모드 해제 → 약간 금단의 영역
•
대용량의 레코드 업데이트는 하지 않도록 되어 있음 (?)
•
update (테이블명) set 컬럼명 = “값” where 조건문으로 구성
•
UPDATE ~ SET 구조로 기억하기
Update 쿼리 by condition
UPDATE `likelion-db`.`seoul_hospital` SET subdivision = "이비인후과"
where subdivision = "" and name like "%이비인후과%";
SQL
복사
•
update (테이블명) set 컬럼명 = “값” where 조건문으로 구성
•
UPDATE ~ SET 구조로 기억하기
distinct 키워드
select distinct (category) from seoul_hospital;
SQL
복사
•
해당 컬럼의 가진 다양한 값을 중복을 제거해줌으로써 고유값만 나타나도록한다.
Group by 키워드
병원의 세부 분과(subDivision)를 통해 서울 시의 병원 중 무엇이 가장 많은지?
select subdivision, count(subdivision) from seoul_hospital
group by subdivision
order by count(subdivision) desc;
SQL
복사
select name, district, subdivision, count(subdivision) as cnt from seoul_hospital
where name like '%성형외과%'
group by name, district, subdivision
order by cnt desc;
SQL
복사
•
각 구별로 병원의 이름과 병원의 개수, 세부 분과를 내림차순으로 보여줌
•
group by 키워드를 통해서 select 하고자 하는 컬럼명을 명시해주어야 함.
테이블 비우기
테이블을 비우는 것은 신중하게 해야 한다.
db에 영향이 큰 query를 날리기 전에 DB를 백업하고 해야 한다.
운영 서버 인지 개발 서버인지 실무에서는 꼭 확인해야 합니다.
2.2 서울시 병의원 데이터를 활용한 Select문 적용
SELECT distinct count(category)
from `likelion-db`.`seoul_hospital`;
SQL
복사
병원의 종류 개수 (ex. 의원 x개, 치과 병원 y개…)
SELECT subdivision, count(subdivision) as cnt
from `likelion-db`.`seoul_hospital`
group by subdivision
order by cnt desc
limit 1000;
SQL
복사
서울의 각 구별의 병원의 개수, 병원이 가장 많은 구
SELECT district, count(district) as cnt
from `likelion-db`.`seoul_hospital`
group by district
order by cnt desc;
SQL
복사
세부 분과의 각 개수를 구하여라
SELECT subdivision, count(subdivision) as cnt
from `likelion-db`.`seoul_hospital`
group by subdivision
order by cnt desc;
SQL
복사