···153153 return f"Database({list(self.tables.keys())!r})"
154154155155156156+def query(
157157+ db,
158158+ select=(),
159159+ select_as=None,
160160+ distinct=None,
161161+ from_=None,
162162+ join=(),
163163+ where=(),
164164+ group_by=(),
165165+ having=None,
166166+ order_by=None,
167167+ offset=None,
168168+ limit=None,
169169+) -> Table:
170170+ if from_ is None:
171171+ raise ValueError("Need a FROM clause")
172172+ result = db.FROM(*from_)
173173+ for j in join:
174174+ table_name, pred = j
175175+ result = db.JOIN(result, db.tables[table_name], pred)
176176+ for w in where:
177177+ result = db.WHERE(result, w)
178178+ if group_by:
179179+ result = db.GROUP_BY(result, group_by)
180180+ if having:
181181+ result = db.HAVING(result, having)
182182+ if select:
183183+ result = db.SELECT(result, select, select_as or {})
184184+ if order_by:
185185+ result = db.ORDER_BY(result, order_by)
186186+ if offset:
187187+ result = db.OFFSET(result, offset)
188188+ if limit:
189189+ result = db.LIMIT(result, limit)
190190+ return result
191191+192192+156193def csv(table):
157194 print(",".join(table.colnames()))
158195 for row in table.rows: