MYSQL / / 2022. 9. 17. 10:06

MYSQL - 2 LIMIT , 문자열 연산


SELECT 열명 FROM 테이블명 LIMIT 행수

**LIMIT을 사용할땐 where , order by 이후에 사용해야한다. 
**같이 사용 할 경우**

[실습] (샘플 33) 3행까지 출력하기 
--> select no from sample33 limit 3; 



[실행 결과]
mysql> select no from sample33 limit 3;
+------+
| no   |
+------+
|    1 |
|    2 |
|    3 |
+------+

--------------------------------------------------------------------------

[실습2] 아래와 같이 구현하기 ! 

--> 행을 내림차순으로 정렬 한후, LIMIT을 이용해 3행만 출력

+------+
| no   |
+------+
|    7 |
|    6 |
|    5 |
+------+

[코드] 
--> select * from sample33 order by no DESC limit 3;
--------------------------------------------------------------------------

[실습3] LIMIT OFFSET을 이용하여 아래와 같이 출력 하기

*리밋으로 3개를 가져오기 offset은 시작 지점 
+------+
| no   |
+------+
|    4 |
|    5 |
|    6 |
+------+
[코드] 
--> select * from sample33 order by no asc limit 3 offset 3;


--------------------------------------------------------------------------
<수치 연산> (파이썬과 동일)

연산 우선순위는, 곱셈 나눗셈 ,나머지(%)가 우선순위로 계산되고 
+ , -가 그 다음 순위로 계산된다 .

- SELECT 식 1 , 식 2 ... from 테이블명 

[실습 아래 표 구현]

1) 아래 표 구현

+------+-------+----------+------------------+
| no   | price | quantity | price * quantity |
+------+-------+----------+------------------+
|    1 |   100 |       10 |             1000 |
|    2 |   230 |       24 |             5520 |
|    3 |  1980 |        1 |             1980 |
+------+-------+----------+------------------+


-->select *, price * quantity from sample34;

--------------------------------------------------------------------------

2) 아래 표 구현

+------------------+
| price * quantity |
+------------------+
|             1000 |
|             5520 |
|             1980 |
+------------------+

[코드]
--> select price * quantity from sample34;



[실습2 아래 표 구현] amount 열에 price * quantity 담아서 모두 출력 
**as를 이용 한다 (생략 가능)

+------+-------+----------+--------+
| no   | price | quantity | amount |
+------+-------+----------+--------+
|    1 |   100 |       10 |   1000 |
|    2 |   230 |       24 |   5520 |
|    3 |  1980 |        1 |   1980 |
+------+-------+----------+--------+


--> select *, price * quantity as amount from sample34;

--------------------------------------------------------------------------


[실습 2-1 아래 표 구현] amount 테이블에 price * quantity 담아서 출력

+--------+
| amount |
+--------+
|   1000 |
|   5520 |
|   1980 |
+--------+

[코드] 
--> select price * quantity as amount from sample34;
--------------------------------------------------------------------------

[실습] 아래와 같이 구현하기
--> 숫자를 넣게 되면 int()이기 때문에 '을 붙여 문자열로 만들어야한다. 

+------+
| 1000 |
+------+
| 1000 |
| 5520 |
| 1980 |
+------+


[코드] 
--> select price * quantity as '1000' from sample34;
--------------------------------------------------------------------------

[실습] 아래 표 구현 

+------+-------+----------+--------+
| no   | price | quantity | amount |
+------+-------+----------+--------+
|    2 |   230 |       24 |   5520 |
+------+-------+----------+--------+

[코드]
--> select *, price * quantity as amount from sample34 where price * quantity >=2000;

#where 다음에 amount를 이용하면 오류가 발생한다.

--FROM > WHERE > SELECT > 테이블 > 행 > 열 순서로 실행된다. 

--------------------------------------------------------------------------

[실습] 아래 표 구현

+------+-------+----------+------------------+
| no   | price | quantity | price * quantity |
+------+-------+----------+------------------+
|    1 |   100 |       10 |             1000 |
|    2 |   230 |       24 |             5520 |
|    3 |  1980 |        1 |             1980 |
+------+-------+----------+------------------+

[코드] 
--> select *, price * quantity from sample34 order by no ASC;

[실습2] 아래 표 구현

+------+-------+----------+------------------+
| no   | price | quantity | price * quantity |
+------+-------+----------+------------------+
|    3 |  1980 |        1 |             1980 |
|    2 |   230 |       24 |             5520 |
|    1 |   100 |       10 |             1000 |
+------+-------+----------+------------------+
[코드]

--> select *, price * quantity from sample34 order by no DESC;

[실습3] 아래 표 구현

+------+-------+----------+------------------+
| no   | price | quantity | price * quantity |
+------+-------+----------+------------------+
|    2 |   230 |       24 |             5520 |
|    3 |  1980 |        1 |             1980 |
|    1 |   100 |       10 |             1000 |
+------+-------+----------+------------------+

[코드]

--> select *, price * quantity from sample34 order by price * quantity DESC;

--------------------------------------------------------------------------
<함수명(인수1, 인수2)>

-부가세 계산 

부가세 5% ==> 1.05

소수점 발생시 반올림 


--------------------------------------------------------------------------
[실습 ] 아래 표 구현 

+---------+
| amount  |
+---------+
| 5961.60 |
| 2138.40 |
| 1080.00 |
+---------+

[코드] 
--> select * from sample341;
--------------------------------------------------------------------------

[실습] 아래 표 구현

+------------+
| new_amount |
+------------+
|       5962 |
|       2138 |
|       1080 |
+------------+

[코드]
--> select round(amount) as new_amount from sample341;


--------------------------------------------------------------------------

[실습] 아래 표 구현 (소수점 뒷자리)

+---------+-----------------+
| amount  | ROUND(amount,1) |
+---------+-----------------+
| 5961.60 |          5961.6 |
| 2138.40 |          2138.4 |
| 1080.00 |          1080.0 |
+---------+-----------------+

[코드]
--> select amount, ROUND(amount,1) from sample341;

--------------------------------------------------------------------------
[실습] 반올림 100단위로 표현 

+---------+------------------+
| amount  | round(amount,-2) |
+---------+------------------+
| 5961.60 |             6000 |
| 2138.40 |             2100 |
| 1080.00 |             1100 |
+---------+------------------+
ㄴㅍ
--> select amount, round(amount,-2) from sample341;

--------------------------------------------------------------------------

[실습2] 반올림 10 단위로 표현

+---------+------------------+
| amount  | round(amount,-1) |
+---------+------------------+
| 5961.60 |             5960 |
| 2138.40 |             2140 |
| 1080.00 |             1080 |
+---------+------------------+

[코드]

--> select amount, round(amount,-1) from sample341;

--------------------------------------------------------------------------

[실습1] 올림과 버림

+---------+--------------------+
| amount  | TRUNCATE(amount,0) |
+---------+--------------------+
| 5961.60 |               5961 |
| 2138.40 |               2138 |
| 1080.00 |               1080 |
+---------+--------------------+


[코드]
--> select amount, TRUNCATE(amount,0) from sample341;

# 0은 소수점 첫번째 자리에서 내림
--------------------------------------------------------------------------


[실습2]

+---------+--------------------+
| amount  | TRUNCATE(amount,1) |
+---------+--------------------+
| 5961.60 |             5961.6 |
| 2138.40 |             2138.4 |
| 1080.00 |             1080.0 |
+---------+--------------------+


[코드]
--> select amount, TRUNCATE(amount,1) from sample341;

# 1은 소수점 두번째 자리에서 내림

--------------------------------------------------------------------------

여러 함수 사용해보기 ! 
(사인, 코사인, 탄젠트 , 제곱근 , 로그값 )

[코드]

--> select amount, sin(amount), cos(amount), tan(amount), SQRT(amount),log(amount) from sample341;

[실행 결과]
+---------+---------------------+---------------------+---------------------+--------------------+-------------------+
| amount  | sin(amount)         | cos(amount)         | tan(amount)         | SQRT(amount)       | log(amount)       |
+---------+---------------------+---------------------+---------------------+--------------------+-------------------+
| 5961.60 | -0.9098226517295911 |  0.4149972799907672 |  -2.192358108346717 |  77.21139812229798 |  8.69309418040727 |
| 2138.40 |  0.8545049723865635 | -0.5194432136111111 | -1.6450402084303701 |  46.24283728319447 | 7.667813164824709 |
| 1080.00 | -0.6502191365954637 |  0.7597467172716508 | -0.8558367174398398 | 32.863353450309965 | 6.984716320118266 |
+---------+---------------------+---------------------+---------------------+--------------------+-------------------+


--------------------------------------------------------------------------

#소수점 지우기 ROUND 이용

[코드]
--> select amount, round(sin(amount)), round(cos(amount)), round(tan(amount)), round(SQRT(amount)),round(log(amount)) from sample341;

[실행 결과]

+---------+--------------------+--------------------+--------------------+---------------------+--------------------+
| amount  | round(sin(amount)) | round(cos(amount)) | round(tan(amount)) | round(SQRT(amount)) | round(log(amount)) |
+---------+--------------------+--------------------+--------------------+---------------------+--------------------+
| 5961.60 |                 -1 |                  0 |                 -2 |                  77 |                  9 |
| 2138.40 |                  1 |                 -1 |                 -2 |                  46 |                  8 |
| 1080.00 |                 -1 |                  1 |                 -1 |                  33 |                  7 |
+---------+--------------------+--------------------+--------------------+---------------------+--------------------+

--------------------------------------------------------------------------

<문자열 연산> 

연산자/ 함수 

[문자열 결합 아래 모두 동일]
--------------------------------
+ --> 
|| --> 
CONCAT  --> CONCAT('ABC','1234') = ABC1234 
--------------------------------------------------------------------------

[실습1] 아래 표 구현 샘플35 이용

+------+-------+----------+------+-----------------------+
| no   | price | quantity | unit | CONCAT(quantity,unit) |
+------+-------+----------+------+-----------------------+
|    1 |   100 |       10 | 개   | 10개                  |
|    2 |   230 |       24 | 통   | 24통                  |
|    3 |  1980 |        1 | 장   | 1장                   |
+------+-------+----------+------+-----------------------+

[코드]
-->  select *, CONCAT(quantity,unit) from sample35;

--------------------------------------------------------------------------

+-----------------------+
| concat(quantity,unit) |
+-----------------------+
| 10개                  |
| 24통                  |
| 1장                   |
+-----------------------+

[코드]
--> select concat(quantity,unit) from sample35;

--------------------------------------------------------------------------

+------+-------+----------+
| no   | price | quantity |
+------+-------+----------+
|    1 |   100 | 10개     |
|    2 |   230 | 24통     |
|    3 |  1980 | 1장      |
+------+-------+----------+

[코드]
--> select no,price,CONCAT(QUANTITY,unit) as 'quantity' from sample35;

--------------------------------------------------------------------------
[아래표 구현 샘플21]

mysql> select SUBSTRING(address, 1, 5) from sample21; 
#주소 목록 1부터 5개 가져온다.
+--------------------------+
| SUBSTRING(address, 1, 5) |
+--------------------------+
| 대구광역시               |
| 대구광역시               |
| 서울특별시               |
+--------------------------+


--------------------------------------------------------
mysql> select SUBSTRING(address,3,3) from sample21;
#주소 시작 3번째부터 3개 가져온다.
+------------------------+
| SUBSTRING(address,3,3) |
+------------------------+
| 광역시                 |
| 광역시                 |
| 특별시                 |
+------------------------+
--------------------------------------------------------
[실습] 아래 코드 구현 후 결과 이해 

select trim(address) from sample21;  # 한방에 정렬 쫚

select CHARACTER_LENGTH(address) from sample21; # 문자열길이 

select CHARACTER_LENGTH('english')

select OCTET_LENGTH('한글') #인코딩 타입에 따라 몇 byte인지 알려준다. 
#띄어쓰기에 따라 같은 문자열도 byte가 달라질 수 있다.

select OCTET_LENGTH('english')
--------------------------------------------------------

< 날짜 연산 > 

-- > SELECT CURRENT_TIMESTAMP;

#현재 날짜 출력하기(기준: 내 PC기준)

+---------------------+
| CURRENT_TIMESTAMP   |
+---------------------+
| 2022-09-16 12:11:20 |
+---------------------+

--------------------------------------------------------------------------


SELECT CURRENT_DATE + INTERVAL 1 DAY; #현재 날짜 + 1일

+-------------------------------+
| CURRENT_DATE + INTERVAL 1 DAY |
+-------------------------------+
| 2022-09-17                    |
+-------------------------------+


SELECT CURRENT_DATE + INTERVAL 30 DAY; #현재 날짜 + 30일
+--------------------------------+
| CURRENT_DATE + INTERVAL 30 DAY |
+--------------------------------+
| 2022-10-16                     |
+--------------------------------+


SELECT CURRENT_DATE - INTERVAL 30 DAY; #현재 날짜 -30일
+--------------------------------+
| CURRENT_DATE - INTERVAL 30 DAY |
+--------------------------------+
| 2022-08-17                     |
+--------------------------------+


SELECT DATEDIFF('2020-03-22','2020-02-03'); #3/22~2/3까지 일수
+-------------------------------------+
| DATEDIFF('2020-03-22','2020-02-03') |
+-------------------------------------+
|                                  48 |
+-------------------------------------+

--------------------------------------------------------------------------

<CASE 문으로 데이터 변환하기> 
CASE WHEN 조건식1 THEN 식1
    [WHEN 조건식2 THEN 식2 ...]
    [ELSE 식3]
END

예)

1 > 남자
2 > 여자
CASE 
    WHEN 1 THEN '남자'
    WHEN 2 THEN '여자' 
END 
--------------------------------------------------------------------------
[실습] NULL을 0으로 바꾸기


mysql> SELECT a, CASE WHEN a IS NULL THEN 0
    -> ELSE a
    -> END AS 'a(null=0)' FROM sample37;

[실행 결과]

+------+-----------+
| a    | a(null=0) |
+------+-----------+
|    1 |         1 |
|    2 |         2 |
| NULL |         0 |
+------+-----------+
--------------------------------------------------------------------------

[실습] a에 있는 NULL 값을 100으로 바꾸기 

mysql> SELECT A, COALESCE(A,100) FROM SAMPLE37;
+------+-----------------+
| A    | COALESCE(A,100) |
+------+-----------------+
|    1 |               1 |
|    2 |               2 |
| NULL |             100 |
+------+-----------------+
--------------------------------------------------------------------------
<검색 CASE 문>
[실습2] A에 1은 , 남자 2는 여자로 바꾸기 

* 숫자를 문자로 바꾸는건 디코드 , 
* 문자를 숫자로 바꾸는건 인코드 라고 한다.

첫번째 코드 > SELECT A, CASE WHEN A = 1 THEN '남자'
    -> WHEN A = 2 THEN '여자'
    -> END '성별'
    -> FROM SAMPLE37;

+------+------+
| A    | 성별 |
+------+------+
|    1 | 남자 |
|    2 | 여자 |
| NULL | NULL |
+------+------+
--------------------------------------------------------------------------
<단순 case 문>

두번째 코드> SELECT A,
    -> CASE A
    -> WHEN 1 THEN '남자'
    -> WHEN 2 THEN '여자'
    -> END '성별'
    -> FROM SAMPLE37;

+------+------+
| A    | 성별 |
+------+------+
|    1 | 남자 |
|    2 | 여자 |
| NULL | NULL |
+------+------+

--------------------------------------------------------------------------

NULL값을 0 으로 바꾼다. 
#null값을 수정 하기 위해선 검색 CASE 문을 사용해야 한다.


SELECT A, CASE WHEN A = 1 THEN '남자'
    -> WHEN A = 2 THEN '여자'
    -> WHEN A IS NULL THEN 0
    -> END '성별'
    -> FROM SAMPLE37;
+------+------+
| A    | 성별 |
+------+------+
|    1 | 남자 |
|    2 | 여자 |
| NULL | 0    |
+------+------+

--------------------------------------------------------------------------

1. 정렬에 사용 되는 구 ? > order by 
2. 내림차순 오름차순  ? > 내림차순 DESC / 오름차순 ASC
3. 검색결과 행제한에 사용 ? >limit
4.열에 별명 붙이는 방법 ? > as
5. 문자열 합치기 함수 ? > CONCAT , + , || 
6. MYSQL에서 사용하는 날짜 확인 ? > DATEDIFF
7. 데이터 변환 ?> 검색 케이스 , 단순 케이스 

--------------------------------------------------------------------------
<INSERT> 
표의 구조를 바꿀 순 없지만, 행은 추가가 가능하다. 
* 열은 안됨

INSERT INTO 테이블명(열1,열2, ...) VALUES(값1, 값2)

--------------------------------------------------------------------------

mysql> select * from sample41;

** INSERT INTO를 이용해서 행 추가 하기! 

mysql> INSERT INTO sample41
    -> VALUES(1,'ABA','2014-01-25')
    -> ;

[실행 결과]
+----+------+------------+
| no | a    | b          |
+----+------+------------+
|  1 | ABA  | 2014-01-25 |
+----+------+------------+

--------------------------------------------------------------------------
[실습2] 샘플41에 NO = 3, A,B 모두 NULL인행 추가 

mysql> INSERT INTO SAMPLE41
    -> VALUES (3,NULL,NULL);

+----+------+------------+
| no | a    | b          |
+----+------+------------+
|  0 | NULL | NULL       |
|  1 | ABA  | 2014-01-25 |
|  3 | NULL | NULL       |
+----+------+------------+

--------------------------------------------------------------------------

[실습3] 샘플41에 A는 XYZ , NO는 2 인 행 추가 

MYSQL>

INSERT INTO SAMPLE41(A, NO) VALUES('XYZ',2);
+----+------+------------+
| no | a    | b          |
+----+------+------------+
|  2 | XYZ  | NULL       |
+----+------+------------+

--------------------------------------------------------------------------
[실습4] 샘플411에 NO =2, D=DEFAULT 행 추가

# default를 추가하면 0이 추가 된다.

INSERT INTO SAMPLE411 VALUES(2,DEFAULT);


[실습5] 샘플411에 NO =3 행 추가

INSERT INTO SAMPLE411(NO) VALUES(3);

--------------------------------------------------------------------------

<DELETE 행 삭제> 

DELETE FROM 테이블명 WHERE 조건식; 

 mysql> delete from sample41 where no = 0;

 +----+------+------------+
| no | a    | b          |
+----+------+------------+
|  1 | ABA  | 2014-01-25 |
|  3 | NULL | NULL       |
|  2 | XYZ  | NULL       |
+----+------+------------+

[실습] no가 3인행 삭제

mysql> delete from sample41 where no =3;
+----+------+------------+
| no | a    | b          |
+----+------+------------+
|  1 | ABA  | 2014-01-25 |
|  2 | XYZ  | NULL       |
+----+------+------------+

---------------------------------------------
<UPDATE> 

UPDATE 테이블명 SET 열1= 값1, 열2=값2 ... where 조건식

[실습] update를 이용해서 no 2에 2020 -03-25를 넣기

update sample41 set b ='2020-03-25' where no =2;

+----+------+------------+
| no | a    | b          |
+----+------+------------+
|  2 | ABA  | 2020-03-25 |
|  2 | XYZ  | 2020-03-25 |
+----+------+------------+

---------------------------------------------

[실습2] update를 이용해서 no.2를 no3으로 변경!

mysql> update sample41 set no= no+1;

+----+------+------------+
| no | a    | b          |
+----+------+------------+
|  3 | ABA  | 2020-03-25 |
|  3 | XYZ  | 2020-03-25 |
+----+------+------------+
---------------------------------------------

[실습3] 샘플41의 no열이 1인행의 a열 값을 xxx로 수정
--> update sample41 set a = 'xxx' where no=1;

[실습4] 샘플41의 no열이 1인행의 b열 값을 2014-01-01로 수정
--> update sample41 set b='2014-01-01' where no =1;

[실습5] 샘플41의 no열이 2인행의 a열을 xxx, b열을 2020-03-23으로 수정
--> update sample41 set a ='xxx', b ='2020-03-25' where no =2;


+----+------+------------+
| no | a    | b          |
+----+------+------------+
|  3 | ABA  | 2020-03-25 |
|  3 | XYZ  | 2020-03-25 |
|  1 | xxx  | 2014-01-01 |
|  2 | xxx  | 2020-03-25 |
+----+------+------------+
---------------------------------------------

[실습] 샘플41의 a열을 null로 수정 
update sample41 set a = null;

[실습2] 샘플 41의 테이블 구조 확인 
DESC sample41;

[실습3] 샘플 41의 no열을 null로 수정불가능

--------------------------------------------- 
< 물리삭제 & 논리삭제 > 
--------------------------------------------- 
<COUNT 집계 함수 > 

select count(*) from sample51;
+----------+
| count(*) |
+----------+
|        5 |
+----------+

---------------------------------------------

[실습] 샘플51 name열이 A행 추출

mysql> select * from sample51 where name = 'A';
+------+------+----------+
| no   | name | quantity |
+------+------+----------+
|    1 | A    |        1 |
|    2 | A    |        2 |
+------+------+----------+

--------------------------------------------- 
[실습2] 샘플51 name열이 A행 카운트 함수 

mysql> select count(*) from sample51 where name ='A';
+----------+
| count(*) |
+----------+
|        2 |
+----------+

--------------------------------------------- 

[실습3] no 열 ,name 카운트 

*name열은 null값이 있기 때문에 카운트를 하지 않는다.

mysql> select count(no), count(name) from sample51;
+-----------+-------------+
| count(no) | count(name) |
+-----------+-------------+
|         5 |           4 |
+-----------+-------------+

--------------------------------------------- 
[실습] 아래 두 쿼리의 결과값 확인 

select all name from sample51;
--> name 모두 추출

select DISTINCT name from sample51;
--> 중복 값 제거 

--------------------------------------------- 

[실습] 샘플 51의 ALL name과 DISTINCT name 개수 확인 

-->

select count(ALL NAME), COUNT(DISTINCT name) from sample51;

+-----------------+----------------------+
| count(ALL NAME) | COUNT(DISTINCT name) |
+-----------------+----------------------+
|               4 |                    3 |
+-----------------+----------------------+

--------------------------------------------- 

< COUNT 외 집계 함수 > 

- SUM([ALL | DISTINCT] 집합)
- AVG([ALL | DISTINCT] 집합)
- MIN([ALL | DISTINCT] 집합)
- MAX([ALL | DISTINCT] 집합)

[실습] 샘플51 quantity 합계 구하기 

mysql> select SUM(quantity) from sample51;
+---------------+
| SUM(quantity) |
+---------------+
|            16 |
+---------------+


--------------------------------------------- 


[실습2] 샘플51 name열 합계 구하기

#문자열이기 때문에 

mysql> select SUM(DISTINCT name) from sample51;
+--------------------+
| SUM(DISTINCT name) |
+--------------------+
|                  0 |
+--------------------+

--------------------------------------------- 

[실습3] 샘플51 quantity열의 평균 구하기 

mysql> select AVG(quantity) from sample51;
+---------------+
| AVG(quantity) |
+---------------+
|        4.0000 |
+---------------+

--------------------------------------------- 

[실습4] 샘플51 quantity열의 평균, 합계 , 수량 구하기
mysql> select AVG(quantity) as '평균', SUM(quantity) as '합계' , count(quantity) as '수량' from sample51;
+--------+------+------+
| 평균   | 합계 | 수량 |
+--------+------+------+
| 4.0000 |   16 |    4 |
+--------+------+------+

--------------------------------------------- 

[실습5] 샘플51 quantity열의 평균을 구하고 만약 
quantity에 NULL이 있을때는 0으로 치환후 계산,
이름은 avgnull0

mysql> select AVG(case when quantity is NULL then 0
    -> ELSE QUANTITY
    -> END) AS avgnull0
    -> from sample51;


+----------+
| avgnull0 |
+----------+
|   3.2000 |
+----------+

--------------------------------------------- 
최고 값 구하기 ! 

mysql> select max(quantity) from sample51;
+---------------+
| max(quantity) |
+---------------+
|            10 |
+---------------+

--------------------------------------------- 
최솟값 구하기  !

mysql> select min(all quantity) from sample51;
+-------------------+
| min(all quantity) |
+-------------------+
|                 1 |
+-------------------+

'MYSQL' 카테고리의 다른 글

MYSQL -4 스키마, 인덱스  (1) 2022.09.19
MYSQL - 기초3 (GROUP BY, 서브쿼리)  (1) 2022.09.19
MYSQL 데이터 다운로드 오류  (0) 2022.09.19
MYSQL - 1 조건문 , 패턴매칭 ,예약어  (1) 2022.09.16
MYSQL 8.0 설치 방법  (0) 2022.09.16
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유