MySQL Query

zihooy·2023년 5월 23일
1

Web Development

목록 보기
5/8
post-thumbnail

이전 포스트에 이어서 MySQL Query문에 대해 알아보자.

🏹 MySQL Query

Table 생성하기

Database를 생성한 후 Table을 생성한다.

CREATE TABLE `DB01`.`table01` (
  `id` INT NOT NULL,
  `name` VARCHAR(10) NULL,
  `age` INT NULL,
  `salary` INT NULL,
  PRIMARY KEY (`id`));

INSERT into table01 values(1, '호랑이1', 10, 1000);
INSERT into table01 values(2, '호랑이2', 20, 2000);
INSERT into table01 values(3, '호랑이3', 30, 3000);
INSERT into table01 values(4, '호랑이4', 40, 4000);

일부의 Row만 가져오기

-- 인덱스 0부터 3까지  
SELECT * FROM table01 limit 0, 3;
-- 인덱스 2부터 2개 더  
SELECT * FROM table01 limit 2, 2;

일부의 Column만 가져오기

SELECT 	id, 
		name, 
		age, 
		salary 
FROM table01;

🍯 Tip) 원하는 column만 쉽게 가져오기 위해 줄바꿈 처리를 한다.

연산

SELECT 	name, salary * 0.1 , salary + salary * 0.1 FROM table01;

Alias(별칭)

-- 1) 기본
SELECT 	name, salary as 급여, salary + salary * 0.1 as 수령금액, name as 이름, age as 나이 FROM table01;
-- 2) 별칭 사용 시 as 생략 가능
SELECT salary 급여 FROM table01; 
-- 3) 공백이 포함된 별칭 사용
SELECT salary `급    여` FROM table01; 
-- 4) 연산 추가 후 별칭 사용
SELECT salary * 12 `연    봉` FROM table01; 

1)을 실행했을 때 실행 결과

2개의 column을 1개로 합치기

SELECT concat(name, ' / ', age) as 이름나이 FROM table01; 
SELECT concat(name, '님의 나이는 ', age, '입니다') as 이름나이 FROM table01; 


DUAL

DUAL은 단일 행 결과를 반환하는 함수 또는 표현식을 사용하기 위해 임시로 사용되는 가상 테이블이다.

SELECT 3+4, sysdate() 날짜 FROM DUAL;

Table 초기화 및 null값이 포함된 데이터 생성

DROP table table01;

CREATE TABLE `DB01`.`table01` (
  id 		INT 		NOT NULL,
  name 		VARCHAR(10),
  age 		INT,
  salary 	INT,
  bonus		INT,
  PRIMARY KEY (`id`));
  
INSERT into table01 values(1, '호랑이1', 10, 1000, 11);
INSERT into table01 values(2, '호랑이2', 20, 2000, null);
INSERT into table01 values(3, '호랑이3', 30, 3000, 33);
INSERT into table01 values(4, '호랑이4', 40, 4000, null);
INSERT into table01 values(5, '호랑이5', 50, 5000, 55);

Null 값 처리

null 값을 해결하기 위해 데이터를 갱신하면 안된다!

-- 1) null 값을 처리하지 않을 때 
SELECT name, salary * 12  + bonus `연    봉` FROM table01; 
-- 2) ifnull을 사용해서 null값을 처리할 때 
SELECT name, salary * 12  + ifnull(bonus, 0) `연    봉` FROM table01; 
-- 3) null 값을 999로 업데이트 
UPDATE table01 set bonus=999 WHERE bonus is null; 

1)을 실행한 결과

2)를 실행한 결과

📣 QUIZ) 백분위로 환산하는 예시

학점을 포함한 테이블을 생성한다.

DROP table table01; 
CREATE TABLE `DB01`.`table01` (
  id 		INT 		NOT NULL,
  name 		VARCHAR(10),
  result	float,
  PRIMARY KEY (`id`));

INSERT into table01 values(1, '호랑이1', 4.5);
INSERT into table01 values(2, '호랑이2', 4.0);
INSERT into table01 values(3, '호랑이3', 3.8);
INSERT into table01 values(4, '호랑이4', 2.8);

계산식을 활용하여 백분위로 환산하는 쿼리는?

정답:

SELECT id, name, result as 학점, ROUND(result/4.5 * 100, 2) as 환산결과 FROM table01;

중복 데이터 제거하기

테이블을 다시 생성해보자.

DROP table table01; 
CREATE TABLE `DB01`.`table01` (
  id 		INT 		NOT NULL,
  name 		VARCHAR(10),
  result	float,
  PRIMARY KEY (`id`));

INSERT into table01 values(1, '한국', 4.5);
INSERT into table01 values(2, '일본', 4.0);
INSERT into table01 values(3, '미국', 3.8);
INSERT into table01 values(4, '한국', 2.8);
INSERT into table01 values(5, '일본', 2.5);

SELECT 문에는 항상 ALL 키워드가 생략되어 있다.
이 대신에 DISTINCT 키워드를 사용하면 중복 데이터를 제거하고 출력할 수 있다.

SELECT ALL name from table01;
SELECT DISTINCT name from table01;

참고로, Null은 중복 제거가 되지 않는다.

정렬하기

ORDER BY 키워드를 활용한다.
DESC 를 활용하면 내림차순, ASC 를 활용하면 오름차순 정렬이 된다.
ASC 은 생략 가능하다.

주의할 것은, 테이블 내의 데이터 순서가 바뀐 것이 아니라, 출력할 때만 순서가 바뀐 것을 기억해야 한다.

SELECT * FROM table01 ORDER BY result; 
SELECT * FROM table01 ORDER BY result ASC; 
SELECT * FROM table01 ORDER BY result DESC; 

Column의 번호로 출력하기

 SELECT * FROM table01 ORDER BY 3; 

3의 index에는 result column이기 때문에, result를 기준으로 순차 정렬된 결과가 나온다. 이를 통해 Java에서 코드를 작성할 때 3 부분을 변수 값으로 활용할 수 있음을 알 수 있다.

2차 정렬하기

테이블을 다시 생성해보자.

DROP table table01; 
CREATE TABLE `DB01`.`table01` (
  id 		INT 		NOT NULL,
  name 		VARCHAR(10),
  result	float,
  result2	INT,
  PRIMARY KEY (`id`));

INSERT into table01 values(1, '한국', 4.5, 5);
INSERT into table01 values(2, '일본', 4.0, 4);
INSERT into table01 values(3, '미국', 3.8, 3);
INSERT into table01 values(4, '한국', 3.8, 2);
INSERT into table01 values(5, '일본', 2.5, 1);
-- 1) 1차 정렬
SELECT * FROM table01 ORDER BY result ASC;
-- 2) 2차 정렬
SELECT * FROM table01 ORDER BY result ASC, result2 ASC;

2)처럼 2차 정렬을 하게 되면, result2의 값까지 반영하기 때문에 1)의 결과에서 한국과 미국의 순서가 달라졌음을 알 수 있다.

📣 QUIZ) 부서별로 월급 정렬하기

DROP table table01; 
CREATE TABLE `DB01`.`table01` (
  id 		INT 		NOT NULL,
  name 		VARCHAR(10),
  dept		VARCHAR(10),
  salary	INT,
  PRIMARY KEY (`id`));

INSERT into table01 values(1, '호랑이1', '경영', 100);
INSERT into table01 values(2, '호랑이2', '개발', 150);
INSERT into table01 values(3, '호랑이3', '영업', 300);
INSERT into table01 values(4, '호랑이4', '개발', 700);
INSERT into table01 values(5, '호랑이5', '영업', 500);
INSERT into table01 values(6, '호랑이6', '경영', 350);
INSERT into table01 values(7, '호랑이7', '개발', 250);
INSERT into table01 values(8, '호랑이8', '영업', 450);

위 쿼리를 실행하여 테이블을 생성하고 부서별로 월급을 정렬하는 쿼리는?

정답:

SELECT id, name, dept, salary FROM table01 ORDER BY dept, salary;

🍯 Tip) 만약 ~ 별로 정렬하라는 문제가 나왔다면
1. ORDER BY
2. 그룹함수(통계)
을 활용하면 된다.

📣 QUIZ) 3과목의 합을 역순 정렬하기

DROP table table01; 
CREATE TABLE `DB01`.`table01` (
  id 		INT 		NOT NULL,
  name 		VARCHAR(10),
  kor		INT,
  eng		INT,
  mat		INT,
  PRIMARY KEY (`id`));
  
INSERT into table01 values(1, '김말자', 66, 78, 80);
INSERT into table01 values(2, '홍길동', 80, 79, 92);
INSERT into table01 values(3, '신혜순', 98, 94, 100);
INSERT into table01 values(4, '홍태현', 77, 67, 82);
INSERT into table01 values(5, '차인봉', 75, 86, 90);

위와 같이 테이블을 생성하고, 3과목의 합을 역순으로 정렬하는 쿼리는?

정답:

SELECT id, name, (kor+eng+mat) as sum FROM table01 ORDER BY sum DESC;

WHERE를 활용하여 조건 걸기

DROP table table01; 
CREATE TABLE `DB01`.`table01` (
  id 		INT 		NOT NULL,
  name 		VARCHAR(10),
  kor		INT,
  eng		INT,
  mat		INT,
  PRIMARY KEY (`id`));
  
INSERT into table01 values(1, '김말자', 66, 78, 80);
INSERT into table01 values(2, '홍길동', 80, 79, 92);
INSERT into table01 values(3, '신혜순', 98, 94, 100);
INSERT into table01 values(4, '홍태현', 77, 67, 82);
INSERT into table01 values(5, '차인봉', 75, 86, 90);

위와 같이 테이블을 생성하자.

국어점수가 50점 이상인 사람들만 보고 싶다면 다음의 쿼리를 사용하면 된다.

SELECT * FROM table01 WHERE kor > 50;

국어와 영어의 평균이 75점 이상인 사람들만 보고 싶다면 다음의 쿼리를 사용하면 된다.

SELECT * FROM table01 WHERE (kor+eng)/2 > 75;

또한 ANDOR, LIKE 등의 키워드를 활용할 수도 있다.

-- and or 사용하기
-- 1) 
SELECT * FROM table01 WHERE kor > 75 AND kor < 95;
-- like 사용하기
-- 2) 첫 글자가 '홍'으로 시작
SELECT * FROM table01 WHERE name LIKE '홍%';	
-- 3) 첫 글자가 '홍'으로 시작 & 국어 점수가 75점 이상
SELECT * FROM table01 WHERE name LIKE '홍%' AND kor > 78;	
-- 4) 마지막 글자가 '자'
SELECT * FROM table01 WHERE name LIKE '%자';	
-- 5) 특정 글자('호')가 있을 때
SELECT * FROM table01 WHERE name LIKE '%호%';	

2) 실행 결과

3) 실행 결과

글자수 조건 걸기

만약 이름이 2자인 사람만 조회하고 싶다면, 다음과 같이 WHERELIKE 키워드를 활용한다.

SELECT * FROM table01 WHERE name LIKE '__';

만약 이름이 2글자가 아닌 사람만 조회한다면, 다음과 같이 된다.

SELECT * FROM table01 WHERE name NOT LIKE '__';
profile
thisIsZihooLog

0개의 댓글