MariaDB로 SQL 공부_3

·2023년 4월 21일
0

SQL

목록 보기
3/4
post-thumbnail

💻 터미널에서 SQL 기초 문법 공부하기

// study DB 내 tStaff 테이블 생성
CREATE TABLE tStaff
    -> (
    -> name CHAR(15) PRIMARY KEY,
    -> depart CHAR(10) NOT NULL,
    -> gender CHAR(3) NOT NULL,
    -> joindate DATE NOT NULL,
    -> grade CHAR(10) NOT NULL,
    -> salary INT NOT NULL,
    -> score DECIMAL(5,2) NULL
    -> );

// 테이블 내 정보 입력
INSERT INTO tStaff VALUES ('김유신','총무부','남','2000-2-3','이사',420,88.8);
INSERT INTO tStaff VALUES ('유관순','영업부','여','2009-3-1','과장',380,NULL);
INSERT INTO tStaff VALUES ('안중근','인사과','남','2012-5-5','대리',256,76.5);
INSERT INTO tStaff VALUES ('윤봉길','영업부','남','2015-8-15','과장',350,71.25);
INSERT INTO tStaff VALUES ('강감찬','영업부','남','2018-10-9','사원',320,56.0);
INSERT INTO tStaff VALUES ('정몽주','총무부','남','2010-9-16','대리',370,89.5);
INSERT INTO tStaff VALUES ('허난설헌','인사과','여','2020-1-5','사원',285,44.5);
INSERT INTO tStaff VALUES ('신사임당','영업부','여','2013-6-19','부장',400,92.0);
INSERT INTO tStaff VALUES ('성삼문','영업부','남','2014-6-8','대리',285,87.75);
INSERT INTO tStaff VALUES ('논개','인사과','여','2010-9-16','대리',340,46.2);
INSERT INTO tStaff VALUES ('황진이','인사과','여','2012-5-5','사원',275,52.5);
INSERT INTO tStaff VALUES ('이율곡','총무부','남','2016-3-8','과장',385,65.4);
INSERT INTO tStaff VALUES ('이사부','총무부','남','2000-2-3','대리',375,50);
INSERT INTO tStaff VALUES ('안창호','영업부','남','2015-8-15','사원',370,74.2);
INSERT INTO tStaff VALUES ('을지문덕','영업부','남','2019-6-29','사원',330,NULL);
INSERT INTO tStaff VALUES ('정약용','총무부','남','2020-3-14','과장',380,69.8);
INSERT INTO tStaff VALUES ('홍길동','인사과','남','2019-8-8','차장',380,77.7);
INSERT INTO tStaff VALUES ('대조영','총무부','남','2020-7-7','차장',290,49.9);
INSERT INTO tStaff VALUES ('장보고','인사과','남','2005-4-1','부장',440,58.3);
INSERT INTO tStaff VALUES ('선덕여왕','인사과','여','2017-8-3','사원',315,45.1);

// 테이블 확인
 SELECT*FROM tStaff;
 +--------------+-----------+--------+------------+--------+--------+-------+
| name         | depart    | gender | joindate   | grade  | salary | score |
+--------------+-----------+--------+------------+--------+--------+-------+
| 강감찬       | 영업부    || 2018-10-09 | 사원   |    320 | 56.00 |
| 김유신       | 총무부    || 2000-02-03 | 이사   |    420 | 88.80 |
| 논개         | 인사과    || 2010-09-16 | 대리   |    340 | 46.20 |
| 대조영       | 총무부    || 2020-07-07 | 차장   |    290 | 49.90 |
| 선덕여왕     | 인사과    || 2017-08-03 | 사원   |    315 | 45.10 |
| 성삼문       | 영업부    || 2014-06-08 | 대리   |    285 | 87.75 |
| 신사임당     | 영업부    || 2013-06-19 | 부장   |    400 | 92.00 |
| 안중근       | 인사과    || 2012-05-05 | 대리   |    256 | 76.50 |
| 안창호       | 영업부    || 2015-08-15 | 사원   |    370 | 74.20 |
| 유관순       | 영업부    || 2009-03-01 | 과장   |    380 |  NULL |
| 윤봉길       | 영업부    || 2015-08-15 | 과장   |    350 | 71.25 |
| 을지문덕     | 영업부    || 2019-06-29 | 사원   |    330 |  NULL |
| 이사부       | 총무부    || 2000-02-03 | 대리   |    375 | 50.00 |
| 이율곡       | 총무부    || 2016-03-08 | 과장   |    385 | 65.40 |
| 장보고       | 인사과    || 2005-04-01 | 부장   |    440 | 58.30 |
| 정몽주       | 총무부    || 2010-09-16 | 대리   |    370 | 89.50 |
| 정약용       | 총무부    || 2020-03-14 | 과장   |    380 | 69.80 |
| 허난설헌     | 인사과    || 2020-01-05 | 사원   |    285 | 44.50 |
| 홍길동       | 인사과    || 2019-08-08 | 차장   |    380 | 77.70 |
| 황진이       | 인사과    || 2012-05-05 | 사원   |    275 | 52.50 |
+--------------+-----------+--------+------------+--------+--------+-------+

✍🏻 집계 함수

여러 개의 레코드에 대해 집합적 계산을 수행하여 합계, 평균, 분산 같은 통계값을 산출함

1. COUNT

SELECT COUNT(*) FROM tStaff;
+----------+
| COUNT(*) |
+----------+
|       20 |
+----------+

// COUNT를 총 직원수로 별명 부여
SELECT COUNT(*) AS "총 직원수" FROM tStaff;
+---------------+
| 총 직원수     |
+---------------+
|            20 |
+---------------+

// 월급이 400 이상인 사람 수 구하기
SELECT COUNT(*) FROM tStaff WHERE salary >=400;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+

// 월급이 400 이상인 사람 이름 목록 구하기
SELECT name FROM tStaff WHERE salary >=400;
+--------------+
| name         |
+--------------+
| 김유신       |
| 신사임당     |
| 장보고       |

// 중복제거 함수 DISTINCT 사용
SELECT COUNT(DISTINCT depart) FROM tStaff;
+--------------+

🍳 연습문제

1. 실적 없이 노는 직원 2명 목록 구하기
SELECT name FROM tStaff WHERE score IS NULL;

2. 성취도 80점 이상인 직원 수 구하기
SELECT COUNT(*) FROM tStaff WHERE score  >=80;

🤔 기타 함수

  • SUM : 합계 계산
  • AVG : 평균 계산
  • MIN : 최소값 계산
  • MAX : 최댓값 계산
  • STDDEV : 표준 편차 계산
  • VARIANCE : 분산 계산

2. 그룹핑

SELECT depart, AVG(salary) FROM tStaff WHERE salary > 300 GROUP BY depart HAVING AVG(salary) >=360 ORDER BY depart;
+-----------+-------------+
| depart    | AVG(salary) |
+-----------+-------------+
| 인사과    |    368.7500 |
| 총무부    |    386.0000 |
+-----------+-------------+

원본 테이블 ( WHERE )-> 통계 대상 선정 ( GROUP BY ) + ( AVG ) -> 집계 ( HAVING ) -> 출력 대상 ( ORDER BY ) -> 출력

✍🏻 컬럼값 삭제하기

하나의 컬럼값만 비교, 삭제하기

DELETE FROM user WHERE id='apple';

여러개의 컬럼값 비교, 삭제하기

WHERE 절은 단일값만 비교 가능!

SELECT*FROM user;
+-----------+----------+------+--------------+----------+-----------+
| id        | password | name | phone_number | birthday | email     |
+-----------+----------+------+--------------+----------+-----------+
| shjee     | 1234     | EL   | 01062702217  | 29091999 | shjee2217 |
| shjee2217 | 1234     | EL   | 01062702217  | 29091999 | shjee2217 |
| svfwsvs   | sdvs     | EL   | 01062702217  | 12091999 | svfdsv    |
+-----------+----------+------+--------------+----------+-----------+

DELETE FROM user WHERE id IN('shjee','svfwsvs');

SELECT*FROM user;
+-----------+----------+------+--------------+----------+-----------+
| id        | password | name | phone_number | birthday | email     |
+-----------+----------+------+--------------+----------+-----------+
| shjee2217 | 1234     | EL   | 01062702217  | 29091999 | shjee2217 |
+-----------+----------+------+--------------+----------+-----------+

🤍 참조

' 김상형의 sql 정복 ', 김상형 저, 5장 데이터 집계

profile
화이트해커 꿈나무 엘입니다😉

0개의 댓글