SQL/Sqlite
-
SQLite 14. INDEXSQL/Sqlite 2022. 1. 1. 22:15
인덱스란? 데이터베이스의 성능, 효율을 높이기 위해, 자주 검색이 발생하는 컬럼이 있다면, 그 컬럼과 ROWID만 다른 테이블로 뽑아낸 뒤, (쉽게 찾을 수 있도록) 컬럼값 기준으로 정렬하여 저장한다. ('컬럼들'이라면 같은 방법으로 컬럼들을 처리하면 된다.) 검색은 정렬된 새 테이블에서 이루어지며, 검색하여 ROWID를 찾은 뒤, 원 테이블의 ROWID와 비교해서 원 데이터를 출력하면 효율적인 검색이 이뤄질 수 있다. 이런 구구절절한 과정을 DBMS가 해주는 데 이 기능을 인덱스라고 한다. SQLite는 B-tree 방식의 정렬을 이용한다고 알려져 있다. 인덱스 생성하기 이렇게 인덱스 걸어줄 테이블과 컬럼을 정하면 인덱스를 사용할 수 있다. CREATE INDEX "name_index" ON "play..
-
SQLite 13. CREATE VIEWSQL/Sqlite 2022. 1. 1. 20:07
SQLite에서 VIEW는 읽기 전용 임시 테이블이다. 저장된 테이블이 아니라 실행될 때마다 데이터를 모으고 가공해서 출력한다. 따라서, 성능상의 이점은 없다. 복잡하거나, 자주 사용되는 쿼리를 VIEW로 만들어 두면 재사용이 편하고, 가독성이 높아진다. 타자와 체중을 같이 반환하는 쿼리를 만들어 보자. 체중 측정이 되지 않은 선수도 포함하려면 LEFT JOIN이 필요하다. SELECT players.id, name, team, position, height, age, date, weight FROM players LEFT JOIN weights ON players.id=weights.id 어렵진 않지만 꽤 긴 쿼리다. 이걸 볼 때마다 입력한다면... --; 위 셀렉트 문 그대로 뷰를 만들자. CREAT..
-
SQLite 12. CREATE TABLE, ALTER, DROPSQL/Sqlite 2022. 1. 1. 19:22
DB Browser에서 테이블 작성 데이터베이스 구조에서 테이블 생성 선택 타입이 5가지 밖에 없다. NN: NOT NULL. 비울 수(=null) 없다. PK: Primary Key. 기본 키. AI: Auto Increment, 자동 증가. 기본 키 컬럼이 INTEGER형이 이어야 하고, INSERT할 때마다 기본 키가 1씩 커지면서 자동으로 입력된다. 자동 증가를 선택하면 마지막 값을 기억하기 위한 테이블이 하나 생성된다. U: UNIQUE. 고유한 값. 기본값 주로 날짜 시간을 많이 사용한다. CREATE TABLE "test" ( "recorded_at_1"TEXT DEFAULT CURRENT_TIMESTAMP, "recorded_at_2"TEXT DEFAULT (datetime('now','l..
-
SQLite 11. UPDATE, DELETESQL/Sqlite 2022. 1. 1. 14:04
UPDATE WHERE이 빠지면 모든 행이 업데이트된다. UPDATE weights SET weight=weight+5 모든 선수의 체중을 5 증가시켰다. UPDATE SET WHERE WHERE를 사용하자. UPDATE players2 SET team='CWS', position=NULL WHERE id=1; SELECT * FROM players2 id=1인 선수의 팀을 바꾸고 포지션을 지웠다. NULL 을 사용하지 못하게 설정되어 있다면, 문자열은 '', 정수형은 -1 또는 0 등을 미리 정해 사용하면 된다. ROW 삭제: DELETE WHERE이 빠지면 모든 행이 삭제된다. 주의 DELETE FROM players2 WHERE id > 10 테이블 자체를 지우는 것은 DROP TABLE 이다. 외..
-
SQLite 10. INSERTSQL/Sqlite 2022. 1. 1. 14:01
삽입: INSERT 한 줄 전체를 입력할 때는 컬럼명 없이 입력할 수 있다. INSERT INTO players VALUES (1035, '나잘함', 'STL', 'Relief Pitcher', 80, 30) 부분만 입력할 때는 컬럼명이 필요하다. 이 테이블에서 id는 '기본 키'로 지정되어 있어 생략할 수 없다. INSERT INTO players (id, name) VALUES (1055, '더잘함') 컬럼명의 순서는 바꿀 수 있다. INSERT INTO players (name, id) VALUES ('더잘함', 1055) INSERT SELECT 여러 번 인서트를 해야할 때 INSERT INTO players2 SELECT * FROM players WHERE id > 10 VALUE를 쓸 필요가..
-
SQLite 9. UNIONSQL/Sqlite 2022. 1. 1. 12:20
SELECT와 SELECT사이에 UNION만 넣으면 끝... OR을 SELECT * FROM players WHERE height > 80 OR age > 40 이렇게 바꿔 쓸 수도 있다. SELECT * FROM players WHERE height > 80 UNION SELECT * FROM players WHERE age > 40 20행이 반환되었다. UNION ALL을 쓰면 중복행도 반환된다. SELECT * FROM players WHERE height > 80 UNION ALL SELECT * FROM players WHERE age > 40 21행 반환.. 컬럼의 개수가 다르면 합쳐지지 않는다. 에러가 발생하여 실행 중단됨. 결과: SELECTs to the left and right of ..
-
SQLite 8. JOIN: LEFT JOINSQL/Sqlite 2021. 12. 31. 11:28
잊을만하면 한 번씩 DB를 만지게 된다. 그림이 꽤 도움이 된다. 교차 조인은 두 테이블의 모든 조합을 만들고, 동등(이너) 조인은 두 테이블에 공통 값이 있는 조합만 만들었다. A 테이블에는 id 11이 있고, B 테이블에는 id 11이 없다. 하지만 JOIN된 테이블에 id 11이 남아 있어야 할 때는 어떻할까? B테이블에 id11을 만들고 NULL 을 입력해도 된다. 체중 측정값이 NULL인 선수(641번)를 INNER JOIN에서 볼 수 있었다. (INNER JOIN 게시물 참고) 하지만 이 NULL이란 DB를 복잡하게 만드는 요소이다. NULL과 문자열 ''이 혼재한다면... 벌써 가슴 한구석이 답답해지지 않는가? 굳이 없는 NULL을 넣는 것은 특별한 상황이 아니라면 추천하지 않는다. LEFT..
-
SQLite 7. JOIN: INNER JOINSQL/Sqlite 2021. 12. 30. 23:40
앞서 정규화를 살짝 언급하면서 자료의 중복을 금지라는 대원칙을 이야기 했다. 그렇기 때문에 자료는 테이블 단위로 조각 조각난 상태로 데이터베이스 안에 저장된다. 조각 조각 나기 전(?)의 상태로 보기 위해서는 테이블을 다시 합치는 과정이 필요하다. 합치는 과정을 JOIN이라고 한다. 크로스 조인(Cross Join) SELECT players.name, weights.weight FROM players, weights 이렇게 조인을 하면 1,070,190 행이 출력되는데 --; 모든 경우의 수, 즉 players 테이블의 모든 행과 weights 테이블의 모든 행을 곱한 숫자 만큼의 행이 생성되기 때문이다. 이 숫자를 카디전 곱이라고 하고, 이런 조인을 크로스 조인이라고 한다. 동등 조인(Equi-Joi..