해피 코딩!

SQL Query과 Django - ORM 본문

SQL

SQL Query과 Django - ORM

지속가능한 성장을 2020. 12. 19. 20:25

가장 최근 작품인 마켓컬리 프로젝트 에서 사용하였던 ORM query를 SQL query로 변경해보며 SQL을 익히고, SQL 에서 사용하는 문법을 정리해보도록 하겠습니다.

SQL

  • SQL은 Structured Query Language 의 약어이다.

  • SQL은 관계형 데이터베이스에 대해서 데이터의 구조를 정의, 데이터 조작, 데이터 제어 등을 할 수 있는 절차형 언어이다.

  • 관계형 데이터베이스는 데이터베이스를 연결하고 SQL문을 사용하여 데이터베이스를 누구나 쉽게 사용할 수 있도록 한다.

  • SQL은 ANSI/ ISO 표준을 준수하기 떄문에, 데이터베이스 관리 시스템이 변경되어도 그대로 사용할 수 있다.

SQL의 종류

종류 설명
DDL(Data Definition Language - 관계형 데이터베이스의 구조를 정의하는 언어이다
- Create , Alter, Drop, Rename 문이 있다.
DML(Data Manipulation Language - 테이블에서 데이터를 입력, 수정, 삭제, 조회한다.
- Insert, Update, Delete, Select 문이 있다.
DCL(Data Control Language - 데이터베이스 사용자에게 권한을 부여하거나 회수한다.
- Grant, Revoke 문이 있다.
TCL(Transaction Control Language) - 트랜잭션을 제어하는 명령어이다.
- Commit, Rollback 문이 있다.

장고 ORM을 SQL로 변경하는 방법

장고 ORM이 실행하는 질의문 또는 우리가 작성한 ORM에 대응하는 SQL 질의문을 확인하고 싶을 때 에는

# ORM
qs = User.objects.all()

# ORM to SQL
str(qs.query)

또는

print(qs.query)

All

select 문은 테이블에 입력된 데이터를 조회할 수 있습니다.

# ORM
qs = User.objects.all()

# SQL
select * from goods_goods;

WHERE

where 절은 조건문

# orm 
Goods.objects.filter(pk=1)

# SQL
select * from goods_goods where id=1;

SELECT title||'이다.' FROM goods_goods LIMIT 5 offset 222;

해당 문장은 title 뒤에 문자열을 합친 값이다.

비교연산자

  • AND

    • ORM : Goods.objects.filter(id__gte=5, id__lte=20)
    • SQL : select * from goods_goods where id >=5 and id<=20;
  • LIKE

    • ORM : Users.objects.filter(username='admin'
    • SQL : select id, username from members_user where username like 'admin';
  • DISTINCT

    • 칼럼 명 앞에 지정하여 중복된 데이터를 한 번만 조회하게 한다.
    • select distinct deptno from emp order by deptno;

AS

필드명이나 테이블의 이름을 다시 지을 때
select user_id AS 'USER_identdity' from members_User

이렇게 작성하면 필드명이 USER_identdity 이렇게 나옴

Order by

  • Order By가 정렬을 하는 시점은 모든 실행이 끝난 후 데이터를 출력해주기 바로 전이다.

  • Order by는 정렬을 하기 때문에 데이터베이스 메모리를 많이 사용하게 된다. 성능 저하를 유의하자.

  • 정렬을 회피하기 위해서 인덱스를 생성할 때 사용자가 원하는 형태로 오름차순 혹은 내림차순이 있어야 한다.

  • 특별한 지정이 없으면 Order by는 오름차순으로 정렬한다.

# ORM
# 값이 적은 상품
Goods.objects.order_by('price')
# 검색이 많이 된 상품 중 상위 5개
KeyWord.objects.all().order_by('-count')[:5]

# SQL
select * from goods_goods order by price
select * from members_keyword order by -count limit 1;

GROUP BY

  • group by는 테이블에서 소규모 행을 그룹화하여 합계, 평균, 최대 값, 최소 값 등을 계산할 수 있다.
  • HAVING 구에 조건문을 사용한다.
  • ORDER BY를 사용해서 정렬을 할 수 있다.
  • 특정 컬럼을 그룹화 한다.

HAVING BY

특정 칼럼을 그룹화 한 결과에 조건을 거는 절

  • WHERE 절과 다른점은 WHERE 절은 그룹화 하기 전이고, HAVING은 그룹화 한 후에 조건입니다.

SQL

select id, title, price from goods_goods order by price;

# limit N

만약 특정 N개의 수 만큼만 데이터를 가져오고 싶다면

LIMIT는 조회한 결과 값의 행의 수를 제한, 한정하는 역할을 합니다. 결과의 범위를 처리할 때 사용합니다.

OFFSET은 시작하는 위치를 지정합니다. 3번째 행 부터라면 실제 문법에서는 M-1로 작성합니다.


# ORM
Goods.objects.all()[:10]
Goods.objects.all()[5:10]

# SQL
select * from goods_goods limit 10;
select * from goods_goods limit 5 offset 20;

소감

  • 2020.12.20 : ORM은 객체를 가져오지만, SQL은 데이터 필드 값을 가져온다.

'SQL' 카테고리의 다른 글

[SQL] JOIN  (0) 2020.12.22
[SQL] case 문을 사용한 조권부 쿼리 작성  (0) 2020.12.21
[SQL] NULL 체크 함수  (0) 2020.12.21
[프로그래머스] SQL 코딩테스트 레벨 2  (0) 2020.12.20
[프로그래머스] SQL 코딩테스트 레벨 1  (0) 2020.12.20
Comments