1. IF
- 조건식에 따라 참인 경우 A, 거짓인 경우 B를 출력하는 명령어 .
- 형식 : IF (조건식, 참일 때의 값, 거짓일 때 값)
- SELECT 절에 사용한다.
-- speed가 60 이상인 경우 fast, 미만인 경우 slow
SELECT name, IF(speed >= 60, ‘fast’, ‘slow’)
FROM carInfo;
2. IFNULL
- 데이터가 NULL일 때 새로운 값을 반환하는 함수
- 형식 : IFNULL ( 컬럼명 , NULL 일 때 값 )
- 주로 SELECT 절에서 사용한다.
SELECT name, IFNULL(speed, ‘unknown’)
FROM carInfo;
3. CASE
- 조건을 여러개 만들 때 사용하는 명령어
- 주로 SELECT 절에서 사용한다.
- ELSE 문장을 생략하면 NULL 값을 반환한다.
- 형식 :
- CASE 컬럼명
- WHEN 조건식 1 THEN 결과값1
- WHEN 조건식 2 THEN 결과값2
- ELSE 결과값 3
- END
SELECT name,
CASE
WHEN speed >= 100 THEN ‘very fast’
WHEN speed >= 60 THEN ‘fast’
ELSE ‘slow’
END AS speed_class
FROM carInfo;
4. 함수 만들기
- 원하는 기능을 하는 함수를 직접 만들 수 있다.
- 형식 (함수 만들기)
CREATE FUNCTION
함수이름 ( 입력값이름 데이터타입, 입력값이름2 데이터타입2, ...) -- 입력 변수 지정
RETURNS
결과값 데이터타입 --출력 변수 지정
BEGIN
DECLARE 임시값이름 데이터타입; -- 함수 내에서 쓸 임시 변수 선언
SET 임시값이름 = 입력값이름; -- 선언한 변수에 입력변수 지정
쿼리; -- 실제 함수 기능
RETURN 결과값 -- 출력값 리턴, 여기는 S를 붙이지 않는다.
END
- 형식 ( 함수 지우기)
DROP FUNCTION 함수이름;
- MySQL Workbench에서 함수 생성하기
SET GLOBAL log_bin_trust_function_creators = 1; -- 함수 만들기 권한 설정
DELIMITER -- 함수 시작부분 지정
(함수 만들기 코드)
DELIMITER ; -- 함수 끝 부분 지정, 반드시 R과 ; 사이 한칸 띄우기
내가 원하는 데이터가 서로 다른 테이블에 있다면?
그 테이블들을 엮어 하나로 합쳐서 조회한다.
테이블을 합칠 때엔 두개의 테이블의 컬럼중 같은 의미의 값을 가지는 컬럼이 있어야 한다.
같은 의미의 값을 가지는 컬럼을 기준으로 테이블을 합친다.
합칠 때 사용하는 명령어는 JOIN 이다.
JOIN의 종류는 다음과 같다
1. INNER JOIN
- 두 테이블 모두에 있는 값만 합친다.
- JOIN의 기본값이 INNER이므로 그냥 JOIN만 써도 상관없다.
- 형식
SELECT * FROM carInfo C
INNER JOIN abilityInfo A
ON A.car_id = C.car_id;
2. RIGHT, LEFT
- 두 테이블 중 한쪽값을 기준으로 테이블을 합체
- RIGHT는 오른쪽 테이블의 기준값을 중심으로 왼쪽 테이블에 존재하는 로우들만 가지고 온다.
- 예를 들어 id가 5인 로우가 오른쪽 테이블에 있고 왼쪽 테이블에는 없다면, 왼쪽 테이블에서 가져올 값들이 없으므로 합체로 인해 새로 늘어난 칼럼들은 NULL로 채운다.
- 이를 통해 왼쪽이나 오른쪽 테이블 둘중 한군데에만 존재하는 로우가 몇개인지 구할 수 있다.
SELECT * FROM carInfo C
RIGHT JOIN abilityInfo A
ON A.car_id = C.car_id;
SELECT * FROM carInfo C
LEFT JOIN abilityInfo A
ON A.car_id = C.car_id;
3. OUTER JOIN
- 두 테이블에 있는 모든 값을 합친다.
- LEFT와 RIGHT의 집합 결과는 UNION 하여 중복을 제외하고 합쳐서 보여준다.
- MySQL에 없는 키워드이므로 아래와 같이 수동적으로 설정한다.
SELECT * FROM carInfo C
RIGHT JOIN abilityInfo A
ON A.car_id = C.car_id;
UNION
SELECT * FROM carInfo C
LEFT JOIN abilityInfo A
ON A.car_id = C.car_id;
4. CROSS JOIN
두 테이블에 있는 모든 값을 각각 합친다.
왼쪽 테이블 각 로우에 대하여 오른쪽 테이블 모든 로우를 합친다.
5. SELF JOIN
한 테이블을 JOIN 하는 것
number, name, model 세 컬럼으로 이루어진 carInfo를 SELF JOIN 한다면
number, name, model, number, name, model 로 이루어진 테이블을 출력한다.
join 명령어를 사용하는 외에도 데이터를 합치는 방식이 있다.
집합의 형식으로, 두개의 쿼리 결과를 합집합, 교집합, 차집합한 결과를 뽑을 수 있다.
join은 두 테이블을 컬럼을 기준으로 합체하는 것이고,
아래에 서술할 명령어들은 로우를 기준으로 결합한다.
예를 들어, UNION은 같은 합집합 명령어지만, 여러 쿼리 결과를 수직적으로 이어붙인다.
즉 join은 데이터가 여러 테이블에 걸쳐있고, 이 테이블들을 연결하여 관련 데이터를 함께 조회할때,
union은 동일한 구조의 데이터를 가진 여러 테이블이나 쿼리 결과를 하나의 결과 집합으로 모을 때 사용한다.
1. UNION, UNION ALL (합집합)
- 쿼리 A와 쿼리 B의 결과를 합쳐서 보여준다.
- UNION은 중복을 제외하고, UNION ALL은 중복을 포함해서 보여준다.
SELECT name
FROM myCar
UNION ALL
SELECT name
FROM friendcar;
2. INTERSECT (교집합)
- MySQL에는 INTERSECT라는 표현이 존재하지 않는다.
- JOIN을 사용하여 표현한다.
SELECT A.name
FROM mycar AS A
INNER JOIN friendcar AS B
ON
A.number = B.number
AND A.name = B.name
AND A.type = B.type
AND A.attack = B.attack
AND A.defense = B.defense
-- 교집합을 확인하려는 컬럼을 전부 ON뒤의 기준으로 두고 합친다.
-- 쿼리 결과 중 교집합 부분만 확인할 수 있다.
3. MINUS (차집합)
- MySQL에는 INTERSECT라는 표현이 존재하지 않는다.
- RIGHT, LEFT JOIN을 사용하여 표현한다.
SELECT A.name
FROM mycar AS A
LEFT JOIN friendcar AS B
ON
A.number = B.number
AND A.name = B.name
AND A.type = B.type
AND A.attack = B.attack
AND A.defense = B.defense
WHERE B.name IS NULL; -- A에는 있지만 B에는 없는걸로 집합
-- 차집합을 확인하고 싶은 컬럼을 전부 ON 뒤의 기준으로 두고 합친다.
'SQL' 카테고리의 다른 글
SQL 윈도우 함수 (0) | 2024.08.15 |
---|---|
SQL 서브쿼리 (0) | 2024.08.08 |
SQL 함수 (0) | 2024.08.01 |
SQL 쿼리 문법 (0) | 2024.08.01 |
SQL 명령어의 종류 (1) | 2024.08.01 |