이번에 보는 시험중에 SQL코테문제가 2문제정도 나와서 정보처리기사 이후에 제대로 본 적 없는 SQL문을 정리해본다.
SELECT IF(10>5, '크다','작다') AS result;
SELECT *
FROM Student
WHERE Student_ID like 'a%';
LIKE 'a%' --a로 시작되는 모든 것
LIKE 'a_%_%' -- a로 시작되고 최소 3이상의 길이를 가진 것
LIKE '_a%' -- 두번째 자리에 a가 들어가는 모든 것
-sql 문에서 <>는 같지않음을 나타낸다.
WHERE INTAKE_CONDITION <> 'Aged'
위의 sql문의 경우 INTAKE_CONDITION중에서 'Aged'와 같지 않은 것들을 반환한다. 따라서 'Aged'를 제외하고 반환하는 것과 같다.
SELECT *
FROM Customers
WHERE country IN ('UK','Korea') -- customer중 country가 uk이거나 korea인것을 다 뽑아냄
SELECT ANIMAL_ID,NAME,SEX_UPON_INTAKE
FROM ANIMAL_INS ani
WHERE NAME IN ('Lucy','Ella','Pickle','Rogan','Sabrina','Mitty');
SELECT *
FROM products
WHERE price BETWEEN 10 and 20;
SELECT ANIMAL_TYPE, IFNULL(NAME,'No name') AS NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
-- ANIMAL_INS 테이블의 각 행에서 동물의 유형, 이름(이름이 없는 경우 'No name'으로 표시), 그리고 수용 시의 성별 정보를 가져오는 역할
SELECT ANIMAL_TYPE, coalesce(NAME,'No name') AS NAME, SEX_UPON_INTAKE FROM ANIMAL_INS
CASE
WHEN 조건 1 THEN '조건1 반환값'
WHEN 조건 2 THEN '조건2 반환값'
ELSE '충족되는 조건 없을때 반환값'
END
WHEN.. THEN은 쌍으로 같이 다녀야한다.
SELECT,WHERE,ORDER BY 절에서 사용 가능하고 보통 SELECT절에서 쓰인다. ELSE를 생략하면 결과 값이 NULL이 나오므로 주의
SELECT
seq,
CASE
WHEN(u.seq BETWEEN 1 AND 3) THEN
CASE
WHEN(u.enabled IS TRUE) THEN 'A+'
ELSE 'A0'
END
WHEN(u.seq BETWEEN 4 AND 6) THEN
CASE
WHEN(u.enabled IS TRUE) THEN 'B+'
ELSE 'B0'
END
ELSE 'C+'
END AS case_result
FROM 'user' u
SELECT(
CASE
WHEN PRICE < 10000 THEN 0
ELSE TRUNCATE(PRICE,-4)
END) AS PRICE_GROUP, COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP;
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME ASC LIMIT 1; -- 상위 한개만 출력
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME ASC LIMIT 1,10; -- 두번째 데이터부터 10개의 데이터를 가져옴(인덱스 0부터 시작)
두번째 데이터부터 시작한다 해도 사실상 처음데이터부터 10개를 출력하는 것이다. 따라서 범위의 마지막인 10은 11번째 데이터가 출력될 것이다.
-- 조건식이 있는 경우
SELECT 열명
FROM 테이블명
WHERE 조건식
LIMIT 행수
-- 조건식이 없는 경우
SELECT 열명
FROM 테이블명
LIMIT 행수
-- 지정한 숫자 개수 리턴
SELECT *
FROM
LIMIT 0,3; -- 0번부터 3개
SELECT COUNT(id)
FROM CUSTOMERS
GROUP BY country -- 각 도시에 사는 사람이 몇명인지
SELECT AVG(price) FROM products;
SELECT SUM(price) FROM products;
SELECT branch_name, avg(balance)
FROM account
GROUP BY branch_name
HAVING AVG(balance) >= 700;
UNION ALL을 사용한다.SELECT *
FROM customers
UNION
SELECT city FROM orders
ORDER BY city;
count만 따로 다루어보도록 하겠다.
COUNT : null을 포함하는경우, 그렇지않은 경우가 있다.
하지만 중복은 포함해서 계산한다. 따라서 DISTINCT를 통해 중복을 제거해주어야 한다.
전체 행의 개수
SELECT COUNT(*) FROM TABLE_NAME
: 이 결과에는 NULL이 포함되어서 세어진다.
SELECT COUNT(COLUMN_NAME) FROM TABLE_NAME
: 컬럼의 이름을 사용하면 그 컬럼의 NULL인 값을 제외한 개수가 반환된다.
SELECT COUNT(DISTINCT COLUMN_NAME) FROM TABLE_NAME
SELECT COUNT(IFNULL(COLUMN_NAME,0)) FROM TABLE_NAME
:NULL 값을 0으로 계산 -> 집계 함수에 반영됨
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d') AS 컬럼명 FROM 테이블명
-- 2022-12-29 출력
%y를 쓰면 22 이렇게 출력되고, 대문자로 %Y를 써야 2022 이렇게 출력된다.
SELECT YEAR(NOW()) FROM 테이블명
-- 2022 출력
NOW()의 데이터 형식
2022-12-29 오전 8:29:11
SELECT HOUR(DATETIME) AS HOUR, COUNT(HOUR(DATETIME)) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
HAVING HOUR >=9 AND HOUR<=19
ORDER BY HOUR;
WHERE SUBSTR(A.CREATED_DATE,1,7) = '2022-10'
-- CREATED_DATE의 데이터에서 첫번째부터 7번째자리를 추출해 연도와 월 정보를 가져옴
YEAR()이외에도 MONTH(),DAYOFMONTH()등 날짜, 시간과 관련된 여러 함수가 존재한다.
앞으로 모르는 부분들이 나올때마다 계속해서 정리해 갈 것이다.