ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SELECT
    SQL/sql 문법(mysql, mariaDB) 2024. 5. 1. 08:38

    ▤ 목차

      DML 을 공부해봤다. 조작어로 테이블 구조가 아닌 테이블 칼럼을 조작하는 언어이다.
      그 중 select는 DB 서버로부터 자료를 클라이언트로 읽어 오는 명령어이다.

      DB는 속도가 생명이다.
      같은 결과를 가져온다면, 1번에 왕복하는게 좋다.
      DB서버는 다양한 곳에서 데이터 처리를 요청받기 때문에
      원하는 데이터를 로컬 RAM에 한번에 가져오는 것이 좋다.

      (물론 서버의 한계가 있다면 상황에 따 Scale-up을 하거나 Scale -out을 고려해야한다.)
       
      우리는 select에 대해 배워보자.
       

      -- /////////////////////////select 형식////////////////////////
      
      SELECT [DISTINCT]	db명.소유자명.테이블명.칼럼명 [AS 별명]...
      [ INTO new_테이블명 ]  
      [ FROM 테이블명 ] [ WHERE 조건]  
      [ GROUP BY 표현식 ]  
      [ HAVING 조건 ]  
      [ ORDER BY 기준칼럼 [ ASC | DESC ] ]

       

      select를 연습하기 위해서는 적당한 자료들이 필요하다.
      MySQL 에서는 대용량 샘플 데이터를 제공한다. https://dev.mysql.com/doc/index-other.html

      나는 개인적으로 찾은 다른 데이터를 사용했다. (이름도 다 가짜로 지어진 그냥 샘플이다!)
      앞으로 사용할 데이터의 구조만 올려두겠다.

       
      부서 테이블 / 직원테이블 / 고객 테이블로 구성되어 있다.

      ✔ DB 모든 자료가져오기

      # 1번 방법
      SELECT * FROM jikwon;
      
      # 2번 방법
      SELECT jikwon_no, jikwon_name, buser_num FROM jikwon;

      💻 코드로 보기

      👏 추가 설명

      Asterisk (아스테리스크)라 불리는 *를 사용하는 것보다 칼럼명을 명시적으로 적어주는 것이 DB입자에서 더 좋아한다.
      대용량이라면 일부만  ram으로 읽어오고 필요할때 더 가져온다.
      원본 데이터랑 내 ram에 있는 데이터랑은 다르다. 내 변경사항을 올리려면 commit을 해야한다.
      heidiSQL은 auto-commit을 사용한다. 즉, 자동으로 원본 DB에 들어간다.
       

      ✔칼럼 별명 AS

      💻 코드로 보기

      SELECT jikwon_no AS 사번, jikwon_name 이름, buser_num '부서 번호'
      FROM jikwon;

      👏 추가 설명

      원본 DB랑 상관없다. 내 ram에 있는 데이터 처리와 상관있는 것이다.
      별명에 띄어쓰기가 필요하면 ''를 사용해야한다.


      ✔ 없는 칼럼 만들기

      💻 코드로 보기

      SELECT jikwon_name AS 이름,jikwon_pay AS 연봉, jikwon_pay*0.02 AS 기부금 FROM jikwon;

      👏 추가 설명

      원본 DB에는 기부금 column은 없다.  보통 데이터에는 순수한 데이터만 담는다.
      연산 결과를 담지 않는다. 하지만 지금처럼 select로 조회하면서 만들 수 있다.


      ✔ 칼럼에 데이터 더하기 CONCAT

      💻 코드로 보기

      SELECT CONCAT(jikwon_name,'님') as 이름 FROM jikwon;

      👏 추가 설명

      원래는 순수하게 이름만 존재했다. CONCAT를 사용해서 문자열을 붙인 것이다.


      ✔ 가상의 테이블 dual

      💻 코드로 보기

      SELECT 10, '안녕', 12+4, 12/3 FROM DUAL;

       

      👏 추가 설명

      가상의 테이블이 만들어진다. 테이블없이 연습하고 싶을 때, dual을 사용하자.


      ✔ 정렬 order by

      💻 코드로 보기

      # 1)
      SELECT * FROM jikwon ORDER BY buser_num ASC; -- 오름차순
      
      SELECT * FROM jikwon ORDER BY jikwon_jik; -- ASC 생략가능
      
      SELECT * FROM jikwon ORDER BY jikwon_pay desc; -- 내림차순
      
      # 2)
      SELECT jikwon_no, jikwon_name, jikwon_pay FROM jikwon ORDER BY buser_num;
      
      # 3)
      SELECT * FROM jikwon ORDER BY jikwon_jik DESC, buser_num ASC, jikwon_pay DESC;
      
      # 4)
      SELECT jikwon_no, jikwon_name, jikwon_pay*0.5 AS tax
      FROM jikwon ORDER BY tax DESC;

      👏 추가 설명

      1) 그룹이 형성된다. 기준 칼럼을 근거로 정렬된다.
       
      2) 원하는 것을 가져올 수 있다.
       
      3) 1차, 2차, 3차 키를 부여할 수 있다. 이때도 asc는 생략이 가능하다.
      보통 3차 키까지 부여한다.
       
      4)

      기준키로 사용이 가능하다.


      ✔ 데이터 중복 배제(없애기) distinct

      💻 코드로 보기

      SELECT distinct jikwon_jik FROM jikwon;

      👏 추가 설명

      distinct 를 사용하면 데이터의 중복값을 제거할 수 있다.


      ✔ 연산자 사용 where 조건

      연산자: () > 산술 > 관계(비교) > is null, like, in > between, not > and > or

      💻 코드로 보기

      SELECT * FROM jikwon WHERE jikwon_jik='대리';
      
      # 아래 두 쿼리 같은 결과를 가져온다.
      SELECT * FROM jikwon WHERE jikwon_jik!='대리';
      SELECT * FROM jikwon WHERE jikwon_jik <>'대리';

      👏 추가 설명

       where 구문은 레코드(행)를 제어하는 조건이 들어가야한다.
      조건은 부정적으로 줄 수도 긍정적으로 줄 수도 있는데,
      조건은 긍정적으로 줄 때 속도가 빠르다. 연산양이 적기때문이다.
       


      ✔ 숫자, 날짜에 ' ' 

      💻 코드로 보기

      # 숫자
      SELECT * FROM jikwon WHERE jikwon_no=3;
      SELECT * FROM jikwon WHERE jikwon_no='3';
      
      # 날짜
      SELECT * FROM jikwon WHERE jikwon_ibsail='2010-03-03';
      SELECT * FROM jikwon WHERE jikwon_ibsail='10-3-3';

       
       

       


      ✔ AND / OR 

      💻 코드로 보기

      # OR 사용
      SELECT * FROM jikwon WHERE jikwon_no = 5 OR jikwon_no=10;
      
      # AND 사용
      SELECT * FROM jikwon WHERE jikwon_jik ='사원' and jikwon_gen='남' AND jikwon_pay<=3500;
      
      # AND, OR 사용
      SELECT * FROM jikwon WHERE jikwon_jik ='사원' AND (jikwon_gen='남' or jikwon_pay<=3500);

      👏 추가 설명

      연산에서 ( )가 우선된다.
      ( ) > 산술 > 관계(비교) > is null, like, in > between, not > and > or
       


      ✔ 사이값 구하기 between

      💻 코드로 보기

      SELECT * FROM jikwon WHERE jikwon_no >=5 AND jikwon_no <=10;
      
      # between 사용
      SELECT * FROM jikwon WHERE jikwon_no between 5 AND 10;
      SELECT * FROM jikwon WHERE jikwon_ibsail BETWEEN '2017-1-1' AND '2020-12-12';
      
      # not between 사용
      SELECT * FROM jikwon WHERE jikwon_no not between 5 AND 10;

      👏 추가 설명

      날짜 사이의 값도 가져올 수 있다. 미만, 초과 값을 찾을 수 도 있다.


      ✔ 문자 연산

      💻 코드로 보기

      SELECT * FROM jikwon WHERE jikwon_name='홍길동';
      SELECT * FROM jikwon WHERE jikwon_name>='이';
      SELECT * FROM jikwon WHERE jikwon_name>='이순신';

      👏 추가 설명

      아스키 코드가 있으니 문자연산도 가능하다.


      ✔ 아스키 코드 출력 (내장함수)

      💻 코드로 보기

      SELECT ASCII(0) FROM DUAL;
      SELECT ASCII(0),ASCII('a'),ASCII('A'),ASCII('가') FROM DUAL;

      👏 추가 설명


      ✔ like % 연

      💻 코드로 보기

      # % : 0개 이상의 문자열
      SELECT * FROM jikwon WHERE jikwon_name LIKE '이%';
      SELECT * FROM jikwon WHERE jikwon_name LIKE '%라';
      SELECT * FROM jikwon WHERE jikwon_name LIKE '이%라';
      
      #_ : 한문자
      SELECT * FROM jikwon WHERE jikwon_name LIKE '이_라';
      SELECT * FROM jikwon WHERE jikwon_name LIKE '__라';
      SELECT * FROM jikwon WHERE jikwon_name LIKE '이순%' OR jikwon_name LIKE '이미%';

      👏 추가 설명

      정말 유용한 연산이다.
      _ 는 한글자를 의미한다. % 앞뒤 문자의 길이와 상관없다.
       


      ✔ null 찾기 is

      💻 코드로 보기

      -- select * FROM jikwon WHERE jikwon_jik=NULL;
      
      select * FROM jikwon WHERE jikwon_jik IS NULL;

      👏 추가 설명

      조건이 틀렸다. null은 키워드사용해야한다.
      관계 연산자는 is 키워드가 있다.
       


      ✔ limit

      💻 코드로 보기

      #~ 5번까지 값 (레코드 제한)
      select * FROM jikwon LIMIT 5;
      
      #5번부터 3개
      select * FROM jikwon LIMIT 5,3;
      
      #3개만 나온다.
      select jikwon_no, jikwon_name, jikwon_jik FROM jikwon where jikwon_jik='사원' LIMIT 3;
      
      select jikwon_no, jikwon_name, jikwon_jik FROM jikwon where jikwon_jik='사원' LIMIT 0,5;

      👏 추가 설명

      오라클에 rownum이 있다.
      마지막 쿼리를 보면  모든 인덱스는 0부터 시작되는 것을 알 수 있다.


       

      😊정리


       이런 종류가 있다는 것을 알아두자. 자주 사용하다보면 익숙하게 사용할 것이다. 필요할때 잘 찾아 사용할 수 있도록 알아두면 될 것같다 :-)

    Designed by Tistory.