SQL(Structured Query Language)은 구조화된 쿼리 언어의 약자로 관계형 데이터베이스 관리 시스템의 데이터를 관리하기 위해 설계된 프로그래밍 언어이다.
SQL을 사용하면 데이터베이스 관리 시스템(RDBMS)에서 데이터를 저장, 수정, 삭제 및 검색 할 수 있다.
가. 데이터는 엄격한(정해진) 데이터 스키마를 따라 데이터베이스 테이블에 저장된다.
이는 더 많은 필드의 레코드 또는 적은 필드의 레코드는 추가할 수 없다는 의미다.

데이터를 여러개의 테이블로 나누어서 데이터들의 중복을 피할 수 있다. 예를 들어 사용자가 구매한 상품을 나타내기 위한 주문한 상품을 보여주기 위해서 각 각 User(사용자), Product(상품), Order(주문한 상품)을 만들어야 하지만 각각의 테이블들은 다른 테이블에 저장되지 않은 데이터 만을 가지고 있다.


NoSQL은 비관계형 데이터베이스로 SQL과 다른 접근 방식을 따르기 때문에 붙혀진 이름이다. NoSQL에서 데이터 레코드를 문서(document)라고 부른다.
NoSQL에서는 SQL과 다르게 접근하기 때문에 스키마도, 관계도 없다
따라서 SQL에서 진행한 물품 구매의 경우 많은 주문(Order)이 있을 경우
주문들(Orders) 컬렉션에 넣는다.
여러 테이블 컬렉션에 조인(Join)할 필요없이 완전한 데이터를 갖추게 된다.
실제로 Join이라는 개념은 없지만 만약 Join을 하고 싶으면 외래키를 참조해서 집어 넣는데 이는 좋은 방법이 아니다.
대신 컬렉션을 통해 데이터를 복제하여 각 컬렉션의 일부분에 속하는 데이터를 산출 할 수 있다.

하지만 이 경우에 데이터가 중복이 되는 불안정성이 존재한다.
컬렉션 A와 B의 데이터를 복제하여 사용하는 C가 있는데 A를 업데이트 하고 C를 업데이트 하지 않은 경우가 발생할 수 있다는 것이다.
특정 데이터를 같이 사용하는 모든 데이터에서 똑같은 데이터를 업데이트를 해야 한다.
이 때문에 자주 변경되지 않는 데이터를 사용하는데 유용하다.
단순히 데이터 서버의 성능을 확장하는 것으로 CPU업그레이드를 예로 들 수 있다. SQL의 경우는 수직적 확장만을 할 수 있다.
데이터 서버의 성능을 확장하는 것이 아닌 서버를 추가하는 것으로 NoSQL만 가능함.
가) 명확하게 정의된 스키마로 데이터의 무결성을 보장한다.
나) 관계는 데이터 중복 없이 단 한 번만 저장된다.
가) NoSQL보다 덜 유연하며 명확하게 정의된 스키마로 인해 사전에 계획되고 알려져야 함(수정이 번거롭거나 불가능할 경우가 있음)
나) 관계를 맺고 있기 때문에 JOIN문에 복잡한 쿼리가 들어갈 수 있음
다) 수평적 확장이 어렵고 수직적 확장만 가능하다.
가) SQL보다 유연함, 언제든지 데이터를 조정할 수 있고 필드를 추가할 수 있음
나) 어플리케이션에 맞는 데이터를 작성할 수 있어 속도가 빠름
다) 수직 및 수평 확장이 가능하므로 데이터베이스가 애플리케이션에서 발생시키는 모든 읽기 / 쓰기 요청을 처리 할 수 있다.
가) 유연성으로 인해 데이터 구조를 못정할 수 있음.
나) 업데이트 시 관련된 모든 레코드를 업데이트 해야함.