mySQL 데이터 조회

SELECT : 테이블데이터조회 할 때 사용하는 구문.
* : asterisk. 각 row의 모든 컬럼들을 보여달라는 의미.

1
SELECT * FROM main.member;

SELECT와 WHERE

1

특정 컬럼의 내용을 보고 싶을 때 조회 가능하다.

1
SELECT email, age, address FROM main.member;

2

  • 그냥 member이라고도 사용해도 된다.
  • 다른 데이터 베이스의 같은 테이블 이름을 가질 수 있으므로 데이터 베이스의 이름도 함께 적어두는 것이 좋다.
1
SELECT * FROM main.member;
1
SELECT * FROM member;

3

WHERE : 이메일 값이 해당 주소여야 하는 조건을 추가하는 것이다.

1
SELECT * FROM member WHERE email = 'mjaedot@gmail.com';

SQL 작성 형식

SQL문 끝에는 세미콜론이 반드시 존재하여야 한다.

  • 문법상 세미콜론이 하나의 SQL문을 종결하는 단위.

SQL문 안에는 공백이나 개행 등을 자유롭게 넣을 수 있다.

  • 어떤 방법으로 하든 구분되어야 할 키워드들이 최소한 하나의 공백으로 구분되어 있고 세미콜론으로 마무리되어 있으면 실행에 문제가 없다.
  • 많은 공백을 주는 행위
    1
    SELECT * FROM main.member        WHERE email = 'mjaedot@gmail.com';
  • SQL문의 일부분을 한줄 내리고 탭을 입력한후에 쓰는 행위
    1
    2
    SELECT * FROM main.member
    WHERE email = 'mjaedot@gmail.com';

SQL문의 대소문자 구분 문자

  • 예약어(mySQL에 기본적으로 내장된 키워드)대문자로 적는 것이 관례 이자 보기에도 좋음.
    • 대문자로 쓰는 것이 필수는 아니기 때문에 소문자로 작성하여도 실행이 된다.
    • 가독성을 위해 대문자로 사용하는 것이 좋다.
  • 데이터 베이스의 이름, 테이블 이름, 컬럼 이름 등은 대소문자를 가리지 않고 실제 존재하는 것의 이름을 기재한다.

데이터 베이스 이름과 테이블 이름

  • 서로 다른 데이터 베이스에 같은 이름의 테이블이 존재할 수도 있기 때문에 데이터 베이스 이름 뒤에 점(.)을 붙이고 테이블 이름을 기재한다.
  • SCHEMAS 패널 부분의 데이터 베이스를 클릭하여 활성하면 해당 데이터베이스를 사용할 것이라고 지정한 것과 같으므로 이럴 경우 테이블 이름만 기재해도 된다.
  • 해당 데이터 베이스를 사용하겠다고 확실하게 선언하면 그 뒤로는 테이블 이름만 기재해도 된다.
    1
    2
    USE main;
    SELECT * FROM member;

조건을 나타내는 다양한 방법

  • 나이가 27살 이상인 데이터를 조회하고 싶을 때
    1
    SELECT * FROM main.member WHERE age >= 27;
  • 나이가 30대인 데이터를 조회하고 싶을 때

    BETWEEN A AND B : A부터 B까지

    1
    SELECT * FROM main.member WHERE age BETWEEN 30 AND 39;
  • 나이가 30대가 아닌 데이터를 조회하고 싶을 때

    NOT BETWEEN A AND B : A부터 B를 제외한 데이터

    1
    SELECT * FROM main.member WHERE age NOT BETWEEN 30 AND 39;
  • 특정 날짜 이후의 데이터를 조회하고 싶을 때

    date 타입 컬럼에도 부등호를 사용 가능하다.

    1
    SELECT * FROM main.member WHERE sign_up_day > '2019-01-01';
  • 특정 날짜 사이의 데이터를 조회하고 싶을 때
    1
    SELECT * FROM main.member WHERE sign_up_day BETWEEN '2018-01-01' AND '2018-12-31';

문자열 패턴 매칭 조건

LIKE

  • 문자열이 특정 문자로 시작하고 임의의 길이를 가진 문자열을 출력한다.
  • 뒤에 문자열이 없어도 되고 100자가 있어도 무방하다.

예시

  • ‘서울’로 시작하는 데이터를 조회한다.
    1
    SELECT * FROM member WHERE address LIKE '서울%';
    1
    2
    3
    서울 송파구...
    서울 강남구...
    서울 양천구...
  • ‘고양시’라는 단어가 포함된 모든 데이터를 조회한다.
    1
    SELECT * FROM member WHERE address LIKE '%고양시%';
    1
    2
    경기 고양시...
    경기도 고양시...

그 밖에 알아야할 조건 표현식

같지 않음 (!=, <>)

  • 같지 않음을 표현할 때 !=<>을 사용한다.

이 중에 있는~ (IN)

  • 연속된 범위가 아닌 여러 값들 중 해당하는 값이 있는 row를 추려야 할 때
  • 정확히 20살, 혹은 30살 회원들을 조회할 때
    1
    SELECT * FROM main.member WHERE AGE IN(20, 30);

한글자를 나타내는 _

  • LIKE 뒤의 %는 임의의 길이를 가진 문자열(0자 포함)을 나타낸다.
  • LIKE 뒤의 _는 문자 하나를 나타낸다.
  • c로 시작하되 c 뒤에 5글자인 이메일을 찾고 싶을 때 _를 5번 적용한다.
    1
    SELECT * FROM main.member WHERE email LIKE 'c_____@%';

DATE 데이터 타입 관련 함수

연도, 월, 일 추출하기

  • YEAR 함수를 적용하여 1992년에 태어난 회원들만 조회하기
    1
    SELECT * FROM main.member WHERE YEAR(birthday) = '1992';
  • MONTH 함수를 적용하여 여름(6, 7, 8월)에 가입한 회원들만 조회하기
    1
    SELECT * FROM main.member WHERE MONTH(sign_up_day) IN (6, 7, 8);
  • 각 달의 후반부(15일~30일)에 가입했던 회원들만 조회하기
    1
    SELECT * FROM main.member WHERE DAYOFMONTH(sign_up_day) BETWEEN 15 AND 31;

날짜 간의 차이 구하기

  • DATEDIFF(날찌a, 날짜b): ‘날짜 a - 날짜 b’를 해서 그 차이 일수를 알려준다.
  • 예를 들어 DATEDIFF('2018-01-05', '2018-01-03')의 값은 2이다.

예시

  • member 테이블에서 각 회원이 가입한 일자가 2019년 1월 1일 기준으로 몇일 이후인지 확인하고 싶을 때
    1
    SELECT email, sign_up_day, DATEDIFF(sign_up_day, '2019-01-01') FROM main.member;

    꼭 테이블에 원래 있는 컬럼이 아니더라도 조회할 때에는 새로운 컬럼을 붙여서 확인할 수도 있다.

  • 오늘 날짜 기준으로 살펴보고 싶을 때 (CURDATE() 오늘 날짜를 구하는 함수이다.)
    1
    SELECT email, sign_up_day, CURDATE(), DATEDIFF(sign_up_day, CURDATE()) FROM main.member;
  • 몇살이었을 때 가입하였는지 확인하고 싶을 때
    1
    SELECT email, sign_up_day, DATEDIFF(sign_up_day, birthday) / 365 FROM main.member;

날짜 더하기 빼기

  • DATE_ADD() : 더하기 함수
    1
    SELECT email, sign_up_day, DATE_ADD(sign_up_day, INTERVAL 300 DAY) FROM main.member;
  • DATE_SUB() : 빼기 함수
    1
    SELECT email, sign_up_day, DATE_SUB(sign_up_day, INTERVAL 300 DAY) FROM main.member;

UNIX Timestamp 값

  • 특정 날짜의 특정 시간을, 1970년 1월 1일을 기준으로, 총 몇 초가 지났는지로 나타낸 값 (ex. 1553526000)
  • UNIX_TIMESTAMP: Unix Timestamp로 바꿔주는 함수
    1
    SELECT email, sign_up_day, UNIX_TIMESTAMP(sign_up_day) FROM main.member;
    1
    2
    3
    4
    1553526000
    1453935000
    1459435400
    ...
  • FROM_UNIXTIME : Unix timestamp를 이걸 사람이 읽을 수 있는 날짜 형태로 변경
    1
    SELECT email, sign_up_day, FROM_UNIXTIME(UNIX_TIMESTAMP(sign_up_day)) FROM main.member;
    1
    2
    3
    2019-03-26 00:00:00
    2019-02-27 00:00:00
    ...

참고

여러개의 조건 걸기

  • AND: 동시에 조건을 충족시키는 데이터를 조회
    1
    2
    3
    4
    SELECT * FROM main.member
    WHERE gender = 'm'
    AND address LIKE '서울%'
    AND age BETWEEN 25 and 29;
  • OR : 조건1 or 조건2 하나라도 해당하는 데이터를 조회
    1
    2
    3
    SELECT * FROM main.member
    WHERE MONTH(sign_up_day) BETWEEN 3 AND 5
    OR MONTH(sign_up_date_ BETWEEN 9 AND 11;
  • ANDOR 조건을 혼합할 경우
    1
    2
    3
    SELECT * FROM main.member
    WHERE (gender = 'm' AND height >= 180)
    OR (gender = 'f' AND height >= 170);

여러 조건을 걸 때 주의할 점

or을 사용할 때 주의사항

1
SELECT * FROM main.member WHERE id = 1 OR id = 2;
1
SELECT * FROM main.member WHERE id = 1 OR 2;

위 두 코드는 같지 않다.
WHERE id = 1 OR 2을 분리해서 보면 (1) id=1이 true, (2) 2로 나눌 수 있다.
MySQL에서는 0을 False, 0 이외의 숫자는 모두 True로 간주하기 때문에 WHERE id = 1 OR TRUE가 되어버린다.

AND와 OR간의 우선순위

  • AND가 OR보다 우선 순위가 더 높기 때문에 첫번째 코드는 틀린 코드이고 두번째 코드가 올바른 코드이다.
    1
    2
    SELECT * FROM main.member
    WHERE gender = 'f' OR age < 30 AND height > 180;
    1
    2
    SELECT * FROM main.member
    WHERE (gender = 'f' OR age < 30) AND height > 180;

문자열 패턴 매칭 조건을 사용할 때 주의사항

이스케이핑(escaping) 문제

  • 이스케이핑(escaping) : 원래 특정 의미(‘임의의 길이를 가진 문자열’)를 나타내던 문자(%)를 그 특정 의미가 아니라, 일반적인 문자처럼 취급하는 행위
    1
    SELECT * FROM main.text WHERE sentence LIKE '%%%';
    우리가 원하는 ‘문자로서의 %’가 아니라 ‘LIKE에서 쓰이는 표현식’으로 간주되어, ‘임의의 길이를 가진 문자열’을 나타내는 것으로 해석된다.
    1
    SELECT * FROM main.text WHERE sentence LIKE '%\%%';
    이는 역슬래시(백슬래시) 기호를 붙여주면 해결된다.
  • 작은 따옴표(') 이스케이핑
    1
    SELECT * FROM main.test WHERE sentence LIKE '%\'%';
  • 언더바(_) 이스케이핑
    1
    SELECT * FROM main.test WHERE sentence LIKE '%\_%';
  • 큰 따옴표(") 이스케이핑
    1
    SELECT * FROM main.test WHERE sentence LIKE '%\"%';

    대소문자 구분 문제

  • 소문자 g를 검색해도 대소문자 구분 없이 g, G 모두 조회된다. 이는 MySQL의 기본 설정때문이다.
    1
    SELECT * FROM main.test WHERE sentence LIKE '%g%';

    Table collation 항목에서 utf8mb4_0900_ai_ci 값의 ci는 case-insensitive의 약자로 문자열이 동일한지 확인할 때, 대소문자를 구별하지 않겠다는 의미이다.

  • BINARY는 해당 0과 1이 정확히 일치하는 것을 찾으라는 의미로 0과 1을 보는 수준까지 문자열을 비교하라는 의미이다.
    1
    SELECT * FROM main.test WHERE sentence LIKE BINARY '%G%';

데이터 정렬해서 보기

  • 정렬: ‘row’들을 ‘특정 컬럼’ 기준으로 순서대로 출력.

    NULL은 가장 작은 수로 취급되지만 DBMS마다 다르고, 표시하지 않고 작업하는 것이 좋다.

    1
    2
    SELECT * FROM main.member
    ORDER BY height;
  • 오름차순: ASC (기본적으로 오름차순)
    1
    2
    SELECT * FROM main.member
    ORDER BY height ASC;
  • 내림차순: DESC
    1
    2
    SELECT * FROM main.member
    ORDER BY height DESC;
  • 조건 추가
    1
    2
    3
    SELECT * FROM main.member
    AND weight >= 70
    ORDER BY height ASC;
    1
    2
    SELECT sign_up_day, email FROM main.member
    ORDER BY YEAR(sign_up_day) DESC, email ASC;

ORDER BY

  • 이름을 먼저 쓴 컬럼을 우선으로 해서 정렬이 차례대로 수행된다.
  • SQL 문법상 WHERE는 ORDER BY 앞에 나와야 한다.

정렬시 주의할 점

  • 숫자형(INT 등)인 경우와 문자열형(TEXT 등)인지에 따라 정렬결과가 달라진다.
  • INT 타입의 값은 숫자의 대소(크고 작음)을 기준으로 정렬
  • TEXT 타입의 값은 한 문자 씩 문자 순서를 비교하여 정렬
  • 숫자값이 담긴 컬럼을 정렬 기준으로 할 때는 그 컬럼의 데이터 타입이 숫자형인지, 문자열형인지를 잘 살펴봐야 한다.
  • TEXT 타입을 숫자형으로 정렬하고 싶을 경우 CAST 라는 함수를 사용한다.
    1
    SELECT * FROM main.test ORDER BY CAST(data AS signed) ASC; 

    CAST(data AS signed): 일시적으로 signed라는 데이터 타입으로 변환하라.
    signed: 양수와 음수를 포함한 모든 정수를 나타낼 수 있는 데이터 타입

데이터 일부만 추려보기

  • LIMIT: 몇개만 추려서 조회하고 싶을 때 사용한다.
    1
    2
    3
    SELECT * FROM main.member
    ORDER BY sign_up_day DESC
    LIMIT 10;

    LIMIT 8, 2: 8번째부터 시작하여 2개만 추려라.
    row는 0번째부터 시작한다.


REFERENCE
코드잇 온라인 강의 개발자를 위한 SQL 데이터베이스

  • © 2020-2025 404 Not Found
  • Powered by Hexo Theme Ayer