[MySQL] MySQL 기본문법
in Study on Web
MySQL의 기본 문법에 대해서 알아보자.
CRUD
회원가입, 회원탈퇴, 게시판 등에서 사용하는 데이터베이스를 관리하는 4개의 기능이다.
각각 생성, 읽기, 수정, 삭제를 가리키며 MySQL 문법에서는 아래와 같이 대응된다.
- Create : INSERT INTO
- Read : SELECT FROM
- Update : UPDATE
- Delete : DELETE
SELECT
CRUD 중에서 READ에 대응되는 단어로
기본적인 문장은 아래와 같다.
-- SELECT * FROM 테이블
SELECT * FROM minco.honey;
minco.honey 테이블의 모든 것을 읽어온다.
*는 모든 필드를 출력하고 싶을 때 사용한다.
SELECT num, name from minco.honey;
minco.honey 테이블에서 num과 name 속성만 읽어온다는 의미이다.
WHERE
WHERE을 붙혀서 가져올 조건을 생성할 수 있다.
-- SELECT 필드 FROM TABLE WHERE 조건
-- num이 2 이상 4 이하인 테이블의 레코드들을 가져온다
SELECT * from minco.honey where num >= 2 and num <= 4;
-- 이름이 영호인 레코드를 가져온다
SELECT * from minco.honey where name='영호';
-- 1번
SELECT * from minco.honey where num=3 or num=5;
-- 2번
SELECT name, age from minco.honey where num >= 2 and num <= 5;
-- 3번
SELECT * from minco.honey where age >= 30 and age <= 39;
-- 4번
SELECT * from minco.honey where num % 2 = 0 and age % 2 = 1;
AS
AS를 통해서 속성이 보여질 이름을 정해줄 수 있다.
-- AS 쓰기
SELECT num, name, age as 나이 FROM minco.honey;
정렬 (ASC, DESC)
-- 정렬
-- 오름차순 DEFAULT ASC
-- 내림차순 desc
SELECT * from honey order by age desc;
-- limit 레코드 수 제한
-- offset 시작 위치
select * from honey limit 3 offset 3;
-- 1번 나이의 오름차순으로 정렬한다.
SELECT num as 번호, name as 성함, age as 나이 from honey order by 나이 asc;
-- 2번 : 이름의 사전순서대로 정렬한다.
SELECT name as 이름, age as 나이 from honey order by 이름 asc;
INSERT
CRUD 중에서 CREATE에 대응되는 단어이다.
활용예시는 아래와 같다.
-- insert into 테이블 values(값1, 값2, 값3)
insert into minco.honey value(7, "이순신", 20);
insert into minco.honey value(8, "박중박", 50);
UPDATE
CRUD 중에서 UPDATE에 대응되는 단어이다.
update 테이블 set 필드=바꿀값 where 조건 형태로 사용된다.
-- update 이순신의 나이를 320세로 바꾸고 박중박의 이름을 박재훈으로 수정
update minco.honey set age=320 where num=7;
update minco.honey set name="박재훈" where num=8;
-- 전체나이 320살로 변경 시도
update minco.honey set age = 320;
SQL Workbench에서는 safe update mode로 인해서 막힌다.
물론 설정에서 수정이 가능하다.
safe update mode란?
다수의 레코드들이 한꺼번에 UPDATE 되는 사고를 막기 위한 장치
DELETE
CRUD 중에서 DELETE에 대응되는 단어이다.
delete from 테이블 where 조건 형태로 사용된다.
-- 방금 insert했던 7번, 8번 레코드 제거
delete from minco.honey where num = 7;
delete from minco.honey where num = 8;
BETWEEN
조건을 부여할 때 두 값 사이에 있는 행을 불러오고 싶을 것이다.
이 때, BETWEEN을 사용하며 경계값 포함하여 가져온다.
-- between
-- 주로 and 대신에 사용함.
-- 컬럼명 between 값1 and 값2
select * from world.city where Population between 500 and 900;
-- 인구수가 500명에서 900명 사이인 도시의 모든 속성을 가져온다.
IN
OR을 대신할 수 있는 코드이다.
값이 값1이거나 값2이거나.. 등등 을 만족하는 행을 불러오고 싶을 때 사용한다.
-- IN
-- 컬럼 in (값1, 값2, ...)
-- or 지정된 칼럼이 값의 특정값에 해당되는 조건
select * from city where Name in('Seoul', 'Sydney', 'Oxford');
-- 이름이 서울, 시드니, 옥스포드 인 도시의 모든 속성값을 가져온다.
LIKE
LIKE를 사용하여 어떤 글자로 시작하거나, 끝나거나, 포함하는 값을 만족하는
행을 가져올 수 있다.
이 때, %와 _가 사용된다.
-- LIKE
-- % <- 다중문자 _ <- 한글자
select * from city where Name like 'New%';
-- New~로 시작하는 모든 것을 가져온다
select * from city where Name like '%New%';
-- New가 들어가는 모든 것을 가져온다
select * from city where Name like '%New';
-- New로 끝나는 모든 것을 가져온다
-- binary를 붙일 경우 대소문자를 구분한다.
select * from city where binary Name like 'New%';
-- New로 시작하고 뒤에 Underbar 갯수만큼 있는 것들을 가져온다.
select * from city where binary Name like 'New___';
-- New로 시작하는 총 6글자 짜리 (New 3글자 + 언더바 3개)
그리고 사용 예시를 보자.
select * from city where Population < 1000 and Name like 'A%';
-- 인구수가 1000 미만이고 A로 시작하는 도시를 가져온다.
select Name, CountryCode from city where CountryCode = 'JPN' and Population between 1000000 and 2000000;
-- 나라코드가 JPN(일본)이고 인구수가 1000000에서 2000000인 도시의 이름과 나라코드를 가져온다.
select * from city where Name like '%kim%';
-- 도시 이름에 kim을 포함하는 도시의 모든 속성을 가져온다.
group by
같은 조건을 가진 그룹을 묶어서 값을 반환하는 코드이다.
-- 나라 별 도시 수를 출력한다.
Select CountryCode, count(Population) '도시수' from city group by CountryCode;
-- 나라 별 인구 수를 출력한다.
select CountryCode, sum(Population) '인구수' from city group by CountryCode;
having
같은 조건을 가진 그룹을 묶기 위해서 조건을 부여하는 단어이다.
-- having
-- where은 group by로 묶기 전의 조건
-- having은 group by로 묶은 뒤의 조건
-- 인구수가 100만이 넘는 조건을 만족하는 국가별 코드
select CountryCode, sum(Population) '인구수' from city group by CountryCode
having sum(Population) > 1000000;
JOIN
같은 열, 속성을 가진 테이블을 묶어서 처리하기 위한 단어이다.
SELECT 열 FROM 첫번째 테이블 조인의 종류 두번째 테이블 ON JOIN 조건
형태로 사용한다.
-- 각 사원들의 사원 번호, 부서번호를 가져온다.
-- inner join을 사용하기 위해서는 공통조건을 봐야한다.
-- 공통으로 존재하는 컬럼의 경우 어떤 곳의 컬럼인지 명시해야한다.
-- dept_emp 에도 dept_no 있고
-- departments 에도 dept_no가 있다
Select a1.emp_no as 사원번호, a1.first_name, a2.dept_no as 근무부서번호, a2.dept_name
from employees a1
INNER JOIN dept_emp a3 ON a1.emp_no = a3.emp_no
INNER JOIN departments a2 ON a2.dept_no = a3.dept_no;
-- 각 사원들의 사원번호, first_name, 현재 받고있는 급여액(salary) 가져오기
select a1.emp_no as 사원번호, a1.first_name, a2.salary
from employees a1 INNER JOIN salaries a2
ON a1.emp_no = a2.emp_no and a2.to_date = "9999-01-01";