본문 바로가기

DB/SQL28

[MySQL] WITH 재귀(RECURSIVE) 쿼리 계층 구조 주의 !! mysql 5.7 이하 미지원 ■ WITH RECURSIVE 문 메모리 상에 가상의 테이블을 저장 재귀 쿼리를 이용하여 실제로 테이블을 생성하거나 데이터삽입(INSERT)을 하지 않아도 가상 테이블을 생성할 수 있다. WITH RECURSIVE 테이블명 AS( SELECT 초기값 AS 컬럼별명1 UNION ALL SELECT 컬럼별명1 계산식 FROM 테이블명 WHERE 제어문 ) ■ 예시 h(컬럼)이 초기값 1 부터 제어문에 합당하는 5까지의 데이터를 갖는 가상 테이블 생성 WITH RECURSIVE CTE AS( SELECT 1 AS h UNION ALL SELECT h+1 FROM CTE WHERE h 2022. 6. 3.
[MySQL] 위도 경도 값으로 반경(거리) 구하기 GPS를 이용한 거리 및 반경을 구하는 경우 MySQL을 이용하여 쿼리문의 정보를 가져오기 편하다. 예제 테이블 명 : MAP_INFO 예제 Lat 컬럼명 : P_LAT 예제 Lon 컬럼명 : P_LON 예제 예시 좌표값 : 37.4685225, 126.8943311 [WGS84 좌표계] SELECT *, (6371*acos(cos(radians(37.4685225))*cos(radians(P_LAT))*cos(radians(P_LON) -radians(126.8943311))+sin(radians(37.4685225))*sin(radians(P_LAT)))) AS distance FROM MAP_INFO HAVING distance 2021. 10. 21.
[오라클(Oracle)] 그룹 함수 (ROLLUP, CUBE, GROUPING 등) 오라클에 있는 다양한 그룹함수에 대한 내용이다. CREATE TABLE 월별매출 ( 상품ID VARCHAR2(5), 월 VARCHAR2(10), 회사 VARCHAR2(10), 매출액 INTEGER ); INSERT INTO 월별매출 VALUES ('P001', '2019.10', '삼성', 15000); INSERT INTO 월별매출 VALUES ('P001', '2019.11', '삼성', 25000); INSERT INTO 월별매출 VALUES ('P002', '2019.10', 'LG', 10000); INSERT INTO 월별매출 VALUES ('P002', '2019.11', 'LG', 20000); INSERT INTO 월별매출 VALUES ('P003', '2019.10', '애플', 150.. 2021. 9. 6.
[Oracle] 오라클 고급쿼리 – 계층적 쿼리 (level) Connect by 계층적 쿼리는 오라클만이 가진 기능 중 하나로, 데이터를 선택하여 계층적인 순서 그대로 리턴하는데 사용된다. 예를 들면, 아래와 같이 직원 테이블이 있다고 생각 하자. 직원 직속상사 직급 철수 순희 대리 순희 영희 과장 길동 순희 대리 영희 개똥 부장 개똥 사장 기본적인 SQl을 사용하여 계층 관계를 표현하는것은 불가능하다. 하지만 재귀 PL/SQL 루틴과 connect by 를 사용한다면 표현이 가능하다. 재귀 PL/SQL은개발과 처리 과정에서 다소 많은 시간이 필요로 한다는 단점이 있으며, 변경사항이 있을 때 다른 저장 프로시저를 만들거나 보다 복잡하게 변경해야 한다는 점도 무시 할 수 없다. 이에 오라클에서는 connect by라는 확장된 select 구문을 지원한다. selec.. 2021. 9. 6.
오라클 NL Join, Sort Merge Join, Hash Join 특징 총정리 NL Join(Nested Loops Join) 수행 원리 1) 다음은 NL Join의 수행 방식을 단계별로 나타낸 것입니다. ① 선행 테이블에서 조건을 만족하는 첫 번째 행을 찾음 → 이때 선행 테이블에 주어진 조건을 만족하지 않는 경우 해당 데이터는 필터링 된다. ② 선행 테이블의 조인 키를 가지고 후행 테이블에 조인 키가 존재하는지 찾으러 감 → 조인 시도 ③ 후행 테이블의 인덱스에 선행 테이블의 조인 키가 존재하는지 확인 → 선행 테이블의 조인 값이 후행 테이블에 존재하지 않으면 선행 테이블 데이터는 필터링 됨 (더 이상 조인 작업을 진행할 필요 없음) ④ 인덱스에서 추출한 레코드 식별자를 이용하여 후행 테이블을 액세스 → 후행 테이블에 주어진 조건까지 모두 만족하면 해당 행을 추출버퍼에 넣음. .. 2021. 8. 31.
[ORACLE]오라클_제약조건( CHECK ) 제약 조건중 하나인 CHECK 기능 CHECK - 입력 값이 조건에 맞지 않으면 DB 에서 받지 않는다. 즉 오류를 일으킵니다. - 입력 값의 범위를 지정 할 수 있다. 즉 CHECK은 입력할수 있는 값의 범위를 설정해 주는것입니다. 예를들어 2000~10000 까지만 입력해! 라고 설정하면 그 범위를 벗어난 값이 들어올 수 없다는 거죠 그리고 주의할 점은 CHECK 역시 NOT NULL처럼 나중에 조건을 추가해줄 경우 이미 들어가 있는 데이터가 조건에 위배되면 적용이 안됩니다. 제약조건 따로 추가하는 부분에서 설명한거처럼 CHECK 제약조건을 설정해 주면 됩니다. - ALTER TABLE [테이블명] ADD CONSTRAINT [제약조건명] [제약조건](범위) ALTER TABLE emp ADD CON.. 2021. 8. 31.
MSSQL 자동 증가값 세팅 및 초기화( IDENTITY) 기본 사용법 사용 create table test( no int identity(1,1) NOT NULL, --(시작할 숫자값, 증가할 숫자값) ) 인서트시 증가된 값 얻어오기 Identity를 설정해준 테이블에 인서트한 경우 인서트한 identity 불러오기 위해서는 보통 다시한번 select를 해주게 된다. 인서트 쿼리 뒤에 select @@Identity을 붙여 주면 insert한 row의 identity를 불러올 수 있다. 사용예) insert into test(name) values('James') select @@Identity as 'id' (as 'id'는 별칭이므로 아무거라도 상관 없다.) 증가값을 임의로 정하기 :Identity를 선언한 경우에는 인서트 시 ,Identity선언 컬럼의 .. 2021. 8. 31.
숫자함수 ROUND, FLOOR, CEIL ,TRUNCATE ROUND: 반올림 지정하는 소숫점 자리로 반올림한다. SELECT ROUND(135.375, 2); -- 135.38 FLOOR: 버림 (to integer) 가장 가까운 '정수'로 버림하여 반환한다. SELECT FLOOR(135.375); -- 135 CEIL 또는 CEILING: 올림 (to integer) 가장 가까운 '정수'로 올림하여 반환한다. SELECT CEIL(135.375); -- 136 SELECT CEILING(135.375); -- 136 TRUNCATE: 제거 학습 중 TRUNCATE라는 것을 발견했다. 이것은 사실상 위의 모든 속성과 다르다고 할 수 있는데, 그냥 n째 자리까지 남기고 아예 제거를 해버리기 때문이다. 그래서 결과는 아래와 같다. SELECT TRUNCATE(1.. 2021. 8. 31.
[SQL] ANY / ALL / EXISTS / NOT EXISTS ANY 연산자는 주로 서브쿼리에 사용되며 하나라도 만족하는 값이 있다면 true를 반환한다. ANY(서브쿼리 or 값) 활용 예제 1) sal > 300 OR sal > 400 OR sal > 500 이므로 sal이 300보다 크면 조건을 만족한다. SELECT ename, sal FROM emp WHERE sal > ANY(300, 400, 500); 활용 예제 2) 서브쿼리에서 값이 여러개 나올 수 있는 경우 ANY 연산자를 활용하였다. SELECT ename, sal FROM emp WHERE sal > ANY( SELECT sal FROM emp WHERE deptno = 20 ); ALL 연산자는 전체 만족해야 true를 반환하는 특징을 가지고 있다. ALL(서브쿼리 or 값) 활용 예제 1) .. 2021. 8. 31.
728x90
반응형