这些查询与其工作有什么区别?

时间:2016-10-02 18:19:08

标签: sql oracle

取样本table_name = Mybooks,
如果我们必须选择查询的所有书籍

select * from mybooks;

那么我们何时以及为什么需要别名并进行类似

的查询
select books.* from mybooks books;

我不明白这是如何运作的及其使用

3 个答案:

答案 0 :(得分:2)

别名就像重命名表的特定用法一样,使用它的原因是:

  1. 只需使用较短的描述符
  2. 您在查询中多次使用同一个表(您需要一些区分它们)
  3. 如果您只使用一个表,则不需要别名,但没有什么可以阻止您使用别名。

    示例:

    1. 一张桌子没有增值,但你可以选择其中任何一个:

      SELECT *
      FROM LongTableName
      
      -- Only if you enjoy typing
      SELECT LongTableName.*
      FROM LongTableName
      
      SELECT *
      FROM LongTableName t
      
      SELECT t.*
      FROM LongTableName t
      
    2. 有多个表:

      -- Cartesian join or cross join, at least one of the instances requires an alias
      SELECT *
      FROM LongTableName, LongTableName l
      
      -- You are forced to use the full name to refer to an "un-aliased" table
      SELECT LongTableName.Field, l.Field
      FROM LongTableName, LongTableName l
      
      -- For any other join, if only one table has an alias, like in the previous case,
      -- you will have to use the full name to refer to the other instance
      SELECT *
      FROM LongTableName
      INNER JOIN LongTableName l ON LongTableName.Field = l.Field
      
      -- Normally you simply use a short alias for both, like this
      SELECT *
      FROM LongTableName l1
      INNER JOIN LongTableName l2 ON l1.Field = l2.Field
      
      -- Only selecting some fields
      SELECT l1.PrimaryKey, l1.Field, l2.PrimaryKey, l2.Field
      FROM LongTableName l1
      INNER JOIN LongTableName l2 ON l1.Field = l2.Field
      
    3. 如果在SELECT中您想要使用所有已使用的表中的所有字段,则只需使用*即可完成。但是如果你需要从几个表中选择特定的字段,你会非常感谢有别名。

答案 1 :(得分:2)

你把两件事混在一起。您已经有一些关于使用别名的好答案。但是,这不是以不同方式编写import java.util.*; public static int solution(String S) { if (S.isEmpty()) return 1; if (S.length() % 2 == 1) return 0; // the length cannot be an odd number. // in time complexity this decreases from O(n) to O(1). // this Map avoid the ugly "switch case" Map<Character, Character> map = new HashMap<Character, Character>(); map.put('}', '{'); map.put(')', '('); map.put(']', '['); Stack<Character> stack = new Stack<Character>(); for (Character c : S.toCharArray()) { if (map.containsKey(c)) { if (!stack.isEmpty() && map.get(c) == stack.peek()) { stack.pop(); } else { return 0; } } else { stack.push(c); } } return stack.isEmpty() ? 1 : 0; } 的唯一方法。

如果没有别名,您可以说select * - 使用表名,而不是别名。

在某些情况下,您不需要表名,只能使用select mybooks.* ...。但是,如果您需要添加其他列 - 例如select *,则无法在SYSDATE as DT之后执行此操作。您必须使用select * - 不需要别名,但您必须在select mybooks.*, SYSDATE as DT ...前加上表名,即使查询仅引用一个表。

更常见的情况是分析函数会发生这种情况,例如*

答案 2 :(得分:0)

当您在查询中加入时,一个简单的*将导致连接中包含的所有表的所有字段。使用书籍时。*结果将仅包含书籍表的所有字段。

这与别名到目前为止没有任何关系,这是另一个概念,你给表一个别名,以便你可以区分两个同名的表。

只有当您有多个表的复杂查询时,这两个概念才有意义。