BETWEEN...AND
특정 값들의 범위 안 데이터 조회 조건절 문법
문법 ) [비교 컬럼] between [최소검색값] and [최대검색값];
비교 컬럼에서 최소검색값(포함)과 최대검색값(포함) 사이 데이터 조회
uno가 3 이상 5 이하
select * from user where uno between 3 and 5;
urdate가 2024-08-27 00:00:00 이상 2024-08-29 00:00:00 이하 데이터
select * from user where urdate between '2024-08-27' and '2024-08-29';
IN() 절
하나의 컬럼으로 검색하고자 하는 or 연산이 여러개인 경우 사용하는 조건절
문법) [검색컬럼] in ([검색값1],[검색값2],...);
LIKE 절
컬럼의 텍스트 부분 검색할 수 있는 조건절
문법1) [검색컬럼] like '[검색문자열]%'; / 검색문자열로 시작하는 컬럼값이 존재하는 데이터 조회
문법2) [검색컬럼] like '%[검색문자열]'; / 검색문자열로 끝나는 컬럼값이 존재하는 데이터 조회
문법3) [검색컬럼] like '%[검색문자열]%'; / 검색문자열로 어디든지 포함하는 컬럼값이 존재하는 데이터 조회
% : 아무거나
notice_board 에서 제목에 테스트가 포함되어있는 게시글을 조회
select * from notice_board where title like '%테스트%';
uno 3번이 쓴 글 중 내용이 DML이 포함되어있는 데이터를 조회
select * from notice_board where uno = 3 and content like '%DML%';
uno가 1 또는 2 또는 5 중에 제목에 '첫번째'를 포함하고 있는 데이터를 조회
select * from notice_board where uno in (1,2,5) and title like '%첫번째%';
서브쿼리
쿼리 안에 또다른 쿼리를 의미함
서브쿼리를 많이 사용할 수록 시스템 성능을 저하시키는 요인이되므로 신중하게 주의하여 사용하도록 한다
주의할 점 : 서브쿼리로 조회되는 데이터는 반드시 한행한열 즉 데이터 한건 이어야 한다
서브쿼리의 위치 3군데)
1. select 의 조회 컬럼 위치
서브쿼리를 사용하여 notice_board에서 글을 쓴 작성자의 id를 출력
select *,(select uid from user where uno = notice_board.uno) from notice_board;
서브쿼리를 사용하여 notice_board에서 글을 쓴 작성자의 이름을 출력
select nno,title,uno,(select uname from user where uno = notice_board.uno) as writer
from notice_board;
서브쿼리를 사용하여 notice_board에서 글을 쓴 작성자의 id를 출력
select nno,title,uno,
(select uname from user where uno = notice_board.uno) as writer,
(select uid from user where uno = notice_board.uno) as id
from notice_board;
서브쿼리를 사용하여 notice_board에서 글쓴이의 이메일을 출력
select nno,title,uno,
(select uname from user where uno = notice_board.uno) as writer,
(select uid from user where uno = notice_board.uno) as id,
(select uemail from user where uno = notice_board.uno) as email
from notice_board;
2. from 위치
조회 대상 데이터의 범위를 설정하게 된다
from 위치에서 사용할 경우 한칸 띄고 가짜 테이블 별칭을 지어줘야 오류없이 작동된다
select * from (select * from ordertb where order_id = 'kimkkk') odb
where order_pname = '마우스';
결과 설명)
1번 실행 (select * from ordertb where order_id = 'kimkkk') -> 2건
2번 실행 where order_pname = '마우스' -> 1번 실행의 2건 중 마우스에 해당하는 1건
3번 실행 select로 1건의 데이터의 전체 데이터 조회
서브쿼리를 활용하여 ordertb에서 order_per_price의 데이터가 60000 이상인 데이터만 조회될 수 있도록 쿼리작성
select * from (select * from ordertb where order_per_price >= 60000) odb;
서브쿼리에서 컬럼을 지정하면 전체 조회했을 때 지정한 컬럼만 나온다
select *
from (select order_no,order_id,order_pname from ordertb where order_per_price >= 60000) odb;
3. 조건절 값의 위치
비교하고자하는 값의 대상이 된다
주의 할 점
1) 조건 비교 연산자가 단일값을 요구하는 경우 서브쿼리의 결과가 한행,한열이어야한다(단일데이터)
2) 조건 비교 연산자가 여러 건의 값을 요구하는 경우 서브쿼리의 결과가 다행,한열이어야 한다
select * from user where uno = (select * from notice_board); -- 오류
정상작동
select * from user where uno = (select uno from notice_board where nno = 1);
select * from user where uno = (select uno from notice_board where title like '%테스트%'); -- 오류
정상작동
select * from user where uno in (select uno from notice_board where title like '%테스트%');
user 테이블에서 user를 검색하는데 notice_board에서 content에 '공지'라는 글이 포함된 글을 작성한 user의 정보를 모두 조회
select * from user where uno in (select uno from notice_board where content like '%공지%');
order by
테이블 데이터 조회 순서 제어
문법) SQL 맨 아래 작성
order by [정렬하고자 하는 컬럼명] [asc(오름차순. 기본값) | desc(내림차순)]
ordertb에서 모든 데이터를 조회하는데 이때 order_per_price의 오름차순으로 조회
select * from ordertb order by order_per_price;
역순으로 정렬
select * from ordertb order by order_per_price desc;
ordertb에서 아이디 honggildong001유저가 구매한 데이터를 조회하는데 이때 order_per_price의 오름차순으로 조회
select * from ordertb where order_id = 'honggildong001' order by order_per_price;
정렬 조건 여러개 주기.
order by 뒤에 조건1,조건2,... 로 작성하면 됨
select * from ordertb order by order_per_price, order_id;
select * from ordertb order by order_per_price, order_id, order_cnt;
조건 순서 바꾸면 조회 결과가 달라짐
select * from ordertb order by order_per_price, order_cnt, order_id;
DISTINCT
중복데이터 생략
selelct의 바로 뒤에만 올 수 있음
문법)
select distinct [컬럼1],[컬럼2],...
조회되는 컬럼들의 데이터가 전부 중복되는 행을 생략 후 한 행만 출력
select distinct uname from user;
주의할부분
이렇게 사용할 경우 uname, uno 두개가 중복되는 경우만 중복데이터 생략이 된다
select distinct uname,uno from user;
제품이름과 타입은 현재 10개
select order_pname, order_type from ordertb;
제품이름과 타입이 중복되는 데이터를 제거하여 총 8개만 남는다
select distinct order_pname, order_type from ordertb;
LIMIT
검색된 데이터의 출력 갯수를 제어하는 문법
문법) SQL 제일 끝에 작성
limit [시작인덱스],[출력갯수];
select * from ordertb where order_per_price >= 60000 limit 0,2;
MySQL 쿼리 실행 순서
- FROM
- JOIN
- WHERE
- GROUP BY
- WITH ROLLUP
- HAVING
- SELECT
- DISTINCT
- ORDER BY
- LIMIT/OFFSET
'MySQL' 카테고리의 다른 글
[MySQL] 기존 테이블 복사, GROUP BY (4) | 2024.09.05 |
---|---|
[MySQL] DML 데이터조작어 UPDATE, DELETE (0) | 2024.09.04 |
[MySQL] DML 데이터조작어 SELECT문 (2) | 2024.09.02 |
[MySQL] DML 데이터조작어 INSERT문 (0) | 2024.09.01 |
[MySQL] DDL 데이터 정의어 (0) | 2024.08.31 |