SniKuz
스니커즈 정리공간
SniKuz
  • 정리공간 (116)
    • 강의 (35)
      • OS (12)
      • 컴퓨터구조 (5)
      • 컴퓨터네트워크 (6)
      • 컴퓨터 그래픽스 (12)
    • 프로젝트 (8)
      • 애니메이션 스티커(Android) (1)
      • 2023GMTK (1)
      • OTT 게임 (2)
      • 3D MORPG (4)
    • Unity (3)
      • Memory (3)
    • 디자인패턴 (8)
    • 활동 정리 (4)
    • 알고리즘 (48)
    • 기타기록 (6)
      • 여행,음식 (4)
      • 잡다지식 (2)

블로그 메뉴

  • ✨ 깃허브

공지사항

인기 글

태그

  • ISTQB
  • programmers
  • 니

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
SniKuz

스니커즈 정리공간

DB, SQL 간략 정리
기타기록/잡다지식

DB, SQL 간략 정리

2024. 4. 21. 17:58

목차

  • DB
  • 관계형DB 와 KEY
  • SQL기본
  • SQL 명령어 예시
  • SQL 예제

 

SQL : Structed Query Language

Data Base 

데이터를 저장하기 위한 여러 방법 중 거대한 규모에 데이터를 여러 사람이 공유하여 사용하기 위해 체계화한 것입니다.
본질적으로는 방대한 Data를 관리하는 용도이며 기본적인 데이터 처리 기능 CRUD(Create ,Read, Update, Delete) 에 발전된 작업을 합니다.

파일 : OS별로 기본 제공하며 성능, 보안, 편의성이 떨어집니다.

스프레드 시트 : 엑셀과 같이 편의성은 향상되었지만 자동화, 명령어 기능 등이 떨어집니다.

데이터베이스 : 자동화, 구체적인 명령어 사용이 가능하며 MySQL, Oracle, MongoDB 등 제품이 있습니다.
MySQL과 Oracle은 관계형 DB, MongoDB는 문서 지향 DB (Document store)입니다. 

 

 

관계형 DB (RDBMS, Relation Data Base Management System)

스프레드 시트 형태 + 컴퓨터 언어로 조작을 하는 구조입니다. 

* KEY : DB에서 각각의 데이터를 구별할 수 있는 유일한 기준이 되는 속성입니다.

유일성 : 각 행이 유일한 값이라 식별가능
최소성 : 꼭 필요한 최소한만 넣는 성질

슈퍼키(Super key) : 각 행을 유일하게 식별할 수 있는 속성들의 집합 (ex : 학번 O, 주민번호 O, 이름 X)
후보키(Candidate Key) : 유일하게 식별 가능한 '최소한'의 속성집합으로, 기본키가 될 수 있는 후보들 (ex: 학번O, 주민번호 O, 학번 + 이름 X,)
기본키(Primary Key) : 후보키 중 선택한 메인 키
대체키(Alternate Key) : 후보키 - 기본키
외래키(Foreign Key)  : 한 테이블이 다른 테이블의 기본키를 참조해서 테이블간 관계를 생성 
복합키(Composite Key) : 여러 칼럼을 묶어 기본키로 만드는 방법. 잘쓰면 더 세밀한 데이터 관리, 성능 향상 가능

 

 

SQL 기본

*트랜잭션(Transaction, 거래) : 실제 DB에 바로 적용하지 않고 commit과 rollback으로 나눠 commit 후 결과를 반영하고 싶지 않거나 거래가 실패했다면 rollback을 실행합니다.

  • Data Manipulation Language (데이터 조작어)
    Table의 한 행을 조작하며 트랜잭션이 가능합니다.
    SELECT, INSERT, UPDATE, DELETE
  • Data Definition Language (데이터 정의어)
    DB 개체(DB, Table, Index 등) 변경하며, 즉시 반영되어 트랜잭션이 불가합니다.
    CREATE, DROP, ALTER
  • Data Control Language (데이터 제어어)
    사용자에게 권한 부여/제거 작업을 합니다.
    GRANT, REVOKE ... 

 

 

SQL 명령어 예시

○ SELECT

SELECT * FROM city : city에 * data
SELECT name, population FROM city : city에 name, population column만 보여줘
SELECT * FROM city WHERE population < 80 AND(OR) population > 70
SELECT * FROM city WHERE population BETWEEN 70 AND 80
SELECT * FROM city WHERE name IN('Seoul', 'NewYork', 'Tokyo') : IN과 OR 대체 가능
SELECT * FROM city WHERE CountryCode LIKE 'ko_' : 문자열 검색 LIKE, _ 한단어, % 몇개의 문자. %kor%는 ~~~kor~~~
SELECT * FROM city WHERE CountryCode = (SELECT CountryCode FROM city WHERE name = 'Seoul') : SubQuery, 해당 Country에 Seoul이 있는것만 아는 경우
SELECT * FROM city WHERE population > ANY(SELECT population FROM city WHERE district = 'NewYork' : 
SubQuery에서 값이 여러개일때OR처럼 1가지라도 만족 시 출력, district(지역)의 이름이 뉴욕인 도시들의 인구수 중 하나라도 큰 값이 있다면 출력. ANY는 SOME과 동일하게 사용, ALL은 가장 큰 값 

○ 정렬

SELECT * FROM city ORDER BY population ASC : 정렬, ASC : 오름차순 default, DESC : 내림차순
SELECT * FROM city ORDER BY population DESC, name ASC : 앞에서 부터 1순위, 2순위
SELECT DISTINCT country code FROM city : 중복제거
SELECT * FROM city ORDER BY population DESC LIMIT2 : 상위 2개 제한

○ 계산

SELECT country code, MAX(population) FROM city GROUP BY country code HAVING MAX(population) > 800 
GROUP BY : country code 키로 묶는 그룹 column, 조건절 Having(조건절), 집계함수 MAX, MIN, SUM, AVG 평균인구수
SELECT COUNT(*) FROM city : city 개수

○ JOIN

SELECT * FROM city JOIN country ON city.country code == country.code
ON대신 USING도 가능 USING(code), 다중 JOIN도 가능

다른 JOIN

○ 수학/문자열 관련 함수

SELECT LENGHT('abcde') : 문자열 길이 반환
SELECT CONCAT ('my', 'sql', 'op', 'en') :문자열을 합쳐서 저장, 1개라도 NULL이면 NULL 반환
SELECT LOCATE ('abc', 'abababca') : abc 위치, MySQL은 시작 위치가 1

% : 1개 이상 문자열 모든 패, _단일문자, [ ] : 지정범위. [a-d] 는 a, b, c,d , [^]지점범위에 없는 문자 : [^a-d]는 a~d 제외
ex : %db[m-n]uri

SELECT LEFT('~~~', 5) : 문자열 좌에서 5개만 보여줘, RIGHT도 동일
SELECT LOWER('~~~')  : 모두 소문자로 변경, 대문자는 UPPER
SELECT REPLACE('mssql', 'ms', my') : ms를 my로 바꾸기
SELECT TRIM('   mysql   ') : 문자열 자르기로 공백 제거
SELECT TRIM(LEADING '#' FROM '###SQL###') : LEADING은 앞에, TRAILING은 뒤에, 안쓰면 앞 뒤 전부 자르기

SELECT FLOOR() : 내림, CEIL() : 올림, ROUND() : 반올림, FORMAT(24567.123, 3) : 소수점 몇자 
ABS(-1) 절대값, RAND() :랜덤 실수형, A DIV B : 나누기
SIN, COS, TAN, PI, 

○ 날짜

NOW() = CURDATE() + CURTIME()
DATE(NOW()) : 현재 날짜만
숫자 : YEAR(NOW()), MONTH(NOW()), DAY(NOW()), HOUR(NOW()), MINUTE(NOW()), SECOND(NOW())
문자로 나올려면 뒤에 NAME추가하면 됩니다.

 

 

SQL 예제

1. 서울에 위치한 식당 목록 출력하기 : https://school.programmers.co.kr/learn/courses/30/lessons/131118

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

SELECT REST_INFO.REST_ID, REST_INFO.REST_NAME, REST_INFO.FOOD_TYPE, REST_INFO.FAVORITES, REST_INFO.ADDRESS, 
ROUND(AVG(REVIEW_SCORE), 2) AS SCORE
FROM REST_INFO 
JOIN REST_REVIEW ON REST_INFO.REST_ID = REST_REVIEW.REST_ID
GROUP BY REST_INFO.REST_ID
HAVING REST_INFO.ADDRESS LIKE '서울%' 
ORDER BY SCORE DESC, REST_INFO.FAVORITES DESC

* %는 1개 이상에 어떤 문자열이든 포함하는 패턴

2. 5월 식품들의 총매출 조회하기 : https://school.programmers.co.kr/learn/courses/30/lessons/131117

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

SELECT product.PRODUCT_ID, product.PRODUCT_NAME, (product.PRICE * SUM(ord.AMOUNT)) AS TOTAL_SALES
FROM FOOD_PRODUCT product
JOIN FOOD_ORDER ord ON product.PRODUCT_ID = ord.PRODUCT_ID
WHERE YEAR(ord.PRODUCE_DATE) = 2022 and MONTH(ord.PRODUCE_DATE) = 5
GROUP BY product.PRODUCT_ID
ORDER BY TOTAL_SALES DESC, product.PRODUCT_ID
저작자표시 (새창열림)

'기타기록 > 잡다지식' 카테고리의 다른 글

ISTQB-CTFL(22.12.1) 후기  (0) 2022.12.03
    '기타기록/잡다지식' 카테고리의 다른 글
    • ISTQB-CTFL(22.12.1) 후기
    SniKuz
    SniKuz
    게임과 관련된 개발, 디자인 등등 + 일상공간

    티스토리툴바