데이터 조회 1

순동·2022년 3월 10일

📌 SELECT / WHERE

  • SELECT : 테이블의 데이터를 조회할 때 사용하는 구문이다.
  • * : asterisk, 각 row의 모든 column들의 값을 보여달라는 의미이다.
  • FROM : '~부터', 어느 테이블에서부터 데이터를 조회할 것인지를 나타낸다.
  • FROM 이후에는 데이터를 조회하고 싶은 테이블의 이름을 작성한다.
  • WHERE : 특정 조건을 만족하는 row들만 조회한다.
SELECT * FROM copang_main.member;

SELECT email, age, address FROM copang_main.member;

특정 조건을 만족하는 row들만 보려면 어떻게 할까 ❓

SELECT * FROM copang_main.member WHERE email = 'taehos@hanmail.net';

📝 SQL문 작성 형식

  • 하나의 SQL문 끝에는 세미콜론(;)을 작성해줘야 한다. 문법 상 세미콜론이 하나의 SQL문을 종결하는 단위이기 때문이다.
  • SQL문 안에는 공백이나 개행(줄바꿈)을 자유롭게 넣을 수 있다.
  • MySQL에 기본으로 내장된 키워드를 예약어라고 한다. 예약어는 대문자로 써주고(가독성을 위해), 나머지 부분은 소문자로 작성한다.
  • 서로 다른 데이터베이스에 같은 이름의 테이블이 존재할 수 있으므로 데이터베이스.테이블;를 사용한다.
  • USE 데이터베이스는 어떤 데이터베이스를 사용하겠다고 확실하게 정의하는 것이다. 그럼 그 이후로는 SELECT * FROM 테이블;로 작성해도 된다.

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

✅ 나이가 27살 이상인 회원만 조회

SELECT * FROM copang_main.member WHERE age >= 27;

✅ 나이가 30대(30~39세)인 회원만 조회

SELECT * FROM copang_main.member WHERE age BETWEEN 30 AND 39;
  • BETWEEN A AND B : A부터 B까지 (구간)

✅ 나이가 30대인 회원만 제외하고 조회

SELECT * FROM copang_main.member WHERE age NOT BETWEEN 30 AND 39;
  • NOT : 부정을 나타내므로 ~이 아닌 것을 의미한다.

✅ 2019년 1월 1일 이후로 가입한 사람을 조회

SELECT * FROM copang_main.member WHERE sign_up_day > '2019-01-01';
  • int가 아닌 DATE 형식의 값들도 부등호를 사용할 수 있다.

✅ 2018년도에 가입한 회원 조회

SELECT * FROM copang_main.member WHERE sign_up_day BETWEEN '2018-01-01' AND '2018-12-31';

'' 또는 "" 안에 들어가는 값은 보통 문자열을 표현할 때 사용한다. 다만 DATEDATETIME 과 같은 시간관련 함수에서는 문자열 형태로 써준다.


📌 문자열 패턴 매칭 조건

✅ 주소가 서울인 회원들 조회

SELECT * FROM copang_main.member WHERE address LIKE '서울%';
  • LIKE : 표현 값이 서울% 처럼 생긴 값을 조회한다.
  • 서울% : 문자열의 첫 부분은 서울로 시작하고, 그 뒤는 임의의 길이를 가진 문자열을 의미한다.

SELECT * FROM copang_main.member WHERE address LIKE '%고양시%';
  • %고양시% : 고양시라는 단어 앞 뒤로 임의의 길이를 가진 문자열을 의미한다.


📝 조건 표현식

  1. 같지 않음 (!=, <>)
    ex) 남자가 아닌 회원들만 조회하기
SELECT * FROM copang_main.member WHERE gender != 'm';
SELECT * FROM copang_main.member WHERE gender <> 'm';
  1. 이 중에 있는 ~ (IN)
    ex) 나이가 딱 20살 또는 딱 30살인 회원들만 조회하기
SELECT * FROM copang_main.member WHERE age IN (20, 30);

  1. 한 글자를 나타내는 _
    LIKE 뒤의 언더바(_)는 문자 하나를 나타낸다.
    ex) 이메일 주소가 c로 시작하고, 그 뒤에 여섯 글자가 있는 row 조회하기
SELECT * FROM copang_main.member WHERE email LIKE 'c_____@%';

c 뒤에 언더바가 5개 있는 상태이다. c로 시작하고, 그 뒤에 다섯글자, 그리고 @ 하나, 그 뒤에 임의의 길이를 가진 문자열을 나타낸다.


📝 DATE 데이터 타입 관련 함수

  1. 연도, 월, 일
    DATE 타입의 값에서 연도(year), 월(month),일(day)만 추출할 수 있다.

✅ 1992년에 태어난 회원들만 조회

SELECT * FROM copang_main.member WHERE YEAR(birthday) = '1992';

✅ 여름(6, 7, 8)월에 가입한 회원들만 조회

SELECT * FROM copang_main.member WHERE MONTH(sign_up_day) IN(6, 7, 8);

✅ 각 달의 후반부(15~31일)에 가입했던 회원들만 조회

SELECT * FROM copang_main.member WHERE DAYOFMONTH(sign_up_day) BETWEEN 15 AND 31;

DAYOFMONTH 함수는 날짜값에서 일만 뽑아낼 수 있다.

  1. 날짜 간의 차이
    DATEDIFF 함수로 날짜 간의 차이를 구할 수 있다.
    DATEDIFF(날짜 a, 날짜 b) = 날짜 a - 날짜 b

✅ 각 회원이 가입한 일자가 2019년 1월 1일을 기준으로 몇 일 이후인지

SELECT email, sign_up_day, DATEDIFF(sign_up_day, '2019-01-01') FROM copang_main.member;

꼭 테이블에 있던 컬럼이 아니더라도 조화할 때 새로운 컬럼을 붙여서 볼 수도 있다.

✅ 오늘 날짜를 기준으로 살펴보기

오늘 날짜를 구하는 함수는 CURDATE() 함수이다.

SELECT email, sign_up_day, CURDATE(), DATEDIFF(sign_up_day, CURDATE()) FROM copang_main.member;

✅ 회원들이 몇 살일 때 가입했는지

(가입일 - 생일) / 365를 하면 알 수 있다.

SELECT email, sign_up_day, DATEDIFF(sign_up_day, birthday) / 365 FROM copang_main.member;

  1. 날짜 빼기 더하기
    DATE_ADD() : 날짜 더하는 함수
    DATE_SUB() : 날짜 빼는 함수

✅ 가입일 기준으로 300일 이후 날짜

SELECT email, sign_up_day, DATE_ADD(sign_up_day, INTERVAL 300 DAY) FROM copang_main.member;

✅ 가입일 기준으로 250일 이전 날짜

SELECT email, sign_up_day, DATE_SUB(sign_up_day, INTERVAL 250 DAY) FROM copang_main.member;
  1. UNIX Timestamp 값

날짜뿐만 아니라 시간까지 포함하는 컬럼이라면 DATETIME이라는 데이터 타입을 사용해야 한다.

그러나 문제는 어떤 테이블에는 날짜와 시간이 상당히 큰 숫자값으로 적혀있는 경우들이 있다는 것이다. 이것 또한 날짜와 시간을 나타내는 값으로 이러한 형식의 날짜시간 값을 UNIX Timestalmp라고 한다.

UNIX Timestalmp은 특정 날짜의 특정 시간을 1970년 1월 1일을 기준으로 총 몇 초가 지났는지를 나타낸 값이다.

✅ DATE 타입(sign_up_day)의 값을 UNIX Timestamp로 바꾸기

SELECT email, sign_up_day, UNIX_TIMESTAMP(sign_up_day) FROM copang_main.member;

UNIX_TIMESTAMP(sign_up_day)를 사용한다.

✅ UNIX Timestapm를 DATE 타입으로 바꾸기

SELECT email, sign_up_day, FROM_UNIXTIME(UNIX_TIMESTAMP(sign_up_day)) FROM copang_main.member;

FROM_UNIXTIME(UNIX_TIMESTAMP())를 사용한다.


0개의 댓글