mysql - 從表中選擇1是什麼意思?




plsql (13)

表中的每個記錄的結果都是1

我看過很多這樣的問題

Select 1  
From table

這是什麼意思?它將如何執行,它會返回什麼? 請同時指導我可以使用哪種類型的情況?

提前致謝


它簡單意味著你正在從表中檢索第一列的數字,,,,意味著選擇Emply_num,僱員Empl_no; 在這裡您使用來自員工的select 1; 這意味著您正在檢索Emply_num列。 謝謝


原因是另一個,至少對於MySQL而言。 這是來自MySQL手冊

InnoDB在啟動後第一次訪問表時計算表的索引基數值,而不是將這些值存儲在表中。 在將數據分割成多個表的系統上,此步驟可能會花費大量時間。 由於此開銷僅適用於初始表打開操作,要“預熱”表供以後使用,請在啟動後立即通過發出諸如SELECT 1 FROM tbl_name LIMIT 1


它做它所說的 - 它將始終返回整數1.它用於檢查是否存在與where子句匹配的記錄。


更具體一點,你可以用它來做

SELECT 1 FROM MyUserTable WHERE user_id = 33487

而不是做

SELECT * FROM MyUserTable WHERE user_id = 33487

因為你不在乎看結果。 詢問數字1對於數據庫來說非常容易(因為它不需要做任何查找)。


select 1 from table被某些數據庫用作查詢來測試連接以查看它是否處於活動狀態,通常在從連接池檢索或返回連接時使用該連接。


儘管它並不廣為人知,但查詢可以有一個沒有GROUP BY子句的HAVING子句。

在這種情況下, HAVING子句適用於整個集合。 顯然, SELECT子句不能引用任何列,否則你會(正確)得到錯誤,“列在選擇中無效,因為它不包含在GROUP BY中”等。

因此, 必須使用字面值(因為SQL不允許帶有零列的結果集 - 為什麼?!),並且通常使用字面值1( INTEGER ):如果HAVING子句求值為TRUE則結果集為1行中有一列顯示值1,否則您將獲得空集。

示例:查找列是否具有多個不同的值:

SELECT 1
  FROM tableA
HAVING MIN(colA) < MAX(colA);

我發現它總是用在SQL注入中,比如:

www.urlxxxxx.com/xxxx.asp?id=99 union select 1,2,3,4,5,6,7,8,9 from database;

這些數字可用於猜測數據庫的存在位置,並猜測您指定的數據庫的列名。以及表的值。


select 1 from table將為表的每一行返回常量1。 當你想便宜地確定記錄是否與你的where子句和/或join相匹配時,這很有用。


SELECT 1 FROM TABLE_NAME表示“從表中返回1”。 它本身非常不起眼,所以通常它將與WHERE一起使用並經常存在(正如@gbn所指出的那樣,這不一定是最佳實踐,然而,即使它不是真的有意義的(也就是說,我會使用它,因為其他人使用它,並立即“更明顯”。當然,這可能是一個粘性雞與蛋問題,但我通常不會居住))。

 SELECT * FROM TABLE1 T1 WHERE EXISTS (
     SELECT 1 FROM TABLE2 T2 WHERE T1.ID= T2.ID
 );

基本上,上面將返回表1中的所有內容,表1中有相應的ID。(這顯然是一個人為的例子,但我相信它表達了這個想法。就我個人而言,我可能會將上述內容作為SELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2);因為我認為FAR對讀者更為明確,除非有一個非常有說服力的理由)。

編輯

實際上有一個我剛才忘記的案例。 在您試圖從外部語言確定數據庫中存在值的情況下,有時會使用SELECT 1 FROM TABLE_NAME 。 與選擇單個列相比,這不會帶來顯著的好處,但根據實現情況,它可能會比提供SELECT *提供更多的好處,僅僅是因為通常情況下,數據庫返回的語言越多,數據結構意味著需要更多的時間。


如果你的意思是類似的話

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1 FROM table WHERE...) 

那麼1就比1

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT * FROM table WHERE...) 

在EXISTS中的1*被忽略,你可以按照ANSI SQL 1992標準的第191頁來寫:

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1/0 FROM table WHERE...) 

如果你不知道你有沒有任何數據,你可以使用下面的查詢:

SELECT cons_value FROM table_name;

例如:

SELECT 1 FROM employee;
  1. 它將返回一個包含行總數的列,並且所有行具有相同的常量值1(對於這段時間,所有行都返回1);
  2. 如果表中沒有行,它將不會返回任何內容。

因此,我們使用這個SQL查詢來了解表中是否有數據,並且行數表示該表中存在多少行。


要使用默認值將列添加到現有數據庫表,我們可以使用:

ALTER TABLE [dbo.table_name]
    ADD [Column_Name] BIT NOT NULL
Default ( 0 )

下面是使用默認值將列添加到現有數據庫表的另一種方法。

下面是一個更加徹底的SQL腳本,用於添加具有默認值的列,包括在添加列之前檢查列是否存在,還檢查約束並刪除它(如果有的話)。 這個腳本也命名約束,所以我們可以有一個很好的命名約定(我喜歡DF_),如果不是,SQL會給我們一個帶有隨機生成數字的名稱的約束; 所以能夠命名約束也很好。

-------------------------------------------------------------------------
-- Drop COLUMN
-- Name of Column: Column_EmployeeName
-- Name of Table: table_Emplyee
--------------------------------------------------------------------------
IF EXISTS (
            SELECT 1
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_NAME = 'table_Emplyee'
              AND COLUMN_NAME = 'Column_EmployeeName'
           )
    BEGIN

        IF EXISTS ( SELECT 1
                    FROM sys.default_constraints
                    WHERE object_id = OBJECT_ID('[dbo].[DF_table_Emplyee_Column_EmployeeName]')
                      AND parent_object_id = OBJECT_ID('[dbo].[table_Emplyee]')
                  )
            BEGIN
                ------  DROP Contraint

                ALTER TABLE [dbo].[table_Emplyee] DROP CONSTRAINT [DF_table_Emplyee_Column_EmployeeName]
            PRINT '[DF_table_Emplyee_Column_EmployeeName] was dropped'
            END
     --    -----   DROP Column   -----------------------------------------------------------------
        ALTER TABLE [dbo].table_Emplyee
            DROP COLUMN Column_EmployeeName
        PRINT 'Column Column_EmployeeName in images table was dropped'
    END

--------------------------------------------------------------------------
-- ADD  COLUMN Column_EmployeeName IN table_Emplyee table
--------------------------------------------------------------------------
IF NOT EXISTS (
                SELECT 1
                FROM INFORMATION_SCHEMA.COLUMNS
                WHERE TABLE_NAME = 'table_Emplyee'
                  AND COLUMN_NAME = 'Column_EmployeeName'
               )
    BEGIN
    ----- ADD Column & Contraint
        ALTER TABLE dbo.table_Emplyee
            ADD Column_EmployeeName BIT   NOT NULL
            CONSTRAINT [DF_table_Emplyee_Column_EmployeeName]  DEFAULT (0)
        PRINT 'Column [DF_table_Emplyee_Column_EmployeeName] in table_Emplyee table was Added'
        PRINT 'Contraint [DF_table_Emplyee_Column_EmployeeName] was Added'
     END

GO

這兩種方法是使用默認值將列添加到現有數據庫表。





mysql sql plsql