데이터베이스/mysql

MySql) 쿼리 활용

HSH12345 2023. 5. 31. 10:30

1. 스키마 생성

 

2. 테이블 생성

 

3. db, 테이블 조회

USE exam11_db;
SHOW TABLES;
DESC user;
DESC score;

 

4. 기본 CRUD 작성

# User
# Create
INSERT INTO user(id, nickname) VALUES ('hsh', 'HSH');
INSERT INTO user(id, nickname) VALUES ('lkj', '임꺽정');
INSERT INTO user(id, nickname) VALUES ('hkd', '홍길동');

# Read
SELECT * FROM user;

# Update
UPDATE user SET nickname = '임꺽정' WHERE id = 'hsh';

# Delete
DELETE FROM user WHERE id = 'hsh';

# Score
DESC score;

# Create
INSERT INTO score(user_id, score) VALUES ('hkd', 5000);

# Read
SELECT * FROM score;

# Update
UPDATE score SET score = 1400, date = CURRENT_TIMESTAMP() WHERE user_id = 'hsh' LIMIT 1;

# Delete
DELETE FROM score WHERE user_id = 'hsh' LIMIT 1;

 

5. inner join으로 두 테이블에서 일치하는 값 조회

SELECT * FROM user INNER JOIN score ON user.id = score.user_id;

 

6. 가상 테이블 생성, 조회

DROP VIEW IF EXISTS viewScore;

CREATE VIEW viewScore AS
SELECT user.id, user.nickname, score.score, score.date
FROM user
INNER JOIN score ON user.id = score.user_id;

SELECT * FROM viewScore
ORDER BY score DESC;

SELECT * FROM viewScore;

 

7. 프로시져 생성, 호출

DROP PROCEDURE IF EXISTS rankUserProc;

DELIMITER //
CREATE PROCEDURE rankUserProc(count INT)
BEGIN 
	DECLARE cnt INT;
    SET cnt = count;
	SELECT * FROM viewScore
ORDER BY score DESC LIMIT cnt;
END //
DELIMITER ;

CALL rankUserProc(3);

 

 

8. 함수 생성, 호출

DROP FUNCTION IF EXISTS getRankById;

DELIMITER //
CREATE FUNCTION getRankById(userId VARCHAR(45)) RETURNS INT
DETERMINISTIC
READS SQL DATA
BEGIN
    DECLARE rank_no INT;
    
    SET rank_no = (
        SELECT COUNT(*) + 1
        FROM (
            SELECT id, score
            FROM viewScore
            ORDER BY score DESC
        ) AS sorted
        WHERE sorted.score > (SELECT score FROM viewScore WHERE id = userId ORDER BY score DESC LIMIT 1)
            AND sorted.id <> userId
    );
    
    RETURN rank_no;
END //
DELIMITER ;

SELECT getRankById('hsh');

SELECT
    getRankById(id) AS rank_no,
    id,
    nickname,
    score
FROM
    viewScore
ORDER BY
    score DESC;

 

 

9. 트리거, 트리거 사용 백업 테이블 생성, 적용

# 테이블 만들기
CREATE TABLE backup_user LIKE user;
DESC backup_user;
SELECT * FROM backup_user;

# 트리거 만들기
DROP TRIGGER IF EXISTS triggerDeleteAfterUser;

DELIMITER //
CREATE TRIGGER triggerDeleteAfterUser
AFTER DELETE ON user
FOR EACH ROW
BEGIN
	INSERT backup_user VALUES(OLD.id, OLD.nickname, CURRENT_TIMESTAMP());
END //
DELIMITER ;

SELECT * FROM user;
SELECT * FROM backup_user;
DELETE FROM user WHERE id = 'hsh';

DROP PROCEDURE IF EXISTS restoreUserFromBackupProc;

DROP PROCEDURE IF EXISTS restoreUserFromBackupProc;
DELIMITER //
CREATE PROCEDURE restoreUserFromBackupProc(IN userId VARCHAR(45))
BEGIN
    INSERT INTO user (id, nickname)
    SELECT id, nickname
    FROM backup_user
    WHERE id = userId;
    
    DELETE FROM backup_user
    WHERE id = userId;
END //
DELIMITER ;

CALL restoreUserFromBackupProc('hsh');