출처: https://3months.tistory.com/307 [Deep Play]

SQL

SQL 기본

코딩하는 랄뚜기 2022. 2. 1. 00:59

DML(Data Manipulation Language)

  • 데이터 조작 언어
  • 데이터를 조작(선택,삽입,수정,삭제) 하는 데 사용되는 언어
  • DML 구문이 사용되는 대상은 테이블의 해
  • DML을 사용하기 위해서는 꼭 그 이전에 테이블이 정의 되어 있어야 함
  • SQL문 중 SELECT,INSERT,UPDATE,DELETE가 이 구문에 해당
  • Transaction이 발생하는 SQL도 이 DML에 속함
    • 테이블의 데이터를 변경(입력/수정/삭제) 할 때 실제 테이블에 환전히 적용하지 않고, 임시로 적용시키는 것
    • 취소 가능

DDL(Data Definition Language)

  • 데이터 정의 언어
  • 데이터베이스, 테이블, 뷰, 인덱스 등의 데이터베이스 개체를 생성/삭제/변경 하는 역할
  • CREATE, DROP, ALTER구문
  • DDL은 transaction을 발생시키지 않음
  • ROLLBACK이나 COMMIT 사용 불가
  • DDL문은 실행 즉시 MySQL에 적용

DCL(Data Control Language)

  • 데이터 제어 언어
  • 사용자에게 어떤 권한을 부여하거나 빼앗을 때 부로 사용하는 구문
  • GRANT/REVOCK

기본 명령어 모음

 

SHOW DATABASES

  • 현재 서버에 어떤 DB가 있는지 보기

 USE

  • 사용할 데이터베이스 지정 ( USE database_name )
  • 지정해 놓은 후 특별히 다시 USE문 사용하거나 다른 DB를 사용하겠다고 명시하지 않는 이상 모든 SQL문은 지정 DB에서 수행
  • Workbench에서 [Navigator]->[SCHEMAS]->데이터베이스를 선택하여 직접 선택 가능

SHOW TABLE STATUS

  • 데이터베이스 world의 테이블 정보 조회

 DESCRIBE(DESC)

  • 테이블에 무슨 열이 있는지 확인 (속성 정보 확인)

SELECT

  • <SELECT...FROM>
  • 요구하는 데이터를 가져오는 구문
  • 일반적으로 가장 많이 사용되는 구문
  • 데이터베이스 내 테이블에서 원하는 정보를 추출
  • SELECT의 구문 형식
    • SELECT select_expr
      	[FROM table_references]
          [WHERE where_condition]
          [GROUP BY {col_name | expr | position}]
          [HAVING where_condition]
          [ORDER BY {col_name | expr | condition}]
  • SELECT * FROM table_name - table에 있는 모든 data를 불러오라는 의미
  • SELECT row_name FROM table_name - 테이블에서 필요로하는 열만 가져옴, 여러 개일 경우 콤마로 구분

SELECT FROM WHERE

  • 기본적인 WHERE절
    • 조회하는 경로가에 특정한 조건으로 원하는 데이터만 보고 싶을 때 사용
    • SELECT field_name FROM table_name WHERE 조건식
    • 조건이 없을 경우 테이블의 크기가 클수록 찾는 시간과 노력이 증가
  • 관계 연산자의 사용
    • OR 연산자
    • AND 연산자
    • 조건 연산자( =, <, >, <=, >=, <, >, != etc)
    • 관계 연산자( NOT, AND, OR etc)
    • 연산자의 조합으로 데이터를 효율적으로 추출
    • 데이터가 숫자로 구성되어 있어 연속적인 값은 두 개의 조건연산자를 사용하기보다는 BETWEEN...AND를 사용하도록 하자
    • 이산적인(Discrete) 값의 조건에서는 IN() 사용 가능
  • ANY
    • 서브쿼리의 여러 개의 결과 중 한 가지만 만족해도 가능
    • SOME은 ANY와 동일한 의미로 사용
    • = ANY 구문은 IN과 동일한 의미
    • SELECT *
      FROM city
      WHERE Population > ANY ( SELECT Population
      			 FROM city
                               WHERE District = 'New York');
  • ALL
    • 서브쿼리의 여러 개의 결과를 모두 만족시켜야 함

ORDER BY

  • 결과가 출력되는 순서를 조절하는 구문
  • 기본적으로 오름차순(ASCENDING)정렬
  • 내림차순(DESCENDING)으로 정렬하고 싶다면 열 이름 뒤에 DESC를 적어 줄것
SELECT *
FROM city
ORDER By Population DESC
  • 콤마를 이용하여 조건을 추가할 수 있다.

DISTINCT 

  • 중복된 것은 1개씩만 보여주면서 출력
  • 테이블의 크기가 클수록 효율적
SELECT DISTINCT CountryCode
FROM city;

LIMIT

  • 출력 개수를 제한
  • 상위의 N개만 출력하는 'LIMIT IN' 구문
  • 서버의 처리량을 많이 사용해 서버의 전반적인 성능을 나쁘게 하는 악성 쿼리문 개선할 때 사용

GROUP BY

  • 그룹으로 묶어주는 역할
  • 집계 함수(Aggregate Function)를 함께 사용
    • AVG() : 평균
    • MIN() : 최소값
    • MAX() : 최대값
    • COUNT() : 행의 개수
    • COUNT(DISTINCT) : 중복 제외된 행의 개수
    • STDEV() : 표준 편차
    • VARIANCE() : 분산
  • 효율적인 데이터 그룹화 (Grouping)
  • 읽기 좋게 하기위해 별칭(Alias) 사용
SELECT CountryCode, MAX(Population) AS 'Populataion'
FROM city
GROUP BY CountryCode

HAVING

  • WHERE과 비슷한 개념으로 조건 제한
  • 집계 함수에 대해서 조건 제한하는 편리한 개념
  • HAVING절은 반드시 GROUP BY절 다음에 나와야 함
SELECT CountryCode, Name, MAX(Population)
FROM city
GROUP BY CountryCode
HAVING MAX(Population) > 8000000

ROLLUP

  • 총합 또는 중간함계가 필요할 경우 사용
  • GROUP BY절과 함께 WITH ROLLUP문 사용
SELECT CountryCode, Name, SUM(Populatioin)
FROM city
GROUP BY CountryCode, Name WITH ROLLUP

JOIN

  • JOIN은 데이터베이스 내의 여러 테이블에서 가져온 레코드를 조합하여 하나의 테이블이나 결과 집합으로 표현
SELECT *
FROM city
JOIN country ON city.CountryCode = country.Code

MySQL 내장함수

  • 사용자의 편의를 위해 다양한 기능의 내장 함수를 미리 정의하여 제공
  • 대표적인 내장 함수의 종류
    • 문자열 함수
    • 수학 함수
    • 날짜와 시간 함수

LENGTH()

  • 전달받은 문자열의 길이를 반환한다.

CONCAT()

  • 전달받은 문자열을 모두 결합하여 하나의 문자열로 반환
  • 전달받은 문자열 중 하나라도 NULL이 존재하면 NULL을 반환

LOCATE()

  • 문자열 내에서 찾는 문자열이 처음으로 나타나는 위치를 찾아서 해당 위치를 반환
  • 찾는 문자열이 문자열 내에 존재하지 않으면 0을 반환(SQL의 경우 index의 시작점이 1이다.)
  • MySQL에서는 문자열의 시작 인덱스를 1부터 계산

LEFT(),RIGHT()

  • LEFT() : 문자열의 왼쪽부터 지정한 개수만큼의 문자를 반환
  • RIGHT() : 문자열의 오른쪽부터 지정한 개수만큼 문자를 반환

LOWER(), UPPER()

  • LOWER() : 문자열의 문자를 모두 소문자로 변경
  • UPPER() : 문자열의 문자를 모두 대문자로 변경

REPLACE()

  • 문자열에서 특정 문자열을 대체 문자열로 교체

TRIM()

  • 문자열의 앞이나 뒤, 또는 양쪽 모두에 있는 특정 문자를 제거
  • TRIM() 함수에서 사용할 수 있는 지정자
    • BOTH : 전달받은 문자열의 양 끝에 존재하는 특정 문자를 제거 (기본 설정)
    • LEADING : 전달받은 문자열 앞에 존재하는 특정 문자를 제거
    • TRAILING : 전달받은 문자열 뒤에 존재하는 특정 문자를 제거
  • 만약 지정자를 명시하지 않으면, 자동으로 BOTH로 설정
  • 제거할 문자를 명시하지 않으면, 자동으로 공백을 제거
SELECT TRIM(LEADING '#' FROM '###MySQL##'),
TRIM(TRAILING '#' FROM '###MySQL##');

FORMAT()

  • 숫자 타입의 데이터를 세자리마다 쉼표(,)를 사용하는 '#,###,###.##'형식으로 변환
  • 반환되는 데이터의 형식은 문자열 타입
  • 두 번째 인수는 반올림할 소수 부분의 자릿수

FLOOR(),CEIL(),ROUND()

  • FLOOR() : 올림
  • CEIL() : 내림
  • ROUND() : 반올림

SQRT(), POW(), EXP(), LOG()

  • SQRT() : 양의 제곱근
  • POW() : 첫 번째 인수로는 밑수를 전달하고, 두 번째 인수로는 지수를 전달하여 거듭제곱 계산
  • EXP() : 인수로 지수를 전달 받아, e의 거듭제곱을 계산
  • LOG() : 자연로그 값을 계산

SIN(),COS(),TAN()

  • 사인, 코사인, 탄젠트 반환

ABS(),RAND()

  • ABS(x) : 절대값을 반환
  • RAND() : 0.0 보다 크거나 같고 1.0보다 작은 하나의 실수를 무작위로 생성

NOW(), CURDATE(), CURTIME()

  • NOW() : 현재 날짜와 시간을 반환, 반환되는 값은 'YYYY-MM-DD HH:MM:SS' 또는 YYYYMMDDHHMMSS 형태로 반환
  • CURDATE() : 현재 날짜를 반환, 이때 반환되는 값은 'YYYY-MM-DD' 또는 YYMMDD 형태로 반환
  • CURTIME() : 현재 시간을 반환, 이때 반환되는 값은 'HH:MM:SS' 또는 HHMMSS 형태로 반환

DATE(), MONTH(), DAY(), HOUR(), MINUTE(), SECOND()

  • DATE() : 전달받은 값에 해당하는 날짜 정보를 반환
  • MONTH() : 월에 해당하는 값을 반환하며, 0부터 12 사이의 값을 가짐
  • DAY() : 일에 해당하는 값을 반환하며, 0부터 31사이의 값을 가짐
  • HOUR() : 시간에 해당하는 값을 반환하며, 0부터 23사이의 값을 가짐
  • MINUTE() : 분에 해당하는 값을 반환하며, 0 부터 59 사이의 값을 가짐
  • SECCOND() : 초에 해당하는 값을 반환하며, 0 부터 59 사이의 값을 가짐

MONTHNAME(), DAYNAME()

  • MONTHNAME() : 월에 해당하는 이름을 반환
  • DAYNAME() : 요일에 해당하는 이름을 반환

DAYOFWEEK(), DAYOFMONTH(), DAYOFYEAR()

  • DAYOFWEEK() : 일자가 해당 주에서 몇 번째 날인지를 반환, 1부터 7 사이의 값을 반환(일요일 = 1, 토요일 = 7)
  • DAYOFMONTH() : 일자가 해당 월에서 몇 번째 날인지를 반환, 0부터 31 사이의 값을 반환
  • DAYOFYEAR() : 일자가 해당 연도에서 몇 번째 날인지를 반환, 1부터 366사이의 값을 반환

DATE_FORMAT()

  • 전달받은 형식에 맞춰 날짜와 시간 정보를 문자열로 변환
SELECT
DATE_FORMAT(NOW(), '%D %y %a %d %m %n %j')

 

'SQL' 카테고리의 다른 글

쿼리 결과 정렬  (0) 2022.02.05
레코드 검색  (0) 2022.02.03
SQL 고급  (0) 2022.02.02