728x90
반응형
SELECT 구문 실행
stmt = select(user_table).where(user_table.c.name == "spongebob")
# Core 방식
with engine.connect() as conn:
for row in conn.execute(stmt):
print(row)
# ORM 방식
stmt = select(User).where(User.name == "spongebob")
with Session(engine) as session:
for row in session.execute(stmt):
print(row)
select() 함수
- 여러 개의 컬럼과 테이블을 받아서 SELECT 쿼리를 구성
stmt = select(user_table)
# SELECT * FROM user_account
- where(): 조건을 하나 또는 여러 개 지정
stmt = select(user_table).where(user_table.c.name == 'spongebob')
# SELECT * FROM user_account WHERE name = 'spongebob
- order_by(): 정렬 기준을 지정(기본적으로 오름차순)
# 오름차순
stmt = select(user_table).order_by(user_table.c.name)
# SELECT * FROM user_table ORDER BY name
# 내림차순
stmt = select(user_table).order_by(desc(user_table.c.name))
# SELECT * FROM user_table ORDER BY name DESC
# 여러 기준
select(user_table).order_by(desc(user_table.c.name), user_table.c.fullname)
# SELECT * FROM user_table ORDER BY name DESC, fullname
- group_by(): 그룹화
select(user_table.c.name, func.count(user_table.c.id)).group_by(user_table.c.name)
# SELECT name, COUNT(id) FROM user_table GROUP BY name
- having(): 그룹화 조건
stmt = select(user_table.c.name, func.count(user_table.c.id)).group_by(user_table.c.name).having(func.count(user_table.c.id) > 1)
# SELECT name, COUNT(id) FROM user_table GROUP BY name HAVING COUNT(id) > 1
- scalar_subquery: SQL 쿼리를 서브쿼리로 변환하여 단일 값(스칼라 값)을 반환하는 역할
subq = select(func.count(address_table.c.id)).where(user_table.c.id == address_table.c.user_id).scalar_subquery()
stmt = select(user_table.c.name, subq.label("address_count"))
"""
SELECT user_account.name,
(SELECT count(address.id)
FROM address
WHERE user_account.id = address.user_id) AS address_count)
FROM user_account
"""
- join: 조인할 테이블을 지정하고, ON 절을 자동으로 추론하거나 직접 제공하여 조인을 수행. (주로 단순한 join에 사용)
stmt = select(user_table.c.name, address_table.c.email_address).join(address_table, user_table.c.id == address_table.c.user_id)
"""
SELECT user_account.name, address.email_address
FROM user_account
JOIN address ON user_account.id = address.user_id
"""
- from_join: 명시적으로 조인 조건을 지정하는 데 사용 (복잡한 join 조건을 명확하게 정의)
stmt = select(user_table.c.name, address_table.c.email_address).join_from(user_table, address_table, user_table.c.id == address_table.c.user_id)
"""
SELECT user_account.name, address.email_address
FROM user_account
JOIN address ON user_account.id = address.user_id
"""
- select_from(): SELECT 문에서 사용되는 기본 테이블을 지정하는 데 사용 (명확하게 테이블 지정)
stmt = select(address_table.c.email_address).select_from(user_table).join(address_table)
"""
SELECT address.email_address
FROM user_account
JOIN address ON user_account.id = address.user_id
"""
- distinct(): SQL의 DISTINCT 구문을 생성하여 중복된 결과를 제거
stmt = select(user_table.c.name).distinct()
# SELECT DISTINCT name FROM user_account
- limit(), offset(): 쿼리 결과에서 몇 개의 행을 건너뛰어서 몇 개의 결과를 나타낼지
stmt = select(user_table).limit(10).offset(5)
# SELECT * FROM user_account LIMIT 10 OFFSET 5
# 6번째 행부터 시작해서 10개의 행 반환
- union(), union_all(), intersect(), except_(): SQL 집합연산자 생성
stmt1 = select(user_table).where(user_table.c.name == "spongebob")
stmt2 = select(user_table).where(user_table.c.name == "patrick")
u = union(stmt1, stmt2)
"""
SELECT * FROM user_account
WHERE name = 'spongebob'
UNION
SELECT * FROM user_account
WHERE name = 'patrick
"""
728x90
반응형
'Programming Language > Python' 카테고리의 다른 글
[SQLAlchemy] 7. 데이터베이스 ORM 상태 관리 (0) | 2024.06.22 |
---|---|
[SQLAlchemy] 6. ORM을 사용한 UPDATE (0) | 2024.06.22 |
[SQLAlchemy] 4. ORM을 사용한 INSERT (0) | 2024.06.22 |
[SQLAlchemy] 3. MetaData (0) | 2024.06.22 |
[SQLAlchemy] 2. Connection, Commit, Query, Bound parameters (0) | 2024.06.22 |