DB

SQL Query 문법 (DDL, DML)

마손리 2022. 12. 14. 05:56

SQL문법에는 데이터정의어, 데이터조작어, 데이터제어어, 트랜젝션 제어어가 있으며 오늘은 데이터 정의어와 데이터 조작어에 대해 알아보고 w3schools의 데모 DB를 이용하여 사용해보았다.

(데모DB:https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all)

 

데이터 정의어(Data Define Language)

데이터 정의어란 CREATE, ALTER, DROP, RENAME등을 이용하여 데이터 구조를 정의하는데 사용되는 명령어 들이다. 

 

CREATE, DROP

CREATE TABLE EmployeesTest
(
EmployeeID uuid,  // 유니크 id 타입
LastName VARCHAR(10),   // 가변문자 타입으로 최대 10bytes의 저장공간을 부여
FirstName VARCHAR(10),
BirthDate DATE,   // 날짜 타입
Photo VARCHAR(20),
Notes VARCHAR(50)
);
// INT(size)로 숫자 타입을 부여할수 있으며 
// 타입 옆에 UNIQUE, NULL과 같은 속성들 추가 가능

DROP TABLE EmployeesTest  // Table 삭제

CREATE은 데이터 구조를 생성하는데 사용되며 TABLE과 같이 사용되면 테이블을, SCHEMA와 같이 사용하면 스키마를 생성한다. 

CREATE TABLE뒤에 생성할 테이블 명을 입력한후 괄호안에 같이 생성될 컬럼들의 이름과 속성을 적으면 된다.

DROP을 이용하면 생성된 테이블을 삭제해줄수 있다.

 

ALTER

ALTER TABLE EmployeesTest RENAME TO Employees  // 테이블 이름변경
ALTER TABLE EmployeesTest ADD Email VARCHAR // 테이블에 Email column추가
ALTER TABLE EmployeesTest DROP COLUMN Email // Email column 삭제
// ALTER를 이용하여 Table 및 Column의 정보들을 변경할수 있다

ALTER를 이용하면 테이블정보들을 변경해줄수 있게된다.

"ALTER  TABLE  [테이블명]  ADD(실행할명령어) ..." 와 같이 구성이된다.

 

 

데이터 조작어(Data Manipulation Language)

데이터 조작어로는 SELECT, INSERT, UPDATE, DELETE등이 있으며 테이블내의 데이터를 생성 및 변경, 삭제등과 같이 데이터를 조작하는데에 사용된다.

 

INSERT, UPDATE, DELETE

INSERT INTO EmployeesTest VALUES(1,"Lee","Taeseop",1989-01-26,"photo.jpg","SQL query test")
// INSERT를 이용하여 Table내의 Row를 생성하며
// NULL 속성이 있는경우 column들을 지정하여 생성가능

UPDATE EmployeesTest SET BirthDate = "1989-01-26" WHERE EmployeeID = 1
// 이미 생성된 Row를 업데이트 할때 사용

DELETE FROM EmployeesTest WHERE EmployeeID = 1
// 생성된 Row를 삭제

INSERT INTO [테이블명] VALUES(각각의 컬럼의 순서로 데이터를 넣어주면된다.)

위와 같이 SQL문은 굉장히 직관적이어서 이해하기 쉽다.

 

SELECT

SELECT Employees.* FROM Orders, Employees // SELECT를 사용하여 특정 데이터를 검색
WHERE Orders.EmployeeID = Employees.EmployeeID
ORDER BY BirthDate ASC
// 전체 직원들중 주문을 넣은 직원들만 출력하며 나이가 많은 순으로 정렬

SELECT는 특정한 데이터를 검색하는데 사용되며 FROM 뒤에는 테이블명이 온다. 

WHERE절에 Orders와 Employees의 테이블을 사용하므로 FROM에도 같은 테이블들을 지정해준다.

 

JOIN

JOIN을 이용하여 위와 같은 결과값을 보여줄수있다.

SELECT Employees.* FROM Employees 
JOIN Orders
ON Employees.EmployeeID = Orders.EmployeeID
ORDER BY BirthDate ASC

 

GROUP BY

위의 SQL문의 결과값을보면 같은 결과값이 무수히 나오는것을 확인할수 있다. 한명의 직원이 여지껏 많은양의 오더를 넣었기 때문인데 GROUP BY를 이용하면 중복된 값들을 모두 지워줄수 있다.

SELECT Employees.* FROM Orders, Employees
WHERE Orders.EmployeeID = Employees.EmployeeID
GROUP BY Employees.EmployeeID
// GROUP BY를 사용하여 중복된 결과값들을 제외시켜줄수있다.

이렇게 GROUP BY뒤에 중복될 값들을 지정해주면 같은 EmployeeID가 존재할경우 하나의 결과로만 나타난다. 

 

 

Subquery (데이터 조작어)

Subquery란 다른 쿼리 내부에 있는 SELECT문을 의미하며 일반적인 자바스크립트의 AND조건문으로 이해하니 쉬웠다.

 

Nested Subquery

WHERE절에 들어가는 Subquery를 중첩 서브쿼리(Nested Subquery)라고하며 이를 이용하여 조건을 더 추가해줄수 있다.

SELECT Employees.* FROM  Employees
WHERE Employees.EmployeeID 
IN (SELECT Orders.EmployeeID FROM Orders WHERE Orders.OrderDate between "1996-07-01" and "1996-07-09" )
GROUP BY Employees.EmployeeID
// Subquery에 명시한 기간에 주문을 한 직원들의 ID를 먼저 추출한뒤
// 그 ID를 가진 직원들의 모든 정보를 출력
// 마지막으로 GROUP BY를 사용하여 중복된 결과들을 제거

서브쿼리의 결과값 즉, 괄호안의 명령을 먼저 추출한뒤 그 결과값 안에서 메인쿼리가 실행된다.

 

Inline Views Subquery

중첩 서브쿼리와 달리 FROM절에 들어가는 서브쿼리를 인라인뷰 서브쿼리라 한다.

위의 중첩 서브쿼리와 결과값은 같지만 방식이 많이 다르다.

SELECT Employees.* 
FROM  (SELECT Orders.EmployeeID AS 직원 FROM Orders WHERE Orders.OrderDate between "1996-07-01" and "1996-07-09" ), 
		Employees
WHERE Employees.EmployeeID = 직원
GROUP BY Employees.EmployeeID
// Orders의 테이블에서 특정날짜에 주문을한 직원의 ID 검색
// 결과값을 "직원"이라는 가상의 테이블로 반환
// 이후 Employees 테이블에서 가상의 테이블과 일치하는 데이터를 출력

위의 코드를 보면 

먼저 원하는 정보 즉 위의 특정기간에 주문을 한 직원들의 ID를 Orders의 테이블에서 찾은뒤 "직원"이라는 가상의 테이블을 만들어 리턴해준다. 

그 이후 받은 가상의 테이블의 정보들과 일치하는 데이터를 출력해주면 된다.

'DB' 카테고리의 다른 글

SQL의 Join 정리  (0) 2023.03.31
관계형 데이터 베이스 설계  (0) 2023.03.29
SQL vs NoSQL  (0) 2023.03.28
SQL Query문 사용  (0) 2022.12.14