목록Database (35)
YS's develop story
⌛ Problem Insert문을 활용하여 테이블에 1000개가 넘는 데이터를 넣으려면 어떻게 해야 할까요? Insert문을 1000번 실행하는 건 매우 비효율적으로 보입니다. 📜 Solution Procedure을 활용하면 같은 쿼리문을 반복적으로 실행할 수 있습니다. Person이라는 테이블에 아래와 같이 sql문을 활용하여 데이터를 반복적으로 넣을 수 있습니다. CREATE PROCEDURE loopInsert() BEGIN DECLARE i INT DEFAULT 1; WHILE i
🥝 MySQL 시간 차이 계산하기 (TIMESTAMPDIFF 함수) ⌛ Problem 쿼리를 작성하다 보면 시간 차이를 활용해야 하는 경우가 존재합니다. 예를 들어 예약시간 30분 전에는 예약을 불가능하도록 막아야 한다거나 특정 이벤트일이 현재부터 얼마나 남았는지 등등의 경우가 존재할 것입니다. 이런 경우에는 어떻게 쿼리를 작성해야 할까요? 😕 📜 Solution TIMESTAMPDIFF라는 함수를 활용하면 매우 쉽게 시간 차이를 계산할 수 있습니다. SELECT TIMESTAMPDIFF(HOUR,'2021-08-22 11:00','2021-08-22 14:00') AS dayCount; SELECT TIMESTAMPDIFF(시간 단위, '날짜 1', '날짜 2') AS 이름; 위와 같은 쿼리를 통해서 ..
🥝 MySQL 여러 개의 데이터 한 번에 저장하기 (Node js, mysql2 promise) ⌛ Problem 😕 변경 전 코드 const connection = await pool.getConnection(async (conn) => conn); ........... for (i in reviewImg) { let postReviewImgParams = [ getReviewIdx[0].reviewIdx, reviewImg[i] ] await hospitalDao.postReviewImg(connection, postReviewImgParams); } async function postReviewImg(connection, postReviewImgParams) { const postReviewImgQ..
👨💻 최근에 추가된 값의 인덱스 찾기, LAST_INSERT_ID() 함수 활용 ⌛ Problem 데이터가 추가될 때마다 각 튜플들을 구분할 수 있게 저장하기 위해 테이블을 설계할 때 테이블의 PK를 Auto_Increment로 설정하는 경우는 매우 많습니다. 아래와 같은 쿼리를 통해 Reviews라는 테이블에 리뷰를 등록한다고 가정해 봅시다. INSERT INTO Reviews(hospitalIdx, userIdx, review, reviewScore) VALUES (?,?,?,?); 이 상황에서 특정 사용자가 등록한 리뷰를 수정하기 위해서는 Reviews테이블에서 사용자가 작성한 리뷰가 몇 번째 튜플인지 알아야 하기 때문에 리뷰 테이블의 PK를 알아야 합니다. 그렇다면 아래와 같은 쿼리를 통해 리뷰..
요일을 구하는 함수 WEEKDAY 위와 같이 User 테이블에 유저가 가입한 시간이 timestamp 형식으로 createdAt이라는 컬럼에 저장되어 있습니다. SELECT CASE WEEKDAY(createdAt) WHEN '0' THEN '월' WHEN '1' THEN '화' WHEN '2' THEN '수' WHEN '3' THEN '목' WHEN '4' THEN '금' WHEN '5' THEN '토' WHEN '6' THEN '일' END AS makeDay FROM Users; 이 정보를 통해 WEEKDAY 함수를 활용하여 위와 같이 날짜를 계산할 수 있습니다. 실행 결과 입니다. 이 데이터는 수요일에 생성되었음을 알 수 있습니다.
참조 무결성 (Referential Integrity)이란 무엇인가? 참조 무결성은 관계형 데이터베이스 모델에서 2개의 관련 있는 관계 변수 간의 일관성을 말합니다 '주어진 속성 집합에 대해 한 관계에 나타나는 값이 다른 관계에서 특정 속성 집합에 대해서도 나타나도록 보장해야 한다'라고 데이터베이스 교재에 나와 있네요. 즉 참조 무결성이란 기본키와 참조 키 간의 관계가 항상 유지되도록 보장하는 것을 말합니다. 간단하게 설명하자면 교원 테이블의 departmentName이 Foreign key이고 그 값이 'Biology'이면 실제로 학과 테이블에 'Biology'가 있어야 합니다. 그리고 두 값은 항상 같아야 합니다. 이러한 관계가 유지되도록 하는 것을 참조 무결성이라고 합니다. 위와 같은 튜플을 추가하..
Foreign key를 설정하려고 테이블을 수정하려고 할 때 발생한 MySQL 1822 에러입니다. 이는 Foreign key 제약조건을 만족하지 않았을 때 발생하는 에러입니다. Stack overflow에 같은 문제가 있어서 기록을 해두고자 했습니다. MySQL Error 1822: Failed to add foreign key constraint; missing index for contraint BUT index exists I am trying to add an foreign key to my flightschedule table but it fails, but I do not really know why. The foreign key should reference the txtAC_tag att..
Select절에서 사용할 수 있는 서브 쿼리 Scalar Subquery Scalar Subquery 특징 한 개의 single value를 반환하는 Select절의 서브 쿼리입니다. 만약 Scalar Subquery를 이용하여 한 개 보다 많은 column을 출력하고자 한다면 Runtime error가 발생하게 됩니다. Scalar Subquery는 테이블에서 column 값을 조회할 때 불필요한 Join을 하지 않기 위해 사용됩니다. Scalar Subquery는 해당하는 값이 존재하지 않을 경우 null을 반환합니다. Scalar Subquery 예시 아래와 같이 두 개의 테이블이 있습니다. Community 테이블 CommunityReply 테이블 SELECT contentName, (SELECT..
SQL Having, Where 차이 위와 같이 instructor라는 테이블이 있습니다. SELECT dept_name, AVG(salary) AS avg_salary FROM instructor GROUP BY dept_name HAVING AVG(salary) > 42000; 집계 함수와 GROUP BY 키워드를 활용해 위와 같은 쿼리문으로 dept_name별로 평균 연봉을 출력하도록 할 수 있습니다. 하지만 여기서 궁금한 게 생겼습니다. HAVING이 아닌 WHERE키워드로 위와 똑같이 출력하도록 할 수 있지 않을까요? 결론부터 말하자면 그렇게 할 수 없습니다! 데이터베이스 원서에도 위와 같이 나와 있습니다. HAVING은 그룹을 형성 한 후에 적용이 되지만 WHERE는 그룹을 만들기 전에 적용이..
SQL Aggregate Functions 집계 함수 SQL은 집계 함수, Aggregate function을 통해 column의 값들을 계산할 수 있습니다. 위 사진의 쿼리는 dept_name이 Comp. Sci인 강사들의 평균 급여를 출력해라 라는 명령어입니다. 위와 같이 집계 함수를 사용할 수 있습니다. avg 대신에... min을 사용하게 되면 강사의 급여 중 최솟값을 max를 사용하게 되면 강사의 급여 중 최댓값을 sum을 사용하게 되면 강사 급여의 모든 합계를 가져오게 됩니다. 위와 같이 count를 활용하여서 course테이블의 튜플 수 가 몇 개인지 확인하는 쿼리를 작성할 수 있습니다. 집계 함수와 Group By 키워드 활용해보기 위 사진에서 사용된 쿼리와 같이 group by 키워드를 ..