데이터 분석/SQL 36

[SQL 문법] CROSS JOIN

모든 row 의 내용을 교차하여 새로운 테이블 생성 샘플 테이블 cross_t1, cross_t2 가 있다 CREATE TABLE cross_t1 ( LABEL char(1) PRIMARY key ); CREATE TABLE cross_t2 ( score int PRIMARY key ); INSERT INTO cross_t1(label) VALUES ('a') ,('b'); INSERT INTO cross_t2(score) VALUES (1) ,(2) ,(3); COMMIT; SELECT * FROM cross_t1 ; SELECT * FROM cross_t2 ; CROSS JOIN SELECT * FROM cross_t1 CROSS JOIN cross_t2 ORDER BY LABEL ; 2 x 3 = ..

[SQL 문법] FULL OUTER JOIN

전체 집합의 내용을 알고 싶을 때, 즉 테이블 A, B가 있을 때, 겹치는 것, 겹치지 않는 것 전부 포함해서 보여주자는 것. 부서 테이블, 직원 테이블이 있을 때 하나의 부서는 여러개의 직원을 가질 수 있다 CREATE TABLE IF NOT EXISTS departments ( department_id serial PRIMARY KEY ,department_name varchar(255) NOT NULL ); CREATE TABLE IF NOT EXISTS employees ( employee_id serial PRIMARY KEY ,employee_name varchar(255) ,department_id integer ); SELECT * FROM departments ; SELECT * FROM..

[SQL 문법] SELF JOIN + ON

같은 테이블에서 같은 속성끼리 묶어서 조인하고 싶을 때 사용. 조직도 테이블이 있을 때(테이블 세팅), CREATE TABLE employee ( employee_id int PRIMARY KEY ,first_name varchar (255) NOT NULL ,last_name varchar (255) NOT NULL ,manager_id int ,FOREIGN KEY (manager_id) REFERENCES employee(employee_id) ON DELETE CASCADE ); INSERT INTO employee ( employee_id ,first_name ,last_name ,manager_id ) VALUES (1, 'windy', 'hays',null) ,(2, 'ava','christ..

[SQL 문법] INNER JOIN + ON

두 테이블의 교집합을 찾는 JOIN 모든 'customer'의 'payment' amount,payment_date를 확인하기 SELECT C.customer_id ,C.first_name ,C.last_name ,C.email ,P.amount ,P.payment_date FROM customer c INNER JOIN payment p ON C.customer_id =P.customer_id ; 그 중 id=3인 사람의 내역 확인하기 SELECT c.customer_id ,c.first_name ,c.last_name , c.email ,p.amount ,p.payment_date FROM customer c INNER JOIN payment p ON c.customer_id = p.customer_..

[SQL 문법] IS NULL

NULL 은 아무것도 아닌, 아무것도 없는 값. 테이블을 만든다고 값을 전부 넣을 필요는 없다. 우리가 회원가입 시 개인정보 입력할 때 필수 입력이 아닌 것이 있듯이. 즉, NULL 이 생길 수 있다. NULL 찾기 CREATE TABLE contacts ( id int GENERATED BY DEFAULT AS IDENTITY , first_name varchar(50) NOT NULL ,last_name varchar(50) NOT NULL ,email varchar(255) NOT NULL ,phone varchar(15) ,PRIMARY key(ID) ); INSERT INTO contacts(first_name,last_name,email,phone) VALUES ('ho','do','doho@..

[SQL 문법] LIKE

유사한 패턴을 가지는 요소를 뽑는다. 이름이 'Jan'으로 시작하는 사람 찾기 SELECT c.first_name , c.last_name FROM customer c WHERE c.first_name LIKE 'Jan%'; 'Jan'이 포함 된 것들이 나옵니다. 검색할 때 사용할 듯 하네요. 여기에 쓰이는 두 개 도우미가 있습니다. '%'와 '_' SELECT 'foo' LIKE 'foo' ,'foo' LIKE 'f%' ,'foo' LIKE '%o' ,'foo' LIKE 'F%' ,'foo' LIKE '_o_' ,'foo' LIKE 'f_' ,'fow' LIKE '%o'; %는 개수에 상관 없이 뭐든 포함 되고, _는 개수가 무조건 맞아야 합니다. 그리고 대소문자 구분합니다 따라서 위의 결과는 참,참,..

[SQL 문법] BETWEEN

특정 범위의 값을 뽑기 'payment' 테이블에서 amount 값이 8과 9 사이인 값 뽑기 SELECT p.customer_id , p.payment_id , p.amount FROM payment p WHERE p.amount BETWEEN 8 AND 9; 결과는 간단하다 반대로 8과 9 사이에 없는 값 뽑기 - NOT SELECT p.customer_id , p.payment_id , p.amount FROM payment p WHERE p.amount NOT BETWEEN 8 AND 9; 결과도 단순~ 일자 비교하기 - 실전 BETWEEN은 일자 비교에 많이 쓰임. 하지만 일자에서 timestamp 형은 비교에 제대로 안됨. 따라서 형을 바꿔야하는데, SELECT p.customer_id , p..

[SQL 문법] IN

집합에 값이 존재하는지 확인하는 연산자 customer_id의 값이 '1'과 '2'인 값 골라내기 SELECT r.customer_id , r.rental_id , r.rental_date FROM rental r WHERE r.customer_id IN (1,2) ORDER BY r.return_date DESC; 이렇게 1, 2 만 골라나옴 같은 표현. SELECT r.customer_id , r.rental_id , r.rental_date FROM rental r WHERE r.customer_id = 1 OR r.customer_id = 2 ORDER BY r.return_date DESC; 하지만, 가독성과 성능 측면에서 IN이 좋으니 IN을 쓰도록 하자~ customer_id의 값에 '1'과..

[SQL 문법] FETCH

LIMIT 와 동일하게 부분 범위 처리 시 사용한다. 부분 범위 처리를 잘하는 사람이 실력을 인정받고 있단다. LIMIT와 비교해서 다를게 없고 취향따라 쓴다고 한다. title로 정렬하여 최초의 1건을 뽑는다 SELECT f.language_id, f.fulltext FROM film f ORDER BY f.title LIMIT 1; 이렇게 하면 안되나? 싶은데 SELECT f.language_id, f.fulltext FROM film f ORDER BY f.title LIMIT 1; 그래서 궁금해서 ctrl + shift + E 해보았다 뭐 비슷.. 앞에 10개 이후에 최초의 10건을 뽑는다 SELECT f.film_id , f.title FROM film f ORDER BY f.title OFFS..

[SQL 문법] LIMIT

출력 값을 제한하는 용도. 엄청 많이 쓰임. postgresql, mysql 에서 지원 'film' table의 5개 행 불러오기 SELECT f.film_id, f.title, f.release_year FROM film f LIMIT 5; 5개를 가져옵니다. 그런데 계속 해보면 film_id 가 랜덤인 것을 알 수 있습니다. 왜냐하면 order by 가 없기 때문입니다. 'film' table의 5번째 까지 행 불러오기 SELECT f.film_id, f.title, f.release_year FROM film f ORDER BY f.film_id LIMIT 5 ; 이젠 5개가 깔끔하게 불러와 집니다. 'film' table의 11번째 부터 15번째 까지 행 불러오기 - OFFSET SELECT f...