Skip to main content

SQL에서 SOQL로 전환

학습 목표

이 유닛을 완료하면 다음을 수행할 수 있습니다.

  • Force.com 개체의 이점을 이해할 수 있습니다.
  • SQL과 SOQL의 유사점과 차이점을 식별할 수 있습니다.
  • Workbench를 사용하여 간단한 SOQL 문을 작성합니다.
  • 더욱 복잡한 관계 쿼리를 작성합니다.
  • 집계된 쿼리를 작성합니다.

Force.com 개체 이해

Force.com 플랫폼은 강력한 데이터베이스뿐만 아니라, 애플리케이션을 더 쉽고 빠르게 만들 수 있는 다양한 기능을 제공합니다. SQL Server를 사용해보셨으므로 데이터가 테이블과 행에 저장된다는 사실을 알고 계실 것입니다. 반면, Force.com의 데이터베이스는 개체를 사용하여 데이터를 저장합니다. 개체는 테이블에서 제공되는 모든 기능을 포함하며, 그러한 기능을 더욱 강력하고 유용하게 만드는 추가 개선 사항을 제공합니다. 각 개체는 데이터베이스의 열에 해당하는 여러 필드로 구성됩니다. 데이터는 데이터베이스의 행에 해당하는 개체의 레코드에 저장됩니다. 하지만 그것이 다가 아닙니다!

개체에는 다음의 두 가지 유형이 있습니다.

  1. 기본 개체 — Salesforce에서 기본적으로 제공되는 개체입니다. 일부 일반적인 CRM 개체에는 계정, 연락처, 기회, 리드가 포함됩니다.
  2. 사용자 정의 개체 — 애플리케이션에 고유한 정보를 저장하기 위해 생성하는 새 개체입니다. 사용자 정의 개체는 표준 개체가 제공하는 기능을 확장합니다. 예를 들어 제품 재고를 추적하는 앱을 빌드하는 경우 상품, 주문 또는 인보이스라는 이름의 사용자 정의 개체를 만들 수 있습니다.

짐작하셨듯이, 개체에는 한 개체의 레코드가 다른 개체의 레코드와 관련되는 방식을 정의하는 관계 필드가 포함될 수 있습니다. 이는 기본적으로 기본 및 외부 키이지만, 그보다 훨씬 더 유연하기 때문에 데이터 모델을 더 쉽게 ​​설계하고 구현할 수 있습니다.

표준 또는 사용자 정의 Force.com 개체는 데이터를 저장하기 위한 구조를 제공할 뿐만 아니라, 사용자가 탭, 페이지의 필드 레이아웃, 관련 레코드 목록을 비롯한 데이터와 상호 작용할 수 있도록 지원하는 인터페이스 요소를 강화합니다. 표준 기능의 경우 ORM을 구현하거나, CRUDing 데이터용 UI를 작성하거나, 테이블을 빌드할 필요가 없습니다. 이러한 표준 기능은 플랫폼에서 자동으로 제공됩니다. 또한 개체에는 액세스 관리, 확인, 수식 및 기록 추적과 같은 기능에 대한 기본 지원이 포함되어 있습니다. 개체의 모든 속성은 메타데이터로 설명되므로, 시각적 인터페이스를 통해 또는 프로그래밍 방식으로 레코드를 쉽게 만들고 수정할 수 있습니다.

보시는 것처럼 개체는 단순히 데이터를 저장하기 위한 컨테이너 그 이상입니다. 또한 애플리케이션에 고유한 기능을 빌드하는 데 초점을 맞춘 다양한 기능 집합을 제공합니다. 사용자 정의 개체, 필드, 관계 등을 만드는 방법에 대한 자세한 내용은 데이터 모델링 모듈을 참조하세요.

유사점과 차이점

.NET 개발자는 SQL Server로 작업하는 데 매우 익숙할 것입니다. 또한 SQL을 사용하여 임시 쿼리를 작성하는 방법도 잘 알고 있을 것입니다. 따라서 저희는 Salesforce용으로 특별히 설계된 유사 언어, 즉 SOQL(Salesforce Object Query Language)을 소개하는 가장 좋은 방법은 이 두 가지를 비교하는 것이라고 생각했습니다.

가장 먼저 알아야 할 사항은 둘 다 쿼리 언어이지만, SOQL은 SELECT 문으로 쿼리를 수행하는 데에만 사용된다는 것입니다. SOQL에는 상응하는 INSERT, UPDATE 및 DELETE 문이 없습니다. Salesforce 환경에서 데이터 조작은 DML(Data Manipulation Language)이라는 일련의 방식을 사용하여 처리됩니다. DML에 대한 자세한 내용은 잠시 후에 살펴보겠습니다. 지금은 SOQL이 제공하는 SELECT 문을 사용하여 Salesforce 데이터를 쿼리하는 방법만 알면 됩니다.

눈에 띄는 큰 차이점 한 가지는 SOQL에는 SELECT*와 같은 문이 없다는 것입니다. SOQL은 Salesforce 데이터를 반환하고 해당 데이터는 모두가 '데이터베이스를 공유'하는 일종 다중 테넌트 환경에 상주하기 때문에 *와 같은 와일드카드 문자는 문제를 일으킬 수 있습니다. 솔직히 말해서, 새 SQL 쿼리를 시작하고 SELECT * FROM SOME-TABLE에 입력하면 되므로 매우 간편하며, 이는 테이블 필드 이름을 모를 때 특히 유용합니다. 이 작업은 공유 환경의 다른 테넌트에 심각한 영향을 줄 수 있습니다. 일요일 아침 7시에 잔디를 깎으시겠습니까? 이는 매우 무례한 행동입니다.

SOQL에서는 반환할 각 필드 이름을 지정합니다. 그 외에도 SOQL이 제공하는 SELECT 문은 SQL과 유사하므로, SOQL 쿼리 작성이 매우 쉽다는 것을 곧 알게 될 것입니다. 하지만 SQL과 SOQL은 서로 비슷하지만 동일하지는 않다는 점에 유의해야 합니다. SOQL은 SQL SELECT 문이 수행하는 고급 기능 중 일부를 지원하지 않습니다. 하지만 Salesforce Platform에서 이러한 추가 기능이 모두 필요한 것은 아닙니다. SOQL은 필요한 기능을 매우 익숙한 방식으로 제공할 뿐입니다.

Workbench로 쿼리 작성

SOQL 쿼리 작성은 어떻게 시작해야 할지 궁금하실 것입니다. 한 가지 간편한 방법은 Workbench라는 Salesforce 웹 기반 도구를 사용하는 것입니다. 저희는 .NET 개발자가 도구를 얼마나 좋아하는지 알고 있습니다. 이 강력한 도구는 관리자와 개발자가 Force.com API를 사용하여 조직에 액세스할 수 있는 다양한 방법을 제공합니다.

지금은 Workbench를 사용하여 SOQL 쿼리를 작성하는 데 초점을 맞추지만, 시간이 있다면 Workbench를 둘러보며 어떠한 기능을 제공하는지 확인해보세요. 매우 마음에 드실 것입니다. 무료 Developer Edition (DE) 조직에 가입한 후 다음 단계를 수행하세요.

  1. https://workbench.developerforce.com/login.php로 이동합니다.
  2. Environment(환경)에 대해 Production(프로덕션)을 선택합니다.
  3. API Version(API 버전) 드롭다운 메뉴에서 최신 API 버전을 선택합니다.
  4. 서비스 약관에 동의하고 Login with Salesforce(Salesforce를 사용하여 로그인)를 클릭합니다.
  5. 로그인 자격 증명을 입력하고 Log in(로그인)을 클릭합니다.
  6. Workbench가 여러분의 정보에 액세스하도록 허용하려면 Allow(허용)를 클릭합니다.
  7. 로그인한 후 Queries(쿼리) > SOQL Query(SOQL 쿼리)를 선택합니다.
  8. Account(계정)를 개체로 선택합니다.

테이블이 아닌 개체를 선택한 것에 주목하세요. 데이터는 개체 내부에 유지됩니다. Salesforce Objects에서와 마찬가지로, sObjects라고 불리며 Force.com 플랫폼과 긴밀하게 통합되어 있기 때문에 작업이 용이합니다.

  1. Ctrl 키를 누른 상태에서 Fields(필드) 목록에서 CreatedDate, Name, Phone, Type을 선택합니다. 개체와 필드를 선택하면 텍스트 상자에 SOQL 쿼리가 생성됩니다. SOQL 쿼리는 다음과 같은 모습입니다.
    SELECT CreatedDate, Name, Phone, Type FROM Account
    
  2. Query(쿼리)를 클릭하여 목록으로 반환된 결과를 확인합니다. 결과에서 CreatedDate 필드에 반환된 값을 확인합니다.

여기서 나쁜 소식은 Salesforce의 DateTime 필드가 SQL과 마찬가지로 SOQL에서도 복잡하고 작업이 어렵다는 점입니다. 좋은 소식은 Salesforce가 SOQL에서의 작업을 덜 힘들게 만드는 여러 날짜 함수를 제공한다는 것입니다. 문서를 살펴보면서 SOQL이 통화 필드를 처리하는 방법을 확인하세요. 특히 여러 통화를 처리하는 조직의 경우 SOQL이 약간 다를 수 있습니다.

결과 필터링

SOQL에서 두 가지 필수 절은 SELECT와 FROM입니다. WHERE 절은 선택 사항입니다. 하지만 여러분을 비롯한 뛰어난 개발자라면 작성하는 거의 모든 쿼리에 WHERE 절을 포함하고 싶을 것입니다. 필요 이상의 데이터를 반환하는 것은 의미가 없습니다.

다시 말하지만, Workbench를 사용하면 이러한 작동 방식을 매우 쉽게 확인할 수 있습니다.

  1. Workbench에 로그인한 후 Queries(쿼리) > SOQL Query(SOQL 쿼리)를 선택합니다.
  2. Contact(연락처)를 개체로 선택합니다.
  3. Ctrl 키를 누른 상태에서 Fields(필드) 목록에서 AccountId, Email, Id, LastName을 선택합니다. 개체와 필드를 선택하면 텍스트 상자에 SOQL 쿼리가 생성됩니다.
  4. Query(쿼리)를 클릭하여 목록으로 반환된 결과를 확인합니다. SOQL 쿼리는 다음과 같은 모습입니다.
    SELECT AccountId, Email, Id, LastName FROM Contact
    

이 쿼리는 조직의 모든 연락처를 반환합니다. 개발 조직의 경우 이 목록이 작을 수 있습니다. 하지만 대부분의 실제 조직의 경우 반환된 연락처 수가 매우 많을 수 있으므로 항상 WHERE 절을 사용하여 SOQL 쿼리를 필터링하는 것을 고려해야 합니다. Apex 코드에서 사용된 경우는 더욱 그렇습니다.

  1. Filter results by(필터 결과 기준) 드롭다운 목록에서 Email(이메일)을 선택합니다.
  2. 다음 필드로 이동한 후 드롭다운 상자의 화살표를 클릭하여 사용 가능한 연산자 목록을 확인합니다.
  3. 목록에서 contains(포함)를 선택하고 마지막 필드로 이동하여 .net을 입력합니다. 구성된 쿼리는 다음과 같은 모습입니다.
    SELECT AccountId, Email, Id, LastName FROM Contact WHERE Email LIKE '%.net%'
    

무슨 일이 일어났는지 눈치채셨나요? 구성된 쿼리에 contains 단어가 포함되어 있지 않습니다. 대신에 LIKE를 사용합니다. 또한 쿼리에는 Email(이메일)이 텍스트 필드이기 때문에 필수적인 작은따옴표, 그리고 와일드카드 검색임을 나타내는 선행 및 후행 백분율 기호가 포함됩니다.

참고: 와일드카드, 특히 위의 예와 같이 선행 및 후행 와일드카드를 사용하는 것은 좋은 관행으로 간주되지 않습니다. 이후 유닛에서 효율적인 쿼리를 작성하는 방법에 대해 자세히 알아볼 예정이므로, 이러한 와일드카드 검색은 가능한 피하시기 바랍니다.

  1. 그러는 김에 Sort results by(결과 정렬 기준) 드롭다운 목록에서 LastName을 선택하여 LastName을 기준으로 결과를 정렬합니다.
  2. 다른 기본값인 A to Z(A~Z) 및 Nulls First(Null 우선)는 그대로 둡니다. 이제 쿼리는 다음과 같은 모습입니다.
    SELECT AccountId,Email,Id,LastName FROM Contact
      WHERE Email LIKE '%.net%' ORDER BY LastName ASC NULLS FIRST
    
  3. Query(쿼리)를 클릭하여 결과를 정렬된 목록으로 반환합니다.

결과에서 가장 눈여겨보아야 할 항목은 AccountId 필드와 Id 필드입니다. 이 두 ID 필드에는 계정 및 연락처 레코드가 생성될 때 플랫폼에서 할당한 고유한 18자 문자열이 들어 있습니다. AccountId 필드는 이 특정 연락처가 할당된 계정 레코드와 연결됩니다. SQL 용어로는 외부 키 관계입니다. Id 필드는 연락처와 관련됩니다. SQL 용어로는 기본 키입니다.

외부 키 관계에 대한 얘기가 나왔으니, 이제 SOQL에서 테이블을 조인하는 방법이 궁금하실 것입니다. 그에 대한 짧은 대답은 불가능하다입니다. SOQL에는 상응하는 JOIN 절이 없습니다. 하지만 걱정하지 마세요. 이는 장점이라고 생각할 수 있으니까요.

서로 다른 조인 유형

이 얘기를 들어도 놀라지 않으시겠지만, Salesforce는 개체 또는 테이블을 결합할 때 여러분이 생각하는 것과 같이 약간 다르게 동작합니다. JOIN 절을 사용하여 테이블을 결합하는 대신, 관계 쿼리라고 하는 것을 작성합니다.

"관계 쿼리가 뭐죠?"라고 질문하는 소리가 들리는 것 같군요. 좋은 질문입니다.

Salesforce는 상위-하위 관계를 사용하여 두 개체를 결합합니다. SQL과 마찬가지로, SOQL은 외부 키를 사용하여 이러한 두 개체를 연결하지만, SOQL에서는 쿼리 구문이 다릅니다. 솔직히 말씀드리겠습니다. 처음에는 행 대신 개체로 작업하기 때문에 이러한 새 구문을 사용하는 것이 어색하게 느껴질 수 있습니다. 하지만 기본 사항을 익히고 나면 SQL로 작성하는 조인보다 관계 쿼리 작성이 훨씬 쉽다는 것을 알게 될 것입니다.

SOQL에는 기억해야 할 다음의 두 가지 기본 관계 쿼리 유형이 있습니다.

  • 하위-상위
  • 상위-하위

이 둘은 서로 다르게 동작합니다. 가장 흔하게 결합되는 계정 및 연락처 개체에 대한 일부 필드를 이미 살펴보았으므로, 이 두 가지부터 시작하겠습니다. 여기서 가장 중요한 사항은 계정이 상위 항목이고 연락처가 하위 항목이라는 점입니다.

하위-상위 쿼리 작성

계정 및 연락처 정보를 반환하는 쿼리를 작성한다고 가정해보겠습니다. 첫 번째 옵션은 하위-상위 쿼리를 작성하는 것입니다. 이 관계 쿼리는 '점 표기법'을 사용하여 상위 데이터에 액세스합니다. 즉 마침표는 관계 이름을 쿼리 중인 필드의 이름과 구분합니다.

작동 방식을 확인하기 위해 연결된 계정의 이름을 비롯한 연락처 목록을 반환하는 관계 쿼리를 작성하는 과정을 살펴보겠습니다. 하지만 이번에는 Workbench가 아니라 Developer Console의 Query Editor(쿼리 편집기) 탭을 사용합니다.

  1. 설정Setup(설정)을 클릭한 다음 Developer Console을 클릭합니다.
  2. Developer Console의 하단 창에서 Query Editor(쿼리 편집기) 탭을 클릭합니다.
  3. 기존 코드를 삭제하고 다음 코드 조각을 삽입합니다.
    SELECT FirstName, LastName, Account.Name FROM Contact
    
  4. Execute(실행)를 클릭합니다.
  5. 쿼리 결과에는 세 개의 열이 포함됩니다. 결과를 스크롤합니다. 모든 연락처가 계정과 관련된 것은 아니므로 Account.name 필드 아래의 일부 결과는 null입니다.

여전히 SQL 용어로 생각하고 계실 것이므로 다음의 시나리오를 가정해보세요. 계정과 연락처라는 두 개의 SQL 테이블이 있고 두 테이블 간에 일대다 관계가 있는 경우 이와 동일한 정보를 반환하는 SQL 쿼리를 작성하려면 어떻게 해야 할까요?

물론 조인을 사용할 것입니다. 하지만 이 사례에서는 오른쪽 외부 조인이 필요합니다. 계정과 관련이 없는 것을 포함한 모든 연락처를 반환하는 동등한 쿼리를 원하기 때문입니다. 이는 다음과 같은 모습일 수 있습니다.

    SELECT c.FirstName, c.LastName, a.Name FROM Account a
    RIGHT JOIN Contact c ON (c.AccountId = a.Id)

이제 다시 돌아와서 여러분의 기억을 돕기 위해 이에 상응하는 SOQL 쿼리를 살펴보겠습니다.

    SELECT FirstName, LastName, Account.Name FROM Contact

SOQL 쿼리가 훨씬 간단해 보이지 않나요?

솔직히 말해서, 관계 쿼리는 때때로 다소 까다로울 수 있습니다. 사용자 정의 개체에 대한 관계 이름을 알아내는 경우에는 더욱 그렇습니다. SQL 쿼리를 SOQL 쿼리로 전환하는 방법에 대한 자세한 내용은 이 실습 비디오를 참조하세요.

이러한 유형의 쿼리와 관련하여 알아야 할 매우 중요한 사항 한 가지는 점 표기법을 사용하여 다섯 단계를 이동할 수 있다는 것입니다. 즉 하위 항목에서 상위 항목, 최상위 항목 등으로 이동할 수 있습니다.

상위-하위 쿼리 작성

상위-하위 쿼리도 관계 이름을 사용하지만, 중첩 선택 쿼리라는 이름으로 사용합니다. 마지막 쿼리 유형과 마찬가지로, 이번에도 예를 들어 설명하겠습니다.

이번에는 상위 계정 개체에서 쿼리를 작성하고, 연결된 각 연락처에 대한 정보도 반환하는 중첩 쿼리를 포함하도록 해보겠습니다.

  1. Developer Console의 하단 창에서 Query Editor(쿼리 편집기) 탭을 클릭합니다.
  2. 기존 코드를 삭제하고 다음 코드 조각을 삽입합니다.
    SELECT Name, (Select FirstName, LastName FROM Contacts) FROM Account
    

중첩 쿼리 내의 관계 이름은 연락처와 달리, 복수형 이름의 연락처를 사용합니다. 이러한 세부 사항을 이해하는 것이 중요하며, 이 부문에서 많은 사람들이 실수를 합니다. 관계 쿼리에 대한 작업을 수행할 때 상위-하위 관계 이름은 복수형 이름이어야 합니다.

사용자 정의 개체에 대한 작업을 수행할 때 관계 이름은 복수형일 뿐만 아니라, 두 개의 밑줄과 r이 추가됩니다. 예를 들어 사용자 정의 개체 My_Object__c의 관계 이름은 My_Objects__r입니다.

  1. Execute(실행)를 클릭합니다.
  2. 쿼리 결과에는 두 개의 열이 포함됩니다. 다음 이미지에서 Contacts(연락처) 열 아래의 결과가 어떻게 표시되는지 확인하세요. 각 계정은 일반적으로 여러 연락처와 연결되어 있으므로 이름과 성은 JSON 형식으로 표시됩니다.

Developer Console에 표시되는 SOQL 쿼리 결과

다시 한번, 동일한 쿼리가 SQL로 작성되는 방식을 살펴보겠습니다. 이 쿼리의 경우 SQL 상응물은 다음과 유사한 왼쪽 외부 조인입니다.

    SELECT a.Name, c.FirstName, c.LastName
    FROM Account a
    LEFT JOIN Contact c ON (a.Id = c.AccountId)

SQL 쿼리는 모든 계정 레코드 및 해당 계정과 연결된 연락처를 가져옵니다. SQL에 반환된 출력은 JSON 형식이 아닙니다. 그 외에는 SQL 및 SOQL 쿼리가 동일한 결과를 생성합니다.

이 시점에서 SOQL이 앨리어싱을 지원하는지 여부가 궁금할 것입니다. 앨리어싱을 지원하지만, SQL에서 작업하던 방식과는 다릅니다. SOQL에는 AS 키워드가 없습니다. 별칭을 사용하여 SOQL 쿼리에서 개체 이름을 나타낼 수 있지만, 필드 이름의 경우 별칭 지정은 집계 쿼리에 대해서만 작동합니다. 이에 대해서는 다음에 다룰 예정입니다.

이 주제에 대해 더 자세히 알아보려면 리소스 섹션의 실습 비디오 링크를 참조하세요.

집계는 어떻게 되나요?

SOQL에도 집계가 있으며 예상하는 대로 거의 동작합니다. 말하자면요. 집계 작업에 대해 알아야 할 가장 중요한 점은 대부분의 함수에서 결과가 AggregateResult 유형으로 반환된다는 것입니다.

SOQL에서 사용할 수 있는 함수는 아래 표에서 확인할 수 있습니다. 각 함수에 대한 자세한 내용은 공식 문서를 참조하세요.

SOQL 집계 함수

함수 설명
AVG() 숫자 필드의 평균 값을 반환합니다.
COUNT() 및 COUNT(fieldName) 및 COUNT_DISTINCT() 쿼리 기준과 일치하는 행 수를 반환합니다.
MIN() 필드의 최소값을 반환합니다.
MAX() 필드의 최대값을 반환합니다.
SUM() 숫자 필드의 총 합계를 반환합니다.

SQL에서 Account라는 이름의 특정 테이블에 대한 레코드 수를 가져오려면 다음을 작성하세요.

SELECT COUNT(*) FROM Account

SOQL에서 이와 동일한 쿼리는 다음과 같습니다.

SELECT COUNT() FROM Account

서로 매우 유사합니다.

차이점은 사용하는 count 함수의 버전에 따라 다른데, 이는 서로 다른 결과를 반환하기 때문입니다. 필드 이름이 없는 COUNT() 함수는 다른 집계 함수 이전에 사용 가능했던 예전 버전입니다. 이 버전의 함수는 정수를 반환하며, SQL에서 제공되는 count(*) 함수와 가장 유사합니다.

Count(fieldName)는 행 수를 반환하는 최신 버전으로, fieldName에 null이 아닌 값을 포함합니다. 차이점은 이러한 결과를 단일 값이 아닌 AggregateResults 목록으로 반환한다는 것입니다.

실제 동작 모습을 살펴보겠습니다.

  1. Developer Console의 하단 창에서 Query Editor(쿼리 편집기) 탭을 클릭합니다.
  2. 기존 코드를 삭제하고 다음 코드 조각을 삽입합니다.
    SELECT COUNT() FROM Account
    
  3. Execute(실행)를 클릭합니다. 쿼리 결과에는 옆에 숫자가 있는 총 행 수가 표시됩니다.
  4. Query Editor(쿼리 편집기) 탭으로 돌아와서 쿼리를 다음과 같이 변경합니다.
    SELECT COUNT(Id) FROM Account
    
  5. Execute(실행)를 클릭합니다. 이제 쿼리 결과에는 반환된 행과 총 레코드 수를 표시하는 열만 표시됩니다.

지금까지는 SOQL 쿼리에서 반환하는 데이터를 처리하는 방법에 대해 많이 이야기하지 않았습니다. 하지만 계속해서 미룰 수는 없습니다. 이제 일부 집계 데이터를 통해 그에 대해 자세히 알아보겠습니다.

Apex에 대해 좀더 자세히 살펴보겠지만, 아직 완전히 이해가 안 되더라도 걱정하지는 마세요. 나중에 자세히 다룰 예정입니다.

  1. Developer Console에서 Debug(디버그) > Open Execute Anonymous Window(익명 실행 창 열기)를 선택합니다.
  2. 기존 코드를 삭제하고 다음 코드 조각을 삽입합니다.
    List<AggregateResult> results  = [SELECT Industry, count(Id) total
        FROM Account GROUP BY Industry];
    for (AggregateResult ar :results) {
        System.debug('Industry:' + ar.get('Industry'));
        System.debug('Total Accounts:' + ar.get('total'));
    }
    

GROUP BY 절과 함께 총계를 나타내기 위해 별칭을 사용한 방법에 주목하세요. SOQL에서는 GROUP BY 절을 사용하는 집계 쿼리의 필드에만 별칭을 지정할 수 있습니다.

  1. Open Log(로그 열기)가 선택되었는지 확인하고 Execute(실행)를 클릭합니다. 실행 로그를 보여주는 탭이 로드됩니다.
  2. 로그에 디버그 문만 표시되도록 Debug Only(디버그만) 옵션을 선택합니다.

추가 정보

GROUP BY 절 외에도 SOQL은 GROUP BY ROLLUP, GROUP BY CUBE, GROUPING 등과 같은 다른 그룹화 절을 제공합니다. 이러한 절을 사용하면 쿼리가 여러 관련 테이블에서 값을 반환할 때 결과를 간편하게 검사할 수 있습니다. GROUP BY CUBE는 쿼리 결과에서 그룹화된 필드의 모든 조합에 대한 소계를 추가할 수 있는 유용한 절입니다. 이러한 절에 대한 자세한 내용은 리소스 섹션의 GROUP BY 문서를 참조하세요.

집계 함수는 SQL Server의 HAVING 절과 유사한 선택적 HAVING 절도 지원하므로, 편안한 마음으로 작업할 수 있습니다. 기본적으로 집계 함수가 반환하는 결과를 필터링할 수 있습니다. 자세한 내용은 리소스 섹션을 참조하세요.

리소스

Salesforce 도움말에서 Trailhead 피드백을 공유하세요.

Trailhead에 관한 여러분의 의견에 귀 기울이겠습니다. 이제 Salesforce 도움말 사이트에서 언제든지 새로운 피드백 양식을 작성할 수 있습니다.

자세히 알아보기 의견 공유하기