SQL
-
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..
-
SQLite 6. 서브쿼리SQL/Sqlite 2021. 12. 30. 14:09
SELECT * FROM mlb_players WHERE "Weight(lbs)">240 AND 조건문을 서브 쿼리로 바꿔 보았다. SELECT * FROM ( SELECT * FROM mlb_players WHERE "Weight(lbs)">240 ) WHERE Position='First Baseman' (다음) 내부의 쿼리가 먼저 실행되고, 그 결과(테이블)가 외부의 쿼리 문으로 전달된다. SELECT * FROM mlb_players WHERE Position='First Baseman' AND "Weight(lbs)">240 속도 느려지고, 구문 복잡하고 별 메리트가 없어 보이는 게 사실이나... 여러 테이블을 넘나 들며 쿼리를 작성해야 할 때는 꽤 유용하게 쓰인다. 원래 실습 데이터에는 테이..
-
SQLite 5. 집계함수와 GROUP BYSQL/Sqlite 2021. 12. 30. 12:04
집계함수, 집약함수, 그룹함수 모두 같은 말이다. 데이터를 가져오지 않고 하나의 값으로 요약한다. COUNT, SUM, AVG, MAX, MIN 이 있다. COUNT 행의 개수를 리턴한다. SELECT count(*) FROM mlb_players AVG SELECT avg("Height(inches)") as avg, max("Height(inches)") as max, min("Height(inches)") as min FROM mlb_players AVG 평균 SUM 합계 MIN 최소 MAX 최대 GROUP BY * GROUP BY 절은 WHERE 뒤 ORDER BY 앞에 위치해야 한다. SELECT * FROM mlb_players GROUP BY Team 실행해보면 각팀의 가장 앞에 있던 선수들..
-
SQLite 4. 연산 필드, 문자열 함수, DATETIME 함수SQL/Sqlite 2021. 12. 29. 22:09
[선수명] is [팀명]'s [포지션] 이라는 문자열을 만들어 보자. ex) Dallas McPherson is ANA 's Third Baseman 컬럼 자리에 문자열을 사용할 수 있다. SELECT Name, ' is ', Team, "'s ", Position FROM mlb_players 이제 합치기만 하면 되는데... SELECT Name||' is '||Team||"'s "||Position FROM mlb_players || 으로 문자열을 합칠 수 있다. 컬럼명이 예술이다. AS를 사용해서 바꿀 수 있다. SELECT Name||' is '||Team||"'s "||Position AS name_team_position FROM mlb_players 컬럼과 필드는 같은 말이지만, 연산 시에는..
-
SQLite 3. WHERESQL/Sqlite 2021. 12. 29. 08:34
IF문과 유사한 개념이다. 비교 조건에 해당되는 행만 출력한다. 단일 값 SELECT * FROM mlb_players WHERE Position="Catcher" ORDER BY Team 일치하지 않는 값 SELECT * FROM mlb_players WHERE Position!="Catcher" ORDER BY Team SELECT * FROM mlb_players WHERE Position"Catcher" ORDER BY Team '!=', '' 둘 다 가능하다. 범위 SELECT * FROM mlb_players WHERE 23.01