종종 코딩테스트 치면서 SQL이 나올때가 있다. 그것도 제법 까다롭게 나오는 경우도 많다... 평소에 프로젝트할때 쿼리 짠다고는 해도 끽해야 JOIN이나 집계함수 수준이어서, 그 외에 자주 안 쓰이는 복잡한 쿼리들을 좀 정리해놓으려고 한다. (MySQL 기준)
MySQL에는 JSON 자료형이 있다. 이걸 다루는 function들로 다음과 같은 것들이 있다.
숫자를 다루는 문제도 나온다.
날짜를 다루는 문제도 종종 나온다.
SELECT * FROM A,B --cartesian product
SELECT * FROM A
UNION
SELECT * FROM B --합집합
SELECT * FROM A INNER JOIN B ON ~ --교집합
SELECT * FROM A LEFT JOIN B ON ~ WHERE B.id IS NOT NULL --교집합
SELECT * FROM B LEFT JOIN A ON ~ WHERE A.id IS NOT NULL --교집합
SELECT * FROM A LEFT JOIN B ON ~ WHERE B.id IS NULL -- A-B 차집합
SELECT * FROM A RIGHT JOIN B ON ~ WHERE A.id IS NULL - B-A 차집합
SELECT * FROM A
WHERE NOT EXISTS(
SELECT DISTINCT B.id
FROM B
WHERE A.id = B.id); -- A-B 차집합
SELECT * FROM A
WHERE A.id NOT IN(
SELECT DISTINCT B.id
FROM B); -- A-B 차집합
-- B-A차집합은 A,B를 바꿔주면 됨
SELECT * FROM
(
SELECT A.id AS id, A.Name AS name
FROM A
UNION ALL
SELECT B.id AS id, B.Name AS name
FROM B
) AS Tbl
GROUP BY Id, Name HAVING COUNT(*) = 1; --대칭차집합
SELECT *
FROM A
WHERE NOT EXISTS(
SELECT DISTINCT *
FROM B
WHERE A.Id = B.Id
)
UNION ALL
SELECT *
FROM B
WHERE NOT EXISTS(
SELECT DISTINCT *
FROM A
WHERE A.Id = B.Id
) -- 대칭차집합
SELECT *
FROM A
WHERE A.Id NOT IN (
SELECT DISTINCT B.Id
FROM B
)
UNION ALL
SELECT *
FROM B
WHERE B.Id NOT IN(
SELECT DISTINCT A.Id
FROM A
) --대칭차집합
DECLARE @변수명 데이터형식
SET @변수이름 = 변수값
SELECT @변수명
PREPARE 지정이름 FROM 'sql문 + ?'
EXECUTE 지정이름 USING @변수명
DEALLOCATE PREPARE 지정이름;
IF 조건문 THEN
실행문
END IF; -- if문 한 개
DROP PROCEDURE IF EXISTS ifProc;
DELIMITER $$
CREATE PROCEDURE ifProc(INOUT count INT(4), IN inc INT(4))
BEGIN
DECLARE num INT;
SET num = 200;
IF num = 100 THEN
SET count = count+inc;
ELSE
SET count = count - inc;
END IF;
END $$
DELIMITER ;
SET @counter = 1;
CALL ifProc(@counter, 1); --2
SELECT @counter;
CASE
WHEN 조건 THEN 결과
...
ELSE
END
WHILE 조건식 DO
SQL문
END WHILE;
DROP PROCEDURE IF EXISTS whileProc;
DELIMITER $$
CREATE PROCEDURE whileProc()
BEGIN
DECLARE i INT;
DECLARE hap INT;
SET i=1;
SET hap = 0;
myWhile:
WHILE (i<=100) DO
IF(i%4=0) THEN
SET i = i+1;
ITERATE myWhile;
END IF;
SET hap = hap + i;
IF (hap>1000) THEN
LEAVE myWhile;
END IF;
SET i = i+1;
END WHILE;
SELECT '1부터 100까지 4의 배수 제외 합, 1000 넘으면 종료', hap;
END $$
DELIMITER ;
CALL whileProc();
CREATE VIEW 뷰이름(열 이름)
AS SQL문
CREAE OR REPLCAE VIEW 뷰이름(열 이름)
AS SQL문
DROP VIEW 뷰이름;
SELECT SUM(a) OVER(PARTITION BY b)
FROM table
WITH A as
( SELECT * FROM B )
SELECT * FROM A