[클래식 MySQL 면접문제2 공유!]

19914 단어 데이터베이스
테이블 이름 및 필드 – 1.학생표Student(s id, s name, s birth, s sex) - 학생 번호, 학생 이름, 생년월일, 학생 성별 – 2.코스 테이블 Course(c id, c name, t id) – 코스 번호, 코스 이름, 교사 번호 – 3.교사 목록 길잡이(t id, t name) - 교사 번호, 교사 이름 – 4.성적표 Score(s id, c id, s score) - 학생 번호, 과정 번호, 점수
테스트 데이터
--  
--   
CREATE TABLE `Student`(
    `s_id` VARCHAR(20),
    `s_name` VARCHAR(20) NOT NULL DEFAULT '',
    `s_birth` VARCHAR(20) NOT NULL DEFAULT '',
    `s_sex` VARCHAR(10) NOT NULL DEFAULT '',
    PRIMARY KEY(`s_id`)
);
--   
CREATE TABLE `Course`(
    `c_id`  VARCHAR(20),
    `c_name` VARCHAR(20) NOT NULL DEFAULT '',
    `t_id` VARCHAR(20) NOT NULL,
    PRIMARY KEY(`c_id`)
);
--   
CREATE TABLE `Teacher`(
    `t_id` VARCHAR(20),
    `t_name` VARCHAR(20) NOT NULL DEFAULT '',
    PRIMARY KEY(`t_id`)
);
--   
CREATE TABLE `Score`(
    `s_id` VARCHAR(20),
    `c_id`  VARCHAR(20),
    `s_score` INT(3),
    PRIMARY KEY(`s_id`,`c_id`)
);
--         
insert into Student values('01' , '  ' , '1990-01-01' , ' ');
insert into Student values('02' , '  ' , '1990-12-21' , ' ');
insert into Student values('03' , '  ' , '1990-05-20' , ' ');
insert into Student values('04' , '  ' , '1990-08-06' , ' ');
insert into Student values('05' , '  ' , '1991-12-01' , ' ');
insert into Student values('06' , '  ' , '1992-03-01' , ' ');
insert into Student values('07' , '  ' , '1989-07-01' , ' ');
insert into Student values('08' , '  ' , '1990-01-20' , ' ');
--       
insert into Course values('01' , '  ' , '02');
insert into Course values('02' , '  ' , '01');
insert into Course values('03' , '  ' , '03');
 
--       
insert into Teacher values('01' , '  ');
insert into Teacher values('02' , '  ');
insert into Teacher values('03' , '  ');
 
--       
insert into Score values('01' , '01' , 80);
insert into Score values('01' , '02' , 90);
insert into Score values('01' , '03' , 99);
insert into Score values('02' , '01' , 70);
insert into Score values('02' , '02' , 60);
insert into Score values('02' , '03' , 80);
insert into Score values('03' , '01' , 80);
insert into Score values('03' , '02' , 80);
insert into Score values('03' , '03' , 80);
insert into Score values('04' , '01' , 50);
insert into Score values('04' , '02' , 30);
insert into Score values('04' , '03' , 20);
insert into Score values('05' , '01' , 76);
insert into Score values('05' , '02' , 87);
insert into Score values('06' , '01' , 31);
insert into Score values('06' , '03' , 34);
insert into Score values('07' , '02' , 89);
insert into Score values('07' , '03' , 98);

-- [1.'01'과정이'02'과정보다 성적이 높은 학생의 정보 및 과정 점수를 조회한다]
SELECT a.* ,b.s_score AS 01_score,c.s_score AS 02_score FROM student a 
JOIN score b ON a.s_id=b.s_id AND b.c_id='01'
LEFT JOIN score c ON a.s_id=c.s_id AND c.c_id='02' OR c.c_id = NULL WHERE b.s_score>c.s_score;

-- [2.'01'과정이'02'과정보다 성적이 낮은 학생의 정보 및 과정 점수 조회]
SELECT a.* ,b.s_score AS 01_score,c.s_score AS 02_score FROM 
student a LEFT JOIN score b ON a.s_id=b.s_id AND b.c_id='01' OR b.c_id=NULL 
JOIN score c ON a.s_id=c.s_id AND c.c_id='02' WHERE b.s_score

-- [3. 평균 성적이 60점 이상인 학생의 학생 번호와 학생 이름과 평균 성적을 조회한다]
SELECT b.s_id,b.s_name,ROUND(AVG(a.s_score),2) AS avg_score FROM student b 
JOIN score a ON b.s_id = a.s_id
GROUP BY b.s_id,b.s_name HAVING ROUND(AVG(a.s_score),2)>=60;

-- [4. 평균 성적이 60점 미만인 학우의 학생 번호와 학생 이름과 평균 성적(성적이 있는 학생과 성적이 없는 학생 포함) 조회
SELECT b.s_id,b.s_name,ROUND(AVG(a.s_score),2) AS avg_score FROM student b 
LEFT JOIN score a ON b.s_id = a.s_id
GROUP BY b.s_id,b.s_name HAVING ROUND(AVG(a.s_score),2)<60
UNION
SELECT a.s_id,a.s_name,0 AS avg_score FROM student a 
WHERE a.s_id NOT IN (SELECT DISTINCT s_id FROM score);

-- [5. 모든 학우의 학생 번호, 학생 이름, 수강신청 총수, 모든 과정의 총성적 조회]
SELECT a.s_id,a.s_name,COUNT(b.c_id) AS sum_course,SUM(b.s_score) AS sum_score FROM 
student a LEFT JOIN score b ON a.s_id=b.s_id GROUP BY a.s_id,a.s_name;

-- [6,'이'성 선생님의 수량 조회]
SELECT COUNT(t_id) FROM teacher WHERE t_name LIKE ' %';

-- [7,'장삼'선생님의 수업을 배운 학우의 정보를 조회한다]
SELECT a.* FROM  student a 
JOIN score b ON a.s_id=b.s_id WHERE b.c_id IN(
SELECT c_id FROM course WHERE t_id =(
SELECT t_id FROM teacher WHERE t_name = '  '));

-- [8,'장삼'선생님의 강의를 배우지 않은 친구들의 정보를 조회한다]
SELECT * FROM  student c 
    WHERE c.s_id NOT IN(
        SELECT a.s_id FROM student a JOIN score b ON a.s_id=b.s_id WHERE b.c_id IN(
            SELECT c_id FROM course WHERE t_id =(
                SELECT t_id FROM teacher WHERE t_name = '  ')));

-- [9. 번호'01'을 배웠고 번호'02'를 배운 학우의 정보]
SELECT a.* FROM  student a,score b,score c 
WHERE a.s_id = b.s_id  AND a.s_id = c.s_id AND b.c_id='01' AND c.c_id='02';

-- [10. 번호'01'을 배웠지만 번호'02'를 배운 학우의 정보를 조회한다]
SELECT a.* FROM student a 
WHERE a.s_id IN (SELECT s_id FROM score WHERE c_id='01' ) AND a.s_id NOT IN(SELECT s_id FROM score WHERE c_id='02');

-- [11. 모든 과정을 다 배우지 못한 학우의 정보를 조회한다]
SELECT s.* FROM  student s WHERE s.s_id IN(
SELECT s_id FROM score WHERE s_id NOT IN(SELECT a.s_id FROM score a 
JOIN score b ON a.s_id = b.s_id AND b.c_id='02'
JOIN score c ON a.s_id = c.s_id AND c.c_id='03' WHERE a.c_id='01'));

-- [12. 학번이'01'인 학우와 같은 학우의 정보를 조회한다]
SELECT * FROM student WHERE s_id IN(
SELECT DISTINCT a.s_id FROM score a WHERE a.c_id IN(SELECT a.c_id FROM score a WHERE a.s_id='01'));

-- [13. 01호 학우들이 공부하는 과정이 똑같은 다른 학우들의 정보를 조회한다]
SELECT a.* FROM student a WHERE a.s_id IN(
SELECT DISTINCT s_id FROM score WHERE s_id!='01' AND c_id IN(SELECT c_id FROM score WHERE s_id='01') GROUP BY s_id HAVING COUNT(1)=(SELECT COUNT(1) FROM score WHERE s_id='01'));

-- [14.'장삼'선생님이 강의한 과목을 배우지 않은 학생의 이름을 조회한다]
SELECT a.s_name FROM student a WHERE a.s_id NOT IN (
SELECT s_id FROM score WHERE c_id = 
(SELECT c_id FROM course WHERE t_id =(
SELECT t_id FROM teacher WHERE t_name = '  '))  GROUP BY s_id);

- [15. 두 과목과 그 이상의 불합격 과정을 조회한 학우의 학번, 성명과 평균 성적]
SELECT a.s_id,a.s_name,ROUND(AVG(b.s_score)) FROM  student a 
LEFT JOIN score b ON a.s_id = b.s_id
WHERE a.s_id IN(
SELECT s_id FROM score WHERE s_score<60 GROUP BY  s_id HAVING COUNT(1)>=2)
GROUP BY a.s_id,a.s_name;

-- [16.'01'과정의 점수가 60보다 적고 점수 내림차순으로 배열된 학생 정보를 검색한다]
SELECT a.*,b.c_id,b.s_score FROM student a,score b 
WHERE a.s_id = b.s_id AND b.c_id='01' AND b.s_score<60 ORDER BY b.s_score DESC;

- [17. 모든 학생의 모든 과정의 성적과 평균 성적을 평균적으로 높게부터 낮게까지 표시한다]
SELECT a.s_id,(SELECT s_score FROM score WHERE s_id=a.s_id AND c_id='01') AS   ,
(SELECT s_score FROM score WHERE s_id=a.s_id AND c_id='02') AS   ,
(SELECT s_score FROM score WHERE s_id=a.s_id AND c_id='03') AS   ,
ROUND(AVG(s_score),2) AS     FROM score a  GROUP BY a.s_id ORDER BY     DESC;

- 【18. 각 과목의 성적 최고 점수, 최저 점수와 평균 점수를 조회한다. 다음과 같은 형식으로 과정 ID, 과정name, 최고 점수, 최저 점수, 평균 점수, 합격률, 중등률, 우수율, 합격률 >=60, 중등: 70-80, 우수: 80-90, 우수: >=90】
SELECT a.c_id,b.c_name,MAX(s_score),MIN(s_score),ROUND(AVG(s_score),2),
    ROUND(100*(SUM(CASE WHEN a.s_score>=60 THEN 1 ELSE 0 END)/SUM(CASE WHEN a.s_score THEN 1 ELSE 0 END)),2) AS    ,
    ROUND(100*(SUM(CASE WHEN a.s_score>=70 AND a.s_score<=80 THEN 1 ELSE 0 END)/SUM(CASE WHEN a.s_score THEN 1 ELSE 0 END)),2) AS    ,
    ROUND(100*(SUM(CASE WHEN a.s_score>=80 AND a.s_score<=90 THEN 1 ELSE 0 END)/SUM(CASE WHEN a.s_score THEN 1 ELSE 0 END)),2) AS    ,
    ROUND(100*(SUM(CASE WHEN a.s_score>=90 THEN 1 ELSE 0 END)/SUM(CASE WHEN a.s_score THEN 1 ELSE 0 END)),2) AS    
    FROM score a LEFT JOIN course b ON a.c_id = b.c_id GROUP BY a.c_id,b.c_name;

-- [19, 과목별 성적순으로 순위를 매기고 표시(불완전 달성)]
SELECT a.s_id,a.c_id,
@i:=@i +1 AS i    ,
@k:=(CASE WHEN @score=a.s_score THEN @k ELSE @i END) AS rank     ,
@score:=a.s_score AS score
FROM (
SELECT s_id,c_id,s_score FROM score WHERE c_id='01' GROUP BY s_id,c_id,s_score ORDER BY s_score DESC
)a,(SELECT @k:=0,@i:=0,@score:=0)s
UNION
SELECT a.s_id,a.c_id,
@i:=@i +1 AS i,
@k:=(CASE WHEN @score=a.s_score THEN @k ELSE @i END) AS rank,
@score:=a.s_score AS score
FROM (
SELECT s_id,c_id,s_score FROM score WHERE c_id='02' GROUP BY s_id,c_id,s_score ORDER BY s_score DESC
)a,(SELECT @k:=0,@i:=0,@score:=0)s
UNION
SELECT a.s_id,a.c_id,
@i:=@i +1 AS i,
@k:=(CASE WHEN @score=a.s_score THEN @k ELSE @i END) AS rank,
@score:=a.s_score AS score
FROM (
SELECT s_id,c_id,s_score FROM score WHERE c_id='03' GROUP BY s_id,c_id,s_score ORDER BY s_score DESC
)a,(SELECT @k:=0,@i:=0,@score:=0)s;

참고:
변수 i를 정의하여 추가할 때마다 결과는 +1, @i:=@i+1입니다.
mysql에서 사용자 변수를 정의하는 방법: select @ 변수 이름
사용자 변수에 값을 지정하려면 다음과 같이 하십시오.
              1.= 기호를 사용합니다.
              2.:= 기호를 사용합니다.
차이점:
set 명령을 사용하여 사용자 변수에 값을 부여할 때 두 가지 방식을 모두 사용할 수 있다.
select 문장을 사용하여 사용자 변수에 값을 부여할 때 ': =' 방식만 사용할 수 있습니다. 왜냐하면 select 문장에서 '=' 번호는 비교 조작부호로 간주되기 때문입니다.
(@i:=@i+1)도 @i:=@i+1으로 쓸 수 있으며, 괄호를 넣는 것은 시각적으로 이 구조를 더욱 명확하게 보기 위해서이다.
마지막 행(SELECT @i:=0) as i:
하나의 변수를 정의한 후에 매번 조회할 때마다 이 변수에 자증합니다. 우리는 매번 조회문을 실행하여 결과를 얻으면 이 변수가 자증할 필요가 없습니다. 따라서 0으로 리셋하고, 표 이름 뒤에 쉼표로 구분해서 사용하십시오. (SELECT @i:=0)asi는 이 asi를 왜 이렇게 사용하는지 설명하십시오. 파생표에 별명이 필요하기 때문입니다.이것은 바로 그것의 별명을 만드는 것이다. 임의의 문자가 될 수 있다
-- (20. 학생의 총 성적을 조회하고 순위를 매긴다)
SELECT a.s_id,
@i:=@i+1 AS i,
@k:=(CASE WHEN @score=a.sum_score THEN @k ELSE @i END) AS rank,
@score:=a.sum_score AS score
FROM (SELECT s_id,SUM(s_score) AS sum_score FROM score GROUP BY s_id ORDER BY sum_score DESC)a,
(SELECT @k:=0,@i:=0,@score:=0)s;

-- [21. 서로 다른 선생님이 가르친 과목의 평균 점수를 조회하면 높은 것부터 낮은 것까지 나타난다]
SELECT a.t_id,c.t_name,a.c_id,ROUND(AVG(s_score),2) AS avg_score FROM course a
LEFT JOIN score b ON a.c_id=b.c_id 
LEFT JOIN teacher c ON a.t_id=c.t_id
GROUP BY a.c_id,a.t_id,c.t_name ORDER BY avg_score DESC;

-- [22. 모든 과정의 성적 2위부터 3위까지의 학생 정보 및 해당 과정의 성적 조회]
SELECT d.*,c.  ,c.s_score,c.c_id FROM (
                SELECT a.s_id,a.s_score,a.c_id,@i:=@i+1 AS    FROM score a,(SELECT @i:=0)s WHERE a.c_id='01'    
            )c
            LEFT JOIN student d ON c.s_id=d.s_id
            WHERE    BETWEEN 2 AND 3
            UNION
            SELECT d.*,c.  ,c.s_score,c.c_id FROM (
                SELECT a.s_id,a.s_score,a.c_id,@j:=@j+1 AS    FROM score a,(SELECT @j:=0)s WHERE a.c_id='02'    
            )c
            LEFT JOIN student d ON c.s_id=d.s_id
            WHERE    BETWEEN 2 AND 3
            UNION
            SELECT d.*,c.  ,c.s_score,c.c_id FROM (
                SELECT a.s_id,a.s_score,a.c_id,@k:=@k+1 AS    FROM score a,(SELECT @k:=0)s WHERE a.c_id='03'    
            )c
            LEFT JOIN student d ON c.s_id=d.s_id
            WHERE    BETWEEN 2 AND 3;

- [23. 각 과목의 성적 각 분수 단계의 인원을 통계: 과정 번호, 과정 명칭, [100-85], [85-70], [70-60], [0-60] 및 차지하는 비율]
SELECT DISTINCT f.c_name,a.c_id,b.`85-100`,b.   ,c.`70-85`,c.   ,d.`60-70`,d.   ,e.`0-60`,e.    FROM score a
                LEFT JOIN (SELECT c_id,SUM(CASE WHEN s_score >85 AND s_score <=100 THEN 1 ELSE 0 END) AS `85-100`,
                                            ROUND(100*(SUM(CASE WHEN s_score >85 AND s_score <=100 THEN 1 ELSE 0 END)/COUNT(*)),2) AS    
                                FROM score GROUP BY c_id)b ON a.c_id=b.c_id
                LEFT JOIN (SELECT c_id,SUM(CASE WHEN s_score >70 AND s_score <=85 THEN 1 ELSE 0 END) AS `70-85`,
                                            ROUND(100*(SUM(CASE WHEN s_score >70 AND s_score <=85 THEN 1 ELSE 0 END)/COUNT(*)),2) AS    
                                FROM score GROUP BY c_id)c ON a.c_id=c.c_id
                LEFT JOIN (SELECT c_id,SUM(CASE WHEN s_score >60 AND s_score <=70 THEN 1 ELSE 0 END) AS `60-70`,
                                            ROUND(100*(SUM(CASE WHEN s_score >60 AND s_score <=70 THEN 1 ELSE 0 END)/COUNT(*)),2) AS    
                                FROM score GROUP BY c_id)d ON a.c_id=d.c_id
                LEFT JOIN (SELECT c_id,SUM(CASE WHEN s_score >=0 AND s_score <=60 THEN 1 ELSE 0 END) AS `0-60`,
                                            ROUND(100*(SUM(CASE WHEN s_score >=0 AND s_score <=60 THEN 1 ELSE 0 END)/COUNT(*)),2) AS    
                                FROM score GROUP BY c_id)e ON a.c_id=e.c_id
                LEFT JOIN course f ON a.c_id = f.c_id;

-- [24, 학생 평균 성적 및 순위 조회]
select a.s_id,
@i:=@i+1 as '       ',
@k:=(case when @avg_score=a.avg_s then @k else @i end) as '      ',
@avg_score:=avg_s as '   '
from (select s_id,ROUND(AVG(s_score),2) as avg_s from score GROUP BY s_id)a,(select @avg_score:=0,@i:=0,@k:=0)b;

-- [25, 과목별 성적 상위 3위 기록 조회] - 1.b표가 a표보다 성적이 큰 모든 조를 뽑아라--2.현재 id보다 성적이 큰 3개보다 작은
SELECT a.s_id,a.c_id,a.s_score FROM score a  
LEFT JOIN score b ON a.c_id = b.c_id AND a.s_score

-- [26, 과목당 선택과목 학생 수 조회]
SELECT c_id,COUNT(s_id) FROM score a GROUP BY c_id;

-- [27, 두 과목만 있는 전체 학생의 학번과 이름을 조회한다]
SELECT s_id,s_name FROM student WHERE s_id IN( 
SELECT s_id FROM score GROUP BY s_id HAVING COUNT(c_id)=2);

-- [28, 남학생, 여학생 수 조회]
SELECT s_sex,COUNT(s_sex) AS     FROM student GROUP BY s_sex;

-- [29. 이름에'바람'자가 포함된 학생 정보 조회]
SELECT * FROM student WHERE s_name LIKE '% %';

-- [30, 동명 동성 학생 명단 조회 및 동명 인원 집계]
SELECT a.s_name,a.s_sex,COUNT(*) FROM student a  JOIN 
student b ON a.s_id !=b.s_id AND a.s_name = b.s_name AND a.s_sex = b.s_sex
GROUP BY a.s_name,a.s_sex;

-- [31, 1990년생 학생 명단 조회]
SELECT s_name FROM student WHERE s_birth LIKE '1990%';

- [32. 각 과정의 평균 성적을 조회한 결과 평균 성적에 따라 순서대로 배열하고 평균 성적은 동시에 과정 번호에 따라 순서대로 배열한다]
SELECT c_id,ROUND(AVG(s_score),2) AS avg_score FROM score GROUP BY c_id 
ORDER BY avg_score DESC,c_id ASC;

-- [33, 조회 평균 성적이 85 이상인 모든 학생의 학번, 성명, 평균 성적]
SELECT a.s_id,b.s_name,ROUND(AVG(a.s_score),2) AS avg_score FROM score a
 LEFT JOIN student b ON a.s_id=b.s_id GROUP BY s_id HAVING avg_score>=85;

- [34. 조회 과정의 이름은'수학'이고 점수가 60보다 낮은 학생의 이름과 점수]
방법1:
SELECT student.`s_name`,score.`s_score` FROM student JOIN score ON student.`s_id`=score.`s_id`
JOIN course ON course.`c_id`=score.`c_id` AND course.`c_name`='  ' AND score.`s_score`<60;

방법2:
SELECT a.s_name,b.s_score FROM score b LEFT JOIN student a ON a.s_id=b.s_id 
WHERE b.c_id=(SELECT c_id FROM course WHERE c_name ='  ') AND b.s_score<60;

- [35. 모든 학생의 수업 및 점수 상황을 조회한다.]
select a.s_id,a.s_name,
SUM(case c.c_name when '  ' then b.s_score else 0 end) as '  ',
SUM(case c.c_name when '  ' then b.s_score else 0 end) as '  ',
SUM(case c.c_name when '  ' then b.s_score else 0 end) as '  ',
SUM(b.s_score) as '  'from student a left join score b on a.s_id = b.s_id 
left join course c on b.c_id = c.c_id  GROUP BY a.s_id,a.s_name;

-- [36. 어느 과목이든 성적이 70점 이상인 이름, 과목 명칭과 점수를 조회한다]
select a.s_name,b.c_name,c.s_score from course b left join score c 
on b.c_id = c.c_id left join student a on a.s_id=c.s_id where c.s_score>=70;

-- [37, 불합격한 수업 조회]
select a.s_id,a.c_id,b.c_name,a.s_score from score a 
left join course b on a.c_id = b.c_id where a.s_score<60;

- [38. 교과 과정 번호가 01이고 교과 과정 성적이 80점 이상인 학생의 학번과 이름을 조회한다.]
select a.s_id,b.s_name from score a LEFT JOIN student b on a.s_id = b.s_id
where a.c_id = '01' and a.s_score>80;

-- [39, 과목당 학생 수 구하기]
select count(*) from score GROUP BY c_id;

- [40.'장삼'선생님이 가르친 과정을 선택한 학생 중 성적이 가장 높은 학생 정보와 성적을 조회한다]
선생님
select c_id from course c,teacher d where c.t_id=d.t_id and d.t_name='  ';

조회 최고 점수, 동일 점수 가능
select MAX(s_score) from score where c_id='02';

정보 조회
select a.*,b.s_score,b.c_id,c.c_name from student a
LEFT JOIN score b on a.s_id = b.s_id LEFT JOIN course c on b.c_id=c.c_id
 where b.c_id =(select c_id from course c,teacher d 
 where c.t_id=d.t_id and d.t_name='  ')
 and b.s_score in (select MAX(s_score) from score where c_id='02');

- [41. 서로 다른 과정 성적이 같은 학생의 학생 번호, 과정 번호, 학생 성적 조회]
select DISTINCT b.s_id,b.c_id,b.s_score from score a,score b 
where a.c_id != b.c_id and a.s_score = b.s_score;

-- [42, 문공당 성적이 가장 좋은 1, 2위 조회]
select a.s_id,a.c_id,a.s_score from score a where (
select COUNT(1) from score b where b.c_id=a.c_id 
and b.s_score>=a.s_score)<=2 ORDER BY a.c_id

- [43. 각 과목의 학생 선택과목 수를 집계한다(5인 초과 과목은 집계한다). 과목 번호와 선택과목 수를 출력하고 조회 결과는 인원수에 따라 순서대로 배열한다. 인원수가 같으면 과목 번호에 따라 순서대로 배열한다.]
select c_id,count(*) as total from score GROUP BY c_id HAVING total>5 ORDER BY total,c_id ASC;

-- [44, 최소 두 과목을 이수한 학생 학번 검색]
select s_id,count(*) as sel from score GROUP BY s_id HAVING sel>=2;

-- [45, 전 과목을 선택과목으로 이수한 학생 정보 조회]
select * from student where s_id in(        
select s_id from score GROUP BY s_id HAVING count(*)=(select count(*) from course));

-- [46. 각 학생의 나이를 조회하고 생년월일에 따라 계산하면 현재 월일 <생년월일의 월일은 연령이 1로 감소한다]
select s_birth,(DATE_FORMAT(NOW(),'%Y')-DATE_FORMAT(s_birth,'%Y') - 

(case when DATE_FORMAT(NOW(),'%m%d')>DATE_FORMAT(s_birth,'%m%d') then 0 else 1 end)) as age

from student;

-- [47, 이번 주 생일인 학생 조회]
방법1:
 select * from student where WEEK(DATE_FORMAT(NOW(),'%Y%m%d'))=WEEK(s_birth); 

방법2:
 select * from student where YEARWEEK(s_birth)=YEARWEEK(DATE_FORMAT(NOW(),'%Y%m%d'));

-- [48, 다음 주 생일인 학생 조회]
select * from student where WEEK(DATE_FORMAT(NOW(),'%Y%m%d'))+1 =WEEK(s_birth);

-- [49, 이번 달 생일인 학생 조회]
select * from student where MONTH(DATE_FORMAT(NOW(),'%Y%m%d')) =MONTH(s_birth) ;

-- [50, 다음 달 생일인 학생 조회]
select * from student where MONTH(DATE_FORMAT(NOW(),'%Y%m%d'))+1 =MONTH(s_birth) ;

좋은 웹페이지 즐겨찾기