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 서울
지금까지 데이터 조회할 때 썼던 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
속성을 이용해서 원하는 위치의 데이터를 갖고 와 보자.
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
데이터를 삭제할 때는 식별 가능한 값을 기준으로 하는 게 좋다. 예를 들면 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
속성을 사용하면 재사용이 불가능하게 설정 가능하다.
지금은 서울에 거주 중인 구창모씨의 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하겠다는 말인가보다.