공부/데이터베이스 24

교집합, 합집합, 차집합

use BaseballData; --RDBMS(Realtional 관계형) --데이터를 집합으로 간주한다. --복수의 테이블을 다루는 방법 --커리어 평균 연봉이 3백만 이상인 선수들의 playerID SELECT playerID, AVG(salary) FROM salaries GROUP BY playerID HAVING AVG(salary) >= 3000000 -- 12월에 태어난 선수들의 playerID SELECT playerID, birthMonth FROM players WHERE birthMonth = 12 -- [커리어 평균 연봉이 300000이상] 이거나 [12월에 태어난] 선수 --UNION (중복 제거) UNION ALL(중복 허용) SELECT playerID FROM salaries..

정규화 / INDEX

정규화란? 테이블을 올바르게 변경하고 분할하는 것. 반복되는 데이터를 세로 방향으로 늘려, 가독성을 높인다. 종복된 데이터를 발생시키지 않고 Table를 따로 관리하여 가독성을 높인다. INDEX(색인) 이란? 특정 데이터를 빨리 찾을 수 있게 보조해주는 것. 종류 1) PRIMARY KEY(CLUSTERED INDEX) 물리적 데이터 저장 순서의 기준. 테이블에 1개만 존재한다. 테이블 우선순위로 정렬되므로 가장 찾는 속도가 빠르며 효율적이다. EX) 영한 사전. 2)일반 INDEX(NON-CLUSTERED INDEX) 따로 관리하는 일종의 LOOKUP 테이블 만드는데 별다른 제한이 없다. EX) 책 후반에 나오는 색인 --인덱스 CREATE INDEX / DROP INDEX CREATE cluster..

데이터베이스 작성

-- 우선 데이터베이스를 만들어야 한다. -- 참고) schema라고도 함. create database GameDB; USE GameDB; --테이블 생성(CREATE) / 삭제(DROP) / 변경(ALTER) --CREATE TABLE 테이블명(열이름 자료형 [DEFAULT 기본값][NULL | NOT NULL], ) CREATE TABLE accounts ( accountID INTEGER NOT NULL, accountName VARCHAR(10) NOT NULL, coins INTEGER DEFAULT 0, createdTime DATETIME ); SELECT* FROM accounts; --테이블 삭제 DROP TABLE accounts; --테이블 변경(ALTER) --열 추가(ADD) /..

서브 쿼리( SUBQUERY)

use BaseballData --SubQuery (서브쿼리 / 하위쿼리) --SQL 명령문 안에 지정하는 하부 SELECT -- 연봉이 역대급으로 높은 선수의 정보를 추출 SELECT TOP 1* FROM salaries order by salary desc; --rodrial01 select* from players where playerID = 'rodrial01' -- 이것을 한 번에 하려면? -- 단일행 서브쿼리 select* from players where playerID = (select top 1 playerID from salaries order by salary desc); -- 다중행 IN 사용 SELECT* FROM players WHERE playerID IN (SELECT TO..

INSERT DELETE UPDATE

use BaseballData; select* from salaries order by yearID DESC; --INSERT INTO [TableName] --VALUES [Values] INSERT INTO salaries values(2020,'KOR', 'NL', 'rookie', 90000000); --> 데이터 하나 빼먹으면 Error 발생 --> INSERT INTO salaries(yearID,teamID,playerID,lgID,salary) valueS (2020,'KOR','rookiss','NL',19000000) --DELETE FROM [TableName] --where [조건] -> 조건을 붙이지 않으면 테이블이 날라간다. DELETE FROM salaries WHERE pla..

GROUP BY

2004년 보스턴 소속으로 출전한 선수들의 타격 정보 select* from batting where yearID = 2004 and teamID = 'BOS' 2004년도 보스턴 소속으로 출전해서 날린 홈런 개수 SELECT SUM(HR) FROM batting WHERE yearID = 2004 AND teamID = 'BOS' 2004년도에 가장 많은 홈런을 날린 팀은? =>GROUP BY 로 구현할 수 있다. --팀별로 묶어서 뭔가를 분석하고 싶다 select teamID, count(teamID) as playerCount, sum(HR) AS homeRuns from batting where yearID = 2004 group by teamID -- 팀 아이디 그룹 중 2004년에 배팅 데이터..

연습문제

use BaseballData; /* playerID(선수ID) yearID(시즌 년도) teamID(팀 명칭, 'BOS' = 보스턴) G_batting(출전 경기 + 타석) AB(타수) H(안타) R(출루) 2B(2루타) 3B(3루타) HR(홈런) BB(볼넷) 1. 보스턴 소속 선수들의 정보들만 모두 출력 select * from batting where teamID is not null and teamID = 'BOS' 2. 보스턴 소속 선수들의 수는 몇명? (단, 중복은 제거) select COUNT(DISTINCE playerID) from batting where teamID is not null and teamID = 'BOS' 1655 3. 보스턴 팀이 2004년도에 친 홈런 개수 selec..

DATETIME

데이터 베이스에는 시간을 따로 제공해준다. 이러한 datatime은 데이터베이스 자체에서 제공하는 규격이 있는데 위와 같은 datatime 규격을 지키게 된다면, 자동으로 읽고 쓰기 기능을 구현해준다. 값을 추가해보자. 아직 INSERT를 배우지 않아 직접적으로 Script를 만들고, VALUES 값에 규격의 DateTime값을 넣는다. 여지껏 배운 문법을 뽐내본다. 규격대로 넣어졌다면 1 raw affected 이라며, 성공적으로 값이 들어갔다고 한다. 확인해보자 정상적으로 들어가 있다. 이 값들을 필터링 해보자. 정상적이다. 현재시간을 저장할때, 본인의 컴퓨터 데이터 기준의 시간에서 저장이 되는 걸 볼 수 있다. 즉 클라이언트 기준의 시간대에서 설정이 되어있고, 컴퓨터 데이터 기준을 변경하여 저장한다..