我有以下语句过滤掉多个表的结果。我不太了解p
之后的tablename
和l
之后的anothertablename
。它们是通用的还是有目的的?
SELECT id, title, l.id, username FROM tablename p JOIN anothertablename l ON (l.id = p.id) WHERE p.id='15' LIMIT 1
答案 0 :(得分:5)
这些被称为别名
它只是一个缩写,而不是总是使用完整的表名。
想象一下,如果你有两个名为Products_Orders_items
和Customers_orders_items
的表,如果它们都有列id,你可以在JOIN中写一下:
SELECT *
FROM Products_Orders_items
INNER JOIN Customers_orders_items
ON Customers_orders_items.id = Products_Orders_items.id
WHERE Customers_orders_items.otherField = 'bla';
使用别名可以更容易阅读:
SELECT *
FROM Products_Orders_items a
INNER JOIN Customers_orders_items b ON a.id = b.id
WHERE b.otherField = 'bla';
在某些情况下,必须使用类似于使用派生表的情况,例如:
SELECT *
FROM (
SELECT *
FROM Products_Orders_items a
INNER JOIN Customers_orders_items b ON a.id = b.id
WHERE b.otherField = 'bla'
) a
如果您不在此处使用别名,则查询会给您一个错误。
答案 1 :(得分:4)
此语法
FROM tablename p
或
JOIN tablename p
为表名创建别名。在大多数情况下,它只是缩短语句的一种方法,因为您可以使用较短的名称来代替完整的表名。
但是,在某些情况下需要别名:当您需要在同一查询中多次引用同一个表时,必须创建一个别名来消除语句的歧义。
需要别名的特定示例是同一个表上的子查询和自连接。
以下是带有子查询的查询示例:
SELECT
FROM Orders o
JOIN OrderItem oi on o.ID=oi.OrderID
JOIN Item i on i.ID=oi.ItemID
WHERE EXISTS (
SELECT *
FROM OrderItem oi2
JOIN Item i2 ON i2.ID=oi2.ItemId
WHERE i2.Description='BACKPACK'
AND oi2.OrderID=o.ID
)
上述查询查找包含背包的所有订单。请注意,Item
和OrderItem
表需要包含两次,因此它们有多个别名。
以下是具有自联接的查询示例:
SELECT
e.Name as EmployeeName
, m.Name as ManagerName
FROM EMPLOYEE e
OUTER JOIN EMPLOYEE m ON m.ID=e.ManagerID
ORDER BY m.Name, e.Name
在上面,同一个表EMPLOYEE
在同一个查询中被引用了两次,因为它参与了两个不同的角色 - 作为员工和作为经理。给表两个别名让我们消除加入条件m.ID=e.ManagerID
的歧义。