COUNT(*)의 COUNT(1) 차이는??

결론부터 말하면 차이가 없다입니다.

You Asked

What is the difference between count(1) and count(*) in a sql query
eg.
select count(1) from emp;
and
select count(*) from emp;

and we said…

nothing, they are the same, incur the same amount of work – do the same thing, take the same amount of resources.

출처: ORACLE Ask TOM

위 출처를 보면 동일한 수의 블록 읽기/쓰기/처리와 같은 CPU 사용 시간, 수행 시간을 갖는다고 합니다.


그렇다면 COUNT(*)과 COUNT(컬럼)은?

이것도 결론부터 말하면 차이가 존재한다입니다. NULL 값에 대해서 카운팅을 하냐 안하냐의 차이가 존재합니다.

COUNT(컬럼) - NULL 값이 들어간 행은 카운트하지 않습니다.
COUNT(*) - NULL 값에 상관없이 모든 행을 카운트합니다.

사실 이 차이는 컬럼을 지정하여 COUNT 하는 경우 값이 NULL이면 세지 않는 게 당연합니다. 즉, 전체 행의 개수를 세려고 했다면 다른 결과가 나오는 게 정상입니다. 만약 NOT NULL인 컬럼이였다면 COUNT(*)과 동일한 결과 값(과정이 아닌 결과에 대해서만)이 나올 겁니다.

다만, COUNT(*)과 COUNT(컬럼)은 사용 목적을 달리하는 게 맞습니다. COUNT(*)의 경우 전체 행이 몇 개인지 세는 경우, COUNT(컬럼)은 해당 컬럼의 행이 몇 개인지 세는 경우로 구분하여 사용하는 게 옳은 사용법입니다.

아무리 해당 컬럼이 NOT NULL인 경우라 해도 본인을 제외 한 다른 사람이 해당 쿼리를 봤을 때 전체 행의 갯수를 세기 위해 만든 쿼리란 걸 모를 확률이 높습니다.(심지어 반년 뒤의 자신 또한 포함해서 말이죠)

출처: 초보개발자꽁쥐

테이블이 존재 여부 확인

SELECT 1 FROM Information_schema.tables
WHERE table_schema = 'DB명'
AND table_name = '테이블명'

결과에 따라 1 또는 아무것도 반환 하지 않습니다.

SELECT COUNT(*) FROM Information_schema.tables
WHERE table_schema = 'DB명'
AND table_name = '테이블명'

결과에 따라 1 또는 0을 반환 합니다.

SELECT EXISTS (
  SELECT 1 FROM Information_schema.tables
  WHERE table_schema = 'DB명'
  AND table_name = '테이블명'
) AS flag

결과에 따라 flag = 1 또는 flag = 0을 반환 합니다.

COUNT의 경우 이름에서 유추 할 수 있다시피 갯수를 세고, EXISTS의 경우 ROW가 존재하는지 아닌지를 확인 하는 차이가 있습니다.


만약 테이블 생성 때 확인 하는 것이라면

create table if not exists "table name" values;

if not exists를 통해 테이블이 없을 때만 생성 하면 됩니다!

제타위키, EXISTS와 IN의 차이

자바 실행 시 dev, prod에 따른 프로퍼티 파일 구분하여 실행 시키는 옵션

@SpringBootApplication
@PropertySource("classpath:config-${config.type}.properties")
public class ApprovalApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApprovalApplication.class, args);
    }
}

위와 같이 config.type에 따라 필요한 프로퍼티를 불러 오는 경우 인텔리제이를 사용 하신다면

properties1

VM options에 해당 값을 넣으면 됩니다.

만약 엘라스틱빈스톡을 사용하신다면

properties2

JVM 명령줄 옵션에 값을 주면 됩니다.

이렇게 문명의 혜택을 받으며 편히 쓰다가 ec2에서 직접 java 명령어로 실행을 시킬 일이 있었는데…..당시 생각보다 금방 찾지를 못해서 고생을 했던 기억이 나네요.

java -Dconfig.type=prod

아주 간단하게도 위와 같이 주면 됩니다.

java -Dconfig.type=prod -Dproperties.type=prod

만약 두개의 값을 줘야 하면 위처럼 한칸 뛰어서 작성 하시면 되고, 마찬가지로 빈스톡, 인텔리제이 내에서도 한칸 뛰고 필요한 값만큼 넣어주면 됩니다~
(사실 -D 형태로 넣어주는 값은 JVM 옵션입니다)

출처 : 커피한잔의 여유와 코딩, 오라클

패키지 목록 보기

dpkg -l  

Ubuntu 14 이상에서는

apt list

위와 같이도 확인이 가능 합니다.

특정 패키지 찾기

dpkg -l | grep package-name

자신이 설치 한 패키지의 버전을 확인 할 떄 사용하면 유용 합니다.

출처

pandoc

하스켈로 만들어진 여러 가지 포맷의 파일들을 변환해주는 유틸리티다.공식 사이트

변환 포맷

pandoc_formats

이번 글에서는 마크다운, 워드, pdf(우분투에 한 해)에 대한 변환 과정만 다루도록 하겠습니다.


설치

우분투

sudo apt-get install pandoc

맥(Homebrew 사용시)

brew install pandoc

마크다운 -> word

pandoc hello.md -f markdown -t docx -s -o hello.docx

-f : from, 원본 소스 포맷
-t : to, 변환할 포맷
-s : standalone -o : output, 출력파일 이름

(더 궁금하시다면 -h 옵션을 통해 더 많은 옵션 값들을 볼 수 있습니다)

word -> 마크다운

pandoc hello.docx -f docx -t markdown -s -o hello.md

마크다운 -> pdf

pdf의 경우 Latex 패키지를 설치해야 하며 권장하는 패키지는 OS마다 다릅니다.
일단, 제가 현재 우분투만 사용하는 관계로 설치 방법은 우분투만 다루도록 하겠습니다.

apt-get install texlive-latex-base
apt-get install ko.tex
apt-get install texstudio

설치 용량이 1기가가 넘어 받는데 생각보다 오래 걸립니다.

pandoc hello.md -f markdown -t latex -s -o hello.pdf

-t 다음에 pdf가 아닌 latex를 입력합니다.

만약 pdf 변환 과정에서 아래와 같은 메시지가 나오면

! Font T1/cmr/m/n/10=ecrm1000 at 10.0pt not loadable: Metric (TFM) file not fou nd.

apt-get install texlive-fonts-recommended

위의 폰트를 설치해보시길 바랍니다 :)

참고자료 : pandoc, latex, 폰트