본문 바로가기
프로그래밍/SQL

SQL 문법학습

by 코딩은 잼있어 2020. 7. 28.
728x90

SQL 개념 및 문법

1. Database(DB) 기본

여러사람이 공유하여 사용할목적으로 체계화하여 통합, 관리하는 데이터의 집합

[1] RDBMS (Relational Database Management System)

데이터베이스는 체계화된 데이터의 모임(데이터베이스를 관리하는 시스템)

  • 파일 단위의 저장도 가능=> 하지만, 데이터를 얼마나 "빠르고 효율적으로 그리고 중복없이" 찾을수 있는지가 관건

RDBMS(Relational Database Management System)

  • 관계형 데이터베이스 관리시스템
  • 관계를 표현하기 위해서 2차원 표(table) 활용

[2] 기본용어

스키마

  • DB의 자료의 구조와 제약조건을 기술한것

테이블

  • 열과 행을 사용해 조작된 데이터들의 집합

열(column)/필드

  • 특정 종류의 데이터를 기록

행(row)/레코드

  • 특정 값(데이터)

PK(Primary Key, 기본키)

  • 각 행의 고유값으로 저장된 레코드를 고유하게 식별할 수 있는 값

2. SQL

[1] 개념

RDBMS에서 데이터를 관리 및 조작하기 위해 설계된 프로그래밍 언어

자료의 검색 및 관리, 데이터베이스 스키마 생성과 수정, 데이터 베이스 접근 관리

[2] SQL 기본정의

DDL(Date Difinition Language) - 데이터 정의 언어

  • RDBMS의 구조를 정의하기 위한 명령어
  • CREATE, DROP(테이블 삭제), ALTER(테이블 수정), TRUNCATE(테이블 초기화)

DML(Date Manipulation Language) - 데이터 조작언어

  • 데이터를 저장, 수정, 삭제, 조회하기 위한 언어

DCL(Date Control Language) - 데이터 제어언어

  • 데이터베이스 사용자의 권한 제어를 위해 사용되는 언어

3. SQL문법

[1] 기본문법

테이블 생성

  CREATE TABLE 테이블 이름 (
      컬럼명1 DATATYPE [DEFAULT 형식],
      컬럼명2 DATATYPE [DEFAULT 형식],
      컬럼명3 DATATYPE [DEFAULT 형식]
  );

모든 테이블 레코드 조회(SELECT)

-- USER란 이름의 테이블 조회
SELECT * FROM USER;

-- 조건 WHERE을 이용한 조회
SELECT * FROM USER
WHERE id = 100;

테이블의 레코드 생성(INSERT)

-- USER 테이블 column에 맞게 값을 적어준다. 모든 레코드의 value 값을 적어줘야함 
INSERT INTO USER ('first_name', 'last_name', 'age', 'country', 'phone', 'balance')
VALUES ('금재', '이', 20, '경기', '031-123-1324', 10000);

테이블의 레코드 수정(UPDATE)

-- USER테이블의 id = 100인 레코드의 last_name을 '최'로 수정
UPDATE USER
SET last_name='최'
WHERE id = 100;

테이블의 레코드 삭제(DELETE)

-- id = 49인 레코드를 삭제
DELETE FROM USER
WHERE id = 49;

[2] 조건에 따른 문법

조건이 있는 조회를 할경우 WHERE을 활용!!!!!

나이가 20인 사람의 first_name

SELECT first_name FROM USER
WHERE age = 20;

나이가 30살 이상인 사람의 인원 수

SELECT COUNT(*) FROM USER
WHERE age >= 30;

나이가 50 이상이면서 성이 김씨인 사람의 인원 수

SELECT COUNT(*) FROM USER
WHERE age >= 50 AND last_name = '김';

column인 phone이 02로 시작하는 사람의 수

-- LIKE는 정확한값이 아니라 패턴을 확인하여 일치하는것 불러오는역할
SELECT COUNT(*) FROM USER
WHERE phone LIKE '02-%';

column인 country가 경기도이면서 last_name이 이씨인 first_name

SELECT first_name FROM USER
WHERE country='경기도' AND last_name='이';

[3] 정렬 및 LIMIT, OFFSET

ASC(Asecending) or DESC(descending)로 정렬을 할때는 ORDER BY을 활용

나이가 많은 사람 10명(내림차순,역순)

SELECT * FROM USER
ORDER BY age DESC
LIMIT 10;

잔액이 적은 사람 10명 (오름차순)

SELECT * FROM USER
ORDER BY balance ASC
LIMIT 10;

성, 이름 내림차순 순으로 5번째 있는 사람

SELECT * FROM USER
ORDER BY last_name DESC, first_name DESC
LIMIT 1 OFFSET 4;

-- LIMIT 1 : 맨 위를 기준으로 1개
-- OFFSET 4 : 위에서 4개가 사라짐

[4] 기타문법

AVG(평균), MAX(최대), SUM(합)

평균(AVG)

SELECT AVG(age) FROM USER;

김씨의 평균 나이(AVG)

SELECT AVG(age) FROM USER
WHERE last_name = '김';

balance가 가장 높은 값(MAX)

SELECT MAX(balance) FROM USER;

balance의 총액(SUM)

SELECT SUM(balance) FROM USER;

[5] Group by

GROUP BY절은 데이터를 그룹으로 나눌 수 있다

지역별 인원 수

SELECT country, COUNT(country) FROM USER
GROUP BY country;

country | COUNT(country)
강원도 | 14
경기도 | 9
경상남도 | 9
경상북도 | 15
전라남도 | 10
전라북도 | 11
제주특별자치도 | 9
충청남도 | 9
충청북도 | 14

-- country를 기준으로 그룹을 나눔

지역별 인원이 10명이상 조회

SELECT country, COUNT(country) FROM USER
GROUP BY country;                    -- country별로 그룹을 나눔
HAVING COUNT(country) >= 10         -- HAVING 으로 조건
ORDER BY COUNT(country) DESC;       -- 지역인원을 기준으로 내림차순으로 정렬

country | COUNT(country)
경상북도 | 15
강원도 | 14
충청북도 | 14
전라북도 | 11
전라남도 | 10

WHERE절과 HAVING절의 차이

1. WHERE

select * from 테이블명 where 조건절

위와 같이 where 조건절을 사용합니다.

항상 from 뒤에 위치하고 다양한 비교연산자들로 구체적인 조건을 줄수 있습니다.

2. HAVING

select * from 테이블명 group by 필드명 having 조건절

위와 같이 having 조건절을 사용합니다.

항상 group by뒤에 위치하고 다양한 비교연산자들로 구체적인 조건을 줄 수 있습니다.

차이점

둘의 차이점은 where은 우선적으로 모든 필드를 조건에 둘수 있지만, having은 group by가 된이후 특정 필드를 그룹화되어진 새로운 구조에 조건을 줄 수 있습니다.

지역별 인원이 10명이상 조회을 보면 우선적으로 country에 의해 GROUP BY 된 이후 HAVING으로 조건을 준걸 볼수 있습니다.

[6] CASE

-- 해당 컬럼에 조건에 따라 결과를 출력하고 컬럼명을 B로 할당 
SELECT A, CASE 
    WHEN 조건식1 THEN 결과1
    WHEN 조건식2 THEN 결과2
    WHEN 조건식n THEN 결과n 
    ELSE 결과
    END AS B
    FROM 테이블명
728x90