Where, Group by, Holding 및 Order by 절

2022. 11. 27. 18:24프로그래밍

728x90

 

 

Where, Group by, Having, and Order by clause in SQL

Hello. In this tutorial, we will learn WHERE, GROUP BY, HAVING, and ORDER BY clauses in SQL and will use the postgresql database running on Docker. 1.

examples.javacodegeeks.com

안녕하세요. 

이 자습서에서는 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;
 
 
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 ORDER BY 절 이해

해당 예제를 살펴 봅시다.

 

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 절을 이해하기 위한 자습서였습니다.

 

이상.

 

 

 

 

728x90