본문 바로가기
전산 관련 시험/DB(SQLP, SQLD) 문제풀이

전산 교육 테스트 대비_SQL

by 응_비 2023. 5. 14.

논리연산자

Customers 데이터에서 고객번호가 10보다 작으면서 이름이 “B”로 시작하는 것을 출력하세요.

더보기

SELECT * FROM Customers

WHERE CustomerID < 10 AND CustomerName LIKE "B%";

더보기

SELECT * FROM Customers

WHERE (CustomerID BETWEEN 1 AND 9) AND (CustomerName LIKE "B%");

 

LIKE 연산자

SELECT * FROM testTable WHERE name LIKE "김%";

 

IN 연산자

SELECT *

FROM customers

WHERE country IN ("Mexico", Germany", "USA")

 

 

INSERT

CREATE TABLE
testTable(
	id int,
    name text(20)
);

INSERT INTO testable VALUES
(1, "김덕수"),
(2, "김덕수"), 
(3, "박동수"),
(4, "김동");

INSERT INTO SELECT

INSERT INTO testTable SELECT * FROM testTable WHERE id <= 2;

 

 

DELETE

testTable에서 사람의 이름 끝이 "수" 자인 사람을 삭제하기

더보기

DELETE FROM testTable WHERE name like "%수";

 

 

UPDATE문 형식

testTable에서 id 가 4인 사람의 이름을 "스티브 정"으로 바꾸기

더보기

UPDATE testTable SET name = "스티브 정" WHERE id = 4;

 

< 정리 >

데이터 검색, 추가, 삭제, 변경 정리

SELECT 컬럼명 FROM 테이블명 [WHERE 조건] ;

INSERT INTO 테이블명 (컬럼....) VALUES (값....);

DELETE FROM 테이블명 [WHERE 조건] ;

UPDATE 테이블명 SET 컬럼1=값1, 컬럼2=값2.... [WHERE 조건 ];

 

구조 수정하기 -> FK, PK 조정 가능

CREATE TABLE 진학반명단 ( 
id int,
s_name char(20) );

insert into 진학반명단 values 
(1, '홍길동'),
(2, '강감찬'),
(3, '김유신'),
(4, '홍범도'), 
(5, '곽재우'), 
(6, '이순신'), 
(7, '이철수');

CREATE TABLE 입시생 ( 
id int,
university char(20) );

insert into 입시생 values 
(1, '서일대' ),
(2, '고려대'),
(5, '고려대'),
(7, '숭실대');

CREATE TABLE 자격증응시생 ( 
id int,
certificate char(20) );

insert into 자격증응시생 values
(2, '정보처리'),
(4, '전자기기'),
(6, '정보처리'), 
(7, '컴활용');
FK, PK 활용
create database order_manger;
use order_manger;


create table 영업사원(
영업사원번호 int,
영업사원명 char(10),
생년 char(8),
전화 char(15),
주소 char(100)
);


alter table 영업사원 add primary key pk_영업사원번호(영업사원번호);


-- SET SQL_SAFE_UPDATES = 0; UPDATE 옵션 설정

update 영업사원
set 주소 =  "서울 도봉동 455"
where 영업사원번호 = 1;

 INSERT  INTO 영업사원(영업사원번호,영업사원명, 생년, 전화, 주소) VALUES
  (1,"박수동", 1988, "010-325-1234", "서울 도봉동 455"),
  (2,"도인범", 1978, "010-222-5432", "서울 성북동 290"),
  (3, "천길호", 1984, "010-6767-8787", "서울 방배동 54"),
  (5, "김희철", 1990, "010-622-0001", "서울 홍제동 244");


create table 주문(
주문번호 int,
일시 datetime,
금액 char(20),
고객번호 int,
영업사원번호 int
);


alter table 주문 add primary key pk_주문번호(주문번호);
ALTER TABLE 주문 ADD FOREIGN KEY (영업사원번호) REFERENCES 영업사원(영업사원번호);
ALTER TABLE 주문 ADD FOREIGN KEY (고객번호) REFERENCES 고객(고객번호);


  INSERT  INTO  주문(주문번호, 일시, 금액, 고객번호, 영업사원번호) VALUES
  (1, "2021-03-02 10:11", 400000, 1, 1),
  (2, "2021-03-02 10:11", 1650000, 2, 2),
  (3, "2021-03-02 11:10", 1050000, 3, 3),
  (4, "2021-03-02 11:17", 1800000, 4, 4),
  (5, "2021-03-02 11:51", 2570000, 5, 2);


create table 고객(
고객번호 int primary key,
고객명 char(20),
전화 char(20),
주소 char(50)
);



INSERT  INTO  고객(고객번호,고객명, 전화, 주소) VALUES
 (1, "김원일", "02-335-2544", "서울 중곡동 311"),
 (2,"박동수", "02-277-7654", "서울 서초동 656"),
 (3, "최길원", "031-988-0987", "경기 안양 76"),
 (4, "박인수", "02-778-9888", "서울 은평동 87"),
 (5, "황철언", "02-490-9900", "서울 평창동 81");


create table 주문상품(
주문번호 int,
상품코드 int,
수량 char(20)
);

alter table 주문상품 add primary key pk_주문상품번호(주문번호,상품코드);

select * from 주문상품;

alter table 주문상품
add constraint idx1 foreign key(주문번호) References 주문(주문번호)
on delete cascade, 
add constraint idx2 foreign key(상품코드) References 상품(상품코드)
on delete cascade;


INSERT  INTO  주문상품(주문번호,상품코드,수량) VALUES
 (1, 1, 50),
 (2, 2, 10),
 (3, 3, 15),
 (4, 4, 20),
 (5, 5, 21);

create table 상품(
상품코드 int,
상품명 char(20),
단가 char(20)
);

alter table 상품 add primary key pk_상품코드(상품코드);

INSERT  INTO  상품(상품코드, 상품명, 단가) VALUES
  (1, "티엘론단열", 80000),
  (2, "경질우레탄", 55000),
  (3, "난연점착제", 70000),
  (4, "T동파이프", 90000),
  (5, "광폭점착제", 120000),
  (6, "열반사단열", 100000);

 

JOIN 예제 및 풀이

순서 : from -> on -> where

4) 주문의 상품별로 판매수량(Quantity)과 금액(Price)을 출력하세요. (제품 ID4보다 작은 경우만 선별)

더보기

SELECT orderdetailid, orderid, productid, productname, Price, Quantity, (Price * Quantity) as 금액

FROM orderdetails

    INNER JOIN products USING (productID)

WHERE productID < 4

ORDER BY orderdetailid;

 

5) 주문별 제품의 판매금액을 기준으로 20%의 영업 수당을 산출해 보세요. + 영업사원 이름도 같이 출력

(Orders, OrderDetails, Prodcuts)

더보기

SELECT orderdate, orderid, employeeid, concat(lastname, "-", firstname) as 이름,

(quantity * price) as 금액, Round(quantity * price *0.2, 2) as 수당

FROM orders

      INNER JOIN orderdetails USING(orderid)

      INNER JOIN products USING(productid)

      INNER JOIN employees USING(employeeid)

ORDER BY orderid;

 

7) 각 주문의 상품별 금액이 4000$이상인 제품을 출력해 보세요 (Orderdetails, Products)

더보기

SELECT OrderDetailID, OrderID, ProductID, ProductName, (Quantity * Price) AS 금액

FROM Orderdetails

    INNER JOIN Products USING (ProductID)

WHERE (Quantity * Price) >= 4000

ORDER BY OrderDetailID;

 

8) 각 주문의 상품별 금액이 4000$이상 제품들이 어떤 류인지 카테고리가 궁금합니다. (Orderdetails, Products, Categorys)

더보기
SELECT OrderDetailID, OrderID, ProductID, ProductName, CategoryID, CategoryName,
(Quantity * Price) AS 금액

FROM Orderdetails
    INNER JOIN Products USING (ProductID)
    INNER JOIN Categories USING (Categoryid)

WHERE (Quantity * Price) >= 4000
ORDER BY OrderDetailID;

 

UNION

- 아무런 시험도 보지 않은 사람을 출력해 보세요.

더보기

SELECT * FROM 진학반명단

   LEFT JOIN (SELECT * FROM 입시생

                        UNION

                        SELECT * FROM 자격증응시생) AS 응시

   USING (id)

WHERE 응시.id IS NULL;

 

Group By

2) 영업사원별로 주문 성사금액과 그에 따른 20%의 수당을 산출해 보세요

영업사원별로(Group by) 주문 성과금액과 그에 따른 20%의 수당을 산출

더보기
 

SELECT OrderDate, EmployeeID, OrderID,

               Sum(Quantity * Price) as 금액

               Sum(Quantity * Price * 0.2) as 수당

FROM Orders

              INNER JOIN OrderDetails Using (OrderID)

              INNER JOIN Products Using (ProductID)

Group BY EmployeeID; 

 

3) 영업사원별 주문 성사금액이 40,000$ 이상인 사람에 대해 25%의 특별수당을 산출해 보세요

영업사원(Group by) 주문 성사금액이 40,000$ 이상(Having)인 사람에 대해 25%의 특별수당 산출

더보기

SELECT EmployeeID,

               Round(Sum(quantity * Price), 2) AS 금액, 

               Round(Sum(quantity * Price * 0.25), 2) AS 특별수당

FROM Orders

            INNER JOIN Products Using (ProductID)

Group By EmployeeID 

Having Sum(quantity * Price) >= 40000;

 

4) 영업사원 1번에 대해 주문성사 총금액과 20%의 수당을 산출해 보세요

영업사원 1번(Where)에 대해 주문성사 총금액 20%의 수당을 산출해 보세요 (영업사원별)

더보기

SELECT EmployeeID,

               Round(Sum(quantity * price), 2) as 총금액,

               Round(Sum(quantity * price * 0.2), 2) as 수당

FROM Orders

            INNER JOIN OrderDetails Using (OrderID)

            INNER JOIN Products Using (ProductID)

WHERE EmployeeID = 1

GROUP BY EmployeeID;

 

8) 판매금액 기준으로 봤을 때 기여도가 높은 제품 10개만 출력해 보세요.

판매금액 기준, 기여도가 높은 제품 10개(Desc, 내림차순 / Limit)만 출력

더보기

SELECT O.productid, P.productname,

               Sum(O.quantity), (P.price * O.quantity) AS 판매금액

FROM orderdetails O            INNER JOIN products P Using (productid)Group by O.productidOrder by 판매금액 DescLimit 10;

 

1) 스칼라(Scalar) 서브쿼리

1) 주문별로 영업사원 이름 출력

더보기

SELECT *,
(select lastName from employees

where orders.employeeID= employees.employeeID) AS `Emp name` FROM orders ; 

 

SELECT *,

                 (SELECT LastName,

                  FROM Employees

                  WHERE Orders.EmployeeID = Employees.EmployeeID) AS 'EMP NAME'

FROM Orders;

 

2) 인라인 뷰(Inline view)

2) 모든 주문중에 판매개수 상위 10의 품명을 출력 (Products, Orderdetails)

모든 주문중에 판매개수 상위 10의 품명 출력

더보기

SELECT PD.ProductID, PD.ProductName, Top_TEN.*

FROM Products PD

            INNER JOIN (SELECT OrderdetailID, ProductID, Quantity

                                   FROM Orderdetails

                                   ORDER BY Quantity DESC

                                   Limit 10) AS Top_TEN

            Using (PD.ProductID);

 

3) 중첩(Nested) 서브쿼리

6) 멕시코에 거래이력(Customers)을 가지고 있는 영업사원 모두 출력 (Ordres, Employees, Customers)

더보기

SELECT *

FROM Orders O

            INNER JOIN Employees E 

            Using (EmployeeID)

WHERE O.CustomerID IN (SELECT CustomerID

                                            FROM Customers

                                            WHERE Country = "Mexico");

 

Case When 표현식

Products 테이블에서 상품리스트를 출력하되, 가격에 따라 아래와 같이 구분하세요.

- 20$ 이하 : 초저가류
- 21$ ~ 40$ 이하 : 저가류
- 40$ ~ 70$ 이하 : 중저가류

- 70$ ~ 100$ 이하 : 고가류

- 101$이상 : 초고가류

더보기
 

SELECT 가격분류, Count(Price)

FROM

         (SELECT Price, 

                         CASE WHEN Price <= 20  THEN "1.초저가류"

                                    WHEN Price > 20 and Price <= 40 THEN "2.저가류"

                                    WHEN Price > 40 and Price <= 70 THEN "3.중저가류"

                                    WHEN Price > 70 and Price <= 100 THEN "4.고가류"

                                    ELSE "5.초고가류"

                         END AS 가격분류

          FROM Products) AS P

GROUP BY 가격분류;

 

< 연산도우미 –함수(Function)사용 >

1) Insert("BEAUTIFUL", 2, 4, "KK") : BKKIFUL (문자열의 부분문자열 교체, 2번째부터 4개)

2) Instr("BEAUTIFUL", "AUT") : 3 (부분문자열 위치, 없으면 0)

3) dateDiff('2022-08-15', '2022-09-03') : -19 ( 날짜 차이를 반환)

Products 테이블에서 가격(Price)이 가장 큰 제품의 거래현황을 출력

 

< CREATE, FOREIGN KEY, REFERENCES >

CREATE TABLE 주문상품 (

주문번호 int ,

상품코드 int ,

수량 int not null,

PRIMARY KEY (주문번호, 상품코드) ,

FOREIGN KEY (주문번호) REFERENCES 주문 (주문번호) ,

FOREIGN KEY (상품코드) REFERENCES 상품 (상품코드)

);

 
CREATE TABLE 주문상품 (
주문번호 int ,
상품코드 int , 
수량 int not null,
PRIMARY KEY (주문번호, 상품코드) ,
FOREIGN KEY (주문번호) REFERENCES 주문 (주문번호) ,
FOREIGN KEY (상품코드) REFERENCES 상품 (상품코드)
);

 

 

ALTER TABLE 주문 ADD PRIMARY KEY PK_주문번호(주문번호);
ALTER TABLE 주문 ADD FOREIGN KEY (영업사원번호) REFERENCES 영업사원(영업사원번호);
ALTER TABLE 주문 ADD FOREIGN KEY (고객번호) REFERENCES 고객(고객번호);

alter table 주문상품
add constraint idx1 foreign key(주문번호) References 주문(주문번호)
on delete cascade, 
add constraint idx2 foreign key(상품코드) References 상품(상품코드)
on delete cascade;

 

FOREIGN KEY, REFERENCES, ON DELET CASCADE (예시)

더보기

ALTER TABLE 주문상품

ADD Constraint  Idx1 FOREIGN KEY(주문번호) REFERENCES 주문(주문번호)

ON DELETE CASCADE

 

ALTER TABLE 주문상품

ADD Constraint  Idx1 FOREIGN KEY(OrderID) REFERENCES Order(OrderID)

ON DELETE CASCADE

 

ALTER TABLE 주문

ADD PRIMARY KEY (영업사원번호) REFERENCES 영업사원(영업사원번호);

 

ALTER TABLE 주문

ADD PRIMARY KEY (EmployeeID) REFERENCES Employees(EmployeeID);

 

 

View(뷰)

-주문별로 어떤 제품인지와 단가, 수량, 금액, 어떤 고객의 주문인지 함께 보여주는 뷰를 order_status 라는 이름으로 작성해보기

CREATE VIEW order_status
AS
SELECT orderdetailid, orderid, productid, productname, 
	price, quantity, price*quantity as 금액, customerID, customerName
FROM orderdetails
	INNER JOIN products USING(productid)
    INNER JOIN orders USING(orderID)
    INNER JOIN customers USING(customerID)
ORDER BY orderdetailid;

 

Procedure VS. Function 비교

이슈 프로시저 함수
호출방법 Call로 호출,
결과값을 반환 X
SQL문에서 식으로 호출,
결과값을 반드시 반환
반환갯수 반환값(out, inout)이 있거나 없거나 반환값(return)이 반드시 하나
전달 입력(in)이 있거나 없거나 입력이 있거나 없거나
코드수용 안에 삽입, 삭제, 수정 등의 작업 가능
안에 동적쿼리, 트렌젝션 작업 가능
예외 처리 블록 가능
안에 선택질의만 가능
안에 동적, 트렌 불가
예외처리 코드 불가

'전산 관련 시험 > DB(SQLP, SQLD) 문제풀이' 카테고리의 다른 글

[DB] SQL 튜닝 힌트  (0) 2024.09.10
(DB, 데이터베이스) DBMS 구성  (0) 2024.03.03
전산 교육 정리_SQL(3)  (0) 2023.05.12
전산 교육 정리_SQL(2)  (0) 2023.05.11
전산 교육 정리_SQL(1)  (0) 2023.05.10

댓글