这个SQL语句中“l”和“p”是什么意思?

时间:2013-12-03 21:55:27

标签: mysql sql phpmyadmin

我有以下语句过滤掉多个表的结果。我不太了解p之后的tablenamel之后的anothertablename。它们是通用的还是有目的的?

SELECT id, title, l.id, username FROM tablename p JOIN anothertablename l ON (l.id = p.id) WHERE p.id='15' LIMIT 1

2 个答案:

答案 0 :(得分:5)

这些被称为别名

它只是一个缩写,而不是总是使用完整的表名。

想象一下,如果你有两个名为Products_Orders_itemsCustomers_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
)

上述查询查找包含背包的所有订单。请注意,ItemOrderItem表需要包含两次,因此它们有多个别名。

以下是具有自联接的查询示例:

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的歧义。