SELECT pid, pcity, quantity, price
FROM products
WHERE pcity != '서울'
ORDER BY 3 DESC, 4;
X
)SELECT *
FROM orders
WHERE MONTH%2=1
ORDER BY 6 DESC;
SELECT *
FROM orders
WHERE MOD(MONTH,2) = 1
ORDER BY qty DESC;
SELECT *
FROM orders
WHERE SUBSTRING_INDEX(MONTH,'월',1)%2 = 1
ORDER BY qty DESC;
SELECT *
FROM orders
WHERE REPLACE(MONTH,'월','')%2 = 1 -- month의 월 이라는 글자를 없애면 숫자만 남음-> 그 숫자를 2로 나눴을때 1이 남는 수 도출 --
ORDER BY qty DESC;
group by는
SELECT pcity, avg(price)
FROM products
GROUP BY pcity
ORDER BY 2 DESC;
SELECT pname, pcity, quantity
FROM products
WHERE price IN(SELECT price
FROM products
WHERE price >= 700);
SELECT pcity, SUM(quantity)
FROM products
WHERE price >= 700
GROUP BY pcity;
SELECT pcity, AVG(price) "평균가격"
FROM products
WHERE price <= 1000
GROUP BY pcity
HAVING AVG(price) >= 800;
PRIMARY KEY :
CREATE TABLE hobby(
hid INT AUTO_INCREMENT,
h_name CHAR(10),
h_cid CHAR(10),
PRIMARY KEY(hid),
FOREIGN KEY(h_cid) REFERENCES customers(cid)
);
-- 복합주키 --
CREATE TABLE test1(
a CHAR(20),
b CHAR(20),
c CHAR(20),
PRIMARY KEY(a, b)
)
INSERT test1 VALUES('aaa','bbb','ccc');
INSERT test1 VALUES('aaa','ccc','ddd');
SELECT * FROM test1;
-- 내 답 --
SELECT cname, h_name
FROM hobby INNER JOIN customers ON hobby.h_cid = customers.cid
WHERE cname = '김동길';
-- 선생님 답 --
SELECT c.cname, h.h_name
FROM customers c JOIN hobby h
ON c.cid = h.h_cid
WHERE c.cname = '김동길';
-- 내 답 --
SELECT c.cname '고객명', h.h_name '취미'
FROM hobby h JOIN customers c
ON h.h_cid = c.cid
WHERE c.cname = '김동길';
-- 선생님 답 --
SELECT c.cname, h.h_name
FROM customers c, hobby h
WHERE c.cid = h.h_cid AND
c.cname = '김동길'
SELECT h_name
FROM hobby
WHERE h_cid IN (SELECT cid
FROM customers
WHERE cname = '김동길');
-- 내 답 --
SELECT p.pname, p.pcity, o.qty
FROM products p JOIN orders o
ON p.pid = o.pid
WHERE p.pcity = '광주'
ORDER BY 3 DESC;
-- 선생님 답 --
SELECT qty, pname
FROM products p JOIN orders o
ON p.pid = o.pid
WHERE p.pcity = '광주'
ORDER BY qty DESC;
-- 내 답 : desc가 빠짐 --
SELECT qty
FROM orders
WHERE pid IN (SELECT pid
FROM products
WHERE pcity = '광주');
-- 선생님 답 --
SELECT qty
FROM orders
WHERE pid IN (SELECT pid
FROM products
WHERE pcity = '광주')
ORDER BY 1 DESC;
교재 196p
중요도:하
-- 삭제 --
DROP PROCEDURE if EXISTS ifProc1;
-- 생성 --
delimiter $$
CREATE PROCEDURE ifProc1()
BEGIN
if 100 = 100 then
SELECT '100은 100과 같습니다.';
END if;
END $$
delimiter ; -- 끝에 공백 1칸 줘야함 --
-- sp 호출 --
CALL ifProc1();
delimiter $$ -- 프로시저 영역이라고 선언해주는 것 --
CREATE PROCEDURE 프로시저명()
BEGIN
END $$
delimiter ;
예제 1
delimiter $$ -- 프로시저 영역이라고 선언해주는 것 --
CREATE PROCEDURE ifProc2()
BEGIN
DECLARE myNum INT; -- 정수형 변수 선언 --
SET myNum = 200;
if myNum = 100 then
SELECT '100입니다.';
ELSE
SELECT '100이 아닙니다.';
END if;
END $$
delimiter ;
예제2
delimiter $$
CREATE PROCEDURE ifProc3() -- 매개변수 없음 --
BEGIN
DECLARE debutDate DATE; -- APN 데뷔날짜 --
DECLARE cDate DATE; -- 오늘 날짜 --
DECLARE days INT;
-- 에이핑크의 데뷔날짜값을 debutDate에 삽입 --
SELECT debut_date INTO debutDate
FROM member
WHERE mem_id = 'APN';
SET cDate = CURRENT_DATE(); -- 오늘 날짜 리턴 --
SET days = DATEDIFF(cDate,debutDate); -- 일단위로 계산 --
if(days/365) >= 5 then
SELECT CONCAT('데뷔한지',days,'일이나 지났습니다.'); -- concat : 하나로 합쳐줌 --
ELSE
SELECT '데뷔한지',days,'일밖에 안되었네요.';
END if;
END $$
delimiter ;
예제 3
delimiter $$
CREATE PROCEDURE caseProc()
BEGIN
DECLARE pos INT;
DECLARE credit CHAR(1);
SET pos = 88;
case -- 여러가지 조건이 있을때 사용하는 제어문(자바:switch) --
when pos >= 90 then
SET credit = 'A';
when pos >= 80 then
SET credit = 'B';
when pos >= 70 then
SET credit = 'C';
ELSE
SET credit = 'F';
END case;
SELECT CONCAT('취득점수 ==> ', pos),
CONCAT('학점 ==> ', credit);
END $$
delimiter $$
일반적인 함수 : 인수의 개수가 정해져있음. a(ex1, ex2) 같은 경우에는 인수 2개만 넣어야함.
가변인수 : 인수의 개수가 정해져있지 않음. concat(ex1, ex2, ...)같이 인수에 ...이 있는 경우에는 ex5까지 넣어도 됨.
동일한 값이 없어도 리턴
-- 일반 join --
SELECT m.mem_id, mem_name, SUM(price * amount) '총구매액'
FROM buy b JOIN member m
ON b.mem_id = m.mem_id
GROUP BY mem_id
ORDER BY 3 DESC;
-- outer join : 값이 null 인것도 나옴 --
SELECT m.mem_id, mem_name, SUM(price * amount) '총구매액'
FROM buy b RIGHT OUTER JOIN member m
ON b.mem_id = m.mem_id
GROUP BY mem_id
ORDER BY 3 DESC;