1. 程式人生 > 資料庫 >MySQL的SQL語句 - 資料操作語句(13)- 子查詢(2)

MySQL的SQL語句 - 資料操作語句(13)- 子查詢(2)

子查詢作為標量運算元

在最簡單的形式中,子查詢是返回單個值的標量子查詢。標量子查詢是一個簡單的運算元,幾乎可以在單個列值或文字合法的任何地方使用它,並且可以期望它具有所有運算元都具有的特性:資料型別、長度、可以指定為 NULL 等等。例如:

1. CREATE TABLE t1 (s1 INT, s2 CHAR(5) NOT NULL);
2. INSERT INTO t1 VALUES(100, 'abcde');
3. SELECT (SELECT s2 FROM t1);

此 SELECT 中的子查詢返回單個值 ('abcde'),該值的資料型別為 CHAR,長度為5,字符集和排序規則使用建立表時有效的預設值,並指示列中的值可以為 NULL。標量子查詢的值是否可以是空並非繼承自所選擇的值,因為如果子查詢結果為空,則結果為 NULL。對於剛剛顯示的子查詢,如果 t1 為空,則結果將為 NULL,即使 s2 是 NOT NULL。

在一些上下文中不能使用標量子查詢。如果語句只允許字面量,則不能使用子查詢。例如,LIMIT 需要字面量整型引數,而 LOAD DATA 需要字面量字串檔名。不能使用子查詢來提供這些值。

當在下面的部分中看到包含相當簡單的結構 (SELECT column1 FROM t1) 的示例時,想象一下自己的程式碼包含了更加多樣化和複雜的結構。

假設我們建立了兩個表:

1. CREATE TABLE t1 (s1 INT);
2. INSERT INTO t1 VALUES (1);
3. CREATE TABLE t2 (s1 INT);
4. INSERT INTO t2 VALUES (2);

然後執行 SELECT 語句:

1. SELECT (SELECT s1 FROM t2) FROM t1;

結果是2,因為 t2 中有一行包含值為 2 的列 s1。

在 MySQL 8.0.19 及更高版本中,前面的查詢也可以這樣寫,使用 TABLE:

1. SELECT (TABLE t2) FROM t1;

標量子查詢可以是表示式的一部分,即使子查詢是為函式提供引數的運算元,也請記住使用括號。例如:

1. SELECT UPPER((SELECT s1 FROM t1)) FROM t2;

在 MySQL 8.0.19 和更高版本中,使用 SELECT UPPER((TABLE t1)) FROM t2 語句可以得到相同的結果。

官方網址: