Selector를 사용한 소켓 멀티플렉싱

zmq.Poller는 소켓을 멀티플렉싱할 때 사용하는 클래스입니다. 파이썬에서의 ZMQ Poller 구현은 파이썬의 내부 select 모듈을 사용합니다. 파이썬 3.4부터는 이 모듈을 개선하여 효율적인 I/O 멀티플렉싱에 대한 고수준 API를 제공하는 selectors 모듈이 있습니다.

selectors.BaseSelector는 복수 파일 객체에 대한 I/O 이벤트를 대기하기 위해 사용합니다. 이 클래스는 파일 스트림에 대한 등록, 해제와 대기에 관한 메소드들을 제공하며, selectors 모듈이 제공하는 여러 셀렉터 클래스들의 기반이 됩니다.

Selector를 사용한 소켓 멀티플렉싱 더보기

SELECT – GROUP BY (SQLite3)

이번 글에서는 SELECT 구문 내에서 GROUP BY 절에 대해서 살펴보자. GROUP BY는 결과 행들을 특정한 하나 혹은 그 이상의 칼럼에 의한 그룹으로 묶어서 그룹을 요약하는 몇 가지 행들로 표현되도록 하는 것이다. 보통 MIN, MAX, SUM, AVG, COUNT 등과 같은 집합 함수와 같이 함께 사용된다. GROUP BY를 적용하는 주요 쿼리 구문의 형식은 다음과 같다.

  • SELECT column1, aggregate_func(column1)
  • FROM _table
  • GROUP BY column1, column2, …. ;

다음의 예는 노래 정보 테이블에서 각 앨범당 수록곡의 개수를 산출하는 쿼리이다.

SELECT albumid, COUNT(trackid)
FROM tracks
GROUP BY albumid;

이 쿼리는 다음과 같이 해석된다.

  1. albumid가 같은 행들은 모두 각각 하나의 그룹으로 취급된다.
  2. 그룹으로 나눠진 대상에 대해서 각 그룹의 albumid와 I의 개수를 리턴한다.

집합 함수로 분류되는 몇몇 함수들은 각 그룹마다 그 그룹에 속해있는 행들에 대해서 반복적용된다.

HAVING 절

having 절을 그룹에 대한 필터링을 수행하는 조건을 추가할 수 있는 절이다. 그룹에 대한 조건이므로 대체로 조건은 aggregate 함수와 같이 쓰인다. 특정 칼럼의 합계나 평균, 최대/최소 및 개수가 어떻다는 식으로 조건을 걸 수 있는 셈이다.

조금 전 작성했던 예제를 GROUP BY와 HAVING을 끼얹은 형태로 살짝 변경해보자.

SELECT albumid, COUNT(trackid)
FROM tracks
GROUP BY albumid
HAVING count(albumid) BETWEEN 18 AND 20
ORDER BY albumid;

위 쿼리는 다음과 같이 동작할 것이다

  1. albumid 값으로 그룹지어 그 행이 18~20 범위에 있는 앨범에 대해서
  2. albumid와 trackid의 개수를
  3. albumid 순으로 출력한다.

즉 수록곡이 18~20개 인 앨범을 출력하라는 쿼리가 된다.

HAVING vs WHERE

그렇다면 GROUP BY가 사용된 쿼리에 WHERE 대신에 HAVING을 쓰면 되는 것이냐? 그것은 아니다. 하나의 쿼리에 HAVING 절과 WHERE 절은 양립할 수 있다. WHERE 절은 각각의 ROW를 필터링하는 조건이 된다. GROUP BYWHERE절에 의해서 필터링된 결과에 대해서 주어진 칼럼으로 데이터를 그룹핑한다. 이후 각각의 그룹에 대해서 특정한 조건으로 다시 필터링할 때 HAVING을 사용할 수 있다.

 

(SQLite3) JOIN을 통한 테이블 연결

지난 글에서 SQLite3에서 SELECT 명령의 사용방법에 대해서 살펴보았는데, FROM을 통해서 단일 테이블 혹은 단일 테이블 내의 범위를 부분적으로 얻어내는 서브 쿼리를 통해서 보다 정교한 범위의 데이터를 얻고, 또 WHERE절을 사용해서 결과를 필터링 하는 방법에 대해서도 살펴보았다. 그외에 GROUP BY나 그외 aggregation 연산을 통한 쿼리 방법에 대해서는 자세하게 다루지 않았는데, 그 전에 JOIN에 대해서 간단하게 짚고 넘어가고자 한다.

(SQLite3) JOIN을 통한 테이블 연결 더보기

(SQLite3) SELECT 문을 알아보자

테이블에 저장된 데이터를 조회하기 위해서는 SELECT문을 사용한다. SELECT 구문운 SQL에서 가장 흔히 쓰이는 쿼리문인 동시에 가장 복잡한 구문이기도 하다. 테이블 조회와 관련하여 SQLite3는 표준 SQL에 정의된 거의 모든 기능을 제공한다. SQLite3의 SELECT 구문의 사용법에 대해서 살펴보자.

기본 컨셉

기본적으로 SELECT 는 DB 엔진으로부터 질의에 대한 답을 요청하는 명령이다. 일반적으로 테이블 내의 레코드들을 조회하는 용도로 사용되지만, SELECT 명령의 본질은 DB가 수행할 수 있는 연산의 결과를 얻는 명령이다. 따라서 테이블 조회뿐만 아니라 다음과 같이 계산 결과를 얻도록 호출할 수도 있다.

SELECT 1 + 1;

위 쿼리는 단순히 2라는 결과를 얻게 된다. 테이블을 지정해서 데이터를 조회하지는 않지만 하나의 온전한 SELECT 구문이기도 하다.  물론 이것은 SELECT라는 명령이 DB엔진으로부터 어떠한 값을 요청한다는 개념을 보여주는 예이지, 실제로 이런 간단한 계산 때문에 데이터베이스를 사용하는 일은 드물다.

따라서 실제로는 다음의 개념으로 SELECT 명령을 이해해야 한다.

  1. SELECT 명령은 어떤 “결과”를 요구하는 명령이다.
  2. SELECT 명령은 폭과 높이가 각각 0 이상인 2차원 그리드로 구성된 데이터에 대해서 수행된다.
  3. SELECT 명령의 결과 역시 폭과 높이가 각각 0 이상인 2차원 그리드로 구성될 수 있다.

이 관점에 따르면 SELECT 1 + 1; 은 첫째로 연산의 결과를 요구하고 있으며, 가로가 0, 세로가 0인 (비어있는) 그리드를 대상으로 ‘조회’한다고 볼 수 있다. 그리고 그 결과는 1X1 그리드, 즉 단일값이 된다.  실제로 통상의 SELECT문이 대상으로 하는 테이블 역시 2차원 그리드이며, SELECT 문의 조회 결과 여러 열과 행으로 구성된 2차원 그리드가 된다.

(SQLite3) SELECT 문을 알아보자 더보기