😎
Onemorebottlee's TIL
  • 🤓Introduce
  • 📖DevLog
    • 💣Error
      • npm ERR! Cannot read properties of null (reading 'edgesOut')
      • git
        • src refspec main does not match any
      • NextJS
        • No img element
        • ReferenceError : document is not defined
        • `next/image` Un-configured Host
  • 📺Lecture
    • Nomad Coders
      • 초보자를 위한 리덕스 101
        • #0 Introduction
        • #1 PURE REDUX: COUNTER
        • #2 PURE REDUX: TO DO LIST
        • #3 REACT REDUX
        • #4 Redux Toolkit
      • 바닐라 JS로 그림 앱 만들기
      • React JS 마스터 클래스
        • #2 Styled Componnents
        • #3 TypeScript
        • #4 Crypto Tracker
        • #5 State Management
        • #6 Trello
        • #7 ANIMATIONS
      • Next.js 시작하기
        • #0 INTRODUCTION
        • #1 FRAMEWORK OVERVIEW
        • #2 PRACTICE PROJECT
      • Typescript로 블록체인 만들기
        • #1 Introduction
        • #2 Overview of TypeScript
        • #3 Functions
        • #4 Classes and Interfaces
        • #5 TypeScript Blockchain
      • SQL Master Class
        • #1 Introduction
        • #2 SQLite
        • #3 Data Definition Language
        • #4 Data Manipulation Language
        • #5 Subqueries and CTEs
        • #6 Indexes
        • #7 MySQL
        • #8 Foreign Keys
        • #9 JOINS
        • #10 Nomalization
        • #11 Events & Triggers
        • #12 Full-Text Indexes
        • #13 PostgreSQL
        • #14 Functions And Procedures
        • #15 Transactions
        • #16 Data Control Language
        • #17 PostgreSQL JSON Columns
        • #18 PostgreSQL Extensions
        • #19 MongoDB
        • #20 REDIS
        • #21 Javascript and Python Drivers
    • Udemy
      • TypeScript 마스터 with Webpack & React
        • [S1] 소개
        • [S2] 설치 및 설정
        • [S3] 타입 애너테이션 기초
        • [S4] 함수
        • [S5] 객체 타입
        • [S6] 배열 타입
        • [S7] 유니온타입
        • [S8] Tuple & Enum
        • [S9] 인터페이스
        • [S10] TypeScript 컴파일러
        • [S11] 미니 프로젝트 DOM, 타입 단언, 그리고 더 많은 내용
        • [S12] Class
        • [S13] TS Class
        • [S14] Generics ⭐⭐⭐⭐⭐
        • [S15] Narrowing
        • [S16] Type Declarations
        • [S17] Module
        • [S18] Webpack 과 TypeScript
        • [S19] React
    • 모두를 위한 컴퓨터 과학 CS50
      • 1. 컴퓨팅 사고
      • 2. C언어
      • 3. 배열
      • 4. 알고리즘
      • 5. 메모리
      • 6. 자료구조
    • 생활코딩
      • DATABASE
        • DATABASE1
  • 📚Book
    • 모던 자바스크립트 Deep Dive
      • 1장 프로그래밍
      • 2장 자바스크립트란?
      • 3장 자바스크립트 개발 환경과 실행 방법
      • 4장 변수
      • 5장 표현식과 문
      • 6장 데이터 타입
      • 7장 연산자
      • 8장 제어문
      • 9장 타입 변환과 단축 평가 ⭐⭐⭐
      • 10장 객체 리터럴
      • 11장 원시 값과 객체의 비교
      • 12장 함수 ⭐⭐⭐⭐
      • 13장 스코프
      • 14장 전역 변수의 문제점
      • 15장 let, const 키워드와 블록 레벨 스코프 ⭐⭐⭐
      • 16장 프로퍼티 어트리뷰트
      • 17장 생성자 함수에 의한 객체 생성
      • 18장 함수와 일급 객체 ⭐⭐
      • 19장 프로토타입 ⭐⭐⭐⭐⭐
      • 20장 strict mode
      • 21장 빌트인 객체 ⭐
      • 22장 this ⭐⭐⭐
      • 23장 실행 컨텍스트 ⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
      • 24장 클로저 ⭐⭐⭐⭐⭐⭐⭐
      • 25장 클래스
      • 26장 ES6 함수의 추가 기능
      • 27장 배열 ⭐⭐⭐
      • 28장 Number
      • 29장 Math
      • 30장 Date
      • 31장 RegExp
      • 32장 String
      • 33장 7번째 데이터 타입 Symbol
      • 34장 이터러블
      • 35장 스프레드 문법
      • 36장 디스트럭처링 할당
      • 37장 Set과 Map
      • 38장 브라우저의 렌더링 과정⭐⭐⭐⭐⭐⭐⭐⭐
      • 39장 DOM ⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
      • 40장 이벤트⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
      • 41장 타이머
      • 42장 비동기 프로그래밍 ⭐⭐⭐⭐⭐⭐⭐⭐
      • 43장 Ajax
      • 44장 REST API
      • 45장 프로미스
      • 46장 제너레이터와 async/await
      • 47장 에러 처리
      • 48장 모듈
      • 49장 Babel과 Webpack을 이용한 ES6+/ES.NEXT 개발 환경 구축
    • 러닝 타입스크립트
      • Ch.1 자바스크립트에서 타입스크립트로
      • Ch.2 타입 시스템
      • Ch.3 유니언과 리터럴
      • Ch.4 객체
      • Ch.5 함수
      • Ch.6 배열
      • Ch.7 인터페이스
      • Ch.8 클래스
      • Ch.9 타입 제한자
      • Ch.10 제네릭
      • Ch.11 선언 파일
      • Ch.12 IDE 기능 사용
      • Ch.13 구성 옵션
      • Ch.14 구문 확장
      • Ch.15 타입 운영
      • 용어 사전
    • 자바스크립트 완벽 가이드
    • SQL in 10 Minutes
      • 1장 SQL 이해하기
      • 2장 데이터 가져오기
      • 3장 가져온 데이터 정렬하기
      • 4장 데이터 필터링
      • 5장 고급 데이터 필터링
      • 6장 와일드카드 문자를 이용한 필터링
      • 7장 계산 필드 생성하기
      • 8장 데이터 조작 함수 사용하기
      • 9장 데이터 요약
      • 10장 데이터 그룹핑
      • 11장 서브쿼리 사용하기
      • 12장 테이블 조인
      • 13장 고급 테이블 조인 생성하기
      • 14장 쿼리 결합하기
      • 15장 데이터 삽입하기
      • 16장 데이터 업데이트와 삭제
      • 17장 테이블 생성과 조작
      • 18장 뷰 사용하기
      • 19장 저장 프로시저 사용하기
      • 20장 트랜잭션 처리 관리하기
      • 21장 커서 사용하기
      • 22장 고급 데이터 조작 옵션
    • 면접을 위한 CS 전공지식 노트
      • 4 데이터베이스
        • 4.1 데이터베이스의 기본
    • 2023 이기적 SQL 개발자 이론서 + 기출문제
      • 데이터 모델링 이해
        • S1. 데이터 모델링
  • 💻Study
    • CS 지식 발표
      • 1회차
      • 2회차
      • 3회차
      • 4회차
      • 5회차
      • 6회차
      • 7회차
      • 8회차
      • 9회차
    • TypeScript Exercises
      • Ex 1
      • Ex 2
      • Ex 3
      • Ex 4
      • Ex 5
      • Ex 6
      • Ex 7
      • Ex 8
      • Ex 9
      • Ex 10
  • 🔄ETC
    • Article
      • Atomic Design Pattern
      • 프론트엔드 개발자
    • DATABASE
      • Oracle
        • CEIL() & FLOOR() - 소수점 올림 & 내림
        • DUAL 테이블 - 임시 테이블로 결과 확인하기
    • Ubuntu
      • 어플리케이션 업데이트
Powered by GitBook
On this page
  • #9.1 CROSS JOIN
  • #9.2 INNER JOIN
  • #9.3 OUTER JOIN
  • #9.4 JOINS Practice Part 1
  • #9.5 JOINS Practice Part 2
  • #9.6 JOINS Practice Part 3

Was this helpful?

  1. Lecture
  2. Nomad Coders
  3. SQL Master Class

#9 JOINS

#9.0 Introduction

-- Create tables
CREATE TABLE dogs (
dog_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
weight DECIMAL(5,2),
date_of_birth DATE,
owner_id BIGINT UNSIGNED,
breed_id BIGINT UNSIGNED,
FOREIGN KEY (owner_id) REFERENCES owners (owner_id) ON DELETE SET NULL,
CONSTRAINT breed_fk FOREIGN KEY (breed_id) REFERENCES breeds (breed_id) ON DELETE SET NULL
);

CREATE TABLE owners (
owner_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
phone VARCHAR(20),
address TINYTEXT
);

CREATE TABLE breeds (
breed_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
size_category ENUM ('small', 'medium', 'big') DEFAULT 'small',
typical_lifespan TINYINT
);

CREATE TABLE pet_passports (
pet_passport_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
blood_type VARCHAR(10),
allergies TEXT,
last_checkup_date DATE,
dog_id BIGINT UNSIGNED UNIQUE,
FOREIGN KEY (dog_id) REFERENCES dogs (dog_id) ON DELETE CASCADE
);

CREATE TABLE tricks (
trick_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) UNIQUE NOT NULL,
difficulty ENUM('easy', 'medium', 'hard') NOT NULL DEFAULT 'easy'
);

CREATE TABLE dog_tricks (
dog_id BIGINT UNSIGNED,
trick_id BIGINT UNSIGNED,
proficiency ENUM('beginner', 'intermediate', 'expert') NOT NULL DEFAULT 'beginner',
date_learned TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (dog_id, trick_id),
FOREIGN KEY (dog_id) REFERENCES dogs (dog_id) ON DELETE CASCADE,
FOREIGN KEY (trick_id) REFERENCES tricks (trick_id) ON DELETE CASCADE
);

-- INSERT
INSERT INTO breeds (name, size_category, typical_lifespan) VALUES
('Labrador Retriever', 'big', 12),
('German Shepherd', 'big', 11),
('Golden Retriever', 'big', 11),
('French Bulldog', 'small', 10),
('Beagle', 'medium', 13),
('Poodle', 'medium', 14),
('Chihuahua', 'small', 15);



INSERT INTO owners (name, email, phone, address) VALUES
('John Doe', 'john@example.com', '123-456-7890', '123 Main St, Anytown, USA'), ('Jane Smith', 'jane@example.com', '234-567-8901', '456 Elm St, Someplace, USA'), ('Bob Johnson', 'bob@example.com', '345-678-9012', '789 Oak St, Elsewhere, USA'), ('Alice Brown', 'alice@example.com', '456-789-0123', '321 Pine St, Nowhere, USA'), ('Charlie Davis', 'charlie@example.com', '567-890-1234', '654 Maple St, Somewhere, USA'), ('Eva Wilson', 'eva@example.com', '678-901-2345', '987 Cedar St, Anyville, USA'), ('Frank Miller', 'frank@example.com', '789-012-3456', '246 Birch St, Otherville, USA'), ('Grace Lee', 'grace@example.com', '890-123-4567', '135 Walnut St, Hereville, USA'), ('Henry Taylor', 'henry@example.com', '901-234-5678', '864 Spruce St, Thereville, USA'), ('Ivy Martinez', 'ivy@example.com', '012-345-6789', '753 Ash St, Whereville, USA'), ('Jack Robinson', 'jack@example.com', '123-234-3456', '951 Fir St, Thatville, USA'), ('Kate Anderson', 'kate@example.com', '234-345-4567', '159 Redwood St, Thisville, USA');


INSERT INTO dogs (name, date_of_birth, weight, breed_id, owner_id) VALUES
('Max', '2018-06-15', 30.5, 1, 1),
('Bella', '2019-03-22', 25.0, NULL, 2),
('Charlie', '2017-11-08', 28.7, 2, 3),
('Lucy', '2020-01-30', 8.2, NULL, NULL),
('Cooper', '2019-09-12', 22.3, 5, 5),
('Luna', '2018-07-05', 18.6, 6, 6),
('Buddy', '2016-12-10', 31.2, 1, 7),
('Daisy', '2020-05-18', 6.8, NULL, 8),
('Rocky', '2017-08-25', 29.5, 2, 9),
('Molly', '2019-11-03', 24.8, 3, NULL),
('Bailey', '2018-02-14', 21.5, 5, 11),
('Lola', '2020-03-27', 7.5, 4, 12),
('Duke', '2017-05-09', 32.0, NULL, 1),
('Zoe', '2019-08-11', 17.8, 6, 2),
('Jack', '2018-10-20', 23.6, NULL, 3),
('Sadie', '2020-02-05', 26.3, 3, 4),
('Toby', '2017-07-17', 8.9, 7, NULL),
('Chloe', '2019-04-30', 20.1, 6, 6),
('Bear', '2018-01-08', 33.5, 2, 7),
('Penny', '2020-06-22', 7.2, 4, NULL);

INSERT INTO tricks (name, difficulty) VALUES
('Sit', 'easy'),
('Stay', 'medium'),
('Fetch', 'easy'),
('Roll Over', 'hard'),
('Shake Hands', 'medium');


INSERT INTO dog_tricks (dog_id, trick_id, proficiency, date_learned) VALUES
(1, 1, 'expert', '2019-01-15'),
(1, 2, 'intermediate', '2019-03-20'),
(14, 3, 'expert', '2019-02-10'),
(2, 1, 'expert', '2019-07-05'),
(2, 3, 'intermediate', '2019-08-12'),
(3, 1, 'expert', '2018-03-10'),
(3, 2, 'expert', '2018-05-22'),
(13, 4, 'beginner', '2019-11-30'),
(4, 1, 'intermediate', '2020-05-18'),
(5, 1, 'expert', '2020-01-07'),
(11, 3, 'expert', '2020-02-15'),
(5, 5, 'intermediate', '2020-04-22'),
(7, 1, 'expert', '2017-06-30'),
(7, 2, 'expert', '2017-08-14'),
(12, 3, 'expert', '2017-07-22'),
(16, 4, 'intermediate', '2018-01-05'),
(7, 5, 'expert', '2017-09-18'),
(10, 1, 'intermediate', '2020-03-12'),
(10, 3, 'beginner', '2020-05-01'),
(15, 1, 'expert', '2019-02-28'),
(14, 2, 'intermediate', '2019-04-15'),
(18, 1, 'intermediate', '2019-09-10'),
(18, 5, 'beginner', '2020-01-20');


INSERT INTO pet_passports (dog_id, blood_type, allergies, last_checkup_date) VALUES
(1, 'DEA 1.1+', 'None', '2023-01-05'),
(2, 'DEA 1.1-', 'Chicken', '2023-02-22'),
(3, 'DEA 4+', 'None', '2023-03-08'),
(5, 'DEA 7+', 'Beef', '2023-04-12'),
(7, 'DEA 1.1+', 'None', '2023-01-10'),
(10, 'DEA 3-', 'Dairy', '2023-05-03'),
(12, 'DEA 5-', 'None', '2023-03-27'),
(15, 'DEA 1.1-', 'Grains', '2023-04-20'),
(18, 'DEA 7+', 'None', '2023-04-03'),
(20, 'DEA 4+', 'Pollen', '2023-06-22');,

#9.1 CROSS JOIN

JOIN 여러 테이블을 연결해 하나의 결과 도출

CROSS JOIN - 테이블의 모든 데이터 연결, 거의 사용하지 않음

SELECT * FROM dogs CROSS JOIN owners;

/**
    SELECT * FROM CROSS JOIN owners WHERE ...;
    FROM > JOIN > WHERE > SELECT > GROUP BY, HAVING ... 의 순서로 실행
**/

#9.2 INNER JOIN

INNER JOIN - 연결되는 row 선택 가능, CROSS JOIN 과 비슷하지만 다름

SELECT * FROM dogs INNER JOIN owners;

SELECT * FROM dogs INNER JOIN owners ON dogs.owner_id = owners.owner_id;

-- 개주인 이름이 같은 데이터 출력
SELECT dogs.name as dog_name, owners.name as owner_name
FROM dogs
INNER JOIN owners ON dogs.owner_id = owners.owner_id;


-- & 견종이 같은 데이터
SELECT
  dogs.name as dog_name,
  owners.name as owner_name,
  breeds.name as breed_name
FROM dogs
  INNER JOIN owners ON dogs.owner_id = owners.owner_id
  JOIN breeds ON dogs.breed_id = breeds.breed_id;
  
-- USING
SELECT
  dogs.name as dog_name,
  owners.name as owner_name,
  breeds.name as breed_name
FROM dogs
  INNER JOIN owners USING (owner_id)
  JOIN breeds USING (breed_id);

JOIN = INNER JOIN

#9.3 OUTER JOIN

애매하거나 의미가 불분명한 row를 확인할 때 사용

-- 주인없는 개도 함께 확인
SELECT
  dogs.name as dog_name,
  owners.name as owner_name
FROM dogs
  LEFT JOIN owners USING (owner_id);
-- 개 없는 주인 확인
SELECT
  dogs.name as dog_name,
  owners.name as owner_name
FROM dogs
  RIGHT JOIN owners USING (owner_id);

LEFT OUTER JOIN = LEFT JOIN

RIGHT OUTER JOIN = RIGHT JOIN

#9.4 JOINS Practice Part 1

-- 1. List all dogs with their breed names
SELECT dogs.name, breeds.name
FROM dogs JOIN breeds USING(breed_id);

-- 2. Show all owners and their dogs (if they have any)
SELECT owners.name, dogs.name
FROM owners JOIN dogs USING(owner_id);

-- 3. Display all breeds and the dogs of that breed (if any)
SELECT breeds.name, dogs.name
FROM breeds JOIN dogs USING(breed_id);

-- 4. List all dogs with their pet passport information and owner data
-- (if avaliable)
SELECT 
	d.name, pp.allergies, o.name
FROM dogs d
	JOIN pet_passports AS pp USING(dog_id)
	JOIN owners o USING(owner_id);

-- 5. Show all tricks and the dogs that know them
SELECT t.name, d.name, dt.date_learned, dt.proficiency
FROM tricks t
	JOIN dog_tricks dt USING(trick_id)
	JOIN dogs d USING(dog_id);

-- 6. Display all dogs that don't know a single trick
SELECT dogs.name
FROM dogs LEFT JOIN dog_tricks USING(dog_id)
WHERE dog_tricks.dog_id is null;

#9.5 JOINS Practice Part 2

-- 1. Show all breeds and the count of dogs for each breed
SELECT breeds.name, COUNT(*)
FROM breeds RIGHT JOIN dogs USING(breed_id)
GROUP BY breeds.name;

-- 2. Display all owners with the count of their dogs, the average dog weight and the average dog age.
SELECT owners.name AS OWNER_NAME,
    count(dogs.dog_id) AS TOTAL_DOGS,
    avg(weight) AS AVG_WEIGHT,
    avg(timestampdiff(YEAR, dogs.date_of_birth, CURDATE())) as AVG_AGE
FROM owners JOIN dogs USING(owner_id)
GROUP BY owners.owner_id

-- 3. Show all tricks and the number of dogs that know each trick ordered by popularity
SELECT tricks.name, count(*) AS TOTAL_DOGS
FROM dog_tricks	JOIN tricks USING(trick_id)
GROUP BY dog_tricks.trick_id
ORDER BY TOTAL_DOGS DESC;

-- 4. Display all dogs along with the count of tricks they know
SELECT dogs.name, count(*) AS CNT_TRICKS
FROM dogs JOIN dog_tricks USING(dog_id)
GROUP BY dogs.dog_id
ORDER BY CNT_TRICKS DESC;

-- 5. List all owner with their dogs and the tricks their dogs know
SELECT owners.name, dogs.name, tricks.name
FROM owners
    JOIN dogs USING(owner_id)
  JOIN dog_tricks USING(dog_id)
  JOIN tricks USING(trick_id);

#9.6 JOINS Practice Part 3

-- 1. Show all breeds with their average dog weight and typical lifespan
SELECT
  breeds.name,
  avg(dogs.weight) avg_weight,
  breeds.typical_lifespan
FROM breeds JOIN dogs USING(breed_id)
GROUP BY breeds.breed_id, breeds.typical_lifespan


-- 2. Display all dogs with their latest checkup date and the time since their last checkup
SELECT
  dogs.name,
  pet_passports.last_checkup_date,
  TIMESTAMPDIFF(DAY, pet_passports.last_checkup_date, CURDATE())
FROM dogs
  JOIN pet_passports USING(dog_id)


-- 3. Display all breeds with the name of the heaviest dog of that breed
SELECT breeds.breed_id, breeds.name, dogs.name, dogs.weight
FROM breeds JOIN dogs USING(breed_id)
WHERE dogs.weight = (
	SELECT max(d1.weight)
  FROM dogs d1
  WHERE d1.breed_id = breeds.breed_id
)

-- 4. List all tricks with the name of the dog who learned it most recently
SELECT
  tricks.name,
  dogs.name,
  dog_tricks.date_learned
FROM tricks
  JOIN dog_tricks USING(trick_id)
  JOIN dogs USING(dog_id)
WHERE dog_tricks.date_learned = (
  SELECT max(dt.date_learned)
  FROM dog_tricks dt
  WHERE dt.trick_id = tricks.trick_id
  GROUP BY trick_id
)

Previous#8 Foreign KeysNext#10 Nomalization

Last updated 5 months ago

Was this helpful?

📺