SQL 정렬, 그룹화
ORDER BY
특정 기준으로 정렬
ASC(오름차순), DESC(내림차순)
SELECT * FROM [TBLNAME] ORDER BY COLUMN ASC;
GROUP BY
특정 기준으로 그룹
SELECT COLUMN1, COLUMN2 FROM [TBLNAME] GROUP BY COLUMN1;
UNION
여러개의 SELECT 하나의 테이블이나 결과 집합으로 나타냄
각각의 SELECT 문으로 선택된 필드의 개수와 타입은 모두 같아야함
중복제거가 자동 포함
SELECT COULMN1, COLUMN2... FROM [TBLANME] UNION SELECT COLUMN1, COLUMN2 FROM [TBLNAME]
ALIAS
테이블에 또 다른 이름 지어줌
SELECT COLUMN1 FROM (SELECT * FROM [TBLNAME1] UNION SELECT * FROM [TBLNAME2]) AS S
JOIN
여러 테이블에서 가져온 데이터를 조합하여 하나의 테이블이나 결과 집합으로 표현해주는 SQL 함수
INNER JOIN
- 왼쪽 테이블과 오른쪽 테이블이 모두 가지고 있는 데이터
- ON 절과 함께 사용되며, ON의 조건을 만족하는 데이터만 가져옴
- MySQL에서는 JOIN, INNER JOIN, CROSS JOIN이 모두 같은 의미로 사용
SELECT * FROM [TBLNAME1] INNER JOIN [TBLNAME2] ON 조건 WHERE 조건
ex)
SELECT * FROM Member INNER JOIN Student
ON Member.ID=Student.ID
WHERE Member.Name="홍길동";
단순히 FROM절에 ,를 써도 INNER JOIN으로 치부된다.
SELECT * FROM Member, Student
ON Member.ID=Student.ID AND Member.Name="홍길동";
on 조건에 부합하는 레코드 값만 가지므로 어떤 기준에서 조인하든 상관없다
추가로 SELECT *은 모든 값을 조회 한것이므로 특정 값만 조회하려면
SELECT COLUMN1 COLUMN2
와 같이 표시할 수 있다
LEFT JOIN
- 왼쪽 테이블을 기준으로 오른쪽 테이블을 조합
- ON 의 조건을 만족하지 않는 경우
왼쪽 테이블의 필드 값은 그대로 가져오고 오른쪽 테이블의 필드 값은 모두 NULL로 표시
SELECT * FROM [TBLNAME1] LEFT JOIN [TBLNAME2] ON 조건 WHERE 조건
ex)
SELECT * FROM Member LEFT JOIN Student
ON Member.ID=Student.ID
WHERE Member.Name="홍길동";
INNER JOIN과 달리 어떤 순서로 조인하나에 따라 행의 개수가 달라지기 때문에 테이블 순서가 상당히 중요함
따라서 가장 첫 번째의 테이블로 SELECT문에 가장 많은 열을 가져와야 할 테이블을 우선으로 적어줘야 한다
RIGHT JOIN
- 오른쪽 테이블을 기준으로 왼쪽 테이블을 조합
- ON 의 조건을 만족하지 않는 경우
오른쪽 테이블의 필드 값은 그대로 가져오고 왼쪽 테이블의 필드 값은 모두 NULL로 표시
SELECT * FROM [TBLNAME1] RIGHT JOIN [TBLNAME2] ON 조건 WHERE 조건
ex)
SELECT * FROM Member RIGHT JOIN Student
ON Member.ID=Student.ID
WHERE Member.Name="홍길동";
FULL OUTER JOIN
대부분 DB는 FULL OUTER JOIN을 지원하지 않는다
SELECT * FROM Member FULL OUTER JOIN Student
ON Member.ID=Student.ID
WHERE Member.Name="홍길동";
를 다른 방법으로 구현할 수 있다.
(SELECT * FROM Member LEFT JOIN Student
ON Member.ID=Student.ID
WHERE Member.Name="홍길동")
UNION
(SELECT * FROM Member RIGHT JOIN Student
ON Member.ID=Student.ID
WHERE Member.Name="홍길동")
LEFT JOIN한 테이블과 RIHGT JOIN한 테이블을 UNION해주면 자동으로 중복을 제거하여 새로운 테이블을 만들어준다
SUBQUERY
하나의 SQL 문 안에 포함되어 있는 또 다른 SQL 문
메인 쿼리가 서브 쿼리를 포함하는 종속적인 관계
서브쿼리 실행 -> 메인(부모)쿼리 실행
SELECT * FROM Member
WHERE Student IN (
//서브쿼리
SELECT Name FROM Member where ...
);
괄호()안에 있는 쿼리가 서브 쿼리
조인(JOIN): 참여하는 모든 테이블이 대등한 관계. 어느 위치에서든 자유롭게 사용이 가능
서브쿼리: 메인쿼리 컬럼 모두 사용 가능
메인쿼리: 서브쿼리 컬림 사용 불가
서브쿼리 장점
- 쿼리를 구조화 시키므로, 쿼리의 각 부분 명확히 구분
- 복잡한 JOIN, UNION 보다 좀 더 읽기 편함 (가독성이 좋음)
서브쿼리 사용할 때 주의할점
- SELECT문으로만 작성
- 괄호()로 감싸서 사용
- 단일 행 또는 복수 행 비교 연산자와 함께 사용가능
- ORDER BY 사용 불가
- 끝에 ;(세미클론) 쓰지 않음
서브쿼리 사용 가능한 곳
- SELECT
- FROM
- WHERE
- HAVING
- ORDER BY
- INSERT문의 VALUES
- UPDATE문의 SET
서브쿼리 위치에 따른 명칭
SELECT COLUMN (SELECT ...) -> 스칼라 서브쿼리(Scalar Sub Query): 하나의 컬럼
FROM (SELECT ...) -> 인라인 뷰(Inline View): 하나의 테이블
WHERE COLUMN = (SELECT ...) -> 일반 서브쿼리: 하나의 변수
중첩 서브쿼리
- 단일행 서브쿼리(Single Row Subquery)
리턴 값이 1 이하인 서브쿼리, 단일행 비교 연산자
SELECT Name, Birth
FROM Member
WHERE Email = (SELECT Email FROM Member Where Name="홍길동");
-> 이름이 홍길동인 사람의 Email과 같은 사람의 Name과 Birth를 출력
- 다중행 서브쿼리(Multiple Row Subquery)
리턴 값이 여러개, 단중행 비교 연산자
SELECT *
FROM Member
WHERE ID >= (SELECT ID FROM Member Where Name="홍길동");
-> 홍길동의 ID보다 더 크거나 같은 값을 모두 출력
조건이 여러개 들어올땐 IN, ANY, ALL, EXISTS 등의 연산자로도 사용할 수 있음
여기서 IN과 ANY는 OR을 의미하고 ALL은 AND를 의미
SELECT *
FROM Member
WHERE ID = ANY(SELECT ID FROM Member Where Birth='2000-01-01');
-> 생일이 같은 2000년 1월 1일생인 사람들을 출력
인라인 뷰(Inline View)
FROM 절에서 사용되는 서브쿼리
서브쿼리가 FROM절에 사용된 경우 무조건 AS 별칭을 지정해주어야 한다
SELECT *
FROM (SELECT *
FROM Member AS Hong
WHERE Name='홍길동');
Hong은 서브쿼리 별칭으로 사용되었다
결과를 동적으로 생성된 테이블로 사용할 수 있으나 데이터베이스에 직접적인 영향은 X
스칼라 서브쿼리(Scalar Subquery)
SELECT 절에서 사용되는 서브쿼리
딴 테이블에서 어떠한 값을 가져올때 쓰임
하나의 레코드만 리턴이 가능, 두개 이상의 레코드는 리턴할 수 없다
SELECT StudentID,(
SELECT Name, Birth
FROM Member
WHERE Name='홍길동'
)
FROM Student
WHERE Name='홍길동'
'백엔드 공부일지 > 데이터베이스 공부일지' 카테고리의 다른 글
[DATABASE] 관계형 데이터 베이스, ERD 설계 (0) | 2024.05.22 |
---|---|
[DATABASE] 기본키, 외래키, 복합키의 개념 (1) | 2024.05.18 |
[DATABASE] My SQL 기초 문법 (0) | 2024.05.15 |
[DATABASE] 데이터베이스 개념 (0) | 2024.05.15 |