[MySQL] 기본 개념과 함수 정리 및 연습문제

Jihoon·2023년 6월 11일
1

DB & SQL Study

목록 보기
4/8
  • 간단한 근황

자소서를 새로 쓰기로 시작한 후, 첫 번째 시도 !! 기업인 KB증권 디지털 직무에 합격했습니다 ~!
(도와준 여자친구에게 감사 인사 전합니다 :) )
인적성 + 코테(SQL 4문제)로 구성되어있어서,, SQL 12000짜리 강의랑 자료를 사서 공부를 해보려합니다..
저번에 다 풀었던 프로그래머스 다시 아이디새로파서 풀고, 함수들 정리하고,, 정규표현식 공부하고,, 1주일간 화이팅 해보겠습니다
FIGHTING!

🎈기본 문법 및 개념

1.SELECT

SELECT CUSTOMERNAME, CITY FROM CUSTOMERS;
SELECT * FROM CUSTOMERS;

2.DISTINCT

  • 중복을 배제하고 고유값만을 출력하고자 할 때
SELECT DISTINCT Country FROM Customers;

3.WHERE

  • 조건을 걸어 검색하고자 할 때 사용
SELECT * FROM Customers
WHERE CustomerName = 'Ana';

SELECT * FROM Customers
WHERE CustomerID = 2;

4.비교 연산자

같을 때 "=" , 같지 않을 때 "!=", 클 때 "<", 크거나 같을 때 "<="

5.ORDER BY

  • 결과를 오름차순이나 내림차순으로 정렬
SELECT * FROM Customers
ORDER BY Country ASC/DESC;

6.ORDER BY FIELD

  • 결과를 내가 지정한 우선 순위로 정렬
SELECT * FROM Customers
ORDER BY FIELD (Country, UK, Sweden)

7.검색 결과 중 지정한 숫자 개수만 리턴

SELECT * FROM Customers LIMIT 3;
SELECT * FROM Customers LIMIT 2, 3; -> INDEX 2부터 3개 리턴 (2,3,4 번째 INDEX 로우)
SELECT * FROM Customers LIMIT 0, 3;

8.ORDER BY와 함께 사용할 때의 주의점

  • ORDER BY 후 LIMIT 할 때
SELECT * FROM Customers
ORDER BY Country ASC LIMIT 3 ;
  • LIMIT 후 ORDER BY 할 때
SELECT * FROM (SELECT * FROM Customers LIMIT 3)
ORDER BY Country ASC;

9.NULL VALUE

  • NULL 값은 IS NULL, IS NOT NULL 연산자로 검색
  • =, <, >, <>(!=) 로는 검색되지 않음
  • COUNT 함수에도 포함되지 않음
SELECT City FROM Customers
WHERE Country IS NOT NULL;

10.LIKE

  • 🌟WHERE 절과 함께 특정 패턴을 검색할 때 사용
SELECT * FROM Customers
WHERE CustomerName NOT LIKE 'A%';

11.LIKE의 %, _ 사용법

  • % : 0개 문자 혹은 여러 개의 문자를 의미
  • _ : 하나의 문자를 의미
  • LIKE 'a%' : a로 시작되는 모든 것
  • LIKE 'a__%' : a로 시작되고 최소 3 이상의 길이를 가진 것
  • LIKE '_r%' : 두번째 자리에 r이 들어가는 모든 것

12.IN()

  • WHERE 절 내 여러 값을 설정하고자 할 때 사용
SELECT * FROM Customers
WHERE Country = 'Germany' OR Country = 'UK';

SELECT * FROM Customers
WHERE Country IN ('Germany', 'UK');

13.BETWEEN

  • WHERE 절 내 검색 조건으로 범위를 지정하고자 할 때 사용
SELECT * FROM Products
WHERE Price BETWEEN 10 AND 20;

SELECT * FROM Products
WHERE Price NOT BETWEEN 10 AND 20;

SELECT * FROM Products
WHERE (Price NOT BETWEEN 10 AND 20) AND NOT CategoryID IN (2,3);
  • AND 연산자가 우선순위가 높아서 위와 같이 괄호 처리 해줘야 됌

14.JOIN

14-1.INNER JOIN

  • 두 테이블에 동시에 존재하는 값을 반환하고 싶을 때
SELECT Orders.OrderID, Customers.CustomerName (두 개 테이블의 컬럼들)
FROM Orders INNER JOIN Customers
ON Orders.CustomerID = Customers.CustomerID;

14-2.LEFT JOIN

  • 테이블1의 모든 레코드를 반환하고 그 중 테이블2 에 해당하는 레코드들도 함께 반화하고 싶을 때
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers LEFT JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;

14-3.RIGHT JOIN

  • LEFT JOIN 반대
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers RIGHT JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;

❌14-4.FULL OUTER JOIN [MYSQL 지원 X]

  • 전체의 합집합을 표현하고 싶을 때
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers FULL OUTER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID

15.UNION

  • SELECT의 칼럼 리스트를 기준으로 두 개 이상의 질의 결과를 하나의 테이블로 합치고자 할 때
SELECT City FROM Customers UNION SELECT City FROM Orders
ORDER BY City;
  • 주의 사항

UNION은 기본적으로 중복값을 제거함
중복값을 포함하고 싶을 경우 UNION ALL 사용

16.MIN, MAX, ABS

SELECT MIN(Price) FROM Products;
SELECT MAX(Price) FROM Products;
SELECT ABS(Price) FROM Products;

17.COUNT, AVG, SUM

SELECT COUNT(CategoryID) FROM Products;
SELECT AVG(Price) FROM Products
SELECT SUM(Price) FROM Products WHERE SupplierID > 2;

18. GROUP BY

  • 집계함수와 함께 사용되어, 결과를 지정한 칼럼에 따라 그룹으로 묶고자 할 때
SELECT COUNT(CustomerID), Country
FROM Customers
WHERE ~
GROUP BY Country;

18-1. HAVING

  • WHERE 조건을 걸 수 없는 집계함수에 조건을 걸고자 할 때 사용
SELECT COUNT(CustomerID), Country
FROM Customers
WHERE ~
GROUP BY Country
HAVING COUNT (CustomerID) > 2

19.CONCAT

  • 여러 문자열을 하나로 합치고자 할 때 사용
SELECT CONCAT(string1, string2, ...., string n);
SELECT CONCAT('HELLO', ',', 'SQL!!')
SELECT CONCAT(region_name, ' ', store_name)
FROM Geography WHERE store_name = 'Boston';

20. ROUND(), TRUNC()

  • 특정 소수점을 기준으로 자릿수를 맞출 때 사용
  • ROUND의 경우 특정 소수점을 반올림하고 나머지를 버리고, TRUNC의 경우 반올림 없이 버림
  • 날짜에도 적용 가능
>SELECT ROUND(Price, 1) FROM People;
SELECT TRUNC(Price, -1) FROM People;
SELECT ROUND(to_date(Contact date, 'yyyy-mm-ddhh24:mi'));

21. DATEDIFF - 🔥암기

  • 두 개의 날짜값의 차이를 Int형으로 반환하고자 할 때 사용

  • Int 형으로 반환하기에 Int 범위를 넘어서는 차이는 확인 불가능

  • 두 날짜값의 년도 차이나 시간 차이, 개월 수 차이도 확인 가능

  • 문법 : SELECT DATEDIFF(interval, Start_Date, End_Date);

>SELECT DATEDIFF(dd, '2018-01-01', '2018-12-31') + 1;
-> 365

22. DATE_FORMAT - 🔥암기

  • 시간을 원하는 형태로 반환하고자 할 때 사용

  • 문법 : DATE_FORMAT(DATETIME date, FORMAT);

SELECT DATE_FORMAT(NOW(), "%Y%c/%e %r");

23. UPDATE - CRUD의 U !!

  • 변경할 테이블 명을 UPDATE 문에 적고

  • 변경할 값을 SET 문 뒤에 나열

  • 조건이 있다면 WHERE 절에 작성, 없으면 열 전체가 변경

  • COMMIT 명령어 입력해야 반영이 됩니다!

  • 변경된 걸 원상복구하고 싶으면 ROLLBACK!! (BUT, COMMIT 입력했으면 ROLLBACK 안되요 조심!)

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

24. INSERT INTO 문

  • 테이블에 데이터 추가하기!
INSERT INTO 테이블 이름 (1,2, ...)
	VALUE (1,2, ...)
INSERT INTO 테이블 이름 (1,2, ...)
	SELECT 테이블에 들어갈 값
    FROM select값을 구하기 위한 테이블
    WHERE 조건

🚩연습문제

1번 - 기본

SELECT LOAN_NUMBER 
FROM LOAN 
WHERE BRANCH_NAME = 'Perryridge' AND AMOUNT >= 1400;

2번 - 기본

SELECT B.CUSTOMER_NAME, B.LOAN_NUMBER, L.AMOUNT
FROM LOAN AS L, BORROWER AS B
WHERE (L.BRANCH_NAME = 'Perryridge') AND (L.LOAN_NUMBER = B.LOAN_NUMBER);

3번 - LIKE

SELECT CUSTOMER_NAME
FROM CUSTOMER
WHERE CUSTOMER_STREET LIKE '%Main%' ;
  • LIKE : WHERE 절에 사용 !

4번 - INNER JOIN, DISTINCT, ORDER BY

  • 내 풀이
SELECT B.CUSTOMER_NAME
FROM LOAN AS L, BORROWER AS B
WHERE (L.BRANCH_NAME = 'Perryridge') AND (L.LOAN_NUMBER = B.LOAN_NUMBER)
ORDER BY B.CUSTOMER_NAME ASC;
  • INNER JOIN
SELECT DISTINCT CUSTOMER_NAME 
FROM BORROWER INNER JOIN LOAN
WHERE BORROWER.LOAN_NUMBER = LOAN.LOAN_NUMBER
AND BRANCH_NAME = 'Perryridge' ORDER BY CUSTOMER_NAME;
  • DISTINCT를 사용안해서 중복 값이 나올 수 있겠군 -> 문제 표시 없어도 알아서 사용해주는 센스 필요

5번 - AVG

SELECT AVG(BALANCE)
FROM ACCOUNT
WHERE BRANCH_NAME = 'Perryridge';
  • AVG -> 컬럼에 붙여주기 !

6번 - GROUP BY, HAVING

SELECT BRANCH_NAME, BALANCE
FROM ACCOUNT
GROUP BY BRANCH_NAME
HAVING AVG(BALANCE) >= 700;

7번 - IN

SELECT ID
FROM Products
WHERE ID IN (SELECT ID FROM PRODUCTS WHERE NAME = 'Milk') AND NAME = 'Yogurt'
ORDER BY ID;
  • WHERE 절 : 우유와 요거트 동시에 산 ID 조건

8번 - ASC, DESC

SELECT I.ANIMAL_ID, I.NAME, I.DATETIME
FROM ANIMAL_INS AS I
ORDER BY I.NAME ASC, DATETIME DESC;

9번 - IFNULL(컬럼, 변경할 형식)

SELECT ANIMAL_TYPE, IFNULL(NAME, 'No name'), SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

10번 - DATE_FORMAT(컬럼, 형식)

SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d')
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

11번 - COUNT, DISTINCT

SELECT COUNT(DISTINCT NAME)
FROM ANIMAL_INS
(GROUP BY NAME
HAVING NAME IS NOT NULL) -> 생략 가능

12번 - LIMIT

SELECT DATETIME
FROM ANIMAL_INS
ORDER BY DATETIME DESC
LIMIT 1;

13번 - LIMIT

SELECT DATETIME
FROM ANIMAL_INS
ORDER BY DATETIME ASDC
LIMIT 1;

14번 - COUNT, DISTINCT

SELECT COUNT(DISTINCT ANIMAL_ID)
FROM ANIMAL_INS

15번 - COUNT, DISTINCT

SELECT COUNT(DISTINCT ANIMAL_NAME)
FROM ANIMAL_INS
WHERE ANIMAL_TYPE = 'Dog';

16번 - GROUP BY, HAVING

SELECT NAME, COUNT(NAME)
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
HAVING COUNT(NAME) >= 2
ORDER BY NAME

17번 - NOT IN, LEFT JOIN

  • 내 풀이
SELECT ANIMAL_ID, NAME
FROM OUTS
WHEHE ANIMAL_ID NOT IN (SELECT ANIMAL_ID FROM INS)
ORDER BY
  • LEFT JOIN 풀이
SELECT O.ANIMAL_ID, O.NAME 
FROM ANIMAL_OUTS AS A LEFT JOIN ANIMAL_INS 
ON O.ANIMAL_ID = ANIMAL_INS.ANIMAL_ID
WHERE ANIMAL_INS.ANIMAL_ID IS NULL;
profile
장난감이 데이터인 사람

0개의 댓글