SQLAlchemy Core - การใช้ Set Operations
ในบทที่แล้วเราได้เรียนรู้เกี่ยวกับฟังก์ชั่นต่างๆเช่น max (), min (), count () ฯลฯ ที่นี่เราจะเรียนรู้เกี่ยวกับการใช้งานชุดและการใช้งาน
การดำเนินการตั้งค่าเช่น UNION และ INTERSECT ได้รับการสนับสนุนโดย SQL มาตรฐานและภาษาถิ่นส่วนใหญ่ SQLAlchemy ดำเนินการด้วยความช่วยเหลือของฟังก์ชันต่อไปนี้ -
สหภาพแรงงาน ()
ในขณะที่รวมผลลัพธ์ของคำสั่ง SELECT สองคำขึ้นไป UNION จะกำจัดรายการที่ซ้ำกันออกจากชุดผลลัพธ์ จำนวนคอลัมน์และประเภทข้อมูลต้องเหมือนกันในทั้งสองตาราง
ฟังก์ชัน union () ส่งคืนวัตถุ CompoundSelect จากหลายตาราง ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้งาน -
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, union
engine = create_engine('sqlite:///college.db', echo = True)
meta = MetaData()
conn = engine.connect()
addresses = Table(
'addresses', meta,
Column('id', Integer, primary_key = True),
Column('st_id', Integer),
Column('postal_add', String),
Column('email_add', String)
)
u = union(addresses.select().where(addresses.c.email_add.like('%@gmail.com addresses.select().where(addresses.c.email_add.like('%@yahoo.com'))))
result = conn.execute(u)
result.fetchall()
โครงสร้างสหภาพแปลเป็นนิพจน์ SQL ต่อไปนี้ -
SELECT addresses.id,
addresses.st_id,
addresses.postal_add,
addresses.email_add
FROM addresses
WHERE addresses.email_add LIKE ? UNION SELECT addresses.id,
addresses.st_id,
addresses.postal_add,
addresses.email_add
FROM addresses
WHERE addresses.email_add LIKE ?
จากตารางที่อยู่ของเราแถวต่อไปนี้แสดงถึงการดำเนินการร่วมกัน -
[
(1, 1, 'Shivajinagar Pune', '[email protected]'),
(2, 1, 'ChurchGate Mumbai', '[email protected]'),
(3, 3, 'Jubilee Hills Hyderabad', '[email protected]'),
(4, 5, 'MG Road Bangaluru', '[email protected]')
]
union_all ()
การดำเนินการ UNION ALL ไม่สามารถลบรายการที่ซ้ำกันและไม่สามารถเรียงลำดับข้อมูลในชุดผลลัพธ์ได้ ตัวอย่างเช่นในข้อความค้นหาด้านบน UNION จะถูกแทนที่ด้วย UNION ALL เพื่อดูเอฟเฟกต์
u = union_all(addresses.select().where(addresses.c.email_add.like('%@gmail.com')), addresses.select().where(addresses.c.email_add.like('%@yahoo.com')))
นิพจน์ SQL ที่เกี่ยวข้องมีดังนี้ -
SELECT addresses.id,
addresses.st_id,
addresses.postal_add,
addresses.email_add
FROM addresses
WHERE addresses.email_add LIKE ? UNION ALL SELECT addresses.id,
addresses.st_id,
addresses.postal_add,
addresses.email_add
FROM addresses
WHERE addresses.email_add LIKE ?
ยกเว้น_()
SQL EXCEPTอนุประโยค / ตัวดำเนินการใช้เพื่อรวมสองคำสั่ง SELECT และส่งคืนแถวจากคำสั่ง SELECT แรกที่ไม่ถูกส่งกลับโดยคำสั่ง SELECT ที่สอง ฟังก์ชัน except_ () สร้างนิพจน์ SELECT ที่มีส่วนคำสั่ง EXCEPT
ในตัวอย่างต่อไปนี้ฟังก์ชัน except_ () จะส่งคืนเฉพาะระเบียนเหล่านั้นจากตารางที่อยู่ที่มี "gmail.com" ในช่อง email_add แต่ไม่รวมรายการที่มี "Pune" เป็นส่วนหนึ่งของช่อง Postal_add
u = except_(addresses.select().where(addresses.c.email_add.like('%@gmail.com')), addresses.select().where(addresses.c.postal_add.like('%Pune')))
ผลลัพธ์ของโค้ดด้านบนคือนิพจน์ SQL ต่อไปนี้ -
SELECT addresses.id,
addresses.st_id,
addresses.postal_add,
addresses.email_add
FROM addresses
WHERE addresses.email_add LIKE ? EXCEPT SELECT addresses.id,
addresses.st_id,
addresses.postal_add,
addresses.email_add
FROM addresses
WHERE addresses.postal_add LIKE ?
สมมติว่าตารางที่อยู่มีข้อมูลที่ใช้ในตัวอย่างก่อนหน้านี้จะแสดงผลลัพธ์ต่อไปนี้ -
[(2, 1, 'ChurchGate Mumbai', '[email protected]'),
(3, 3, 'Jubilee Hills Hyderabad', '[email protected]')]
ตัด()
การใช้ตัวดำเนินการ INTERSECT SQL จะแสดงแถวทั่วไปจากทั้งคำสั่ง SELECT ฟังก์ชัน intersect () ใช้พฤติกรรมนี้
ในตัวอย่างต่อไปนี้โครงสร้าง SELECT สองรายการคือพารามิเตอร์เพื่อตัดกัน () ฟังก์ชัน หนึ่งส่งคืนแถวที่มี "gmail.com" เป็นส่วนหนึ่งของคอลัมน์ email_add และแถวอื่น ๆ จะแสดงผลที่มี "Pune" เป็นส่วนหนึ่งของคอลัมน์ Postal_add ผลลัพธ์จะเป็นแถวทั่วไปจากทั้งสองชุดผลลัพธ์
u = intersect(addresses.select().where(addresses.c.email_add.like('%@gmail.com')), addresses.select().where(addresses.c.postal_add.like('%Pune')))
มีผลเทียบเท่ากับคำสั่ง SQL ต่อไปนี้ -
SELECT addresses.id,
addresses.st_id,
addresses.postal_add,
addresses.email_add
FROM addresses
WHERE addresses.email_add LIKE ? INTERSECT SELECT addresses.id,
addresses.st_id,
addresses.postal_add,
addresses.email_add
FROM addresses
WHERE addresses.postal_add LIKE ?
พารามิเตอร์สองตัวที่ถูกผูกไว้ '% gmail.com' และ '% Pune' สร้างแถวเดียวจากข้อมูลต้นฉบับในตารางที่อยู่ดังที่แสดงด้านล่าง -
[(1, 1, 'Shivajinagar Pune', '[email protected]')]