일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- stack&que
- Git
- permutations
- greedy
- HTTP 완벽 가이드
- dictionary
- postreSQL
- Q objects
- Gunicorn
- SQL
- ORM
- Programmers
- combinations
- TDD
- was
- codecov
- stateful
- Query
- AWS
- pytest
- 백준
- Bruteforce
- utils
- Django
- Stack
- Python
- Unit Testing
- algorithm
- stateless
- ws
- Today
- Total
해피 코딩!
SQL Query과 Django - ORM 본문
가장 최근 작품인 마켓컬리 프로젝트 에서 사용하였던 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;
- ORM :
LIKE
- ORM :
Users.objects.filter(username='admin'
- SQL :
select id, username from members_user where username like 'admin';
- ORM :
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 |