[DB] - SQLite3을 이용해 데이터 다루기

gonzo·2020년 10월 11일
0

DataBase

목록 보기
2/2

✅ SQL을 이용해 데이터를 갖고 놀자

🟥 Data의 추가 / 삽입 / INSERT

frnds라는 이름의 테이블을 하나 만들었다.

sqlite> CREATE TABLE frnds (
   ...> name TEXT,
   ...> age INT,
   ...> address TEXT );

이 테이블의 스키마-형태-를 조회해 보면

sqlite> .schema frnds
CREATE TABLE frnds (
name TEXT,
age INT,
address TEXT );

앞서 넣은 값인 name TEXT, age INT, address TEXT가 출력되므로 우리는 성공적인 테이블 생성을 했음을 알 수 있다😎 신규 값을 추가해 보자

sqlite> INSERT INTO frnds (name, age)
   ...> VALUES('마카롱', 28);

28세의 마카롱씨를 frnds 테이블에 추가했다. 테이블 전체 조회 명령문인 SELECT * FROM 테이블이름을 이용해 올바르게 됐는지 확인.

sqlite> SELECT * FROM frnds
   ...> ;
name  age  address
----  ---  -------
마카롱   28

일정한 주소가 없는 마카롱씨. 우리의 마카롱씨는 자유로운 영혼이다.

rowid 조회

sqlite> SELECT rowid, * FROM frnds;
rowid  name  age  address
-----  ----  ---  -------
1      마카롱   28
2      공갈빵   25   경상북도

SQLite에서 자체적으로 생성하는 id 값인 rowid를 조회할 수 있다.
NOT NULL ?
반드시 입력받아야 하는 데이터라면, NOT NULL을 이용해 값의 입력을 강제할 수 있다.
favs라는 이름의 테이블을 새로 만들고, id, name, age 항목은 NOT NULL을 사용/address 항목은 NOT NULL을 설정하지 않았다.

sqlite> CREATE TABLE favs(
   ...> id INTEGER PRIMARY KEY,
   ...> name TEXT NOT NULL,
   ...> age INT NOT NULL,
   ...> address TEXT);
sqlite> INSERT INTO favs(name) VALUEs('이상혁');
Error: NOT NULL constraint failed: favs.age

Error: NOT NULL constraint failed: favs.age 라는 에러가 발생했다. id, name, age, address 중 age에서만 에러가 발생한 이유는 id(rowid)는 자동적으로 생성되고, name은 입력되었으며, age는 공백을 허용하지 않았는데 값이 입력되지 않았기 때문이다. 동일한 이유로 address는 값이 없어도 공백을 허용했기 때문에 에러가 발생하지 않았다.

sqlite> INSERT INTO favs (name, age, address) VALUES ('이상혁', 25, '서울');
sqlite> SELECT * FROM favs
   ...> ;
id  name  age  address
--  ----  ---  -------
1   이상혁   25   서울

값을 올바르게 입력한 후 데이터를 조회하면 잘 출력되는 것을 확인할 수 있다.

sqlite> INSERT INTO favs VALUES('구창모', 27, '남
양주');
Error: table favs has 4 columns but 3 values were supplied

테이블을 만들 때에 id INTEGER PRIMARY KEY로 id 항목을 지정해 준 상태에서 위의 코드처럼 입력하면 id가 저절로 생성되지 않는다는 것에 주의해야 한다.favs (name, age, address) 이런 식으로 각 항목을 배정해 주면 상관없으나 위의 경우처럼 입력하려는 coulumn을 알려주지 않으면 table은 값 입력이 덜 됐다는 에러를 띄운당.
그래서 아래와 같은 방식으로 id의 지정 없이 coulumn만 지정해 주는 방식을 사용하도록 하자.

sqlite> CREATE TABLE favours(
   ...> name TEXT NOT NULL,
   ...> age INT NOT NULL,
   ...> address TEXT NOT NULL);
sqlite> INSERT INTO favours VALUES('강동원', 40, 
'부산'), ('변요한', 35, '인천'), ('구창모', 27, '남양주'), ('이상혁', 25, '서울');
sqlite> SELECT * FROM favours;
name  age  address
----  ---  -------
강동원   40   부산
변요한   35   인천
구창모   27   남양주
이상혁   25   서울

특정 column들만 슬쩍 갖고 오기 - SELECT

지금까지 데이터 조회할 때 썼던 SELECT * FROM 테이블이름에서 *(Asterisk) 부분만 원하는 항목 값으로 고치면 된다.
name, address 항목을 갖고 오자.

sqlite> SELECT name,address FROM favours;        
name  address
----  -------
강동원   부산
변요한   인천
구창모   남양주
이상혁   서울

LIMIT 속성을 이용해서 갖고 오는 데이터의 수에 제한을 걸어 보자.

sqlite> SELECT rowid, name, address FROM favours 
LIMIT 2;
rowid  name  address
-----  ----  -------
1      강동원   부산
2      변요한   인천

id값은 rowid로 입력해야 한다는 것!

OFFSET 속성을 이용해서 원하는 위치의 데이터를 갖고 와 보자.

via GIPHY

물론 아니다 이 OFFSET ㅎㅎ
sqlite> SELECT rowid, name FROM favours LIMIT 2 OFFSET 3;
rowid  name
-----  ----
4      이상혁

··· LIMIT M OFFSET N 이라고 썼다면, N을 포함해서 시작하되 M만큼 떨어져 있는 데이터를 가져오라는 의미가 된다. 내 경우에는 2(OFFSET 시작 지점_1) ➡ 3 ➡ 4 해서 4번 값이 오게 된 것. 데이터 수를 넘는 범위에서 데이터를 갖고 오라고 하니까 아무것도 출력되지 않았다.

sqlite> SELECT rowid, name FROM favours LIMIT 2 OFFSET 5;
sqlite>

📍 그 외의 속성들

WHERE, DISTINCT

🟧 Data의 삭제 / DELETE

데이터를 삭제할 때는 식별 가능한 값을 기준으로 하는 게 좋다. 예를 들면 rowid라거나 rowid같은...

sqlite> DELETE FROM favours WHERE rowid=2;       
sqlite> SELECT rowid, * FROM favours;
rowid  name  age  address
-----  ----  ---  -------
1      강동원   40   부산
3      구창모   27   남양주
4      이상혁   25   서울

rowid = 2 항목이 삭제된 것을 확인 가능하다. 새로운 값을 삽입한 후 다시 id를 확인해 보자.

sqlite> INSERT INTO favours VALUES('김태리', 31, 
'서울');
sqlite> SELECT rowid, * FROM favours;
rowid  name  age  address
-----  ----  ---  -------
1      강동원   40   부산
3      구창모   27   남양주
4      이상혁   25   서울
5      김태리   31   서울

마지막 행의 값을 삭제한 후 새 데이터를 입력했을 때도 새 데이터는 기존의 id 값을 그대로 쓴다.

sqlite> DELETE FROM favours WHERE rowid=5;       
sqlite> SELECT rowid, * FROM favours;
rowid  name  age  address
-----  ----  ---  -------
1      강동원   40   부산
3      구창모   27   남양주
4      이상혁   25   서울
sqlite> INSERT INTO favours VALUES('김태리', 31, 
'서울');
sqlite> SELECT rowid, * FROM favours;
rowid  name  age  address
-----  ----  ---  -------
1      강동원   40   부산
3      구창모   27   남양주
4      이상혁   25   서울
5      김태리   31   서울

📍 AUTOINCREMENT 속성을 사용하면 재사용이 불가능하게 설정 가능하다.

🟨 Data의 수정 / UPDATE

지금은 서울에 거주 중인 구창모씨의 address를 남양주에서 서울로 변경해 보자.

sqlite> UPDATE favours SET address = '서울' WHERE rowid=3;
sqlite> SELECT rowid, * FROM favours;
rowid  name  age  address
-----  ----  ---  -------
1      강동원   40   부산
3      구창모   27   서울
4      이상혁   25   서울
5      김태리   31   서울

SET을 왜 쓰나 해서(참고자료에서는 두 항목을 변경했기 때문에 복수의 항목을 변경할 때에 사용하는 속성인가 궁금해져서) 빼고 했는데

sqlite> UPDATE favours address = '서울' WHERE rowid=3;
Error: near "address": syntax error

에러가 떴다. SET의 세트가 아니라 SET하겠다는 말인가보다.

참고 자료:wally-wally님의 github

profile
💬직업은 IT로 하겠습니다 근데 이제 건축을 곁들인...

0개의 댓글