반응형
 

[DATABASE] My SQL 기초 문법

[DATABASE] 데이터베이스 개념데이터베이스 정의'데이터의 집합'데이터를 저장하고 조회하는 프로그램 통합 데이터(Integrated Data)최소 중복과 통제 가능한 중복만 허용하는 데이터중복된 정보에

mint10.tistory.com

 

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='홍길동'

 

 

반응형