3. SQL 기본 문법

하쮸·2024년 8월 13일

SQL

목록 보기
3/6
post-thumbnail

3. SQL 기본 문법

3-1. 기본중에 기본 SELECT ~ FROM ~ WHERE

  • SELECT 문은 구축이 완료된 테이블에서 데이터를 추출하는 기능을 함.

    • 아무리 많이 사용해도 기존의 데이터는 변경되지 않음.
    • 테이블에서 데이터를 가져올 때 사용하는 예약어
  • SELECT의 가장 기본 형식 --> SELECT ~ FROM ~ WHERE

    • SELECT 다음에는 열 이름,
      FROM 다음에는 테이블 이름,
      WHERE 다음에는 조건식
      (조건식을 다양하게 표현함으로써 원하는 데이터를 뽑아낼 수 있음.)

SELECT문은 데이터베이스의 테이블을 조회한 후 결과를 보여줌.


3-2. 데이터베이스

  • DROP DATABASE IF EXISTS market_db;

    • DROP DATABASE는 market_db를 삭제하는 문장
  • CREATE DATABASE market_db;

    • 데이터베이스를 새로 만듦.
  • USE market_db;

    • USE 문은 market_db 데이터베이스를 선택하는 문장
    • MySQL Workbench의 SCHEMAS 패널에서 데이터베이스를 더블클릭하는 것과 동일한 효과
  • CHAR : Character의 약자로, 고정길이 문자형. 즉 자릿수가 고정 되어 있음.

  • VARCHAR : Variable Character의 약자로, 가변길이 문자형.

    • VARCHAR가 CHAR보다 공간을 효율적으로 운영할 수 있지만 MySQL 내부적으로 성능면에서는 CHAR로 설정하는 것이 조금 더 좋다.
  • CREATE TABLE buy

    • buy 테이블을 생성
  • num INT AUTO_INCREMENT NOT NULL PRIMARY KEY

    • AUTO_INCREMENT : 자동으로 숫자를 입력해준다.
      • 순번은 직접 입력할 필요 없이 1, 2, 3, ....과 같은 방식으로 자동으로 증가 함.

3-3. 데이터를 입력하는 INSERT문

  • CHAR,VARCHAR,DATE형은 작은 따옴표로 값을 묶어줘야 됨.
    INT형은 없어도 됨.
  • AUTO_INCREMENT로 지정해준 열은 자동으로 입력 되므로 그 자리에는 NULL이라고 써주면 됨
  • date : 날짜 표현('0000-00-00')(3바이트),
    datetime : 날짜와 시간을 같이 표현('0000-00-00 00:00:00')(8바이트)

3-4. 기본 조회하기 SELECT ~ FROM

  • 데이터 조회하기

    • SELECT (*) FROM member; --> member 테이블 모든 열 조회
    • SELECT (*) FROM buy;
  • USE 문

    • SELECT 문을 실행하려면 먼저 사용할 데이터베이스를 지정 해야 함.
    • 현재 사용하는 데이터베이스를 지정 또는 변경하는 형식
      • USE 데이터베이스 이름;
    • USE 문은 '지금부터 이 DB를 사용하겠으니 모든 쿼리는 이 DB에서 실행해라'는 의미.
    • 지정해 놓은 후에 다시 USE문을 사용하거나 다른 DB를 사용하겠다고 명시하지 않으면 앞으로 모든 SQL문은 가장 최근에 USE 해놓은 곳에서 수행 됨.
    • MySQL 워크벤치를 재시작하거나 쿼리 창을 새로 열면 다시 USE를 실행해야 함.
  • SELECT문의 기본형식 ( ) 묶인 부분은 생략 가능

    • SELECT select_expr
      (From table_references)
      (WHERE where_condition)
      (GROUP BY {col_name | expr | position})
      (HAVING where_condition)
      (ORDER BY {col_name | expr | position})
      (LIMIT {(offset,) row_count | row_count OFFSET offset})
  • 핵심만 표현

    • SELECT 열 이름
      FROM 테이블 이름
      WHERE 조건식
      GROUP BY 열 이름
      HAVING 조건식
      ORDER BY 열 이름
      LIMIT 숫자
  • 기본적인 형식

    • SELECT 열 이름
      FROM 테이블 이름
      WHERE 조건식

  • SELECT : 테이블에서 데이터를 가져올 때 사용하는 예약어.

  • 별표(*)

    • 일반적으로 모든 것을 의미
    • 일반적으로 별표(*)가 사용되는 위치가 열 이름이 적혀야 되는 곳이므로 모든 열을 말함.
  • FROM : FROM 다음에 테이블 이름이 나옴. 테이블에서 내용을 가져온다는 의미.

  • 원래 테이블의 전체 이름은 데이터베이스이름.테이블이름 형식으로 표현 함 (여기서 _는 띄어쓰기를 표현)

    • 원칙적으로 표현한 ex) SELECT * FROM market_db.member
    • 데이터베이스_이름을 생략하면 USE 문으로 선택해놓은 데이터베이스가 자동으로 지정 됨
  • 테이블에서 전체 열이 아닌 필요한 열만 가져오기

    • SELECT * 하면 모든 열을 선택한 케이스
      SELECT mem_name 으로 적으면 'mem_name'열만 가져옴
    • 여러 개의 열을 가져오고 싶은 경우 ,(콤마)로 구분해서 적으면 됨.
      이때 테이블 생성시 정했던 순서에 상관없이 출력하고 싶은 순서대로 적으면 됨.
  • 별칭(Alias)

    • 열 이름에 별칭(Alias)을 지정할 수 있음.
      열 이름 뒤에 지정하고 싶은 별칭을 적어주면 됨.
    • Ex) SELECT addr 주소, debut_date "데뷔 일자", height AS 키
      • AS(별칭)에 공백이 있는 경우에는 큰따옴표(" ")로 묶어줌.
        • 작은따옴표도 사용해도 되지만 INSERT 등에서 문자를 입력할 때 사용하므로 별칭에는 큰따옴표를 사용할 것을 권장.

3-5. 특정한 조건만 조회하기 SELECT ~ FROM ~ WHERE

  • WHERE : 조회하는 결과에 특정한 조건을 추가해서 원하는 데이터만 보고 싶을때 사용.
    필요한 것들만 골라서 결과를 보는 효과
    • 열_이름 = 값 형태로 작성하면 열의 값에 해당하는 결과만 출력해줌.
      • SELECT 열이름 FROM 테이블이름 WHERE 조건식;
  • 관계연산자, 논리연산자

    • 숫자로 표현된 데이터는 범위를 지정할 수 있음.
      • 키가 162보다 작은 케이스만 조회
        • Ex) WHERE height <= 162;
      • 키가 163 이상이면서 165이하인 케이스만 조회
        • Ex) WHERE height >= 163 AND height <= 165;
          (2가지 이상의 조건은 논리 연산자 AND사용)
      • 키가 163 이하 이거나 165 이상인 케이스
        • Ex) WHERE height <= 163 OR height >= 165;
          (OR은 여러 조건중 하나만 만족해도 됨.)
  • BETWEEN ~ AND : 범위에 있는 값을 구하는 경우 사용 (ex 숫자의 범위)

    • Ex) WHERE height BETWEEN 163 AND 165; ---> (163 <= X <= 165)
  • IN() : 조건식에서 여러 문자중 하나에 포함되는 지 비교할 때 사용

    • Ex) WHERE addr IN('경기', '전남', '경남');
    • 숫자로 구성된 데이터는 크다, 작다의 범위로 지정할 수 있으므로 BETWEEN ~ AND를 사용할 수 있지만
      데이터는 문자로 표현되기 때문에 어느 범위에 들어있다고 표현할 수 없음
      -> 이럴 경우 IN()을 사용
  • LIKE 와 언더바 '_'

    • LIKE : 문자열의 일부 글자를 검색할때 사용
      • Ex) WHERE mem_name LIKE '우%';
      • 제일 앞 글자가 '우'이고 그 뒤는 무엇이든(%) 허용한다는 의미
    • 언더바( _ ) : 한 글자와 매치하기 위해서 사용
      • Ex) WHERE mem_name LIKE '__핑크';
      • 이름(mem_name)의 앞 두글자는 상관없고 뒤는 '핑크'인 경우를 검색
  • SELECT 안에는 또 다른 SELECT문이 들어갈 수 있음.
    이것을 서브 쿼리(Sub Query) 또는 하위 쿼리라 부름

    • Ex) 홍길동의 키보다 큰 회원을 검색
      SELECT height From member WHERE mem_name = '홍길동';
      출력 결과 height : 164

    • Ex) 164보다 큰 회원 조회
      SELECT mem_name, height From member WHERE height > 164;

  • 이때 이 두 SQL을 하나로 결합 하는 걸 서브 쿼리.

    • SELECT mem_name, height From member WHERE height > (
      SELECT height From member WHERE mem_name = '홍길동'
      );
    • 세미콜론(;)이 하나이므로 이 SQL은 하나의 문장이다.
    • 서브 쿼리의 장점은 2개의 SQL을 하나로 만듦으로써 하나의 SQL만 관리하면 되므로 더 간단해진다.

3 - 6. 좀 더 깊게 알아보는 SELECT문

  • SELECT 문에서
    • 결과의 정렬을 위한 ORDER BY
    • 결과의 개수를 제한 하는 LIMIT
    • 중복된 데이터를 제거하는 DISTINCT
    • 지정한 열의 데이터들을 같은 데이터끼리는 묶어서 결과를 추출하는 GROUP BY
      • 주로 합계, 평균, 개수 등을 처리할 때 사용하므로 집계함수와 함께 사용
    • HAVING 절을 통해 조건식을 추가
      (WHERE절과 비슷해 보이지만 GROUP BY절과 함께 사용되는 것이 차이점)
  • ORDER BY : 결과가 출력되는 순서를 조절 함.
    • SELECT 열 이름
      FROM 테이블 이름
      WHERE 조건식
      GROUP BY 열 이름
      HAVING 조건식
      ORDER BY 열 이름
      LIMIT 숫자
    • Ex) ORDER BY height;
    • Ex) ORDER BY height DESC;
      • 기본값은 ASC(Ascending)로 오름차순을 의미.
        DESC(Descending)는 내림차순을 의미.
    • 정렬 기준을 여러 개 열로도 지정 가능.
      우선 첫 번째 지정 열로 정렬한 후에 동일할 경우에는 다음 지정 열로 정렬할 수 있음.
      ex) ORDER BY height DESC, debut_date ASC;
  • LIMIT : 출력하는 개수를 제한 함.

    • Ex) LIMIT 3
      • 전체 중 앞에서 3건만 조회
    • 형식 : LIMIT 시작, 개수
      • LIMIT 시작, 개수는 LIMIT 개수 OFFSET 시작이라고 쓰는 것과 동일.
        • LIMIT는 첫 데이터를 0번으로 설정하고 시작.
      • Ex) LIMIT 3; == LIMIT 0, 3; (즉 0번째 부터 3건)
      • Ex) LIMIT 3, 2; ---> 이런 식으로 중간부터 출력도 가능
        (3번째부터 2건만 조회)
    • 주로 ORDER BY와 함께 사용
  • DISTINCT : 조회된 결과에서 중복된 데이터를 1개만 남김.

    • DISTINCT를 열 이름 앞에 붙이면 중복된 값은 1개만 출력 됨
      • Ex) SELECT DISTINCT addr FROM member;
  • GROUP BY, HAVING

    • SELECT 열이름
      WHERE 조건식
      GROUP BY 열이름
      HAVING 조건식
      ORDER BY 열이름
      LIMIT 숫자
    • GROUP BY : 그룹으로 묶어주는 역할
    • 집계함수 : 주로 GROUP BY 절과 함께 쓰이며 데이터를 그룹화(Grouping) 해주는 기능을 함
      • SUM() : 합계를 구함
      • AVG() : 평균을 구함
      • MIN() : 최소값을 구함
      • MAX() : 최대값을 구함
      • COUNT() : 행의 개수 세어줌
      • COUNT(DISTINCT) : 행의 개수를 세어줌 (중복은 1개만 인정)
    • Ex) SELECT mem_id "회원 아이디", SUM(COUNT) "총 구매 개수" FROM buy GROUP BY mem_id;
    • Ex) SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액" FROM buy GROUP BY mem_id;
    • Ex)SELECT COUNT(*) FROM member;
      --> COUNT(*)은 모든 행의 개수를 셈 (NULL 포함)
    • Ex)SELECT COUNT(phone1) FROM member;
      --> COUNT(열 이름)은 열 이름의 값이 NULL인 것을 제외한 행의 갯수를 셈
  • HAVING : WHERE와 비슷한 개념으로 조건을 제한하는 것이지만 집계 함수에 대해서 조건을 제한 하는 것.

    • HAVING 절은 꼭 GROUP BY 절 다음에 나와야 함.
      • GROUP BY와 관련된 조건절은 HAVING을 사용해야 함.
        • Ex)
          SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
          FROM buy GROUP BY mem_id
          HAVING SUM(price*amount) > 1000;
          GROUP BY ~~;

3 - 7. 데이터 변경을 위한 SQL 문

데이터를 입력/수정/삭제하는 기능

  • INSERT : 새로운 값을 입력할 때

  • UPDATE : 정보를 수정할때

  • DELETE : 삭제할 때

  • INSERT : 테이블에 행 데이터를 입력하는 기본적인 SQL문

    • INSERT INTO 테이블 {(열1, 열2, ...)} VALUES (값1, 값2, ...)

      • 테이블 이름 다음에 나오는 열은 생략 가능.
        단 생략 했을 경우에 VALUES 다음에 나오는 값들의 순서 및 개수는 테이블을 정의할 때의 열 순서 및 개수와 동일해야 함.
        - Ex)
        CREATE TABLE hon1 (toy_id INT, toy_name CHAR(4), age INT);
        INSERT INTO hon1 VALUES (1, '우디', 25);
    • 만약 아이디와 이름만 입력하고 나이를 생략한다면 테이블 이름 뒤에 입력할 열의 이름을 써줘야 함.
      이 경우 나이 열에는 아무것도 없다는 의미의 NULL값이 들어감.

      • Ex)
        INSERT INTO hon1 (toy_id, toy_name) VALUES (2, '버즈');
  • AUTO_INCREMENT : 열을 정의할 때 1부터 증가하는 값을 입력해줌.

    • INSERT에서는 해당 열이 없다고 생각하고 입력하면 됨.
    • 주의할 점은 AUTO_INCREMENT로 지정하는 열은 꼭 PRIMARY KEY로 지정해줘야 함 .
      • Ex)
        CREATE TABLE hon1
        (toy_id INT AUTO_INCREMENT PRIMARY KEY, toy_name CHAR(4), age INT);
    • 자동 증가하는 부분은 NULL값으로 채워 놓으면 됨
      • Ex) INSERT INTO hon1 VALUES
        (NULL, '보핍', 25);
  • 만약 AUTO_INCREMENT로 입력되는 다음 값을 100부터 시작하도록 변경

    • ALTER TABLE hon1 AUTO_INCREMENT = 100;
      • ALTER TABLE은 테이블을 변경하라는 의미
        (테이블의 열 이름 변경, 새로운 열 정의, 열 삭제등의 작업을 함)
    • 증가하는 값 변경 : 시스템 변수인 @@auto_increment_increment를 변경시켜야 함.
      • Ex)
        ALTER TABLE hon1 AUTO_INCREMENT = 100; ---> 100부터 시작
        SET @@auto_increment_increment = 3; ---> 증가값은 3으로 지정
  • 시스템 변수

    • 시스템 변수란 MySQL에서 자체적으로 가지고 있는 설정값이 저장된 변수를 말함.
    • 시스템 변수는 앞에 @@가 붙는 것이 특징임.
    • 시스템 변수의 값을 확인하려면
      SELECT @@시스템변수 를 실행하면 됨.
      SHOW GLOBAL VARIABLES : 전체 시스템 변수의 종류를 알고 싶다면.
  • 다른 테이블의 데이터를 한 번에 입력하는 INSERT INTO ~ SELECT

    • 다른 테이블에 이미 데이터가 입력되어 있다면
      INSERT INTO ~ SELECT 구문을 사용해 해당 테이블의 데이터를 가져와서 한 번에 입력할 수 있음.
      INSERT INTO 테이블이름 (열이름1, 열_이름2, ...) SELECT 문 ;

    • 주의할 점은 SELECT문의 열 개수는 INSERT할 테이블의 열 개수와 같아야 함.

      • Ex) world.city 테이블의 내용을 city_popul 테이블에 입력하기
        • INSERT INTO city_popul
          SELECT Name, Population FROM world.city;
    • 데이터베이스이름.테이블이름으로 다른 데이터베이스의 테이블에 접근할 수 있음

      • DESC는 Describe의 약자로 테이블의 구조를 출력해주는 기능을 해줌
        (테이블 구조를 확인할 수 있음)
        • Ex) DESC world.city;
  • UPDATE : 기존에 입력되어 있는 값을 수정하는 명령어

    • UPDATE 테이블 이름
      SET 열1 = 값1, 열2 = 값2, ...
      WHERE 조건 ;
    • Ex) UPDATE city_popul
      SET city_name = '뉴욕', population = 0         
      콤마로 분리해서 여러개의 열을 변경
      WHERE city_name = 'NEW York';
    • 주의할 사항 : UPDATE 문에서 WHERE 절은 문법상 생략이 가능하지만
      WHERE 절을 생략하면 테이블의 모든 행의 값이 변경 됩니다
      .
      Ex) UPDATE city_popul SET city_name = '서울'
      ----> 모든 도시 이름(city_name)이 '서울'로 바뀜
  • DELETE : 행 단위로 데이터 삭제

    • 형식 : DELETE FROM 테이블 이름 WHERE 조건;
      • Ex) DELETE FROM city_popul WHERE city_name LIKE 'New%';
        ----> city_poplu 테이블에서 'New'로 시작하는 도시들 삭제
    • 주의할 사항 : UPDATE와 마찬가지로 WHERE 절이 생략되면
      전체 행 데이터를 삭제하므로 주의해야 함
      .

3 - 8. 대용량 테이블 삭제

  • DELETE 문은 삭제가 오래 걸림.

  • DROP 문은 테이블 자체를 삭제 함.

  • TRUNCATE 문도 DELETE와 동일한 효과를 내지만 속도가 엄청 빠름.

  • DROP은 테이블이 아예 없어지지만 DELETE, TRUNCATE는 빈 테이블 남김.

    • 결론적으로 대용량 테이블의 전체 내용을 삭제할 때 테이블 자체가 필요 없을 경우
      DROP으로 삭제
      테이블의 구조는 남겨놓고 싶다면
      TRUNCATE로 삭제하는 것이 효율적
profile
Every cloud has a silver lining.

0개의 댓글