Today
USE employees;
SELECT emp_no, AVG(salary)
FROM salaries
WHERE from_date BETWEEN '2002-01-01' AND '2002-08-31'
WHERE AVG(salary) > 80000
GROUP BY emp_no
;
SELECT emp_no, AVG(salary)
FROM salaries
WHERE from_date BETWEEN '2002-01-01' AND '2002-08-31'
GROUP BY emp_no
HAVING AVG(salary) > 80000
;
SELECT * FROM salaries LIMIT 100;
SELECT * FROM dept_emp LIMIT 100;
SELECT * FROM departments LIMIT 100;
SELECT
A.dept_no, A.dept_name, AVG(A.AVG_SAL)
FROM salaries = SA
INNER JOIN (
SELECT
SA.emp_no, DP.dept_no, DP.dept_name, AVG(SA.salary) AS AVG_SAL
FROM salaries AS SA
INNER JOIN dept_emp AS DE ON DE.emp_no = SA.emp_no
INNER JOIN departments AS DP ON DP.dept_no = DE.dept_no
GROUP BY SA.emp_no
HAVING AVG_SAL > 100000
) AS A
ON A.emp_no = SA.emp_no
GROUP BY dept_no
;
SELECT * FROM salaries LIMIT 100;
SELECT
to_char(from_date, 'YYYY-MM'), AVG(salary)
FROM salaries
WHERE from_date BETWEEN '2002-01-01' AND '2002-12-31'
GROUP BY to_char(from_date, 'YYYY-MM') WITH ROLLUP
;
SELECT
CONCAT(MONTH(from_date),'월') AS mon,
emp_no, salary,
ROW_NUMBER() OVER(PARTITION BY MONTH(from_date) ORDER BY salary desc) AS rank
FROM salaries
WHERE from_date >= '2002-01-01'
ORDER BY MONTH(from_date), rank
;
SELECT * FROM salaries LIMIT 100;
SELECT * FROM dept_emp LIMIT 100;
SELECT * FROM departments LIMIT 100;
SELECT
CONCAT(MONTH(SA.from_date),'월') AS MON
, ROW_NUMBER()
OVER(PARTITION BY MONTH(SA.from_date) ORDER BY SUM(SA.salary) DESC) AS rank
, DP.dept_no, DP.dept_name
, SUM(SA.salary) AS total
FROM salaries AS SA
INNER JOIN dept_emp AS DE ON SA.emp_no = DE.emp_no
INNER JOIN departments AS DP ON DP.dept_no = DE.dept_no
WHERE SA.from_date BETWEEN '2002-01-01' AND '2002-12-31'
GROUP BY DP.dept_no, MONTH(SA.from_date)
ORDER BY MON, rank
;
SELECT DP.dept_no, MONTH(SA.from_date), SUM(SA.salary)
FROM salaries AS SA
INNER JOIN dept_emp AS DE ON SA.emp_no = DE.emp_no
INNER JOIN departments AS DP ON DP.dept_no = DE.dept_no
WHERE (SA.from_date BETWEEN '2002-01-01' AND '2002-12-31') && (DP.dept_no = 'd005')
GROUP BY DP.dept_no, MONTH(SA.from_date)
;
SELECT
emp_no
, CONCAT(MONTH(from_date), '월') AS mon
, AVG(salary) AS avg_sal
, ROW_NUMBER()
OVER(PARTITION BY MONTH(from_date) ORDER BY AVG(salary) DESC) AS rnk
FROM salaries
WHERE from_date BETWEEN '2002-01-01' AND '2002-12-31'
GROUP BY MONTH(from_date), emp_no
ORDER BY MONTH(from_date), rnk asc
;
SELECT
emp_no
, CONCAT(MONTH(from_date), '월') AS mon
, AVG(salary) AS avg_sal
, RANK()
OVER(PARTITION BY MONTH(from_date) ORDER BY AVG(salary) DESC) AS rnk
FROM salaries
WHERE from_date BETWEEN '2002-01-01' AND '2002-12-31'
GROUP BY MONTH(from_date), emp_no
ORDER BY MONTH(from_date), rnk asc
;
SELECT
emp_no
, CONCAT(MONTH(from_date), '월') AS mon
, AVG(salary) AS avg_sal
, DENSE_RANK()
OVER(PARTITION BY MONTH(from_date) ORDER BY AVG(salary) DESC) AS rnk
FROM salaries
WHERE from_date BETWEEN '2002-01-01' AND '2002-12-31'
GROUP BY MONTH(from_date), emp_no
ORDER BY MONTH(from_date), rnk asc
;
SELECT
emp_no
, CONCAT(MONTH(from_date), '월') AS mon
, AVG(salary) AS avg_sal
, NTILE(10)
OVER(PARTITION BY MONTH(from_date) ORDER BY AVG(salary) DESC) AS rnk
FROM salaries
WHERE from_date BETWEEN '2002-01-01' AND '2002-12-31'
GROUP BY MONTH(from_date), emp_no
ORDER BY MONTH(from_date), rnk asc
;
SELECT
emp_no
, CONCAT(MONTH(from_date), '월') AS mon
, AVG(salary) AS avg_sal
, PERCENT_RANK()
OVER(PARTITION BY MONTH(from_date) ORDER BY AVG(salary) DESC) AS rnk
FROM salaries
WHERE from_date BETWEEN '2002-01-01' AND '2002-12-31'
GROUP BY MONTH(from_date), emp_no
ORDER BY MONTH(from_date), rnk asc
;
SELECT
emp_no
, CONCAT(MONTH(from_date), '월') AS mon
, AVG(salary) AS avg_sal
, CUME_DIST()
OVER(PARTITION BY MONTH(from_date) ORDER BY AVG(salary) DESC) AS rnk
FROM salaries
WHERE from_date BETWEEN '2002-01-01' AND '2002-12-31'
GROUP BY MONTH(from_date), emp_no
ORDER BY MONTH(from_date), rnk asc
;
USE maria;
SELECT * FROM tbl_orderinfo;
SELECT * FROM tbl_orderdetail;
CREATE VIEW VW_ORDER_INFO_SELECT
AS
SELECT
MB.memberId, MB.name
, OI.orderNo, OI.orderDate
, OD.orderedCnt, OD.amount
, GI.goodsCode, GI.goodsName, GI.state
FROM tbl_orderinfo AS OI
INNER JOIN tbl_orderdetail AS OD ON OD.orderNo = OI.orderNo
INNER JOIN tbl_goodsinfo AS GI ON GI.goodsCode = OD.goodsCode
INNER JOIN tbl_member AS MB ON MB.memberId = OI.memberId
;
SELECT * FROM vw_order_info_select;
SELECT * FROM tbl_member;
CREATE OR REPLACE VIEW VW_MEMBER
AS
SELECT
memberId AS ID
, NAME AS NM
, pwd AS PW
, jumin AS JM
, CONCAT(addr1, ' ',addr2) AS ADDR
, birthday AS BD
, jobCode AS JC
, mileage AS ML
, memberState AS MS
, regDate AS RD
, leaveDate AS LD
FROM tbl_member;
SELECT * FROM VW_MEMBER;
CREATE VIEW VW_tbl_member
AS
SELECT memberId, NAME, pwd, jumin, addr1, addr2, birthday
, jobCode, mileage, memberState, regDate, leaveDate
FROM tbl_member
;
SELECT * FROM VW_tbl_member;
INSERT INTO VW_tbl_member(memberId, NAME, pwd, regDate)
VALUES('test2', '테스트회원2', '1234', NOW());
UPDATE VW_tbl_member
SET jumin = '345678-1234567', addr1 = '서울 금천구 독산1동'
, birthday = '2000-12-25', jobCode = '06', mileage = 3000
, memberState = 'Y', regDate = NOW()
WHERE memberId = 'memberId';
SET AUTOCOMMIT = 0;
START TRANSACTION;
SELECT * FROM VW_tbl_member;
DELETE FROM VW_tbl_member
WHERE memberId = 'test2';
COMMIT;
ROLLBACK;
DESC vw_order_info_select;
SET AUTOCOMMIT = 0;
START TRANSACTION;
INSERT INTO vw_order_info_select(memberId, NAME, orderNo, orderDate, orderedCnt, amount, goodsCode, goodsName, state)
VALUES ('test3', '테스트회원3','202402001', NOW(), 5, 5000, 'DGS001', '노트', 'Y');
COMMIT;
ROLLBACK;
SELECT TABLE_NAME, IS_UPDATABLE
FROM information_schema.VIEWS
WHERE TABLE_SCHEMA = 'maria'
;
CREATE TABLE if NOT EXISTS `tbl_member2`
LIKE `tbl_member`;
DESC tbl_member_test;
ALTER TABLE tbl_member2 RENAME tbl_member_test;
ALTER TABLE tbl_member_test
CHANGE COLUMN jumin jumin_no VARCHAR(200)
;
ALTER TABLE tbl_member_test
MODIFY COLUMN jumin_no VARCHAR(300) DEFAULT NULL COMMENT '주민등록번호';
INSERT INTO tbl_member_test
SELECT * FROM tbl_member;
SELECT * FROM tbl_member_test;
ALTER TABLE tbl_member_test
ADD COLUMN if NOT EXISTS ssn1
CHAR(6) NULL COMMENT '주민번호 앞 6자리'
first;
DESC tbl_member_test;
ALTER TABLE tbl_member_test
DROP COLUMN if EXISTS ssn1;
ALTER TABLE tbl_member_test
DROP PRIMARY KEY;
ALTER TABLE tbl_member_test
ADD COLUMN idx INT COMMENT '인덱스'
FIRST;
BEGIN
DECLARE i INT DEFAULT 1;
while (i<8) DO
UPDATE tbl_member_test SET idx = i
WHERE rownum() = i;
SET i = i + 1;
END while;
END
SELECT * FROM tbl_member_test;
UPDATE tbl_member_test SET idx = 1 WHERE memberId = 'gee1';
UPDATE tbl_member_test SET idx = 2 WHERE memberId = 'member1';
UPDATE tbl_member_test SET idx = 3 WHERE memberId = 'member2';
UPDATE tbl_member_test SET idx = 4 WHERE memberId = 'member3';
UPDATE tbl_member_test SET idx = 5 WHERE memberId = 'member4';
UPDATE tbl_member_test SET idx = 6 WHERE memberId = 'memberId';
UPDATE tbl_member_test SET idx = 7 WHERE memberId = 'test';
ALTER TABLE tbl_member_test
ADD PRIMARY KEY (`idx`);
ALTER TABLE tbl_member_test
ADD CONSTRAINT PK_tbl_member_test_idx PRIMARY KEY (`idx`);
ALTER TABLE tbl_member_test
MODIFY COLUMN idx
int NOT NULL AUTO_INCREMENT COMMENT '인덱스';
ALTER TABLE tbl_member_test
ADD CONSTRAINT ck_jumin CHECK(CHAR_LENGTH(jumin_no) >= 13);
ALTER TABLE tbl_member_test
ADD CONSTRAINT ck_pwd CHECK(CHAR_LENGTH(pwd) >= 4);
INSERT INTO tbl_member_test (memberId, NAME, pwd)
VALUES ('test3', '테스트3', '123');
ALTER TABLE tbl_member_test
DROP CONSTRAINT ck_pwd;
ALTER TABLE tbl_member_test
DROP CONSTRAINT ck_jumin;
ALTER TABLE tbl_member_test
ADD COLUMN If NOT EXISTS `ssn1`
CHAR(6) COMMENT '주민번호 앞 6자리'
FIRST;
ALTER TABLE tbl_member_test
ADD COLUMN If NOT EXISTS `ssn2`
CHAR(7) COMMENT '주민번호 뒤 7자리'
FIRST;
ALTER TABLE tbl_member_test
ADD CONSTRAINT ck_ssn1 CHECK(CHAR_LENGTH(ssn1) = 6);
ALTER TABLE tbl_member_test
ADD CONSTRAINT ck_ssn2 CHECK(CHAR_LENGTH(ssn2) = 7);
SELECT * FROM tbl_member_test;
INSERT INTO tbl_member_test (memberId, NAME, pwd, ssn1, ssn2)
VALUES ('test1', '테스트1', '1234', '222222','3333333');
INSERT INTO tbl_member_test (memberId, NAME, pwd, ssn1, ssn2)
VALUES ('test2', '테스트2', '1234', '555555','6666666');
SET AUTOCOMMIT = 0;
START TRANSACTION;
UPDATE tbl_member_test AS A INNER JOIN tbl_member_test AS B ON A.memberId = B.memberId
SET A.jumin_no = CONCAT(B.ssn1, '-', B.ssn2)
WHERE A.jumin_no IS NULL;
UPDATE tbl_member_test AS A INNER JOIN tbl_member_test AS B ON A.memberId = B.memberId
SET A.ssn1 = LEFT(B.jumin_no,6), A.ssn2 = RIGHT(B.jumin_no,7)
WHERE A.ssn1 IS NULL && A.ssn2 IS NULL;
ROLLBACK;
COMMIT;
ALTER TABLE tbl_orderdetail
ADD CONSTRAINT FK_tbl_orderDetail_goodsCode
FOREIGN KEY (goodsCode) REFERENCES tbl_goodsinfo(goodsCode)
ON UPDATE CASCADE ON DELETE CASCADE;
ALTER TABLE tbl_orderdetail
DROP CONSTRAINT FK_tbl_orderDetail_goodsCode;
ALTER TABLE tbl_orderdetail
DROP INDEX FK_tbl_orderDetail_goodsCode;
ALTER TABLE tbl_orderdetail
ADD CONSTRAINT FK_tbl_orderDetail_goodsCode
FOREIGN KEY (goodsCode) REFERENCES tbl_goodsinfo(goodsCode)
ON UPDATE SET NULL ON DELETE SET NULL;
Review
- SQL...배우면 배울수록 응용하는게 어렵다...
TO DO
- Java 최종 정리(~2/25)
- Maria DB 정리 수업진도 따라잡기