postgreSQL 기본 사용법 [update 中]
DevOps 관련 포스팅
- Git Convention
- Test Code
- Git and github
- 왜 Code Review를 해야 하는가
- Web API
- postgreSQL
- AWS 배포하기(1) - RDS (MySQL)
- AWS 배포하기(2) - Elastic Beanstalk
- Docker 설치 및 실행
이 글은 postgreSQL의 기본적인 사용법에 대해 다루고 있습니다.
0. SQL Shell 사용하기
cmd에서psql명령으로 postgreSQL 접속하기psql --version명령이 실행되지 않는다면,환경 변수 설정이 선행되어야 함- [환경 변수] - [시스템 변수: Path]선택 - 확인 - 새로 만들기 - 찾아보기 -
C:\Program Files\PostgreSQL\14\bin선택 - 확인- 확인 - cmd 종료 후 재실행
- [환경 변수] - [시스템 변수: Path]선택 - 확인 - 새로 만들기 - 찾아보기 -
psql실행psql -U postgres실행으로 user 암호 입력하기
1. CREATE DATABASE
\l명령으로 database 목록 확인SQL syntax는대문자로 입력하며 명령의 끝은 세미콜론(;)으로 끝맺어야 실행됨CREATE DATABASE test;\l명령으로 database가 생성되었는지 확인데이터베이스 목록 이름 | 소유주 | 인코딩 | Collate | Ctype | 액세스 권한 -------------+----------+-------+----------------+----------------+----------------- test | postgres | UTF8 |Korean_Korea.949|Korean_Korea.949|\c+db 이름으로 생성된 database에 연결하기(connect)\c test접속정보: 데이터베이스="test", 사용자="postgres".
2. CREATE TABLE
datatype에 익숙해지기 datatype 목록- 입력
CREATE TABLE person ( id BIGSERIAL NOT NULL PRIMARY KEY, first_name VARCHAR(50) NOT NULL, last_name VARCHAR(50) NOT NULL, gender VARCHAR(7) NOT NULL, date_of_birth DATE NOT NULL, email VARCHAR(150) );CREATE TABLE \d명령으로 테이블 확인릴레이션(relation) 목록 스키마 | 이름 | 종류 | 소유주 --------+---------------+--------+---------- public | person | 테이블 | postgres public | person_id_seq | 시퀀스 | postgres (2개 행)※
BIGSERIAL(autoincrementing eight-byte integer) 때문에person_id_seq테이블이 생성됨\dt명령으로 실제 테이블 확인릴레이션(relation) 목록 스키마 | 이름 | 종류 | 소유주 --------+--------+--------+---------- public | person | 테이블 | postgres (1개 행)\d+table 이름으로 해당 테이블 확인"public.person" 테이블 필드명 | 종류 | Collation | NULL허용 | 초기값 ---------------+------------------------+-----------+----------+------------------------------------ id | bigint | | not null | nextval('person_id_seq'::regclass) first_name | character varying(50) | | not null | last_name | character varying(50) | | not null | gender | character varying(7) | | not null | date_of_birth | date | | not null | email | character varying(150) | | | 인덱스들: "person_pkey" PRIMARY KEY, btree (id)
3. INSERT INTO
- data 입력하기
INSERT INTO person (first_name, last_name, gender, date_of_birth) VALUES ('Anne', 'Smith', 'FEMALE', date '1988-01-09'); - sql 파일로 data 입력하기
\i [download한 file의 경로]※ 해당 파일이 있는 곳에서 bash를 열어 pwd 명령을 이용하면 경로를 확인할 수 있음
\i Downloads/person.sql
4. SELECT
4-1. ASC/DESC
- person 테이블의 id, first_name, country_of_birth를 country_of_birth의
오름차순(ASC)으로 정렬SELECT id, first_name, country_of_birth FROM person ORDER BY country_of_birth ASC;id | first_name | country_of_birth -----+----------------+---------------------------------- 316 | Gasper | Afghanistan 613 | Mohandis | Afghanistan 753 | Vevay | Afghanistan 23 | Jodee | Afghanistan 259 | Killian | Afghanistan 641 | Jereme | Afghanistan 529 | Finley | Albania 346 | Leanna | Albania 426 | Robinetta | Albania 806 | Haskel | Angola 666 | Devondra | Argentina- person 테이블의 country_of_birth를
중복 없이(DISTINCT)내림차순(DESC)으로 정렬SELECT DISTINCT country_of_birth FROM person ORDER BY country_of_birth DESC;country_of_birth ----------------- Afghanistan Albania ... Yemen Zambia
- person 테이블의 country_of_birth를
4-2. WHERE 조건절
gender = 'Female'인 column(id, first_name, gender, country_of_birth)SELECT id, first_name, gender, country_of_birth FROM person WHERE gender = 'Female';id | first_name | gender | country_of_birth -----+----------------+--------+---------------------------------- 7 | Oona | Female | Indonesia 8 | Colline | Female | China 13 | Willyt | Female | China 14 | Marice | Female | Poland ...
4-3. WHERE … AND … 조건절
gender = 'Female'이고(AND),country_of_birth = 'Poland'인 조건SELECT id, first_name, gender, country_of_birth FROM person WHERE gender = 'Female' AND country_of_birth = 'Poland';id | first_name | gender | country_of_birth -----+------------+--------+------------------ 14 | Marice | Female | Poland 49 | Elisabeth | Female | Poland 62 | Aurlie | Female | Poland 474 | Sallie | Female | Poland 535 | Larine | Female | Poland 611 | Asia | Female | Poland
4-4. WHERE … AND …( ~ OR ~) 조건절
gender = 'Female'이고(AND),
country_of_birth = 'Poland'이거나(OR)country_of_birth = 'China'인 조건SELECT id, first_name, gender, country_of_birth FROM person WHERE gender = 'Female' AND (country_of_birth = 'Poland' OR country_of_birth = 'China');id | first_name | gender | country_of_birth -----+------------+--------+------------------ 8 | Colline | Female | China 13 | Willyt | Female | China 14 | Marice | Female | Poland 37 | Bari | Female | China 46 | Bobine | Female | China 49 | Elisabeth | Female | Poland ...gender = 'Female'이고(AND),
country_of_birth = 'Poland'이거나(OR)country_of_birth = 'China'이며(AND),
last_name = 'Quest'인 조건SELECT id, first_name, last_name, gender, country_of_birth FROM person WHERE gender = 'Female' AND (country_of_birth = 'Poland' OR country_of_birth = 'China') AND last_name = 'Quest';id | first_name | last_name | gender | country_of_birth ----+------------+-----------+--------+------------------ 14 | Marice | Quest | Female | Poland (1개 행)
5. Comparison Operator(비교 연산)
- number, string, date 등 여러 datatype에 대해 연산이 가능함
TRUESELECT 1 = 1;SELECT 'MONKEY' <> 'monkey';?column? ---------- t (1개 행)FALSESELECT 1 = 2;SELECT 2 <= 1;?column? ---------- f (1개 행)
6. LIMIT
한정된 개수로 DATA 제한- 최초의 3개 행(
LIMIT 3)SELECT id, first_name, country_of_birth FROM person LIMIT 3;id | first_name | country_of_birth ----+------------+------------------------ 1 | Cody | Bosnia and Herzegovina 2 | Prescott | China 3 | Trev | Indonesia (3개 행)
- 최초의 3개 행(
7. OFFSET … LIMIT
지정된 INDEX부터한정된 개수로 DATA 제한- INDEX 2(
OFFSET 2)부터 3개 행(LIMIT 3)SELECT id, first_name, country_of_birth FROM person OFFSET 2 LIMIT 3;id | first_name | country_of_birth ----+-------------+------------------ 3 | Trev | Indonesia 4 | Bartolemo | Poland 5 | Christopher | Philippines (3개 행)
- INDEX 2(
8. OFFSET
OFFSET만 사용시,지정된 INDEX부터끝까지- INDEX 926부터(
OFFSET 926) 끝까지 (총 DATA는 930개)SELECT id, first_name, country_of_birth FROM person OFFSET 926;id | first_name | country_of_birth -----+------------+------------------ 927 | Gayleen | China 928 | Mavis | Peru 929 | Melody | United States 930 | Isidoro | Indonesia (4개 행)
- INDEX 926부터(
9. FETCH
LIMIT의 공식적인 버전- INDEX 1부터(
OFFSET 1) 3개 행(FETCH FIRST 3 ROW ONLY)SELECT id, first_name, date_of_birth FROM person OFFSET 1 FETCH FIRST 3 ROW ONLY;id | first_name | date_of_birth ----+------------+--------------- 2 | Prescott | 2022-05-17 3 | Trev | 2022-04-05 4 | Bartolemo | 2021-09-24 (3개 행)
- INDEX 1부터(
- INDEX 111부터(
OFFSET 111) 1개행(FETCH FIRST ROW ONLY)1은 생략가능SELECT * FROM person OFFSET 111 FETCH FIRST ROW ONLY;SELECT * FROM person OFFSET 111 FETCH FIRST 1 ROW ONLY;id | first_name | last_name | email | gender | date_of_birth | country_of_birth -----+------------+-----------+-------+--------+---------------+------------------ 112 | Henry | Wakes | | Male | 2021-12-03 | China (1개 행)
10. IN
- 반복되는 컬럼에 대한 값을 지정할 때 사용
- 반복적인
OR을IN으로 교체SELECT id, first_name, country_of_birth FROM person WHERE country_of_birth = 'China' OR country_of_birth = 'France' OR country_of_birth = 'Brazil';SELECT id, first_name, country_of_birth FROM person WHERE country_of_birth IN ('China', 'Brazil', 'France');id | first_name | country_of_birth -----+------------+------------------ 2 | Prescott | China 8 | Colline | China ... 920 | Krisha | Brazil 922 | Shirlee | China 927 | Gayleen | China (255개 행) IN으로 반복을 묶고,ORDER BY로 정렬SELECT id, first_name, country_of_birth FROM person WHERE country_of_birth IN ('China', 'Brazil', 'France') ORDER BY country_of_birth;id | first_name | country_of_birth ----+------------+------------------ 663 | Darbee | Brazil 269 | Hamnet | Brazil ... 825 | Jerrie | France 309 | Janel | France (255개 행)
- 반복적인
11. BETWEEN … AND …
- 구간 지정
SELECT id, first_name, date_of_birth FROM person WHERE date_of_birth BETWEEN DATE '2021-12-31' AND '2022-01-01';id | first_name | date_of_birth -----+------------+--------------- 576 | Seana | 2022-01-01 782 | Kelcey | 2021-12-31 789 | Jaine | 2021-12-31 842 | Burl | 2022-01-01 (4개 행)
12. LIKE / ILIKE
LIKE연산자는=연산자처럼 작동함LIKE: 대소문자 구분SELECT 'Her' LIKE 'HER';?column? ---------- f (1개 행)ILIKE: 대소문자 구분하지 않음SELECT 'her' ILIKE 'HER';?column? ---------- t (1개 행)
PostgreSQL은 두 가지 wildcard(%,_)를 제공함%: 일치하는 0개 이상의 문자_: 일치하는 하나의 문자
%.com: .com으로 끝나는 문자열SELECT id, first_name, email FROM person WHERE email LIKE '%.com';id | first_name | email ----+-------------+------------------------------------- 1 | Cody | cgiocannoni0@github.com 3 | Trev | tmackellar2@msn.com ... 927 | Gayleen | gsawartrn@usnews.com 928 | Mavis | mrallingro@gravatar.com (384개 행)%@mozilla.com: @mozilla.com으로 끝나는 문자열SELECT id, first_name, email FROM person WHERE email LIKE '%@mozilla.com';id | first_name | email -----+------------+-------------------------- 533 | Nonna | nrucklessefr@mozilla.com 744 | Jobye | jhappsma@mozilla.com (2개 행)@google.: @google.이 포함된 문자열SELECT id, first_name, email FROM person WHERE email LIKE '%@google.%';id | first_name | email ------+------------+------------------------------ 113 | Reuben | rwinslett3a@google.ru 162 | Rice | rblayney4t@google.co.jp ... 738 | Emmy | eswindenm4@google.cn 751 | Hedvig | hhardypigginmh@google.com.au (18개 행)- 8자의 문자열과
@로 시작하는 emailSELECT id, first_name, email FROM person WHERE email LIKE '________@%';id | first_name | email -----+------------+------------------------------- 12 | Matthus | mallbutc@nyu.edu 28 | Stefano | srainers@npr.org ... 894 | Anselm | apirieqq@wisc.edu 901 | Leonore | lwykeyqx@list-manage.com (78개 행) P%: P로 시작하는 문자열SELECT id, first_name, country_of_birth FROM person WHERE country_of_birth LIKE 'P%';id | first_name | country_of_birth ----+-------------+----------------------- 4 | Bartolemo | Poland 5 | Christopher | Philippines ... 926 | Edvard | Portugal 928 | Mavis | Peru (136개 행)
13. GROUP BY
< 출처 >
‘Learn PostgreSQL Tutorial - Full Course for Beginners,’ 유튜브 비디오, 04:19:34, 게시자 ‘freeCodeCamp.org,’ 2019년04월04일, https://youtu.be/qw–VYLpxG4