잘 사용하지 않았던 것만 첨가하여 기록하였음.
SELECT * FROM TableName
LIMIT 30,10;
다음은 TableName의 테이블에서 처음 30개를 건너뛰고, 10개를 가져온다.
SELECT 10 - 3 AS DIFF;
하게 된다면,
SELECT 10 - 7, 'HI';
SELECT 'GOAT' + 7;
SELECT '001' * 3 + '040';
SELECT '04A' + 3;
SELECT OrderID, ProductID, OrderID + ProductID AS SUM
FROM OrderDetails;
SELECT TRUE, FALSE;
이를 이용하여 WHERE 조건문과 함께하여 사용한다. (WHERE 참?) (WHERE 거짓?)
SELECT * FROM Customers WHERE TRUE;
-> 모든 Customers 정보들을 가져옴.
SELECT 'A' = 'a';
IN ( ) 괄호 안에 값이 있을 때 True를, 없으면 False를 반환
SELECT 100 IN (1,10,100);
SELECT '천재' IN ("염소는 천재다");
False를 반환한다.
SELECT '천재' IN ('염소','천재','이다');
SELECT "염소는 천재다" LIKE "%천재%";
SELECT "cheonjae" LIKE "_____jae";
한글로 할 때는 안되는 경우가 있으니 조심
MIN, MAX와는 다름 !!
열을 기준으로 MIN , MAX 값을 반환
소수점 이하는 버리고, 정수부분은 0으로 채워 넣는 함수 (마찬가지로 버리는 거긴 함)
SELECT
TRUNCATE(1234.5678,3),
TRUNCATE(1234.5678,2),
TRUNCATE(1234.5678,1),
TRUNCATE(1234.5678,0),
TRUNCATE(1234.5678,-1),
TRUNCATE(1234.5678,-2);
대문자와, 소문자로 바꾸는 함수
문자열을 이어 붙이는 함수 / 이 때, 숫자 또한 이어 붙여짐
SELECT CONCAT_WS('-',1997,06,06,'BIRTHDAY');
SQL 문자들의 인덱스는 1부터 시작함에 유의 하자
문자열의 공백을 제거
SELECT LPAD('HI',15,'GOAT'),
RPAD('HI',15,'GOAT');
SELECT REPLACE('염소는 바보다. 바보맞지? 바보다.','바보','천재');
문자열(첫번째인자)중 찾으려는 문자(두번째인자)가 포함된 인덱스를 반환
SELECT INSTR('ABCDE','B'),
INSTR('brave goat','goat');
SELECT
'01' = '1',
CONVERT('01',DECIMAL) = CONVERT('1',DECIMAL);
SELECT
CURDATE(), --현재 날짜
CURTIME(), --현재 시간
NOW(); --현재 시간과 날짜
SELECT
'2023-3-21' = '2023-03-21',
DATE('2023-3-21') = DATE('2023-03-21'),
'1:2:3' = '01:02:03',
TIME('1:2:3') = TIME('01:02:03');
SELECT
DATE('2023-03-21 1:2:3') = TIME('2023-03-21 01:02:03');
해당 쿼리는 다른 0을 반환한다.
이유는 DATE는 날짜정보로만, TIME은 시간정보로만 변환해주기 때문이다.
다시말해 '2022-3-21' = '1:2:3' 이 되는 것이다.
=> 보면 앎.
SELECT
OrderDate,
YEAR(OrderDate) AS YEAR,
MONTHNAME(OrderDate) AS MONTHNAME,
MONTH(OrderDate) AS MONTH,
WEEKDAY(OrderDate) AS WEEKDAY,
DAYNAME(OrderDate) AS DAYNAME,
DAY(OrderDate) AS DAY
FROM Orders;
SELECT
ADDDATE('2021-06-20', INTERVAL 1 YEAR),
ADDDATE('2021-06-20', INTERVAL -2 MONTH),
ADDDATE('2021-06-20', INTERVAL 3 WEEK),
ADDDATE('2021-06-20', INTERVAL -4 DAY),
ADDDATE('2021-06-20', INTERVAL -5 MINUTE),
ADDDATE('2021-06-20 13:01:12', INTERVAL 6 SECOND);
SELECT
OrderDate,
NOW(),
DATEDIFF(OrderDate, NOW())
FROM Orders;
LAST_DAY
형식 | 설명 |
---|---|
%Y | 년도 4자리 |
%y | 년도 2자리 |
%M | 월 영문 |
%m | 월 숫자 |
%D | 일 영문(1st, 2nd, 3rd...) |
%d, %e | 일 숫자 (01 ~ 31) |
%T | hh:mm:ss |
%r | hh:mm:ss AM/PM |
%H, %k | 시 (~23) |
%h, %l | 시 (~12) |
%i | 분 |
%S, %s | 초 |
%p | AM/PM |
SELECT
DATE_FORMAT(NOW(), '%M %D, %Y %T'),
DATE_FORMAT(NOW(), '%y-%m-%d %h:%i:%s %p'),
DATE_FORMAT(NOW(), '%Y년 %m월 %d일 %p %h시 %i분 %s초');
STR_TO_DATE
SELECT
DATEDIFF(
STR_TO_DATE('2021-06-04 07:48:52', '%Y-%m-%d %T'),
STR_TO_DATE('2021-06-01 12:30:05', '%Y-%m-%d %T')
),
TIMEDIFF(
STR_TO_DATE('2021-06-04 07:48:52', '%Y-%m-%d %T'),
STR_TO_DATE('2021-06-01 12:30:05', '%Y-%m-%d %T')
);
IF(조건,참,거짓) => 조건이 참이라면 참 실행, 거짓이라면 거짓 실행
SELECT IF (1 > 2, '1는 2보다 크다.', '1은 2보다 작다.');
IF보다 복잡할 때 사용
SELECT
CASE
WHEN -1 > 0 THEN '-1은 양수다.'
WHEN -1 = 0 THEN '-1은 0이다.'
ELSE '-1은 음수다.'
END;
IFNUL(A,B) => A가 NULL시 B출력
SELECT
IFNULL('A','B'),
IFNULL(NULL,'NULL입니다');
ROLLUP은 총 합계를 나타냄
ORDER BY와 절대 함께 사용할 수 없다.
SELECT
Country, COUNT(*)
FROM Suppliers
GROUP BY Country
WITH ROLLUP;
SELECT
Country,
COUNT(DISTINCT CITY)
FROM Customers
GROUP BY Country;
SELECT * FROM Products
WHERE Price > ALL (
SELECT Price FROM Products
WHERE CategoryID = 2
);
아래와 같이 서브쿼리와 바깥쪽 쿼리가 직접적으로 연관이 되어있으므로 상관 서브 쿼리라고 부른다.
SELECT
ProductID, ProductName,
(
SELECT CategoryName FROM Categories C
WHERE C.CategoryID = P.CategoryID
) AS CategoryName
FROM Products P;
SELECT
CategoryID, CategoryName
-- ,(SELECT MAX(P.Price) FROM Products P
-- WHERE P.CategoryID = C.CategoryID
-- ) AS MaxPrice
FROM Categories C
WHERE EXISTS (
SELECT * FROM Products P
WHERE P.CategoryID = C.CategoryID
AND P.Price > 80
);
P 테이블과 C테이블에서 같은 카테고리 ID를 가지면서, 가격이 80원이 넘어가는 row에서 ID와 NAME을 가져온다.
SELECT
E1.EmployeeID, CONCAT_WS(' ', E1.FirstName, E1.LastName) AS Employee,
E2.EmployeeID, CONCAT_WS(' ', E2.FirstName, E2.LastName) AS NextEmployee
FROM Employees E1 JOIN Employees E2
ON E1.EmployeeID + 1 = E2.EmployeeID;
-- 1번의 전, 마지막 번호의 다음은? (INNER JOIN의 특징)
오른쪽 테이블이 비어있더라도 왼쪽이 존재하면 가져온다.
모든 행 정보를 가져온다. (A 테이블 행의 수) * (B 테이블 행의 수)
JOIN은 테이블의 좌 우로 붙여나간다면,
UNION은 테이블의 위 아래로 붙여나간다.
중복을 제거한 집합
중복을 제거하지 않은 집합