MySQL | 소고기와 마늘 모두를 사용하는 요리법을 찾는 테이블 서브쿼리

서브쿼리는 총 3가지 정도로 분류한다.

'테이블 서브쿼리', '단일 컬럼 테이블 서브쿼리', '스칼라 서브쿼리'

아래 내용은 테이블 서브쿼리이므로 '테이블 서브쿼리'에 대한 내용부터

먼저 살펴보도록 하자.

다소 복잡하게 보일 수 있는 이 구문은

불필요한 검색 결과를 제거하고

원하는 결과값만을 얻기 위한 코드이다.

자, 결과값을 살펴보도록 하자.

두개의 테이블 중 겹치는 값을 내기 위하여

Recipes - Recipe_Ingredients 테이블에서

각각 RecipeID - RecipeID 를 연결한다.

거기에 Ingredents 테이블에 IngredientID

Recipe_Inredients에 IngredientID 를 연결하여

두 테이블 내에 값 중 동일한 값들만 지정한다.

자, 정리하면 총 2개의 작업 INNER JOIN이 일어났고

큰 INNER JOIN이 하나 일어났다.

즉, 요리에 들어갈 레시피 중 '마늘'이 포함된다고 가정하자.

그렇다면, Recipes중 '마늘'이 포함된 열은 여러개가 나올 것이다.

하지만 Reciepe_Ingredients.RecipeID는 1개만 나온다.

Ingredients 테이블에서 마늘은 1개의 인덱스이다. 하지만

Recipe_Ingredients에서는 여러개 나올 것이다.

자, 그럼 변수 설정을 해주자. 'Beef'이다.

이는 위에 코드 산식으로 해석해보자면

Recipes에도 들어가고,

Recipe_Ingredeints에도 포함되며

Ingredients에도 포함된다.

자 이어서,

조건 설정 중 소고기와 마늘이 들어가길 희망하는

메뉴들만 출력하고 싶다고 하자.

그렇다면 위에 적어준 것과 똑같이 써주면 되겠다.

마지막으로

'BeeRecipes' 조건과 'GarlicRecipes' 조건을

포함하는 것들만 출력하게 된다.

추가글 +

조인을 수행하기 전에 하나 이상의 집합에 대해 필터링이

필요한 데이터 조합 그리고 조인을 수행할 수 있는 FROM 절에서 특히나

자주 사용이된다. 가령, 데이터베이스 내에 소고기와 마늘을 사용하는

요리를 모두 찾아야하거나 학교에서 키가 170~180이면서 남자인

학생을 찾는 등의 집합 데이터 등에 유용하게 쓰인다.

또한 자주 사용되지는 않지만,

테이블 서브쿼리로는 EXISTS도 사용한다.

'Skateboard' 나 'Helmet'을 구매한 모든 고객을 찾는다고했을 때

OrderNumber 값과 Products 테이블에서 제품 이름이

스케이트보드나 헬멧인 데이터를 필터링하는 연관성 있는

테이블 서브쿼리를 두 개 사용하면 되는 것이다.

보통은 *이나 1을 사용하지만,

NULL은 나열한 정보는 무의하기에

명시하였다. 이렇게도 쓰이고,

이렇게도 쓰일 수 있겠다.