안녕하세요.
이 자습서에서는 SQL의 #WHERE, #GROUP_BY, #HAVING 및 #ORDER_BY 절에 대해서 배우고 #Docker 에서 실행되는 #postgresql 데이터베이스를 사용합니다.
1. 소개
SQL은 Structured Query Language의 약자이며 MySQL, PostgreSQL, Oracle 등과 같은 관계형 데이터베이스에 저장된 데이터를 구성하고 추출하는 데 사용됩니다.
관계형 데이터베이스는 나중에 분석에 사용할 수 있는 데이터베이스에서 특정 정보를 가져올 수 있는 행과 열로 구성됩니다.
실시간으로 SQL은 동시에 쓰고 읽는 대량의 데이터를 관리하며 SQL 서버에 도달하는 모든 쿼리는 다음 세 부분으로 처리됩니다.
- Parsing – SQL 쿼리 문법을 확인하는 과정
- Binding – SQL 쿼리 문법을 확인하는 프로세스
- 최적화 - SQL 쿼리 실행 계획을 생성하는 프로세스
1.1 SQL의 사용 법
구조적 쿼리 언어(보통 SQL로 알려짐)는 데이터 분석가와 데이터 과학 전문가가 일반적으로 사용하며 매우 유용합니다.
- 데이터베이스에 대한 쿼리 실행
- 데이터베이스에서 데이터 검색
- 데이터베이스에 새 레코드 삽입
- 기존 레코드를 데이터베이스로 업데이트
- 데이터베이스에서 저장 프로시저, 함수 및 구체화된 뷰 생성
- 사용자 생성 및 권한 부여
- 테이블, 저장 프로시저, 함수 및 구체화된 뷰에 대한 권한 설정
1.2 WHERE 절이란 무엇인가?
#SQL 문의 WHERE 절은 지정된 조건에 따라 레코드를 필터링하는 데 사용됩니다.
SQL 쿼리는 아래 구문을 확인 하십시오.
WHERE 구문 문법
SELECT column1, column2, … column FROM table_name WHERE condition;
1.3 GROUP BY 절이란 무엇인가?
SQL 문의 GROUP BY 절은 유사한 데이터를 그룹화하는 데 사용됩니다.
GROUP BY 절은 WHERE 절 뒤와 ORDER BY 절(있는 경우) 앞에 사용됩니다.
SQL 쿼리는 아래 구문을 확인 하십시오.
GROUP BY 구문 문법
SELECT
column1, column2, … column
FROM
table_name
WHERE
condition
GROUP BY column_name(s) ORDER BY column_name(s);
1.4 HAVING 절이란 무엇인가?
SQL 문의 HAVING 절은 지정된 조건에 따라 그룹의 레코드를 필터링하는 데 사용됩니다. SQL 쿼리표현은 아래와 같습니다.
HAVING 구문 문법
SELECT
column1, column2, … column
FROM
table_name
WHERE
condition
GROUP BY column_name(s) HAVING condition
ORDER BY column_name(s);
아래와 같이 WHERE 절과 다릅니다.
HAVING 절
|
WHERE 절
|
특정 조건에 따라 그룹의 레코드 필터링
|
특정 조건에 따라 레코드 필터링
|
sql 문에서 GROUP BY 절과 함께 실행된다.
|
sql 문에서 GROUP BY 절 없이 실행된다
|
sql 문에서 집계 함수를 사용 할 수 있다.
|
sql 문에서 집계 함수를 사용 할 수 없다.
|
오직 SELECT sql 문과 함께만 사용 가능하다.
|
SELECT, UPDATE, 그리고 DELETE sql 문과 함께 사용 가능하다.
|
GROUP BY 절 뒤에 사용 된다.
|
GROUP BY 절 앞에 사용된다.
|
post-filter 임
|
pre-filter 임
|
그룹별로 필터링 할 때 사용한다.
|
단일 레코드(들)을 필터링 할 때 사용한다.
|
1.5 ORDER BY 절이란 무엇인가?
SQL 문의 ORDER BY 절은 하나 이상의 열을 기준으로 오름차순 또는 내림차순으로 데이터를 정렬하는 데 사용됩니다. 기본 정렬 순서는 오름차순입니다.
SQL 쿼리표현은 아래와 같습니다.
ORDER BY 구문 문법
SELECT column1, column2, … column FROM table_name ORDER BY column_name(s) ASC | DESC;
2. SQL의 Where, Group by, Holding 및 Order by 절
postgresql 데이터베이스에서 몇 가지 연습 구현예제를 파 봅시다.
2.1 사전 요구 사항 - Postgres 설정
일반적으로 데이터베이스 설정은 지루한 단계이지만 Docker를 사용한다면 간단한 과정입니다.
Windows OS에서 Docker 설치를 이해하려면 이 링크에서 제공되는 비디오를 시청할 수 있습니다.
완료되면 터미널을 열고 아래 명령을 입력하면 postgresql을 설정하고 실행합니다.
도커 명령
-- command to run postgres on docker --
-- remember to change the password --
docker run -d -p 5433:5432 -e POSTGRES_PASSWORD= --name postgres postgres
-- command to stop the Postgres docker container --
docker stop postgres
-- command to remove the Postgres docker container --
docker rm postgres
선택한 암호를 입력해야 합니다.
모든 것이 순조롭게 진행된다면 postgresql 데이터베이스 서버는 포트 번호 5433에서 기동되면서 실행되고, 서버 연결로는 Dbeaver GUI 를 사용할 수 있습니다.
2.2. 데이터베이스 생성하기
이 자습서를 연습하기 위해 learning 데이터베이스를 사용합니다. 아래 명령으로 데이터베이스를 생성할 수 있습니다.
데이터베이스 SQL 쿼리 생성
-- create database
create database learning
2.3 Person 테이블 생성 및 데이터 저장
learning 데이터베이스에 person 테이블을 생성합니다. 아래 스크립트를 사용하여 테이블을 만들고 데이터를 저장하고 확인 해 볼 수 있습니다.
Person SQL 스크립트
-- drop table
drop table person;
-- create person table
create table person (
id SERIAL PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
gender VARCHAR(50),
email VARCHAR(50),
date_of_birth DATE,
country_of_birth VARCHAR(50)
);
-- insert sample records in person table
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Had', 'Aronsohn', 'Male', 'haronsohn0@macromedia.com', '2016-01-03', 'Portugal');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Katya', 'Trainor', 'Female', 'ktrainor1@typepad.com', '1984-07-05', 'Canada');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Angelle', 'Conahy', 'Female', 'aconahy2@yandex.ru', '1992-02-24', 'Afghanistan');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Enrika', 'Osmond', 'Female', 'eosmond3@sun.com', '1984-03-11', 'Indonesia');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Xever', 'Foldes', 'Male', 'xfoldes4@eepurl.com', '1977-06-22', 'Philippines');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Egbert', 'Badam', 'Male', 'ebadam5@list-manage.com', '1987-10-02', 'Colombia');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Jaquenetta', 'Goodison', 'Female', 'jgoodison6@tripod.com', '1985-03-01', 'Costa Rica');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Ardene', 'Hunnywell', 'Female', 'ahunnywell7@howstuffworks.com', '2011-09-16', 'Philippines');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Ruperta', 'Druhan', 'Female', 'rdruhan8@taobao.com', '1971-11-27', 'Faroe Islands');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Niels', 'Lorenz', 'Male', 'nlorenz9@theguardian.com', '2012-07-10', 'Sweden');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Hamid', 'Mattek', 'Male', 'hmatteka@dedecms.com', '2010-10-06', 'Indonesia');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Andras', 'Antognoni', 'Male', 'aantognonib@jalbum.net', '2011-05-16', 'Iran');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Hermia', 'Dymocke', 'Female', 'hdymockec@dion.ne.jp', '1977-11-11', 'Brazil');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Bendix', 'Towlson', 'Male', 'btowlsond@nytimes.com', '2020-05-09', 'Armenia');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Minny', 'O''Corrin', 'Female', 'mocorrine@woothemes.com', '2021-09-07', 'China');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Brooks', 'MacDwyer', 'Male', 'bmacdwyerf@blogger.com', '2000-10-25', 'China');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Catha', 'Lavigne', 'Female', 'clavigneg@discovery.com', '1990-05-01', 'Portugal');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Shay', 'Charle', 'Male', 'scharleh@sfgate.com', '2001-09-11', 'Indonesia');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Lenee', 'Haskur', 'Female', 'lhaskuri@redcross.org', '1974-12-14', 'East Timor');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Fayette', 'Luker', 'Female', 'flukerj@squidoo.com', '1998-03-25', 'Sweden');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Don', 'Applewhite', 'Male', 'dapplewhitek@latimes.com', '1976-08-09', 'Iran');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Ric', 'Peggrem', 'Male', 'rpeggreml@domainmarket.com', '1993-01-28', 'Brazil');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Aprilette', 'Mattiazzi', 'Female', 'amattiazzim@nifty.com', '1994-10-10', 'Germany');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Lindy', 'Garvill', 'Male', 'lgarvilln@un.org', '1972-12-05', 'Brazil');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Francisco', 'Lebbern', 'Male', 'flebberno@accuweather.com', '1987-12-11', 'China');
insert into person (first_name, last_name, gender, email, date_of_birth, country_of_birth) values ('Elwood', 'Cumberbatch', 'Male', 'ecumberbatchp@businessweek.com', '2008-12-28', 'Czech Republic');
… other insert statements are omitted for brevity
-- fetch all records from the person table
select * from person;
2.4 WHERE 절의 이해
몇 가지 예를 살펴보겠습니다.
2.4.1 성별이 여성인 레코드 가져오기
아래 SQL 쿼리는 person 테이블에서 성별이 '여성'인 레코드를 가져옵니다.
SQL 쿼리
-- fetch those records where gender is female
select
id,
first_name,
last_name,
gender,
email,
country_of_birth
from
public.person
where
gender = 'Female';
성공적으로 끝나면 다음의 결과를 볼 수 있을 것입니다.
2.4.2 남성 인구 수 계산
아래 SQL 쿼리는 person 테이블의 남성 인구를 계산합니다.
SQL 쿼리
-- count male population count
select count(id) as male_count from public.person where gender = 'Male';
오류 없이 실행 되면 아래 결과가 표시됩니다.
2.5 GROUP BY 절 이해
몇 가지 예를 살펴보겠습니다.
2.5.1 사용 된 국가명 횟수 Count
아래 SQL 쿼리는 person 테이블에서 국가 이름이 사용된 횟수를 계산합니다.
SQL 쿼리
-- count how many times a country name is used
select
country_of_birth,
count(id) as times_used
from
public.person
group by country_of_birth;
이상없이 진행 되면, 아래 결과가 표시됩니다
2.5.2 남녀 인구 수 세기
The below sql query will count the male and female populations in the person table.
아래 SQL 쿼리는 person 테이블의 남성 및 여성 인구를 계산 해 줄 것입니다.
SQL 쿼리
-- count male and female population
select gender, count(id) as population_count from public.person group by gender;
이상없이 진행 되면, 아래 결과처럼 나타 날 것입니다.
2.6 HAVING 절의 이해
예제를 살펴 봅시다.
2.6.1 Count가 1보다 큰 사용 국가 이름 세기.
아래 SQL 쿼리는 person 테이블에서 국가 이름이 사용된 횟수를 계산하지만 개수 > 1인 것을 필터링합니다.
SQL 쿼리
-- count how many times a country name is used but the count should be greater than one
select
country_of_birth,
count(id)
from
public.person group by country_of_birth having count(id) > 1;
이상없이 진행 되면, 아래 결과가 표시 될 것입니다.
해당 예제를 살펴 봅시다.
2.7.1 오름차순으로 레코드 정렬
아래 SQL 쿼리는 레코드를 국가 이름의 오름차순으로 정렬합니다.
SQL 쿼리
-- fetch all records but sort them by country of birth in ascending order
select
id,
first_name,
last_name,
gender,
email,
country_of_birth
from
public.person order by country_of_birth asc;
이상없이 진행 되면, 아래와 같은 결과가 표시됩니다
3. 요약
이 자습서에서는 sql, WHERE, GROUP BY, HAVING 및 ORDER BY 절에 대한 개요와 다양한 예제를 통해 실제 구현을 배워 봤습니다. 다운로드 섹션에서 이 자습서에 사용된 SQL 스크립트를 다운로드하여 사용 할 수 있습니다.
4. Sql 스크립트 다운로드
이것은 SQL에서 WHERE, GROUP BY, HAVING 및 ORDER BY 절을 이해하기 위한 자습서였습니다.
이상.
'프로그래밍' 카테고리의 다른 글
데이터구조에 대해서 (0) | 2022.11.29 |
---|---|
Python에서 문자열을 비교하는 방법: 동일성과 동등성 (0) | 2022.11.28 |
자바에서 Bit Masking (1) | 2022.11.26 |
final 키워드가 자바 가비지콜렉션을 향상 시킬까요? (0) | 2022.11.25 |
[C#]제공자가 oracle 클라이언트 버전과 호환되지 않습니다 (0) | 2022.11.24 |