///////
Search

삽입 정렬, Select문 활용_곽철민

1.
2.

알고리즘

삽입정렬

카드 놀이에서의 정렬 방식과 유사하게 작동하는 간단한 정렬 알고리즘
정렬된 부분과 정렬되지 않은 부분으로 나눌 수 있음
정렬되지 않은 부분의 값이 선택되어, 정렬된 부분에 올바른 위치에 배치됨
두 번째 요소 부터 시작하여 그 앞(왼쪽)의 요소들과 비교하여 삽입할 위치를 지정한다.
삽입 정렬의 특성
이미 부분적으로 정렬된 데이터들을 정렬하는데 효과적입니다.
아마 이 특성은 동작 과정을 보면, 이해가 더 쉽게 될 것 입니다.
삽입 정렬의 동작 과정
삽입 정렬이 부분적으로 정렬된 데이터에서 효율적인 이유
  삽입 정렬의 동작 원리를 나타낸 그림
노란색으로 표시된 부분은 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
복사