1. SQL이란 ?
- SQL = '씨퀄'이라고 불림
- SQL은 1974년에 SEQUEL (씨퀄)로 탄생 했지만, 지금 이름인 SQL로 변경 되어 지금까지 SQL 불린다. 그러나 에 스-큐-엘 이 아닌 씨퀄로 주로 발음된다.
- 절차적 언어(procedural language)가 아닌 선언적 언어(descriptive language)
- ☝🏼 A STRUCTURED ENGLISH QUERY LANGUAGE ⇒ A STRUCIURED QUERY LANGUAGE
- 데이터 처리 방법은 SQL Query Optimizer 가 대신 처리함
- 필요한 데이터 집합을 SQL 로 정의하면 Query Optimizer 가 SQL를 처리 데이터, 하드웨어, 테이블 구조를 고려하여 처리하기 때문에, Data Scientist, Data Analyst 는 Business Problem 에 더 집중할 수 있음
- 데이터 처리 방법은 SQL Query Optimizer 가 대신 처리함
- - ETL이란 ? ⇒ Extraction Transformation Loading
- Relational Data Model ⇒ 관계형 데이터 모델 - EXCEL과 비슷하다고 생각하면됨
- 그럼 비 정형, 반 정형도 있음
- 비정형 - 텍스트 같은거
- 반정형 - json xml 같은거
- 그럼 비 정형, 반 정형도 있음
1.1 단일 라인 주석 (Single-line comment)
- 한줄 라인 주석은 '--' 를 사용한다.
--Select all:
SELECT *
FROM customer;
1.2 블록 주석 (Multi-line Comment)
- /* ~ */ 까지 안에있는 모든 내용이 주석 처리 된다.
/*Select all the columns
of all the records
in the customers table:*/ -- 여기까지 전부 주석처리
SELECT *FROM customer;
2. Select , Order by
- SELECT ⇒ 일방적으로 테이블에 저장 된 칼럼명을 조회할때 쓰인다
- ORDER BY ⇒
- ASC 오름차순 정렬
- DESC 내림차순 정렬 /
- 마지막에 세미콜론 절대 빼먹으면 안된다!!
- 다음줄에 실행되는 부분이랑 같이 실행되므로 오류가 뜬다!
SELECT
COLUMN_1
, COLUMN_2
, 중략...
FROM
TABLE_NAME
;
- 추출대상컬럼
- 만약 테이블의 모든 컬럼을 다 보고 싶다면 ‘ * ’을 붙여라 !
- 근데 이러면 연산량이 많아지니까 꼭 필요한 경우가 아니라면 쓰지말자 ! 조회할때는 필요한 컬럼만 쓰는 습관을 들이자 !
- 추출 대상 테이블명 입력
⇒ 세미 콜론으로 끝남
-- 사용방법
SELECT
COLUMN_1 , COLUMN_2
FROMTBL_NAME
ORDER BY
COLUMN_1 ASC
, COLUMN_2 DESC ;
/*
COLUMN_1은 오름차순 정렬 (Default는 ASC)
COLUMN_2은 내림차순 정렬 (Default는 ASC)
*/
- 실제예시
-- 실제 사용 예
SELECT
FIRST_NAME , LAST_NAME -- 이름과 성을 조회함
FROM
CUSTOMER -- 커스토머 테이블에서
ORDER BY -- 정렬은 1 Firstname 오름차 먼저하고 2 lastname 내림차 먼저한다.
1 ASC,
2 DESC
;
3. SELCET DISTINCT
⇒ 중복값 제외
📌 SELECT DISTINCT 문법
SELECT
DISTINCT COLUMN_1
FROM TABLE_NAME;
-- COLUMN_1의 값이 중복값 존재시 중복값을 제거
SELECT
DISTINCT COLUMN_1, COLUMN_2
FROM TABLE_NAME;
-- COLUMN_1+COLUMN_2의 값이 중복값 존재시 중복값을 제거
SELECT
DISTINCT COLUMN_1, COLUMN_2
FROM TABLE_NAME
ORDER BY COLUMN_1, COLUMN_2;
-- COLUMN_1+COLUMN_2의 값이 중복 값 존재 시 중복 값을 제거
-- 결과를 명확하게 하기 위해 ORDERBY절 사용
- SELECT DISTINCT 실습 - DISTINCT사용 + 컬럼두개 + ON사용 + DESC정렬
SELECT
DISTINCT ON (BCOLOR)
BCOLOR
, FCOLOR
FROM
T1
ORDER BY
BCOLOR, FCOLOR DESC;
/*
BCOLOR 컬럼 값 기준 중복 제거함
FCOLOR 컬럼 값은 단 한개 값만을 보여줌
FCOLOR 컬럼값을 보여줄때 내림차순 정렬함
*/
⇒ 그러니까 비 컬러 BCOLOR 기준으로 중복제거를 진행한 뒤에 f컬러 기준으로 정렬된 값에서 중복제거되고 남은 값의 행에 있는 값을 리턴한다.
4. 필터링 - WHERE
- 어떤 집합을 가져올지 정하는 부분 = 조건을 걸어서
SELECT
COLUMN_1 , COLUMN_2 , 중략...
FROM
TABLE_NAME
WHERE
<조건> ;
-- 어떤 집합을 가져올지에 대한 조건을 준다.
= 같음
파이썬은 == 인데 헷갈리지 말자 !
~보다 큰
< ~보다 작은
= ~보다 크거나 같은
<= ~보다 작거나 같은
<> , != ~가 아닌
AND 그리고
OR 혹은
- 먼저 sql을 짤때 alignment 를 하면서 짜야한다.
- Dbeaver 에서는
ctrl + shift + f
를 누르면 자동으로 정렬이 된다. - Tableplus 에서는 ??http://www.dpriver.com/pp/sqlformat.htm 에서 바꾸자
- Dbeaver 에서는
실습
- 조건 한 개
SELECT last_name,
first_name
FROM customer
WHERE first_name = 'Jamie';
-- FIRST_NAME이 ‘Jamie’ 인 행을 출력함
- 조건 두 개
SELECT last_name,
first_name
FROM customer
WHERE first_name = 'Jamie'
AND last_name = 'Rice';
-- FIRST_NAME이 ‘Jamie’ 이면서 LAST_NAME이 ‘Rice’ 인 행을 출력함
WHERE 절 실습
- 조건 두 개
SELECT customer_id ,
amount ,
payment_date
FROM payment
WHERE amount <= 1
OR amount >= 8;
-- AMOUNT가 1이하 이거나 amount가 8이상인 행을 출력
5. LIMIT
- 한정하다 제한하다라는 뜻
- ⇒ 출력하는 행의 수를 한정하는 역할
SELECT *
FROM table_name
LIMIT n;
-- 출력갯수 제한
SELECT *
FROM TABLE_NAME
LIMIT N OFFSET M ;
-- 출력하는 행의 수를 지정하면서 시작위치를 지정한다.
-- OFFSET M값의 시작위치는 0이다
.
6.FETCH
얼마나 중요하면 행의 수를 한정하는가?!
- 네트워크 한테 올때까지 많은 부하
- 클라이언트 한테 올때까지 많은 부하
때문에 행의 수를 한정한다.
출력하는 행의 수를 지정한다. N을 입력하지 않고 ROW ONLY 만 입력하면 단 한건만 출력한다.
SELECT *
FROM table_name
FETCH first [N] row only ;
- n대신 1을 쓰면 1건만 가져온다는 뜻
- 출력하는 행의 수를 지정하면서 시작위치를 지정한다.
- OFFSET N값의 시작위치는 0이다.
SELECT*
FROM TABLE_NAME
OFFSET N ROWS
FETCH FIRST [N] ROW ONLY
;
예시
select * --이건 주석다는 법입니다. :
from
film
order by title
offset 5 rows
fetch first 10 row only
;
7. IN 연산자
데이터 조회와 필터링
SELECT *
FROM TABLE_NAME
WHERE COLUMN_NAME IN (VALUE1, VALUE2, ...) -- 밸류 1, 밸류 2가 있는지 없는지 확인!!
;
COLUMN_NAME이 가지고 있는 집합에서 VALUE1, VALUE2 등의 값이 존재하는지 확인
SELECT *
FROM TABLE_NAME
WHERE COLUMN_NAME
IN (SELECT COLUMN_NAME2 FROM TABLE_NAME2) -- 서브쿼리라고 합니다.
;
COLUMN_NAME이 가지고 있는 집합에서 TABLE_NAME2의 COLUMN_NAME2의 집합이 존재하는지 확인
실습
SELECT customer_id ,
rental_id ,
return_date
FROM rental
WHERE customer_id IN (1,
2). -- 커스터머 아이디가 1혹은 2가 포함된 데이터만 ㄹㅌ/
--근데 개오래 걸림
ORDER BY return_date -- 리턴데이터 기준 내림차순!
DESC;
- (아래) OR 적는 것 = , 콤마찍는 것
SELECT customer_id,
rental_id,
return_date
FROM rental
WHERE customer_id = 1
OR customer_id = 2 --or 이라고 적어줘야함
ORDER BY return_date DESC;
SELECT customer_id ,
rental_id ,
return_date
FROM rental
WHERE customer_id NOT IN (1,
2)
ORDER BY return_date customer_id DESC;
- not in 을 쓰면 1도 2도 아닌것을 return
SELECT
CUSTOMER_ID , RENTAL_ID
, RETURN_DATE
FROM RENTAL
WHERE CUSTOMER_ID <> 1
AND CUSTOMER_ID <> 2
ORDER BY RETURN_DATE
DESC;
- NOT IN 연산자는 ‘AND’ && ‘<>‘ 과 같다
- 근데 위에 있는게 더 보기 좋다.
IN 연산자실습 - 서브쿼리
- 서브쿼리 ⇒ 메인쿼리에 도움이 되는 역할을 한다.
SELECT
from customer_id rental
WHERE cast (return_date AS date) = '2005-05-27';
'RETURN_DATE'가 2'005년 5월 27일'인 CUSTOMER_ID 를 출력한다. data라는 이름으로
- 테이블 설계 왜 하는가
- ⇒ 데이터의 중복을 방지하고자 설계. 정규화와 관련된 개념!
8. Between
- 특정 범위안에 들어가는 집합을 출력하는 연산자
SELECT *
FROM TABLE_NAME
WHERE COLUMN_NAME BETWEEN VALUE_A AND VALUE_B;
COLUMN_NAME >= VALUE_A AND
COLUMN_NAME <= VALUE_B
SELECT *
FROM TABLE_NAME
WHERE COLUMN_NAME
NOT BETWEEN VALUE_A AND VALUE_B
COLUMN_NAME < VALUE_A OR
COLUMN_NAME > VALUE_B
실습
SELECT CUSTOMER_ID , PAYMENT_ID, AMOUNT
FROM PAYMENT
WHERE AMOUNT BETWEEN 8 AND 9;
Amount 가 8과 9 사이인 집합을 선택한다.
-- 위와 같은코드
SELECT customer_id,
payment_id,
amount
FROM payment
WHERE amount >= 8
AND amount <= 9;
어느 것이 가독성이 더 좋을까 ? ⇒ 가독성은 그냥 FORMAT SQL을 하자 !
SELECT customer_id,
payment_id,
amount
FROM payment
WHERE amount NOT BETWEEN 8 AND 9;
AMOUNT가 8부터 9사이가 아닌 집합을 출력한다.
-- 동일한 결과를 알려줌
SELECT customer_id,
payment_id,
amount
FROM payment
WHERE amount < 8
OR amount > 9;
SELECT customer_id ,
payment_id ,
amount ,
payment_date
FROM payment
WHERE to_char(payment_date, 'YYYY-MM-DD’)
BETWEEN '2007-02-07' AND '2007-02-15';
-- 위랑 결과가 같음
WHERE
CAST(PAYMENT_DATE AS DATE)
BETWEEN '2007-02-07' AND '2007-02-15'
CAST 와 TO_CHAR 의 차이
- 둘다 형 변환하는 함수인데 https://aljjabaegi.tistory.com/462에 차이가 나와있다.
- CAST(형변환할 컬럼 AS 변환할타입)
- CAST 함수를 사용할 때 주의 하셔야 될 점 - 소수점을 포함하는 숫자 타입 변환 시 만약 기존 자릿수보다 작은 자릿수로 CAST 하게 되면 ROUND(반올림) 되어 처리됩니다.
9. Like / Isnull
SELECT *
FROM TABLE_NAME
WHERE COLUMN_NAME LIKE 특정패턴
- 특정 패턴과 유사한 집합을 나타낸다
SELECT *
FROM TABLE_NAME
WHERE COLUMN_NAME NOT LIKE 특정패턴
- 특정 패턴과 유사하지 않은 집합
- LIKE 연산자는 조회 조건 값이 명확하지 않을 때 사용합니다. LIKE 연산자는 ‘~와 같다’라는 의미입니다.
- ■ LIKE 연산자는 %와 _ 같은 기호 연산자(wild card)와 함께 사용합니다.
- 조건에는 문자나 숫자를 포함할 수 있습니다.
- %는 ‘모든 문자’라는 의미고,
- _는 ‘한 글자’라는 의미입니다.
'-' : 글자숫자를 정해줌(EX 컬럼명 LIKE '홍_동')
'%' : 글자숫자를 정해주지않음(EX 컬럼명 LIKE '홍%')
--A로 시작하는 문자를 찾기--
SELECT 컬럼명
FROM 테이블
WHERE 컬럼명 LIKE 'A%'
--A로 끝나는 문자 찾기--
SELECT 컬럼명
FROM 테이블
WHERE 컬럼명 LIKE '%A'
--A를 포함하는 문자 찾기--
SELECT 컬럼명
FROM 테이블
WHERE 컬럼명 LIKE '%A%'
--A로 시작하는 두글자 문자 찾기--
SELECT 컬럼명
FROM 테이블
WHERE 컬럼명 LIKE 'A_'
--첫번째 문자가 'A''가 아닌 모든 문자열 찾기--
SELECT 컬럼명
FROM 테이블
WHERE 컬럼명 LIKE'[^A]'
--첫번째 문자가 'A'또는'B'또는'C'인 문자열 찾기--
SELECT 컬럼명
FROM 테이블
WHERE 컬럼명 LIKE '[ABC]'
SELECT 컬럼명
FROM 테이블
WHERE 컬럼명 LIKE '[A-C]'
SELECT first_name,
last_name
FROM customer
WHERE first_name LIKE 'Jen%';
FIRST_NAME이 ‘Jen’으로 시작하는 집합을 출력한다. 즉 ‘Jen’ 이후의 문자 혹은 문자열은 모두 매칭된다.
SELECT *
FROM TABLE_NAME
WHERE COLUMN_NAME IS NULL;
COLUNM_NAME 컬럼의 값이 NULL인 집합을 출력한다.
SELECT *
FROM TABLE_NAME
WHERE COLUMN_NAME IS NOT NULL;
COLUNM_NAME 컬럼의 값이 널이 아닌 집합을 출력한다.
SELECT id,
first_name,
last_name,
email,
phone
FROM contacts
WHERE phone = NULL;
PHONE 컬럼의 값이 NULL인 집합을 출력하고자 한다.
- 결과집합이 공집합이다. 널은 ‘=‘ 연산으로 비교할 수 없다.
- =를 쓰지말고 다른걸 써야함
정답은 바로 IS NULL;
아니면 is not null
댓글