2월에 있을 자격시험을 대비하여, 하루 2~3문제는 꼭 풀기로 했다.
매일매일 푼 내용은 github에 정리하여 넣고, 문제풀다가 기억이 안나는 개념 몰랐던 개념, 헤깔리던 개념관련해서 나의 생각과 같이 블로그에 기록해보고자 한다🥕
SQL를 사용하면 정말 많이 사용하게되는 함수이다.
풀이
SELECT concat("/home/grep/src/" ,BOARD_ID, "/",FILE_ID, FILE_NAME, FILE_EXT) AS FILE_PATH FROM USED_GOODS_FILE
WHERE USED_GOODS_FILE.BOARD_ID = (SELECT USED_GOODS_BOARD.BOARD_ID FROM USED_GOODS_BOARD ORDER BY VIEWS DESC LIMIT 1)
ORDER BY FILE_ID DESC
CONCAT(문자열1, 문자열2 , 문자열3 ...)
-- BOARD_ID,FILE_ID , FILE_NAME, FILE_EXT : 문자열로 이루어진 칼럼의 이름
select concat("/home" , "/grep/src/" ,BOARD_ID , "/" , FILE_ID , FILE_NAME , FILE_EXT )
간단한 사용법을 알았으니, 이제 유의사항에 대해알아보자
들어가는 인수중에 하나라도 NULL이 있다면, concat함수는 NULL를 반환한다.
null값이랑 합친 경우
null값이 아닌 경우
group_concat_max_len
시스템 변수에 의해 길이가 제한되기에,(기본값 1024) 이 변수를 변경하면 된다.변경 쿼리
SET GLOBAL group_concat_max_len = <원하는 값>;
변경된점 확인 쿼리
SELECT @@group_concat_max_len;
문제를 풀다보니, Subquery returns more than 1 row
라는 에러문구를 마주했다.
찾아보니 보통 서브쿼리가 단일값만 반환해야되는데 여러 개의 행을 반환하는 경우 발생하는 오류!
처음 알게된 것이기에 이번에 서브쿼리가 뭔지!, 왜 이런 에러가 나는지!, 그리고 해결책은 뭔지 알아보고자 한다!
하나의 SQL 문 안에 포함된 또 다른 SQL 문!
SQL의 강력한 기능 중 하나이며, 데이터 검색과 조작을 더욱 유연하고 효과적으로 수행할 수 있도록 도와준다.
WHERE table1.column1 = table2.column1;
WHERE column1 = (SELECT MAX(column1) FROM table2);
개념
사용하는 상황
예
SELECT column1, column2
FROM table1
WHERE EXISTS (SELECT 1 FROM table2 WHERE table1.id = table2.id);
SELECT column1, column2
FROM table1
WHERE EXISTS (SELECT 1 FROM table2 WHERE table2.column3 > 100);
서브쿼리의 결과를 SELECT 문의 칼럼값으로 사용할 때, 단일값 반환해야됨!(내가 맞닿들였던 문제!)
WHERE절의 서브쿼리 말고도, SELECT에 들어갈 하나의 값도 가능하다.
예시
SELECT column1, column2,
(SELECT COUNT(*) FROM table2 WHERE table2.column1 = table1.column1) AS count_value
FROM table1;
결론적으로, 서브쿼리가 WHERE에 종속적인 경우, WHERE은 결국 결과를 내야되기에 대부분의 서브쿼리가 단일값으로 해야되는 것, 그렇지않으면
Subquery returns more than 1 row
에러가 남을 도출했다.
(여기서, 무조건 서브쿼리는 단일값을 반환해야된다! 가 아니라 위와 같은 상황에서는 단일값을 반환해야된다는 말이다.)
SELECT column1, column2, (SELECT AVG(column3) FROM table2) AS avg_value
FROM table1;
여러 값이 반환되더라도 IN은 그 값들이 포함된 것으로 처리해주기때문에, 단일 값이 아닌 경우 처리가능하다.
나도 문제는 IN을 사용하여 풀었다.
예시
SELECT * FROM Customers
WHERE Country IN ('Germany', 'France', 'UK');
-- 코드를 입력하세요
-- 조건: 게시물 3건 이상
-- 조회: 사용자 ID, 닉네임, 전체주소(시 ,도로명, 상세주소), 전화번호 (xxx-xxxx-xxxx)
-- 정렬 : USER_ID 내림차순
SELECT USER_ID , NICKNAME, CONCAT(CITY, " ",STREET_ADDRESS1," ", STREET_ADDRESS2) AS 전체주소 , CONCAT(SUBSTRING(TLNO,1,3) ,'-', SUBSTRING(TLNO,4,4) ,'-',SUBSTRING(TLNO,8)) AS 전화번호
FROM USED_GOODS_USER
WHERE USED_GOODS_USER.USER_ID IN
(
SELECT WRITER_ID
FROM USED_GOODS_BOARD
GROUP BY WRITER_ID
HAVING COUNT(USED_GOODS_BOARD.WRITER_ID) >= 3
)
ORDER BY USER_ID DESC
작가 chandlervid85 이미지 출처 Freepik