“ {select from table_name *”和“ select a。* from table_name a”有什么技术区别?

时间:2018-11-26 09:31:39

标签: sql db2

这可能是一个基本问题,但是在谷歌搜索之后我找不到解释。

无论如何,一个简短的背景故事。我有这个表,我无权在DB2上进行更改:

other_field |  date_field  | time_field
---------------------------------------
     1      |    180101    |   101010
     2      |    180102    |   202020
     3      |    180103    |   303030
     4      |    180104    |   404040

我尝试使用:

select *, concat(date_field, time_field) as TIME
from Table_Name

我的预期结果是显示,如下所示:

other_field |  date_field  | time_field |     TIME
--------------------------------------------------------
     1      |    180101    |   101010   | 180101101010
     2      |    180102    |   102020   | 180102102020
     3      |    180103    |   103030   | 180103103030
     4      |    180104    |   104040   | 180104104040

但是由于某种原因,我无法使用该查询。它给了我一个错误...Token , was not valid. Valid tokens: FROM INTO,基本上说,之后是逗号(*)。

然后我尝试将其略微调整为:

select a.*, concat(a.date_field, a.time_field) as TIME
from Table_Name a

它有效!

我知道Table_Name a通常用于联接表,但是我对底层机制感到好奇。

使用Table_NameTable_Name a有什么技术区别?这个a叫什么名字?

2 个答案:

答案 0 :(得分:1)

从技术上讲, SELECT * FROM TAB_NAMESELECT a,* FROM TAB_NAME a

这里您只是指定别名。

但是当您尝试从TAB_NAME中获取带有*的另一列时,您可以理解其中的区别。 这意味着如果您希望将数据作为波纹管

SELECT *,COL_1,COL2... 
FROM TAB_NAME 

SELECT *,CONCAT(...) 
FROM TAB_NAME

或带有*的任何内容,您必须指定别名。

但是问题是为什么?让我尝试解释一下,

您在这里知道SELECT *表示您正在尝试选择所有列。因此,*的意思是“全部”,如果您将*放在SELECT子句之后,则意味着您已经向系统发出了通过传递特殊字符来选择所有内容的命令,之后您的系统只能期望FROM子句,而不能期望任何其他事物。因为您已经告诉系统/数据库选择所有内容,所以没有其他选择,因此系统将始终等待FROM子句。因此,每次都会引发错误。

现在的问题是,波纹管查询在内部如何工作

SELECT a.*,COL_1,COL2... 
FROM TAB_NAME a

SELECT a.*,a.COL_1,a.COL2... 
FROM TAB_NAME a

SELECT a.*,CONCAT(c1,c2) 
FROM TAB_NAME a

SELECT a.*,CONCAT(a.c1,a.c2) 
FROM TAB_NAME a

或其他类似的东西。

在这里,您的系统将了解您正在尝试从表a中选择所有内容,这意味着您可以从表a或任何其他表中选择其他任何col / function等。这就是为什么您的系统/数据库将允许您在a之后插入其他col / func的原因(如果需要),或者您也可以在a.*

之后使用from子句

答案 1 :(得分:0)

Db2(LUW)11.1支持此语法

create table Table_Name (
   other_field int not null primary key
,  date_field date not null
,  time_field time not null 
)
;
insert into Table_Name values 
    (1,'2018-01-01', '10.10.10')
,   (2,'2018-01-01', '20.20.20')
,   (3,'2018-01-01', '13.13.13')
,   (4,'2018-01-01', '14.14.14')
;
select *, timestamp(date_field, time_field) as TIME from Table_Name
;

这将返回

 OTHER_FIELD    DATE_FIELD  TIME_FIELD  TIME
 -----------    ----------  ----------  ---------------------
           1    2018-01-01  10:10:10    2018-01-01 10:10:10.0
           2    2018-01-01  20:20:20    2018-01-01 20:20:20.0
           3    2018-01-01  13:13:13    2018-01-01 13:13:13.0
           4    2018-01-01  14:14:14    2018-01-01 14:14:14.0

顺便说一句,我为您的示例使用了明智的数据类型。使用DATE1TIMETIMESAMP(或TIMESTAMP(0))来处理日期和时间值...