SQL(Structured Query Languae)은 데이터베이스와 소통할 수 있는 구조화된 쿼리 언어이다.
파이썬과 다르게 쿼리(query)라는 단어가 나오게되는데 이 쿼리(query)는 무엇일까??
직역을 했을 때 "질의문" 이라고 볼 수 있다. 예를들어 검색을 할 때 입력하는 검색어도 일종의 쿼리라고 볼 수 있다.
즉, SQL이란 데이터베이스 용 프로그래밍 언어이다. 따라서, 데이터베이스에 쿼리를 보내 원하는 데이터만 가져올 수 있다.
그리고 이름에서 알 수 있듯이 SQL은 structured즉 relation이라고도 불리는, 데이터가 구조화된 테이블을 사용하는 데이터베이스 에서 활용 가능하다.
반면 데이터 구조가 고정되어 있지 않은 데이터베이스들은 NoSQL이라고도 불린다. 관계형 데이터베이스와는 달리 테이블을 사용하지 않고 다른 형태로 데이터를 저장한다. 예를들어 MongoDB와 같은 문서 지향의 데이터베이스가 있다.
위와 같이 고객릴레이션이라는 테이블에서 고객아이디와 같은것을 기본키 라고 한다. 외래키 설명을 통해 이해를 도울 수 있다.
이 둘의 관게 를 정리하면 다음과 같다.
< 사진출처 : 네이버 지식백과 >
참고) Primary키는 unique즉, 중복이 없고, NULL값이 있으면안되며 수정,업데이트가 되어서는 안된다. 기본키가 수정및 업데이트 되면 다른 테이블도 변경을해줘야하기 때문(외래키있는테이블)
데이터 베이스에는 여러 테이블들이 서로 관계를 가지고 있는 경우가 많다. 종류로는 1:1 관계, 1:N관계, N:N관계, 테이블자체관계(self referencing) 이렇게 네가지가 있다.
테이블의 레코드 하나당 다른 테이블의 한개의 레코드와연결된 경우이다.
위의 사진을 예로 들었을때 고객아이디(고객)당 주문번호가 1개인것을 의미한다. 사실 이런경우는 흔치않다. 왜냐하면 고객한명당 여러개의 주문이 존재할 가능성이 크기때문이다.
한명의 고객이 여러개의 주문번호를 가지고 있는경우이다. 또 다른 예로 한 유자가 가지고 있는 전화번호가 여러개 일 수 있다는 예시를 들 수 있다. 하지만 반대는 성립이 될 수없다. 즉, 한 전화번호는 한 명의 유저만 가질 수 있다.
여러 개의 레코드가 여러 개의 레코드를 가지는 관계이다.
이런경우 조인함수를 사용하여 따로 테이블을 만들어 관리해야한다.
예를들어 여행 상품이 있다고 가정했을때 여러 개의 여행 상품이 있고 여러명의 고객이 있을때, 한고객은 여러 여행상품을 사용할 수 있고, 한 여행상품은 여러 고객을 가질 수 있다.
N:N관계는 1:N관계 두개로 만들 수 있다.
위와 같은 형태로 '조인 테이블'로 만들어 볼 수 있다.
때때로 테이블 내에서 관계가 필요한 경우도 있다. 예를들어 추천인을 파악하는것인데, 한명의 유저가 한명을 추천할 수 있으면 추천을 받는 유저는 여러명에서 부터 추천을 받는것이 된다.
이를 자기참조 관계라고 부른다.
단어 뜻 그대로 데이터셋에 포함될 특성들을 특정한다.
테이블과 관련이 있는 경우 필수로 명시해야 하는 명령어이다. 결과를 도출할 데이터베이스 테이블을 명시하는 것이다.
위 그림을 해석하면 SELECT *은 전체를 선택한다는 뜻입니다. FROM은 사용한 테이블을 지정을 해주어 tracks라는 테이블을 가져와 전체를 확인한다는 뜻입니다. 출력을 하게되면 아래와 같이 출력이 된다.
그렇다면 코드를 SELECT Name FROM tracks ; 이렇게 해준다면
위와 같이 Name만 출력이된다.
즉 SELECT은 가져오고자 하는것을 입력하고 FROM은 테이블을 선택하는것이다.
이때 주의해야 할 점은 쿼리문 마지막에는 항상 ;을 붙여주어야 한다.
그리고 이후에 많은 테이블을 불러올때 혼란을 방지하기 위한 코드작성법을 알아보았다.
tracks라는 테이블을 불러올때 뒤에 t를 적게되면 tracks를 t로 저장해서 불러오겠다는 뜻이다. tracks는 너무 길기때문에 변수로 불러오는것이다. 이것이 효과적인 이유는 SELECT를 보면 두개의 컬럼을 지정한것을 알 수 있다. 현재는 한개의 테이블이지만 join을 하여 여러개의 테이블을 합쳤을때는 어떤 테이블의 변수인지를 알기 위해 변수를 앞에 붙이고 뒤에 컬럼명을 써줌으로서 혼란을 방지할 수 있다. 이를 출력해 보면 다음과 같다.
WHERE는 필터역할을 하는 쿼리문입니다. 즉, 파이썬에서의 if문과 비슷한 역할을 합니다.
위와 같이 WHERE에 t.TrackID <5 ;를 주었다고 해보자, 이는 tracks테이블의 TrackID가 5보다 작은 조건을 말한다. 즉 5보다 작은것만을 가져오는것으로 필터를 넣어준 것이다. 결과값을보면
필터가 적용되어 출력되는것을 알 수 있다.
이 외에도 여러가지가 있다.
위의 경우의 수를 순서대로 아래에 출력해 보겠다.
유니크한 값들을 받고 싶을 때에는 SELECT뒤에 붙여 사용할 수 있다.
특성이 여러개일때 똑같이 DISTINCT를 붙이면 어떻게 될까
이런식의 구조를 가지고 있을때에는
특성_1, 특성_2, 특성_3의 유니크한 조합 값들을 선택한다.
INNER JOIN 테이블_2 ON 테이블_1 특성 = 테이블_2 특성
이때 주의할 것은같은 특성끼리 합쳐져야 하며 이때 같은특성은 같은 KEY를 뜻한다.
합쳐질때 INNER JOIN이므로 둘의 특성의 공통된것들이 합쳐진것이다(교집합).
그렇다면 OUTER JOIN은?? OUTER JOIN을 하면 합집합 즉, 전체를 JOIN해 준다.
LEFT JOIN은 왼쪽에 있는 것과 같은것을 오른쪽 테이블에서 가져와 JOIN해 준다.