
컬럼에 사칙연산 가능 저번 글에서 사용한 테이블을 중 '사용금액' 컬럼이 있다. 이 컬럼에 사칙연산을 사용해보면 기존 사용 금액의 0.9가 곱해진 값만 출력이 된다. 컬럼끼리의 연산도 가능 만약 결제당 평균 사용금액을 출력하고 싶으면 컬럼끼리 나눠서 도출할 수 있다. 문자 덧셈도 가능, CONCAT() 문자도 문자끼리 양옆을 이어붙여서 더할 수 있다...
greatest / least 여러 숫자들을 입력하면 최댓값, 최솟값 뽑아줌 floor / ceil 소수점 들어있는 숫자들을 정수로 변환해줌 floor은 소수부분을 내림, ceil은 소수부분을 올림 round / truncate 소수점 부분을 반올림 / 내림할 때 씀 round는 입력한 자릿수까지 반올림, truncate는 내림 power 거듭제곱 ...

위의 card 테이블에서 사용금액들의 평균보다 더 큰 사용금액을 가진 사람만 출력하고 싶다면? 사용금액의 평균구하기 사용금액 > 평균인 행 출력하기 이 두 코드를 합치는 방법은 SELECT 쿼리안에 다른 SELECT 쿼리를 자유롭게 넣는 것이다. 저렇게 다른 쿼리 안에 들어가는 쿼리를 "서브쿼리" 라고 한다. (참고) 문자나 숫자 등의 자료가 들...

특정 그룹을 뽑고 싶으면 WHERE 써서 필터링하면 되는데 그룹 별로 뽑고 싶으면 GROUP BY 문법을 사용하면 편리하다 GROUP BY 고객등급 카테고리끼리 그룹이 지어진 것을 볼 수 있다. 집계함수를 더해서 각 등급마다 고객이 몇 명인지 출력할 수 있다. <img src="https://velog.velcdn.com/images/yunbini/...

자주 쓰는 IF 함수 문자나 데이터 넣는 곳에 고정된 값이 아닌 조건에 따라 각각 다른 값을 넣고 싶다면 IF 함수를 사용할 수 있다. 예시) card 테이블에서 사용금액이 20만원을 넘는 경우 "우수" 아니면 "거지"를 출력하고 싶다면 IF 함수의 단점이라고 하면 조건을 하나만 잡을 수 있다는것이다. 이것을 해결할 수 있는 함수는 CASE 문법이다...
데이터베이스 생성, 삭제 방법 데이터베이스 생성 데이터베이스 삭제 테이블 생성 예시) 컬럼만들 때 뒤에 DEFAULT를 붙이면 기본으로 채워줄 값을 설정할 수 있다. DEFAULT가 없으면 NULL을 채워준다. 테이블 삭제 컬럼 생성,변경,삭제 컬럼 생성 컬럼 변경 이미 컬럼에 '가나다'같은 문자가 들어있으면 INT로 바꿀 수 없다. 그럼 경...

컬럼 만들 때 제약조건을 걸어둘 수 있다. NOT NULL 컬럼 만들 때 우측에 NOT NULL을 체크해주면 NULL 금지라는 제약을 걸 수 있다. 까먹고 데이터를 넣지 않으면 저장이 되지 않는다. UNIQUE 컬럼 만들 때 우측에 UNIQUE를 체크해주면 그 컬럼 안에선 각 행이 다른 데이터를 가지고 있어야 한다. 중복되는 데이터가 있을 수 없다....

제 1정규형(1st normal form) 이러한 테이블이 있었는데 김민수 라는 사람이 다음 날 '골프초급'을 수강신청했다. 이렇게 해놓으면 나중에 성능이슈가 생길 수 있고 한 칸에 많은 정보를 저장해두면 한 칸에서 일부만 찾거나 수정하거나 삭제하는 작업이 느려진다. 그래서 이렇게 만드는 것이 낫다. **제 1정규화은 하나의 셀 안에 하나의 데이터만 ...

제3정규형(3rd normal form) 제2정규형을 만족하는 테이블에서 primary key나 composition primary key 컬럼에 종속되는 것이 아닌 하찮은 잔챙이 컬럼에 종속된 컬럼을 다른 테이블로 빼면 그것이 제3정규형 테이블이다. 위 사진은 제2정규형 테이블이고 primary key는 '프로그램'이다. 근데 '출신대학' 컬럼은 pr...

정규형 테이블 만들고 나서 테이블을 다 쪼개놓고 합쳐서 출력하고 싶을 때 SELECT와 JOIN 문법을 쓰면 된다. 다른 테이블에 있는 컬럼 같이 출력 두 개의 테이블을 위 사진 처럼 프로그램, 가격, 강사, 출신대학까지 4개의 컬럼을 한 번에 출력하고 싶으면 FROM 뒤에 두 개의 테이블을 적어서 하나의 테이블로 합쳐준다. (참고) 컬럼명이 겹칠 ...

테이블을 여러 개 조합해서 출력하고싶으면 INNER JOIN을 쓰면 된다. 그리고 공통점이 있는 행만 필터링하고 싶으면 ON 조건문을 붙이면 된다. 근데 공통점이 없는 행도 함께 출력하고싶으면 LEFT,RIGHT JOIN, OUTER JOIN을 쓰면 된다. 저번에 썼던 program, teacher 테이블에 행 1개씩 추가 왼쪽 테이블 전체 + 공통된...
테이블 미리 만들기 데이터 집어넣고 싶으면 INSERT 테이블의 모든 컬럼명과 거기 넣을 모든 값을 차례로 적어주면 된다. 모든 컬럼말고 일부 컬럼에만 데이터를 저장할 수 있다. 이땐 id가 생략되었지만 AUTO INCREMENT 제약이 부여되어있기 때문에 알아서 채워준다. 다른 컬럼이었으면 NULL로 채워준다. 모든 컬럼이 빠짐없이 데이터를 넣는...
UPDATE / SET / WHERE SET 뒤엔 컬럼마다 어떤 값으로 수정할지 선택하고 WHERE 뒤엔 어떤 행을 업데이트할 것인지 조건식을 넣어준다. 값을 완전히 대체하는 것이 아닌 기존 값에 사칙연산을 할 수 있다. 삭제하려면 DELETE FROM 그럼 조건식에 맞는 모든 행을 삭제해준다. (참고) 다른 테이블에서 Foreign Key로 사용...

SELECT 여러 개를 사용해야하는 경우에 결과를 각각 다른 탭에 보여줄텐데 이렇게 말고 하나의 결과로 합쳐놓고 싶다면 UNION 문법 쓰면 된다. UNION 사용법 보통 테이블을 전부 출력하고 싶으면 이렇게 코드를 짠다. 근데 이러면 결과를 각자 다른탭으로 출력해주기 때문에 결과를 하나로 합치고 싶다면 이렇게 하면 하나의 테이블로 출력해준다. 이...
간혹 create table 말고 create view 하는 경우가 있다. view가 뭐냐면 SELECT로 찾은 행들이 맘에 들어서 테이블로 두고두고 저장해서 쓰고 싶으면 실제 테이블로 저장해도 되겠지만 가상의 테이블인 view로 만드는 방법이 있다. view를 만드는 문법은 간단하다. SELECT로 찾은 행들을 view로 만들어달라는 코드이다. vi...

자주 쓰는 SQL 문장이 있다면 필요할 때 마다길게 타이핑하는 것이 귀찮을 수도 있으니 stored procedure를 사용하면 좋다! stored procedure는 코드 덩어리 저장가능 SELECT FROM 이런 긴 문장같은 것을 저장해서 재사용하고싶으면 stored procedure 기능을 사용하면 된다. 만약 이 코드를 나중에 사용할 일이 많다....
변수문법 변수는 길고 복잡한 자료를 잠깐 보관하는 통이라고 생각하면 된다. 이런식으로 변수를 정의하면 된다. 셋 다 같은 방법이다. 이렇게 하면 20이 출력된다. 이런식으로 가격이 6000원인 상품만 가져오라는 코드로 활용할 수 있다. 변수에는 한가지 값만 들어가면 되기 때문에 한가지 값만 출력된다면 서브쿼리를 넣어도 상관없다. 기존 변수에 값을 ...
위의 코드는 가격이 5000원보다 비싼 제품을 출력하라는 코드이다. 근데 가격이 6000원이상인 제품을 출력하는 procedure를 만들고 싶으면 procedure를 더 만들면 되지만 그럼 이미 만들어둔 procedure는 쓸모가 없어지기 때문에 이를 해결하기 위해 구멍뚫기 문법을 사용해보고자 한다. 구멍뚫기 문법 위의 코드에서 가격 기준을 바꾸고 싶다...

날짜 저장하려면 MySQL의 경우 DATE / YYYY-MM-DD 형식 / 9999년까지 저장가능 DATETIME / YYYY-MM-DD hh:mm:ss 형식 / 9999년까지 저장가능 TIMESTAMP / YYYY-MM-DD hh:mm:ss 형식 / 2038년까지 저장가능 TIMESTAMP는 현재DB시간 기록용 말고는 잘 쓰지 않는다. 테이블만들 때 D...
function 함수 문법은 procedure과 비슷한 문법이다. 용도는 같지만 기능이 살짝 다르다. procedure는 자주 쓰는 긴 코드를 한 단어로 만들어놓고 싶을 때 쓴다고 했는데 function도 똑같다. function 만들 때 필요한 문법 1.procedure처럼 파라미터 넣을 수 있다. returns 뒤에 return할 자료의 데이터타입을...
card 테이블의 '사용금액' 컬럼 총 합계를 구하는데 총 합계가 500만원이 넘으면 select '잘했어요; 넘지 못하면 select '분발하세요'; 를 실행하고싶을 때 어떻게 코드를 짜야할까? if나 case를 써도 되겠지만 그 문법들은 숫자나 문자 1개씩만 남겨주는 문법이기 때문에 조건에 따라 select같은 쿼리문은 남기지 못한다. 조건에 따라 ...

만약 1억개의 데이터 중 하나의 데이터를 찾으려면 1억개의 행을 모두 뒤져봐야한다. (매우느리다는뜻) 효율적으로 데이터를 검색하고 싶으면 index를 사용해야한다. 업다운놀이 1부터 100까지 써있는 카드가 책상에 있으면 그 중 정답 숫자 하나를 맞춰보고자 한다. 멍청한 사람은 1부터 100까지 하나씩 물어보면서 정답이냐 하겠지만 똑똑한 사람은 50보...

위 데이터셋은 어떤 도서관의 소장도서 6만원의 정보가 들어있다. execution plan(실행계획) 분석해보기 원하는 쿼리문 작성해서 커서 찍고 dbeaver 상단메뉴의 sql편집기 - 실행계획보기를 눌러보면 실행계획이 출력된다. 컴퓨터가 이 쿼리문을 어떻게 실행할지 계획을 짜놓은것을 볼 수 있는 화면인데 이것을 보고 성능평가를 할 수 있다. co...

게시판 서비스를 만들었는데 테이블 하나에 게시물의 글 내용, 작성자, 발행일을 저장하기 시작했다. 이 때 검색기능이 필요해지면 어떻게 구현하면 될까? LIKE 연산자 예전에 간단한 검색기능 구현하고 싶으면 컬럼명 LIKE %단어% 하면 된다고 했는데 % 기호를 맨 앞에 쓰면 인덱스 활용을 못하고 문장이 좀 길거나 행이 많아지면 LIKE 만으로는 매우 느...
INSERT, UPDATE, DELETE가 안되고 실패하는 경우가 있는데 그러면 다시 시도하면 되긴하지만 동시에 여러 쿼리를 실행해야할 때 그 중 하나만 실패하는 경우 서비스 운영에 심각한 문제가 발생할 수 있다. 예를 들어 은행을 운영하는데 A고객이 B고객에게 1000원을 이체한다고 한다. A고객의 잔고에서 -1000원을 하고 B고객의 잔고에서 +100...