SQL 기본사항

1. 시작하기 전에

이전 과정에서는 네트워크에 연결된 데이터를 앱에 통합하는 방법과 코루틴을 사용하여 동시 실행 작업을 처리하는 방법을 알아봤습니다. 이번 과정에서는 고품질 앱을 빌드할 수 있는 또 다른 Android 개발 기본 기술인 지속성을 알아봅니다. 이 용어를 들어본 적이 없더라도 앱을 사용할 때 지속성을 경험했을 것입니다. 쇼핑 목록 작성, 사진 앱에서의 몇 년 전 사진 스크롤, 게임 일시중지 및 재개에 이르기까지 앱은 지속성을 사용하여 원활한 사용자 환경을 제공합니다. 사용자는 이러한 기능을 당연하게 생각하기 쉽지만 데이터 지속성은 개발자가 고품질 앱을 빌드하는 데 필수적인 기술입니다.

이 단원의 뒷부분에서는 Android의 지속성에 관해 자세히 알아보고 앱이 데이터베이스에서 읽고 쓸 수 있도록 하는 Room이라는 라이브러리를 알아봅니다. 그러나 Android의 지속성 사용에 관해 알아보기 전에 관계형 데이터베이스의 기본사항과 SQL(구조화된 쿼리 언어의 약어)로 데이터를 읽고 조작하는 방법을 잘 아는 것이 중요합니다. 관련 개념을 이미 잘 알고 있다면 Room을 배울 때 개념을 떠올리도록 이 과정을 복습해 보세요. 잘 몰라도 괜찮습니다. 이 시점에서는 데이터베이스에 관해 아무것도 몰라도 됩니다. 이 Codelab을 마치면 Android 앱에서 데이터베이스를 사용하는 방법을 배우는 데 필요한 기본사항을 모두 익히게 됩니다.

기본 요건

  • Android 스튜디오에서 프로젝트를 탐색합니다.

학습할 내용

  • 관계형 데이터베이스의 구조: 테이블, 열, 행
  • WHERE, ORDER BY, GROUP BY, LIMIT 절을 포함한 SELECT
  • SQL을 사용하여 행을 삽입하고 업데이트하며 삭제하는 방법

필요한 항목

  • Android 스튜디오가 설치된 컴퓨터

2. 관계형 데이터베이스 개요

관계형 데이터베이스란 무엇인가요?

컴퓨팅에서 데이터베이스는 단순히 전자 형식으로 액세스하고 쓸 수 있는 구조화된 데이터 모음입니다. 데이터베이스는 Kotlin을 사용하여 앱에 나타낼 수 있는 같은 정보를 모두 저장할 수 있습니다. 휴대기기에서 데이터베이스는 인터넷과 같은 다른 소스에서 데이터를 검색하지 않고도 다음번에 앱을 열 때 액세스하도록 실행 중인 앱의 데이터를 저장하는 데 흔히 사용됩니다. 이를 데이터 지속성이라고 합니다.

데이터 지속성을 이야기할 때 '관계형 데이터베이스'라는 용어를 자주 듣게 됩니다. 관계형 데이터베이스는 데이터를 테이블과 열, 행으로 구성하는 일반적인 데이터베이스 유형입니다. Kotlin 코드를 작성할 때는 객체를 나타내는 클래스를 만듭니다. 관계형 데이터베이스에서 테이블은 같은 방식으로 작동합니다. 데이터를 나타내는 것 외에도 테이블은 다른 테이블을 참조할 수 있으므로 테이블 간 관계를 확인할 수 있습니다. 일반적인 예로는 '학생', '교사', '과정'에 관한 테이블이 있습니다. 과정에는 교사가 한 명 있을 수 있지만 학생은 여러 과정을 들을 수도 있습니다. 데이터베이스는 이러한 테이블 간의 관계를 나타낼 수 있으므로 관계형 데이터베이스라는 용어를 듣는 경우가 많습니다.

ef61dd2663e4da82.png

현실에서의 관계는 테이블 간의 관계로 표현할 수 있습니다.

테이블, 열, 행

테이블 또는 나타내는 데이터를 정의하는 것은 관계형 데이터베이스를 만드는 첫 번째 단계일 뿐입니다. 각 테이블에 어떤 특정 정보가 저장되어 있는지도 생각해야 합니다. 특정 속성은 로 표현됩니다. 열은 이름과 데이터 유형으로 구성됩니다. Kotlin의 클래스 작업을 통해 속성은 이미 잘 알고 계실 겁니다. SQL 테이블도 같은 방식으로 생각하면 됩니다. 테이블은 클래스 정의와 같아서 나타내려는 '사물'의 유형을 설명합니다. 열은 테이블의 각 항목으로 만들어진 '사물'의 특정 속성입니다.

식물

ID

INTEGER

TEXT(문자열)

이름

TEXT(문자열)

색상

TEXT(문자열)

정원

ID

INTEGER

이름

TEXT(문자열)

길이

INTEGER

너비

INTEGER

개별 테이블 항목을 이라고 합니다. Kotlin의 클래스 인스턴스와 같습니다. 각 행에는 각 열에 상응하는 데이터가 있습니다. 테이블은 템플릿을 제공하지만 행은 테이블에 저장된 실제 데이터를 정의합니다.

ID

이름

색상

1

카멜리아 시넨시스

차나무

녹색

2

에키네시아

드린국화

자주색

3

페룰라

아위

녹색

기본 키

위 예에서 ID 속성 열이 있는 것에 주목합니다. 자연의 식물종이나 데이터베이스에 나타내는 어떤 것에든 편리하게 번호가 지정된 ID가 없을 수 있지만 데이터 테이블의 행에는 일종의 고유 식별자가 있는 것이 중요합니다. 일반적으로 기본 키라고 하는 이 식별자는 테이블의 각 행에 고유하며, 한 데이터 테이블의 행을 다른 테이블에서 참조해야 하는 경우 유용합니다. 예를 들어 정원에 포함된 모든 식물 종과 정원을 연결하려는 '정원'이라는 또 다른 테이블이 있습니다. 식물 테이블의 기본 키를 사용하여 정원 테이블 또는 데이터베이스에 있는 다른 테이블의 항목에서 식물을 참조할 수 있습니다.

기본 키를 사용하면 관계형 데이터베이스에서 관계를 확인할 수 있습니다. 이 과정에서는 테이블이 두 개 이상인 데이터베이스를 사용하지 않지만 테이블의 기존 항목을 쿼리하고 업데이트하며 삭제하는 데 도움이 되는 고유 ID가 있습니다.

데이터 유형

Kotlin 클래스의 속성을 정의하는 것과 마찬가지로 데이터베이스의 열은 가능한 여러 데이터 유형 중 하나일 수 있습니다. 열은 문자나 문자열, 숫자(소수점 포함 여부와 상관없음), 바이너리 데이터를 나타낼 수 있습니다. 날짜 및 시간과 같은 다른 데이터는 사용 사례에 따라 숫자나 문자열로 표시될 수 있습니다. Room을 사용할 때 Kotlin 유형을 주로 사용하지만 이 유형은 내부적으로 SQL 유형에 매핑됩니다.

SQL

관계형 데이터베이스에 액세스할 때는 자체적으로든 Room과 같은 라이브러리를 사용하든 SQL이라는 것이 필요합니다.

SQL이란 무엇일까요? SQL('sequel'이라고도 함)은 구조화된 쿼리 언어를 의미하며 이를 통해 관계형 데이터베이스에서 데이터를 읽고 조작할 수 있습니다. 걱정하지 않아도 됩니다. 앱에서 지속성을 구현하기 위해 완전히 새로운 프로그래밍 언어를 배울 필요는 없습니다. Kotlin과 같은 프로그래밍 언어와 달리 SQL은 데이터베이스에서 읽고 쓰기 위한 몇 가지 유형의 문으로만 구성됩니다. 각각의 기본 형식을 익히고 나면 데이터베이스에서 읽거나 쓰는 특정 정보에 관해 빈칸을 채우면 됩니다.

다음은 앞으로 사용할 가장 일반적인 SQL 문입니다.

SELECT

데이터 테이블에서 특정 정보를 가져오고 결과를 다양한 방법으로 필터링하고 정렬할 수 있습니다.

INSERT

테이블에 새 행을 추가합니다.

UPDATE

테이블의 기존 행을 업데이트합니다.

DELETE

테이블의 기존 행을 삭제합니다.

이제 SQL로 작업하려면 데이터베이스가 있어야 합니다. 다음 화면에서 SQL 쿼리를 연습할 수 있는 데이터베이스가 포함된 샘플 프로젝트를 설정합니다.

3. 시작 코드 - Parks 데이터베이스

다운로드할 시작 코드는 이전 Codelab과는 약간 다릅니다. 기존 프로젝트에 기반하는 대신 SQL 쿼리 연습에 사용할 수 있는 데이터베이스를 만드는 간단한 Android 스튜디오 프로젝트를 제공합니다. 앱을 한 번 실행하면 Database Inspector라는 Android 스튜디오 도구를 사용하여 데이터베이스에 액세스할 수 있습니다.

이 Codelab의 코드를 가져와서 Android 스튜디오에서 열려면 다음을 실행합니다.

코드 가져오기

  1. 제공된 URL을 클릭합니다. 브라우저에서 프로젝트의 GitHub 페이지가 열립니다.
  2. 프로젝트의 GitHub 페이지에서 Code 버튼을 클릭하여 대화상자를 엽니다.

5b0a76c50478a73f.png

  1. 대화상자에서 Download ZIP 버튼을 클릭하여 컴퓨터에 프로젝트를 저장합니다. 다운로드가 완료될 때까지 기다립니다.
  2. 컴퓨터에서 파일을 찾습니다(예: Downloads 폴더).
  3. ZIP 파일을 더블클릭하여 압축을 해제합니다. 프로젝트 파일이 포함된 새 폴더가 만들어집니다.

Android 스튜디오에서 프로젝트 열기

  1. Android 스튜디오를 시작합니다.
  2. Welcome to Android Studio 창에서 Open an existing Android Studio project를 클릭합니다.

36cc44fcf0f89a1d.png

참고: Android 스튜디오가 이미 열려 있는 경우 File > New > Import Project 메뉴 옵션을 대신 선택합니다.

21f3eec988dcfbe9.png

  1. Import Project 대화상자에서 압축 해제된 프로젝트 폴더가 있는 위치로 이동합니다(예: Downloads 폴더).
  2. 프로젝트 폴더를 더블클릭합니다.
  3. Android 스튜디오가 프로젝트를 열 때까지 기다립니다.
  4. Run 버튼 11c34fc5e516fb1c.png을 클릭하여 앱을 빌드하고 실행합니다. 예상대로 작동하는지 확인합니다.
  5. Project 도구 창에서 프로젝트 파일을 살펴보고 앱이 설정된 방식을 확인합니다.

다음 섹션으로 이동하기 전에 다음 단계를 완료하여 시작 프로젝트가 설정되어 있는지 확인하세요.

  1. 애플리케이션을 실행합니다. 앱에는 다음과 같은 단일 화면이 표시됩니다.

3c62c10fad7c0136.png

  1. Android 스튜디오에서 View > Tool Windows > Database Inspector로 이동하여 Database Inspector를 엽니다.
  2. 하단에 'Database Inspector'라는 라벨이 지정된 새 탭이 표시됩니다. 로드하는 데 몇 초 정도 걸릴 수 있지만 쿼리를 실행하는 데 선택할 수 있는 데이터 테이블이 포함된 목록이 왼쪽에 표시됩니다.

8c2b12249b4f652a.png

4. 기본 SELECT 문

다음 연습에서는 Database Inspector에서 쿼리를 실행합니다. 왼쪽 창(park)에서 올바른 테이블을 선택하고 Open New Query Tab 버튼을 클릭하면 SQL 명령어를 입력할 수 있는 텍스트 상자가 표시됩니다.

bb06b5ce9ac4ba72.png

SQL 문은 데이터베이스에 액세스(읽기 또는 쓰기)하는 일종의 코드 줄과 같은 명령어입니다. SQL로 할 수 있는 가장 기본적인 작업은 간단히 테이블의 모든 데이터를 가져오는 것입니다. 이렇게 하려면 SELECT라는 단어로 시작합니다. 즉, 데이터를 읽으려 한다는 의미입니다. 그런 다음 별표(*)를 추가합니다. 여기서 선택하려는 열을 지정하고 별표를 사용하면 모든 열을 간단히 선택할 수 있습니다. 이제 FROM 키워드를 사용한 후 데이터 테이블 이름 park를 사용합니다. Database Inspector에서 다음 명령어를 실행하고 모든 행과 열이 있는 전체 테이블을 확인합니다.

SELECT * FROM park

데이터 테이블의 모든 열 대신 특정 열만 선택하려면 열 이름을 지정하면 됩니다.

SELECT city FROM park

각각 쉼표로 구분된 특정 열을 여러 개 선택할 수도 있습니다.

SELECT name, established, city FROM park

데이터베이스의 모든 행을 반드시 선택하지 않아도 되는 때도 있습니다. SQL 문의 절 부분을 추가하여 결과 범위를 더 좁힐 수 있습니다.

한 절은 LIMIT이고 이 절을 통해 반환되는 행 수에 제한을 설정할 수 있습니다. 따라서 23개 결과를 모두 반환하는 대신 다음 쿼리는 처음 5개만 반환합니다.

SELECT name FROM park
LIMIT 5

가장 일반적이고 유용한 절 중 하나는 WHERE 절입니다. WHERE 절을 사용하면 하나 이상의 열에 기반하여 결과를 필터링할 수 있습니다.

SELECT name FROM park
WHERE type = "national_park"

'같지 않음'(!=) 연산자도 있습니다. 다음 쿼리는 recreation_area가 아닌 10만 에이커가 넘는 모든 공원을 나열합니다. WHERE 절을 사용하면 ANDOR과 같은 부울 연산자를 사용하여 조건을 두 개 이상 추가할 수도 있습니다.

SELECT name FROM park
WHERE type != "recreation_area"
AND area_acres > 100000

연습

SQL 쿼리는 데이터에 관한 다양한 질문에 답하는 데 유용할 수 있고 가장 좋은 연습 방법은 직접 쿼리를 작성하는 것입니다. 다음 몇 단계에 걸쳐 특정 질문에 답하는 쿼리를 작성해보겠습니다. 계속 진행하기 전에 Database Inspector에서 테스트해보세요.

모든 연습은 이전 모든 섹션에서 배운 내용을 토대로 하고 Codelab 끝부분에 답변을 확인하는 둘러보기가 제공됩니다.

5. 일반적인 SQL 함수

작성한 첫 번째 쿼리는 단순히 데이터베이스의 모든 행을 반환했습니다.

SELECT * FROM park

그러나 긴 결과 목록을 반환하고 싶지 않을 수 있습니다. SQL은 데이터를 의미 있는 단일 값으로 줄일 수 있는 집계 함수도 제공합니다. 예를 들어 park 테이블의 행 수를 알고 싶다고 가정해보겠습니다. SELECT * ... 대신 COUNT() 함수를 사용하고 *(모든 행의 경우) 또는 열 이름을 전달하면 쿼리가 모든 행 수를 대신 반환합니다.

SELECT COUNT(*) FROM park

또 다른 유용한 집계 함수는 열의 값을 더하는 SUM() 함수입니다. 이 쿼리는 국립공원(null이 아닌 park_visitors 열이 있는 유일한 항목이므로)만 필터링하고 모든 공원의 방문자 총수를 합산합니다.

SELECT SUM(park_visitors) FROM park
WHERE type = "national_park"

null 값에 여전히 SUM()을 사용할 수 있지만 값은 간단히 0으로 처리됩니다. 다음 쿼리는 위 쿼리와 같은 결과를 반환합니다. 그러나 앱에서 SQL을 사용할 때 버그를 방지하려면 최대한 구체적인 것이 좋습니다.

SELECT SUM(park_visitors) FROM park

값을 집계하는 것 외에도 각각 가장 큰 값과 가장 작은 값을 가져오는 MAX(), MIN()과 같은 다른 유용한 함수도 있습니다.

SELECT MAX(area_acres) FROM park
WHERE type = 'national_park'

DISTINCT 값 가져오기

일부 행의 경우 열에 다른 행과 같은 값이 있음을 알 수 있습니다. 예를 들어 유형 열에는 한정된 수의 가능한 값만 있습니다. DISTINCT 키워드를 사용하여 쿼리 결과에서 중복 값을 제거할 수 있습니다. 예를 들어 유형 열의 모든 고유한 값을 가져오려면 다음 쿼리를 사용하면 됩니다.

SELECT DISTINCT type FROM park

집계 함수에서 DISTINCT를 사용할 수도 있으므로 고유한 type을 나열하고 직접 계산하는 대신 간단히 개수를 반환할 수 있습니다.

SELECT COUNT(DISTINCT type) FROM park

연습

잠시 시간을 내어 지금까지 배운 내용을 적용해보고 다음 쿼리를 작성할 수 있는지 확인하세요. Database Inspector를 사용하여 코드가 작동하는지 확인해야 합니다.

6. 쿼리 결과 정렬 및 그룹화

이전 예에서는 특정 항목을 찾기가 어려웠을 수 있습니다. 다행히 ORDER BY 절을 사용하여 SELECT 문의 결과를 정렬할 수도 있습니다. 쿼리 끝 WHERE 절(있는 경우) 뒤에 ORDER BY 절을 추가하고 정렬 기준으로 사용할 열 이름을 지정하기만 하면 됩니다. 다음 예는 데이터베이스에 있는 모든 공원의 이름을 가져오지만 결과를 알파벳순으로 정렬합니다.

SELECT name FROM park
ORDER BY name

기본적으로 결과는 오름차순으로 정렬되지만 ASC 또는 DESC 키워드를 order by 절에 추가하여 오름차순 또는 내림차순으로 정렬할 수 있습니다. ASC는 지정하지 않아도 됩니다. 첫 번째 쿼리가 먼저 오름차순으로 결과를 나열하기 때문입니다. 그러나 결과를 내림차순으로 가져오려면 DESC 키워드를 ORDER BY 절 끝에 추가합니다.

SELECT name FROM park
ORDER BY name DESC

결과를 더 쉽게 읽으려면 열별로 그룹화할 수도 있습니다. ORDER BY 절(있는 경우) 앞에 선택적으로 GROUP BY 절과 열을 지정할 수 있습니다. 이렇게 하면 결과가 GROUP BY의 열과 관련된 하위 집합으로 분리되고 각 열의 경우 결과가 나머지 쿼리에 따라 필터링되고 정렬됩니다.

SELECT type, name FROM park
GROUP BY type
ORDER BY name

예를 통해 잘 알 수 있습니다. 데이터베이스에 있는 모든 공원을 계산하는 대신 각 유형의 공원 수가 얼마나 되는지 확인하고 별도의 개수를 가져올 수 있습니다.

SELECT type, COUNT(*) FROM park
GROUP BY type
ORDER BY type

연습

잠시 시간을 내어 지금까지 배운 내용을 적용해보고 다음 쿼리를 작성할 수 있는지 확인하세요. Database Inspector를 사용하여 코드가 작동하는지 확인해야 합니다.

문제 4: 방문자가 가장 많은 상위 5개 공원 이름을 방문자 수와 함께 내림차순으로 가져오는 SQL 쿼리를 작성하세요.

7. 행 삽입 및 삭제

Room을 사용하여 Android에서 데이터 유지를 최대한 활용하려면 데이터를 쓸 수 있어야 합니다. 데이터베이스 쿼리 외에도 행을 삽입하거나 업데이트하거나 삭제하는 SQL 문도 있습니다. 나중에 과정 2에서 Room을 사용한 데이터 쓰기를 학습할 때 이에 관한 기본 지식이 필요합니다.

INSERT 문

새 행을 추가하려면 INSERT 문을 사용합니다. INSERT 문 뒤에는 INTO 키워드와 행을 추가하려는 테이블의 이름이 옵니다. VALUES 키워드 뒤에 각 열의 값을 괄호로 묶어 순서대로 제공하고 각 값은 쉼표로 구분합니다. INSERT 문의 형식은 다음과 같습니다.

INSERT INTO table_name
VALUES (column1, column2, ...)

park 테이블에 행을 추가하려면 INSERT 문을 다음과 같이 작성하면 됩니다. 값은 park 테이블에서 열이 정의된 순서와 일치합니다. 일부 데이터가 지정되지 않았습니다. 지금은 괜찮습니다. 삽입한 후 언제든지 행을 업데이트할 수 있기 때문입니다.

INSERT INTO park
VALUES (null, 'Googleplex', 'Mountain View', 12, null, 0, '')

또한 ID의 경우 null을 전달합니다. 특정 번호를 제공할 수 있지만 그렇게 편리한 방법은 아닙니다. 중복이 없도록 앱이 최신 ID를 추적해야 하기 때문입니다. 그러나 기본 키가 자동으로 증가하도록(여기서 실행함) 데이터베이스를 구성할 수 있습니다. 이렇게 하면 null을 전달할 수 있고 다음 ID가 자동으로 선택됩니다.

WHERE 절을 사용해 "Googleplex"라는 공원을 지정하여 항목이 만들어졌는지 확인합니다.

SELECT * FROM park
WHERE name = 'Googleplex'

UPDATE 문

행이 만들어지면 언제든지 그 내용을 변경할 수 있습니다. UPDATE 문을 사용하면 됩니다. 이제까지 확인한 다른 모든 SQL 문과 마찬가지로 테이블 이름을 먼저 지정해야 합니다. SET 절에서 변경하려는 각 열을 새 값으로 설정하기만 하면 됩니다.

UPDATE table_name
SET column1 = ...,
column2 = ...,
...
WHERE column_name = ...
...

Googleplex 항목의 경우 기존 속성 하나가 업데이트되고 다른 일부 필드는 채워집니다. 이러한 필드에는 이전에 값이 있었지만 빈 문자열 ""였습니다. UPDATE 문으로 필드를 여러 개 또는 모두 한 번에 업데이트할 수 있습니다.

UPDATE park
SET area_acres = 46,
established = 1088640000,
type = 'office'
WHERE name = 'Googleplex'

쿼리 결과에 반영된 업데이트를 확인하세요.

SELECT * FROM park
WHERE name = 'Googleplex'

DELETE 문

마지막으로 SQL 명령어를 사용하여 데이터베이스에서 행을 삭제할 수도 있습니다. 다시 테이블 이름을 지정하고 SELECT 문으로 했던 것처럼 WHERE 절을 사용하여 삭제하려는 행의 기준을 제공합니다. WHERE 절이 여러 행과 일치할 수 있으므로 명령어 하나로 여러 행을 삭제할 수 있습니다.

DELETE FROM table_name
WHERE <column_name> = ...

Googleplex는 국립공원이 아니므로 DELETE 문을 사용하여 데이터베이스에서 이 항목을 삭제해보세요.

DELETE FROM park
WHERE name = 'Googleplex'

SELECT 문을 사용하여 행이 삭제되는지 확인합니다. 쿼리가 반환하는 결과는 없습니다. 즉, 'Googleplex'라는 이름이 있는 모든 행이 성공적으로 삭제되었습니다.

SELECT * FROM park
WHERE name = 'Googleplex'

이것으로 데이터를 삽입하고 업데이트하며 삭제하는 작업을 마쳤습니다. 실행하려는 SQL 명령어의 형식을 알고 데이터베이스의 열과 일치하는 값을 지정하기만 하면 됩니다. 다음 Codelab에서 Room을 소개할 때는 주로 데이터베이스에서 읽기에 중점을 둡니다. 데이터의 삽입과 업데이트, 삭제는 과정 2에서 자세히 다룹니다.

8. 연습 문제 솔루션

연습 문제가 SQL 개념을 확실히 이해하는 데 도움이 되었길 바랍니다. 어려운 문제가 있거나 답변을 확인하고 싶다면 아래 Google 답변을 언제든지 참고하세요.

문제 1: 방문자가 100만 명 미만인 공원 이름을 모두 가져오는 SQL 쿼리를 작성하세요.

이 문제는 WHERE 절에 지정할 수 있는 방문자가 100만 명 미만이어야 하는 공원 이름(단일 열)을 요청합니다.

SELECT name FROM park
WHERE park_visitors < 1000000

문제 2: park 테이블에서 고유한 도시 수를 가져오는 SQL 쿼리를 작성하세요.

열의 총수는 COUNT() 함수를 사용하여 계산할 수 있지만 고유한 도시(공원이 여러 개인 도시도 있기 때문)만 원하므로 COUNT() 함수에서 열 이름 앞에 DISTINCT 키워드를 사용할 수 있습니다.

SELECT COUNT(DISTINCT city) FROM park

문제 3: 샌프란시스코에 있는 공원의 총방문자 수를 가져오는 SQL 쿼리를 작성하세요.

총방문자 수는 SUM() 함수를 사용하여 계산할 수 있습니다. 또한 샌프란시스코에 위치한 공원만 지정하려면 WHERE 절도 있어야 합니다.

SELECT SUM(park_visitors) FROM park
WHERE city = "San Francisco"

문제 4: 방문자가 가장 많은 상위 5개 공원(이름만)을 방문자 수와 함께 내림차순으로 가져오는 SQL 쿼리를 작성하세요.

쿼리는 이름 열과 park_visitors 열을 모두 가져와야 합니다. 결과는 ORDER BY 절을 사용하여 내림차순으로 park_visitors 열에 정렬됩니다. 결과를 다른 열에 그룹화하고 이러한 그룹 내에서 정렬하길 바라지 않으므로 GROUP BY 절은 필요하지 않습니다.

SELECT name, park_visitors FROM park
ORDER BY park_visitors DESC
LIMIT 5

9. 축하합니다

요약하면 다음과 같습니다.

  • 관계형 데이터베이스를 사용하면 테이블, 열, 행으로 구성된 데이터를 저장할 수 있습니다.
  • SQL SELECT 문을 사용하여 데이터베이스에서 데이터를 검색할 수 있습니다.
  • SELECT 문에서 WHERE, GROUP BY, ORDER BY, LIMIT를 비롯한 다양한 절을 사용하여 쿼리를 더 구체적으로 만들 수 있습니다.
  • 집계 함수를 사용하여 여러 행의 데이터를 단일 열로 결합할 수 있습니다.
  • SQL INSERT, UPDATE, DELETE 문을 각각 사용하여 데이터베이스의 행을 추가하고 업데이트하며 삭제할 수 있습니다.

자세히 알아보기