SQL은 데이터베이스에서 원하는 데이터를 추출하고 분석하는 데 도움을 주는 쿼리 언어로, 데이터베이스에서 데이터를 추축하고 조작하는 데에 사용하는 데이터 처리 언어이다.
쉽게 말해,
라고 할 수 있다.
💡 쿼리(query)란?
query
란 쉽게 얘기해서 데이터베이스(DB)에 정보를 요청하는 것을 말한다.클라이언트가 서버에게 특정한 키워드에 대한 검색 요청을 하면, DB에서 해당 키워드를 찾아 해당 내용을 서버에게, 최종적으로 클라이언트에게 응답하는 형식이다.
때문에 인터넷 검색 시
http://google.com
?serach='nike'
👈 이부분에 해당하는 것이 쿼리이다.
❓ SQL VS NoSQL
가장 큰 차이점은 SQL은 관계형 데이터 베이스(RDBMS)로, 테이블(table)이라는 최소 단위로 구성되며, 이 테이블은 하나 이상의 열(column)과 행(row)으로 이루어졌으며, 모든 데이터가 해당 테이블에 저장된다.
반면 NoSQL은 문서 지향 데이터베이스로, 데이터의 구조가 고정되어 있지 않은 데이터베이스이다.
※ DBMS는 크게 계층형, 망형, 관계형, 객체 지향형, 객체 관계형, 문서형 등이 있다.
※ 많이 쓰이는 MySQL, Oracle, SQLite, PostgresSQL, MariaDB는 모두 관계형 데이터 베이스이다.
👀 DB와 DBMS란?
- DB(Database) : 데이터의 집합
- DBMS(Database Managment System) : 데이터 베이스를 관리하고 운영하는 소프트위어
- DBMS는 대용량의 데이터를 사용하고 저장 관리할 수 있다.
- DBMS는 공유개념을 가져, 동시에 다른 사용자가 공유할 수 있다.
SQL의 연산자란, WHERE절에서 산수와 같은 연산을 수행하기 위해 사용되는, 사전에 예약된 단어 또는 문자를 말한다.
연산자는 SQL문에서 조건을 명시할 때나 여러 개의 조건을 위한 접속사로 사용된다.
키워드(SELECT, FROM 등)은 대/소문자 둘다 가능하지만, 사용자가 작성한 열과 테이블 이름과 ↔️ 기본 SQL 구문 문법을 구분하기 위해 보통 대문자로 표기한다.
SELECT column FROM table
모든 열 데이터 보기(전체) : SELECT * FROM film;
특정 열 보기 : SELECT title FROM film;
column
FROM table
해당 열에서 중복되지 않는, 고유한 값만 반환하고 싶을 때 사용한다.
SLECT DISTINCT `column` FROM `table`
SLECT DISTINCT(`column`) FROM `table`
column
값을 직접 넘겨줄 수 있다.column
FROM table
해당 열의 개수를 구하고 싶을 때 사용한다.
SELECT COUNT column FROM table
// SELECT COUNT realease_year FROM film;
SELECT COUNT(column) FROM table
// SELECT COUNT (realease_year) FROM film;
해당 열에서 고유한 값이 몇개인지 구하고 싶을 때 사용한다.
SELECT COUNT (DISTINCT column) FROM table
// SELECT COUNT (DISTINCT realease_year) FROM film;
열에 조건을 지정하여 그에 맞는 행이 반환되도록 할때 사용한다.
SELECT column1, column2 FROM table WHERE conditions;
SELECT name, choice FROM table WHERE name='David';
SELECT name, choice FROM table WHERE name='David' AND choice=Red;
SELECT *`FROM film WHERE rental_rate > 4;
SELECT COUNT(title) FROM film WHERE rental_rate > 4;
💡 조건을 적용하여 필터링할 때는 열을 두 개 이상 선택해야 한다.
PostgreSQL에서 가끔 동일한 요청에 대해 쿼리 결과를 다른 순서로 반환할 때가 있다. 이 문제를 해소하기 위해 요청 쿼리 결과를 특정한 순서로 표시하고 싶다면, ORDER BY를 이용할 수 있다
ORDER BY를 이용해 열의 값에 따라 오름차순 또는 내림차순으로 행을 정렬 할 수 있다. 또한 ORDER BY를 여러 열에 사용할 수 있다.
- 문자열 : 알파벳 순
- 숫자열 : 번호순
SELECT column_1, column_2 FROM table ORDER BY column_1 ASC / DESC
표에서 정렬을 원하는 열을 선택을 선택한 후, 어떤 열을 기준으로 정렬할 지 결정한다.
쿼리 맨 마지막에 오름차순(ASC) 또는 내림차순(DESC)으로 정렬 방식을 결정한다.
이떄 정령 방식을 정하지 않으면, 기본값으로 오름차순 정렬이 된다.
💡 선택(SELECT)이나 필터링(WHERE) 구문이 있을 경우, ORDER BY 앞에 입력한다
SELECT Company, Name, Sales FROM table ORDER BY Company, Sales;
SELECT store_id, first_name, last_name FROM customer
ORDER BY store_id DESC, first_name ASC;
각 열마다 정렬 기준을 결정할 수 있다.
또한 SELECT 요소에서 store_id를 제거해도 동일한 순서로 정렬되는데, SELECT문은 실제로 요청하지 않은 열로도 정렬된다.
💡 SELECT으로 A열을 설정하지 않아도, ORDER BY를 통해 A열을 기준으로 정렬할 수 있다. 하지만 보편적으로 정렬 기준이 되는 열(ORDER BY)은 선택(SELECT)하는 것이 좋다.
LIMIT은 쿼리에 대해 반환되는 행의 개수를 제한할 수 있는 명령어이다.
특히 LIMIT은 테이블의 모든 행을 반환하는 것이 아니라, 상위 몇 개의 행만 표시하여 테이블 레이아웃을 파악하려고 할 때 유용하다.
LIMIT은 쿼리 요청의 가장 아래로 내려가며, 가장 마지막에 실행되는 명령이다.
👉 LIMIT이 하는 일을 생각하면 당연하다. 왜냐하면 LIMIT이 하는 일은 WHERE문으로 필터링하고, ORDER 문으로 정렬 및 분류를 거친 다음 LIMIT을 통해 최적적으로 몇 개의 행을 표시할 건지 결정하기 때문이다.
SELECT * FROM payment
ORDER BY pament_date DESC
LIMIT 10;
SELECT * FROM payment
WHERE amount != 0.00 또는 WHERE amount > 0.00
ORDER BY pament_date DESC
LIMIT 10
BETWEEN 연산자는 값을 값 범위와 비교할 때 사용한다.
BETWEEN 연산자는 WHERE문 뒤에 사용하는 조건문으로 쓰인다.
대표적으로 low값과 high값 사이의 값을 조회해 볼 수 있다. 이때 low값과 high값도 포함된다.
SELECT * FROM payment
WHERE value BETWEEN low AND high
=== value >= low AND value <= high
SELECT * FROM payment
WHERE value NOT BETWEEN low AND high
=== value < low OR value > high
low와 high 사이에 포함되지 않는 값
SELECT * FROM payment
WHRER date BETWEEN '2007-01-01' AND '2007-02-01';
💡 날짜를 비교할 땐, 타임스탬프 정보도 포함되기 때문에 날짜뿐만 아니라 시간, 분, 초도 모두 포함된다.
따라서 날짜를 비교할 땐 주의가 필요하며, 특히 자정(00:00)을 포함할 것인지 결정해야 한다.
예를 들어 12/11 ~ 12/12일까지의 기록을 보고 싶다면,
-> ~ AND '2023-12-12' 는 11일의 자정(24:00)까지가 되므로, ~AND '2023-12-13'로 해야 12일의 자정(24:00)까지의 데이터를 필터링할 수 있다.
테이들의 1개 이상의 다중 옵션을 확인해야 할 때 사용하며, 옵션에 대해 OR문을 적용한다.
SELECT * FROM table
WHERE value IN('option1', 'option2');
SELECT * FROM table
WHERE value NOT IN('option1', 'option2');
SELECT * FROM payment
WHERE color IN('red', 'blue');
문자열 데이터에 대한 패턴 매칭을 할 때 사용한다. 이때 LIKE는 대소문자를 구분하고, ILIKE는 대소문자를 구분하지 않는다.
ex. @gmail.com으로 끝나는 모든 이메일 결과 반환
문자의 순서나 문자의 수에 상관 없이 매칭된다.
대문자 A로 시작하는 값들을 순서에 상관없이 알고싶을때
~
WHERE name Like A%
대문자 A로 끝나는 값들을 순서에 상관없이 알고싶을때
~
WHERE name Like %A
단 하나의 문자만 매칭되며, 문자열 내에 있는 하나의 문자만 사용되는 와일드카드이다.
~
WHERE name Like '_her%''