본문 바로가기

공부 자료/SQL

(27)
[SQL] 문자열 자르기 SUBSTR, SUBSTRING, LEFT, RIGHT 코딩테스트 문제를 풀면서 문자열을 잘라서 활용해야 하는 경우가 있었다.당시에는 책, 인터넷 검색이 금지였기 때문에 자바를 알고 있던 나로서는 substring과 substr이 생각나 질러 보았더니??문자열이 진짜 잘렸네...?그래서 SQL에서 문자열은 어떻게 자르는지 알아보고자 한다. * Oracle에서 SUBSTR 함수 사용1. SUBSTR(문자열, 시작 위치, 길이): 문자열에서 시작 위치부터 길이만큼 출력 * MS-SQL / MySql에서는 SUBSTRING, LEFT, RIGHT 함수 사용2. SUBSTRING(문자열, 시작 위치, 길이): 문자열에서 시작 위치부터 길이만큼 출력 3. LEFT(문자열, 길이): 문자열에서 왼쪽부터 길이만큼 출력 4. RIGHT(문자열, 길이): 문자열에서 오른쪽부..
[29일차] Join 용어에는 어떤 것이 있을까? SQL 작성순서 및 실행순서 1 SELECT 5 2 FROM 1 3 WHERE 2 4 GROUP BY 3 5 HAVING 4 6 ORDER BY 6 - FROM 절에서 작성하는 서브쿼리 외에 다른 절에서 서브쿼리를 작성하는 것은 피하는 것이 좋다. - 속도와 성능이 제대로 나오지 않을 때 좌변가공하지 않은 SQL로 변경하는 SQL 튜닝 작업을 실시한다. - WHERE 절의 좌별을 가공하기보다는 컬럼형으로 바꾸어주고, 서브쿼리를 활용하는 것이 오라클이 명령을 수행하기에 효율적이며 실행 순서를 생각하며 SQL을 작성하는 것이 중요! - IN : 테이블의 모든 컬럼을 직접 비교하기 때문에 대량의 데이터를 조회하는 시점부터 문제가 생길 수 있음 - EXISTS : TRUE or FALSE를 조회하기 때문에 대량..
[28일차] Where - 서브쿼리 : 원하는 데이터 추출하기 단일행 서브쿼리 : 서브쿼리의 조회 결과 값의 개수가 1개인 서브쿼리 - 다중행 서브쿼리 : 서브쿼리의 조회 결과 값의 행이 여러 개인 서브쿼리 - EXISTS : 검색 결과에 최소한 하나 이상의 레코드가 존재하는지의 여부를 표현하며, 최소한 한 개의 레코드가 존재하면 참이 되고 그렇지 않으면 거짓 - IN : 특정 값을 포함하고 있는 행을 반환함 - GROUP BY만 서브쿼리가 없는 이유 : GROUP BY를 기준으로 어떠한 값을 산출할지 여부를 판단한 뒤 필터링하는 역할을 HAVING이 하므로 GROUP BY에는 서브쿼리를 사용할 필요가 없음 SELECT * FROM employees WHERE salary in ( select salary from employees where job_id = 'SA..
[27일차] FROM - 서브쿼리 : 원하는 데이터 추출하기 - rank함수는 rank( ) over(order by 컬럼)의 형식으로 사용되는데, 컬럼 값의 순서대로 순위를 매겨주는 컬럼을 만든다. - dense_rank함수는 공동 순위가 있을 경우 그 다음 순위를 건너뛰고 차례대로 순위를 매기는 rank함수와 달리 공동 순위 이후 그대로 순위를 산출한다. - from (쿼리)는 쿼리를 하나의 테이블로 간주하고 컬럼을 뽑아낸다. select b.직원이름 as 우수사원명, a.* from employees a left outer join ( select a.부서번호, a.직원이름, a.순위 from( select last_name||' '||first_name as 직원이름 , salary 급여 , department_id as 부서번호 , dense_rank()..
[26일차] 서브쿼리. 원하는 데이터 추출하기 - select절의 서브쿼리는 서브쿼리가 select절로 확장되었다고 해서 스칼라 서브쿼리라고 하며, 스칼라 서브쿼리는 출력되는 행수만큼 반복되어 실행됨 - over함수는 쿼리 결과 집합 내의 윈도우 또는 사용자 지정 행 집합을 정의 - partition by는 특정 열을 기준으로 데이터를 나누며, partition by를 지정하지 않으면 쿼리 결과 집합의 모든 행이 단일 그룹으로 취급됨 SELECT a.* , (SELECT sum(salary) as 전체급여 from employees) as 전체급여 , (SELECT round(avg(salary)) as 평균급여1 from employees) as 평균급여1 , round((SELECT avg(salary) as 평균급여2 from employees..
[25일차] 실전 데이터 분석 : 우리집 주변은 안전할까?!-3 - 쿼리 앞에 CREATE TABLE 테이블명 AS를 입력하면 쿼리를 바탕으로 한 새로운 데이터 테이블이 생김 - TO_CHAR(수치형 데이터, '999,999')는 숫자의 천의 자리에 쉼표를 찍어줌 select case when round(a.전체카메라설치수/(a.전체카메라설치수+b.설치대수)*100, 2)
[24일차] Self-Join. 자기 자신을 연결하기 - Natural Join : Join 조건을 주지 않고 Equi-Join을 하는 방법으로, 중복된 컬럼을 제거하고 중복되는 대상의 컬럼을 키값으로 활용한다. - Cross Join : 키를 연결해주지 않으며 각 테이블 간 행의 수를 곱한 만큼의 행이 생성되며, 시스템 테스트나 테스트 예제를 생성할 때 사용된다. - 세 개의 테이블을 Join할 때는 ON 다음에 한 번 더 Join을 걸어준다. SELECT a.last_name||' '||a.first_name as 사원이름 , to_char(a.hire_date, 'YYYY-MM-DD') as 입사일 , b.department_name as 부서명 , a.salary as 급여 , c.job_title as 직업명 FROM employees a ,dep..
[23일차] Outer-Join. 모든 데이터 연결하기 - 엑셀의 VLOOKUP 함수와 유사 - RIGHT JOIN 함수 사용 시 Join하는 테이블 고유의 값들이 모두 출력되면서 행이 늘어남 - Oracle 방식의 Join은 WHERE문에서 Join하려고 하는 테이블 옆에 (+)를 써줌 SELECT * FROM employees full outer join departments ON employees.department_id = departments.department_id; ​