1. select
SELECT menu_name FROM tbl_menu;
-- '*' : 모든 컬럼을 보고싶을 때 사용, 그러나 현업에서는 모호한 *보다는 확실하게 모든 컬럼을 명시해서 사용한다고 한다.
SELECT * FROM tbl_menu;
-- 단독으로 select문 사용
SELECT 7 + 3;
-- 내장함수 확인
SELECT NOW() AS 현재시간;
2. order by
: 오름차순 정렬이 기본이다.
2-1. 기본 사용 형태
ORDER BY '컬럼명' [ASC/DESC]
SELECT
menu_code
, menu_name
, menu_price
FROM tbl_menu
-- ORDER BY menu_price ASC; --asc는 오름차순 (default)
ORDER BY menu_price DESC; -- desc는 내림차순
2-2. field 함수
내가 정렬하고 싶은 데이터의 순서가 있을 때, 이 함수와 함께 커스텀된 order by 사용이 가능하다.
FIELD 함수를 ORDER BY 뒤에 사용하면 원하는 값을 우선적으로 정렬할 수 있다.
SELECT
menu_name
,orderable_status
,FIELD(orderable_status, 'Y', 'N')
FROM tbl_menu
ORDER BY FIELD(orderable_status, 'Y','N');
'Y'가 먼저 정렬되고, 그 다음에 'N'이 정렬된다는 뜻이다.
같은 게 있으면 내부 기준으로 정렬되고, 만약 'Y'도, 'N'도 아닌 제 3의 값이 있으면 그 값은 'y','n'의 가장 위로 올라온다.
정렬 결과
명시되지 않은 값 Y N
2-3. null의 정렬 기준
- 오름차순일 땐 맨 위에 NULL 값이 온다.
- 내림차순일 땐 맨 아래에 NULL 값이 온다.
ORDER BY -ref_category_code
와 같이 표현할 때도, -가 붙어서 값들은 내림차순으로 정렬되겠지만 null값은 맨 위로 온다.
3. where
: 조건에 맞는 레코드만 보고싶을 때 사용한다.
비교 연산자 : =, !=, <, <=, >, >= 사용 가능하다.
논리 연산자 : and, or, not 사용 가능하다. 이때 주의할 점은 and 연산자의 우선순위가 or 연산자의 우선순위보다 높아서, and가 먼저 연산된다는 것이다.
between and 연산자
SELECT * FROM tbl_menu WHERE menu_price BETWEEN 10000 AND 25000 ORDER BY menu_price;
like 연산자
: 문자 포함은%
, 한 글자는_
로 표현한다.SELECT * FROM tbl_menu WHERE menu_name LIKE '_마늘%'; -- '_'는 한 글자 자리 차지
검색 시
_
나%
를 실제로 검색하고 싶을 때는 다음과 같이 사용한다.LIKE '%\_%'
- in 연산자
SELECT * FROM tbl_menu WHERE category_code IN (4, 5, 6) ORDER BY category_code;
- is null : null값은 비교연산자로 비교가 불가능하다.
SELECT * FROM tbl_category WHERE ref_category_code IS NULL;
4. distinct
: 중복 레코드 삭제
- 재밌는 점은 null이 비교는 안되는데 중복 레코드 삭제할 때는 null도 중복으로 인식된다는 점이다.
- 다중 열에도 사용이 가능하다.
SELECT DISTINCT category_code, orderable_status -- 두 개 컬럼 조합했을 때 중복되는 것을 제거 FROM tbl_menu;
- group by 역시 중복을 제거하는 방법 중 하나이다.
SELECT category_code, orderable_status FROM tbl_menu GROUP BY category_code;
5. limit
: 특정 개수의 레코드만 보여주도록 조정
SELECT menu_code, menu_name, menu_price
FROM tbl_menu
ORDER BY menu_price
LIMIT 1, 4;
-- offset은 생략이 가능하며 row_count만 입력하면 top-n 행 반환
SELECT menu_code, menu_name, menu_price
FROM tbl_menu
ORDER BY menu_price
LIMIT 5;
6. join
: 관계형 DB는 최대한 중복되는 데이터가 없도록 테이블을 쪼개놓는다. 그래서 그 테이블을 연결해서 정보를 만들려면 join을 통해 테이블을 합쳐야 한다.
-- 조인의 종류
-- 1. inner join : 두 테이블의 교집합을 반환
-- (1) on :
SELECT menu_name, category_name
FROM tbl_menu AS a
JOIN tbl_category AS b ON a.category_code = b.category_code;
-- (2) using : join할테이블의 컬럼명이 동일한 경우만 사용
SELECT a.menu_name, b.category_name
FROM tbl_menu a
JOIN tbl_category b USING (category_code);
-- employee와 department join
SELECT a.emp_name, b.dept_title
FROM employee a
JOIN department b ON a.DEPT_CODE = b.DEPT_ID;
-- inner join은 교집합만 반환하므로 겹치지 않는 값은 view에 들어가지 않는다.
-- 2. left [outer] join
-- : 왼쪽 테이블의 모든 레코드와 오른쪽 테이블에서 일치하는 레코드(행)를 반환
SELECT a.emp_name, b.dept_title
FROM employee a
LEFT JOIN department b ON a.DEPT_CODE = b.DEPT_ID;
-- 3. right [outer] join
-- : 오른쪽 테이블의 모든 레코드와 왼쪽 테이블에서 일치하는 레코드(행)를 반환
SELECT a.emp_name, b.dept_title
FROM employee a
RIGHT JOIN department b ON a.DEPT_CODE = b.DEPT_ID;
-- 4. cross join : 두 테이블의 가능한 모든 조합을 반환하는 조인
-- 카티션 프로덕트
SELECT
a.menu_name
, b.category_name
FROM tbl_menu a
CROSS JOIN tbl_category b;
7. grouping
: 때로는 레벨별, 부서별로 어떤 값을 집계해서 보고싶을 때가 있다. 그럴 때 사용한다.
- having
: grouping 후 조건에 맞는 레코드만 보고싶을 때 사용한다.
-- group by : distinct와 같은 효과
SELECT *
FROM tbl_menu
GROUP BY category_code;
SELECT category_code, COUNT(*)
FROM tbl_menu
GROUP BY category_code;
8. subqueries
: 절 내부에 또 절이 올 수 있다.
-- 메뉴 이름이 민트미역국인 메뉴의 카테고리 코드를 찾아, 그 카테고리 코드에 속한 메뉴를 모두 보고싶을 때
SELECT
category_code
FROM tbl_menu
WHERE menu_name = '민트미역국';
SELECT
menu_name
FROM tbl_menu
WHERE category_code = 4;
-- 위의 질의를 하나의 질의로 변경
SELECT
menu_name
FROM tbl_menu
WHERE category_code = (SELECT
category_code
FROM tbl_menu
WHERE menu_name = '민트미역국');
'Database' 카테고리의 다른 글
[Mariadb] FULL OUTER JOIN (0) | 2025.02.06 |
---|---|
[DB] 제약조건 수정 ( primary key 추가/삭제/수정, foriegn key 추가/삭제/수정) (0) | 2025.02.04 |
[DB] ORDER BY 구문 활용 (0) | 2025.02.04 |
[DB] SELECT 구문 활용 (0) | 2025.02.04 |
[DB] mariaDB 계정 생성 (0) | 2025.01.24 |