內(nèi)容概覽
本文介紹的面試題包括以下內(nèi)容。
- SQL 基礎(chǔ)知識,包括 SQL 應(yīng)用程序、SQL 語句、SQL 命令和 SQL 查詢的類型等。
- SQL 中的函數(shù)。包括聚合函數(shù)和標(biāo)量函數(shù),以及 SQL 內(nèi)置函數(shù)和用戶定義函數(shù)。
- 高級命令。包括 Join、主鍵和外鍵、索引和關(guān)聯(lián)等主題。
- 數(shù)據(jù)庫設(shè)計。包括范式、反范式,以及 DELETE、TRUNCATE、DROP 等 SQL 語句。
- 高級查詢。包括子查詢(嵌套子查詢和相關(guān)子查詢)等。
通用問題
在考察你的 SQL 技術(shù)前,面試官可能會問一些有關(guān) SQL 的通用問題。例如:
- 你對哪些 SQL 方言比較熟悉?
- 你如何評價自己對 SQL 的熟練程度?
- 你從事 SQL 的工作多久了?
雖然在你的簡歷中會提及這些信息,但你也要做好介紹這些信息的準(zhǔn)備。當(dāng)然,這類問題并沒有所謂的正確答案,但切忌在回答時胡編亂造。
就算你的 SQL 工作經(jīng)驗有限,也不必要擔(dān)心,面試官看簡歷的時候就知道這一點了。但既然他們還有興趣面試你,就說明他們認(rèn)為你有與他們公司需求相契合的點。
另外,哪怕你只使用過一種 SQL 方言,也沒關(guān)系。記住,各個 SQL 方言的相似度非常高,只熟悉其中一種也是可以的。
40 個初級 SQL 面試題
80 個常見的 SQL 面試問題與答案
內(nèi)容概覽
本文介紹的面試題包括以下內(nèi)容。
- SQL 基礎(chǔ)知識,包括 SQL 應(yīng)用程序、SQL 語句、SQL 命令和 SQL 查詢的類型等。
- SQL 中的函數(shù)。包括聚合函數(shù)和標(biāo)量函數(shù),以及 SQL 內(nèi)置函數(shù)和用戶定義函數(shù)。
- 高級命令。包括 Join、主鍵和外鍵、索引和關(guān)聯(lián)等主題。
- 數(shù)據(jù)庫設(shè)計。包括范式、反范式,以及 DELETE、TRUNCATE、DROP 等 SQL 語句。
- 高級查詢。包括子查詢(嵌套子查詢和相關(guān)子查詢)等。
通用問題
在考察你的 SQL 技術(shù)前,面試官可能會問一些有關(guān) SQL 的通用問題。例如:
- 你對哪些 SQL 方言比較熟悉?
- 你如何評價自己對 SQL 的熟練程度?
- 你從事 SQL 的工作多久了?
雖然在你的簡歷中會提及這些信息,但你也要做好介紹這些信息的準(zhǔn)備。當(dāng)然,這類問題并沒有所謂的正確答案,但切忌在回答時胡編亂造。
就算你的 SQL 工作經(jīng)驗有限,也不必要擔(dān)心,面試官看簡歷的時候就知道這一點了。但既然他們還有興趣面試你,就說明他們認(rèn)為你有與他們公司需求相契合的點。
另外,哪怕你只使用過一種 SQL 方言,也沒關(guān)系。記住,各個 SQL 方言的相似度非常高,只熟悉其中一種也是可以的。
40 個初級 SQL 面試題
1.什么是SQL?
SQL 的全稱是 Structured Query Language,即結(jié)構(gòu)化查詢語言,它是用來與關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)交互的語言,包括從表中獲取、更新、插入和刪除數(shù)據(jù),也就是我們常說的增刪改查。
2. 什么是 SQL 方言?
SQL 包括多種免費(fèi)或付費(fèi)的版本,這些不同的版本都被稱為 SQL 方言。各種 SQL 方言的語法非常相似,只是功能有些差別。如 Microsoft SQL Server、PostgreSQL、MySQL、SQLite、T-SQL、Oracle 等。
3. SQL的主要應(yīng)用有哪些?
使用 SQL,可以實現(xiàn)以下功能。
- 創(chuàng)建、刪除和更新數(shù)據(jù)庫中的表。
- 訪問、操作和修改表中的數(shù)據(jù)。
- 從一個或多個表中提取和總結(jié)的信息。
- 在表中添加或刪除某些行或列。
總之,SQL 允許以多種方式查詢數(shù)據(jù)庫,還可以輕松地與 Python 或 R 等編程語言集成。
4.什么是 SQL 語句?舉一些例子。
SQL語句也叫作 SQL 命令,由 SQL 引擎解釋并執(zhí)行。SQL 語句包括 SELECT、CREATE、DELETE、DROP 和 REVOKE等。
5. 有哪些類型的 SQL 命令(或 SQL 子集)?
- 數(shù)據(jù)定義語言 (DDL) – 定義和修改數(shù)據(jù)庫的結(jié)構(gòu)。
- 數(shù)據(jù)操作語言 (DML) – 訪問、操作和修改數(shù)據(jù)庫中的數(shù)據(jù)。
- 數(shù)據(jù)控制語言 (DCL) – 控制用戶對數(shù)據(jù)庫中數(shù)據(jù)的訪問,并授予或撤銷特定用戶或一組用戶的權(quán)限。
- 事務(wù)控制語言 (TCL) – 控制數(shù)據(jù)庫中的事務(wù)。
- 數(shù)據(jù)查詢語言 (DQL) – 對數(shù)據(jù)庫中的數(shù)據(jù)執(zhí)行查詢以從中檢索必要的信息。
6. 請給出一些常見 SQL 命令。
-
DDL:
CREATE、ALTER、TABLE、DROP、TRUNCATE、ADD COLUMN -
DML:
UPDATE、DELETE、INSERT -
DCL:
GRANT、REVOKE -
TCL:
COMMIT、SET TRANSACTION、ROLLBACK、SAVEPOINT -
DQL:
SELECT
7.什么是數(shù)據(jù)庫?
數(shù)據(jù)庫是一種結(jié)構(gòu)化的存儲空間,數(shù)據(jù)保存在表中,可供提取、操作和匯總數(shù)據(jù)信息。
8. 什么是 DBMS?你知道哪些類型的 DBMS?
DBMS 是數(shù)據(jù)庫管理系統(tǒng),可以對數(shù)據(jù)執(zhí)行各種操作,如訪問、更新、整理、插入和刪除數(shù)據(jù)。
DBMS 有多種類型,如關(guān)系型、層次型、網(wǎng)絡(luò)型、圖型和面向?qū)ο笮汀_@些類型的劃分基于數(shù)據(jù)在系統(tǒng)中的組織、結(jié)構(gòu)與存儲方式。
9.什么是關(guān)系型數(shù)據(jù)庫管理系統(tǒng)?舉一些 RDBMS 的例子。
RDBMS,即關(guān)系型數(shù)據(jù)庫管理系統(tǒng)。它是最常見的數(shù)據(jù)庫管理系統(tǒng),用于處理存儲表中的數(shù)據(jù)。SQL 是專門用于與關(guān)系型數(shù)據(jù)庫交互的語言。主流的關(guān)系型數(shù)據(jù)庫包括 MySQL、PostgreSQL、Oracle、MariaDB 等。
10. SQL中的表和字段是什么?
表是以表格形式存儲的有組織的數(shù)據(jù)。字段是列的別稱。
11. 什么是 SQL 查詢,你知道哪些類型的查詢?
SQL 查詢是用于查詢或修改數(shù)據(jù)庫中數(shù)據(jù)的 SQL 代碼。
SQL 查詢有兩種:選擇查詢和操作查詢。第一種用于檢索數(shù)據(jù)(包括限制、分組、排序數(shù)據(jù),以及從多個表中提取數(shù)據(jù)等)。第二種 SQL 查詢用于創(chuàng)建、添加、刪除、更新、重命名數(shù)據(jù)等。
12.什么是子查詢?
子查詢也稱為內(nèi)部查詢,是在一個查詢或外部查詢中的查詢。子查詢可能出現(xiàn)在 SELECT、FROM、WHERE 和 UPDATE 等子句中。
子查詢中還可以包含子查詢。最里面的子查詢首先運(yùn)行,并將結(jié)果傳遞給它的外部查詢。
13.你知道哪些類型的 SQL 子查詢?
- 單行子查詢 – 最多返回一行。
- 多行子查詢 – 返回至少兩行。
- 多列子查詢 – 返回至少兩列。
- 相關(guān)子查詢 - 與外部查詢的信息相關(guān)的子查詢。
- 嵌套子查詢 – 子查詢嵌套在另一個子查詢中。
14.什么是約束,為什么使用約束?
定義表中列的數(shù)據(jù)類型的條件。約束可確保表中數(shù)據(jù)的完整性,并阻止不需要的操作。
15.你知道哪些 SQL 約束?
-
DEFAULT– 為列提供默認(rèn)值。 -
UNIQUE– 只允許唯一值。 -
NOT NULL– 只允許非空值。 -
PRIMARY KEY– 必須是唯一值,且必須是非空值(NOT NULL和UNIQUE)。 -
FOREIGN KEY– 實現(xiàn)兩個或多個表之間共享的鍵。
16. 什么是 join?
用于從多個表中提取數(shù)據(jù)記錄的語句。SQL 表可以根據(jù)表之間的關(guān)系進(jìn)行連接。
17. join 的類型都有哪些?
-
(INNER) JOIN– 只返回滿足兩個(或所有)表中定義的 join 條件的記錄。這是默認(rèn)的 SQL 連接。 -
LEFT (OUTER) JOIN– 返回左表中的所有記錄及右表中滿足定義的 join 條件的記錄。 -
RIGHT (OUTER) JOIN– 返回右表中的所有記錄及左表中滿足定義的 join 條件的記錄。 -
FULL (OUTER) JOIN– 返回兩個(或所有)表中的所有記錄。它是左連接和右連接的組合。
18.什么是主鍵?
把表的一列或多列設(shè)置為主鍵可以約束該列中的值是唯一值,而且必須是非空值。主鍵是 NOT NULL 和 UNIQUE 約束的組合。主鍵確保表中的每條記錄都是唯一的,每個表都應(yīng)該包含主鍵,但不能包含多個主鍵。
19. 什么是唯一鍵?
把表的一列或多列設(shè)置為 UNIQUE 可以約束該列中的值是唯一值,即便 NULL 值也只能是唯一的。
20.什么是外鍵?
把表的一列或多列設(shè)置為 FOREIGN KEY 可以將該列與另一個表(或多個表)中的主鍵相關(guān)聯(lián)。外鍵用于把數(shù)據(jù)庫的多個表連接起來。
21.什么是索引?
索引用于實現(xiàn)更快的數(shù)據(jù)檢索。索引可以顯著提高大型數(shù)據(jù)庫的查詢性能。
22. 你知道哪些類型的索引?
- 唯一索引 – 不允許表的列中存在重復(fù)項,便于維護(hù)數(shù)據(jù)完整性。
- 聚合索引 – 定義數(shù)據(jù)庫表中記錄的物理順序,并根據(jù)鍵值進(jìn)行數(shù)據(jù)搜索。一張表只能有一個聚合索引。
- 非聚合索引 – 表的記錄順序與磁盤數(shù)據(jù)的物理順序不匹配。這意味著數(shù)據(jù)存儲在一個位置,非聚合索引存儲在另一個位置。一個表可以有多個非聚合索引。
23.什么是 schema?
schema 是表、存儲過程、索引、函數(shù)和觸發(fā)器等數(shù)據(jù)庫結(jié)構(gòu)元素的集合,是數(shù)據(jù)庫的總體架構(gòu),指定了數(shù)據(jù)庫中對象之間的關(guān)系,并為它們定義不同的訪問權(quán)限。
24.什么是 SQL 注釋?
SQL 代碼注釋可以是單行注釋(--),也可以是多行注釋(/*comment_text*/)。SQL 引擎運(yùn)行時會忽略代碼注釋。注釋是為了讓人更方便地閱讀代碼。
25.什么是 SQL 運(yùn)算符?
用于執(zhí)行特定操作的保留字符或關(guān)鍵字。 SQL 運(yùn)算符通常與 WHERE 子句一起使用,以設(shè)置過濾數(shù)據(jù)的條件。
26. 你知道哪些類型的 SQL 運(yùn)算符?
-
算術(shù)運(yùn)算符:
+、-、*、/ -
比較運(yùn)算符:
>、<、=、>= -
復(fù)合運(yùn)算符:
+=、-=、*=、/= -
邏輯運(yùn)算符:
AND、OR、NOT、BETWEEN -
字符串運(yùn)算符:
%、_、+、^ -
集合運(yùn)算符:
UNION、UNION ALL、INTERSECT、MINUS或EXCEPT
27. 什么是別名?
執(zhí)行 SQL 查詢時為表(或表中的列)指定的臨時名稱。使用別名是為了提高代碼的可讀性,使代碼更加簡潔。別名的關(guān)鍵字是 AS:
SELECT col_1 AS column
FROM table_name;
28. 什么是子句?
SQL 查詢的條件,用于過濾數(shù)據(jù)以獲得查詢的結(jié)果。如,WHERE、LIMIT、HAVING、LIKE、AND、OR、ORDER BY 等。
29. SELECT 查詢中常用的語句有哪些?
主要有 FROM、GROUP BY、JOIN、WHERE、ORDER BY、LIMIT、HAVING 等。
30.如何創(chuàng)建表?
使用 CREATE TABLE。例如,要創(chuàng)建一個包含 3 列預(yù)定義數(shù)據(jù)類型的表。
CREATE TABLE table_name (col_1 datatype,
col_2 datatype,
col_3 datatype);
31.如何更新表?
使用 UPDATE 語句。
UPDATE table_name
SET col_1 = value_1, column_2 = value_2
WHERE condition;
32. 如何從數(shù)據(jù)庫中刪除表?
使用 DROP TABLE 聲明。語法是:DROP TABLE table_name;。
33. 如何獲取表中的記錄數(shù)?
使用聚合函數(shù) COUNT():SELECT COUNT(*) FROM table_name;。
34.如何排序表中的記錄?
使用 ORDER BY 語句。
SELECT * FROM table_name
ORDER BY col_1;
默認(rèn)排序為升序,使用關(guān)鍵字 DESC 可以指定降序的列。還可以實現(xiàn)多列排序,分別指定每一列是升序還降序。例如:
SELECT * FROM table_name
ORDER BY col_1 DESC, col_3, col_6 DESC;
35. 如何選擇表中的所有列?
在 SELECT 語句中使用星號 *。語法是:SELECT * FROM table_name;
36、如何從兩個表中選取共同的記錄?
使用 INTERSECT語句,示例如下。
SELECT * FROM table_1
INTERSECT
SELECT * FROM table_1;
37. 什么是 DISTINCT 語句,如何使用?
DISTINCT 可以與 SELECT 一起使用,以過濾掉重復(fù)項,并僅返回表中列的唯一值。示例如下。
SELECT DISTINCT col_1
FROM table_name;
38.什么是實體?舉一些例子。
實體是可以收集并存儲到數(shù)據(jù)庫表中的現(xiàn)實世界中的對象數(shù)據(jù)。每個實體對應(yīng)于表中的一行,表的列描述其屬性。實體的示例包括銀行交易、學(xué)校學(xué)生、銷售的汽車等。
39.什么是關(guān)系?舉一些例子。
關(guān)系是實體之間的連接,是指數(shù)據(jù)庫中的多個表如何相互關(guān)聯(lián)。例如,可以在銷售數(shù)據(jù)表和客戶表中找到同一客戶的 ID。
40.什么是 NULL?它與 0 或空格有什么不同?
NULL 表示表格中的某個單元格不存在數(shù)據(jù)。
0 是有效的數(shù)值,空字符串是長度為 0 的合法字符串。
40 個中級 SQL 面試題
41. SQL 中什么是函數(shù),為什么要使用函數(shù)?
函數(shù)是執(zhí)行特定任務(wù)的一組 SQL 語句。函數(shù)接收輸入?yún)?shù),對它們執(zhí)行計算或其他操作,然后返回結(jié)果。函數(shù)有助于提高代碼可讀性,并避免重復(fù)相同的代碼片段。
42.你知道哪些類型的 SQL 函數(shù)?
- 聚合函數(shù) – 針對處理分組表中列的記錄,并返回單個值(通常按組)。
- 標(biāo)量函數(shù) – 處理每個單獨(dú)的值,并返回單個值。
另一方面,SQL 函數(shù)可以是內(nèi)置的,或用戶定義的(由用戶根據(jù)其特定需求創(chuàng)建)。
43.你知道哪些聚合函數(shù)?
-
AVG()– 返回平均值。 -
SUM()– 返回值的和。 -
MIN()– 返回最小值。 -
MAX()– 返回最大值。 -
COUNT()– 返回行數(shù),包括具有空值的行數(shù)。 -
FIRST()– 返回列中的第一個值。 -
LAST()– 返回列中的最后一個值。
44.你知道哪些標(biāo)量函數(shù)?
-
LEN()(或LENGTH()) – 返回字符串的長度,包括空格。 -
UCASE()(或UPPER()) – 返回轉(zhuǎn)換為大寫的字符串。 -
LCASE()(或LOWER()) – 返回轉(zhuǎn)換為小寫的字符串。 -
INITCAP()– 返回轉(zhuǎn)換為首字母大寫的字符串。 -
MID()(或SUBSTR()) – 從字符串中提取子字符串。 -
ROUND()– 返回四舍五入到指定小數(shù)位數(shù)的數(shù)值。 -
NOW()– 返回當(dāng)前日期和時間。
45. 什么是大小寫處理函數(shù)?舉一些例子。
大小寫處理函數(shù)是文本函數(shù),用于更改文本數(shù)據(jù)的大小寫,可以將數(shù)據(jù)轉(zhuǎn)換為大寫、小寫或首字母大寫。
-
UCASE()(或UPPER()) – 返回轉(zhuǎn)換為大寫的字符串。 -
LCASE()(或LOWER()) – 返回轉(zhuǎn)換為小寫的字符串。 -
INITCAP()– 返回轉(zhuǎn)換為首字母大寫的字符串。
46. 什么是字符操作函數(shù)?舉一些例子。
字符操作函數(shù)代表字符函數(shù)的子集,它們用于修改文本數(shù)據(jù)。
-
CONCAT()– 連接多個字符串值,將后一個字符串附加到前一個字符串的末尾。 -
SUBSTR()– 返回滿足所提供的起點和終點的字符串的一部分。 -
LENGTH()(或LEN()) – 返回字符串的長度,包括空格。 -
REPLACE()– 用一個子字符串替換提供的字符串中所有出現(xiàn)的已定義子字符串。 -
INSTR()– 返回給定字符串中定義的子字符串的數(shù)字位置。 -
LPAD()/RPAD()– 返回右對齊/左對齊值的左側(cè)/右側(cè)字符的填充。 -
TRIM()– 從提供的字符串的左側(cè)、右側(cè)或兩端刪除所有定義的字符及空格。
47. 局部變量和全局變量有什么區(qū)別?
局部變量只能在聲明該變量的函數(shù)內(nèi)部訪問。
在函數(shù)外部聲明的全局變量存儲在內(nèi)存結(jié)構(gòu)中,可以在整個程序中使用。
48. ORDER BY 語句的默認(rèn)排序是什么??如何更改?
ORDER BY 語句的默認(rèn)排序是升序。要改為降序,需要添加 DESC 關(guān)鍵字,示例如下。
SELECT * FROM table_name
ORDER BY col_1 DESC;
49. 你知道哪些集合運(yùn)算符?
-
UNION– 返回多個查詢語句的結(jié)果合并后的唯一記錄集(不包括重復(fù)項)。 -
UNION ALL– 返回多個查詢語句的結(jié)果合并后的記錄集(包括重復(fù)項)。 -
INTERSECT– 返回多個查詢語句的結(jié)果交集的記錄集。 -
EXCEPT(MySQL 和 Oracle 中為MINUS) – 僅返回第一個語句查詢的結(jié)果,不返回第二個查詢的結(jié)果。
50. 查詢中使用什么運(yùn)算符進(jìn)行模式匹配?
LIKE 運(yùn)算符與 % 和 _ 通配符結(jié)合使用。通配符 % 代表任意數(shù)量的字符,包括 0 個字符;_ 嚴(yán)格來說是一個字符。
51. 主鍵和唯一鍵有什么區(qū)別?
兩種類型的鍵都確保列中的值唯一,但主鍵唯一標(biāo)識表中的每個記錄,唯一鍵則防止該列中出現(xiàn)重復(fù)項。
52.什么是復(fù)合主鍵?
表的主鍵,基于多個列。
53. SELECT 查詢中常見語句的出現(xiàn)順序是什么?
SELECT – FROM – JOIN – ON – WHERE – GROUP BY – HAVING – ORDER BY - LIMIT
54.解釋器執(zhí)行 SELECT 查詢語句的順序是什么?
FROM – JOIN – ON – WHERE – GROUP BY – HAVING – SELECT – ORDER BY – LIMIT
55.什么是視圖,為什么要使用視圖?
視圖一種虛擬表,包含從一個或多個數(shù)據(jù)庫表(或其他視圖)中提取的數(shù)據(jù)。
視圖占用的空間很少,還可以簡化復(fù)雜的查詢,限制對數(shù)據(jù)的訪問以確保安全,實現(xiàn)數(shù)據(jù)獨(dú)立性,并匯總多個表中的數(shù)據(jù)。
56. 可以基于一個視圖再創(chuàng)建一個視圖嗎?
可以。這也叫作嵌套視圖。但要避免嵌套多個視圖,因為代碼會變得難以理解,調(diào)試也更加困難。
57. 原表刪除后還可以使用視圖嗎?
不可以。刪除基表后,任何基于該表的視圖都將失效。使用這樣的視圖時,將收到錯誤消息。
58. 你知道哪些類型的 SQL 關(guān)系?
- 一對一 — 一個表中的每條記錄僅對應(yīng)于另一個表中的一條記錄。
- 一對多 — 一個表中的每條記錄對應(yīng)另一個表中的多條記錄。
- 多對多 — 兩個表中的每條記錄都對應(yīng)于另一個表中的多條記錄。
59. BOOLEAN 數(shù)據(jù)字段的值有哪些?
在 PostgreSQL 中,BOOLEAN 類型的值包括 TRUE、FALSE 和 NULL。在其他 SQL 方言中,如 SQL Server,BIT 類型用于將布爾值存儲為整數(shù) 1(true)或 0(false)。
60. SQL 中的范式(normalization )是什么,為什么要使用范式?
范式是數(shù)據(jù)庫的設(shè)計過程,旨在減少數(shù)據(jù)冗余、提高數(shù)據(jù)一致性和完整性,讓查詢效率更高,也更靈活,常用的范式有第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。
61. SQL 中的非范式(denormalization )是什么,為什么要使用非范式?
非范式是與范式相反的過程:它引入數(shù)據(jù)冗余,并組合來自多個表的數(shù)據(jù)。在讀操作比寫操作更重要的情況下,非范式可以優(yōu)化數(shù)據(jù)庫基礎(chǔ)設(shè)施的性能,有助于避免復(fù)雜的連接,并減少查詢運(yùn)行的時間。
62. 重命名列與列的別名有什么區(qū)別?
重命名列意味著永久更改其在原始表中的實際名稱。
為列指定別名意味著在執(zhí)行 SQL 查詢時為其指定一個臨時名稱,使代碼更易讀,更簡潔。
63. 嵌套子查詢和相關(guān)子查詢(correlated subquery)有什么區(qū)別?
相關(guān)子查詢是嵌套在外部查詢中的內(nèi)部查詢,該查詢引用外部查詢中的值來執(zhí)行,這意味著相關(guān)子查詢依賴于其外部查詢。相反,非相關(guān)子查詢不依賴于外部查詢的數(shù)據(jù),并且可以獨(dú)立于外部查詢運(yùn)行。
64. 聚合索引和非聚合索引的區(qū)別是什么?
聚合索引定義表中記錄的物理順序,并根據(jù)鍵值執(zhí)行數(shù)據(jù)搜索,而非聚合索引的記錄順序與磁盤上實際數(shù)據(jù)的物理順序不匹配。一張表只能有一個聚合索引,但可以有多個非聚合索引。
65. CASE() 函數(shù)是什么?
SQL 中 if-then-else 邏輯的實現(xiàn)方式。CASE() 函數(shù)按順序檢查 WHEN 子句中的條件,在滿足第一個條件時返回 THEN 子句中的值。如果沒有滿足任何條件,則該函數(shù)將返回 ELSE 子句中的值(如果已提供),否則返回 NULL。
CASE
WHEN condition_1 THEN value_1
WHEN condition_2 THEN value_2
WHEN condition_3 THEN value_3
...
ELSE value
END;
66. DELETE 和 TRUNCATE 的區(qū)別是什么?
DELETE 根據(jù) WHERE 子句中的條件從表中刪除一行或多行記錄。
TRUNCATE 是用于刪除表中的所有行,但包含外鍵的表不能使用 TRUNCATE 語句。
DELETE 的速度比 TRUNCATE 慢。
67. DROP 和 TRUNCATE 的區(qū)別是什么?
DROP 從數(shù)據(jù)庫中完全刪除表,包括表結(jié)構(gòu)、約束條件、多表關(guān)系及訪問權(quán)限。
TRUNCATE 刪除表中的所有行的數(shù)據(jù),但不涉及表的結(jié)構(gòu)和約束條件。
DROP 的速度比 TRUNCATE 慢。
兩者都是不可逆的。
68. HAVING 和 WHERE 語句有什么區(qū)別?
HAVING 對分組后的數(shù)據(jù)進(jìn)行聚合處理。
WHERE 則核查每一行的數(shù)據(jù)。
如果兩個語句都出現(xiàn)在查詢中,優(yōu)先級為 WHERE – GROUP BY – HAVING。
SQL 引擎按此順序進(jìn)行解析。
69. 如何向表中添加記錄?
INSERT INTO 與 VALUES 結(jié)合使用。
INSERT INTO table_name
VALUES (value_1, value_2, ...);
70.如何刪除表中的記錄?
使用 DELETE 語句刪除記錄,可以搭配 WHERE 一起使用。
DELETE FROM table_name
WHERE condition;
可以刪除符合條件的多條記錄。
71.如何向表格添加列?
ALTER TABLE 與 ADD 結(jié)合在一起使用。
ALTER TABLE table_name
ADD column_name datatype;
72. 如何重命名表的列?
ALTER TABLE 與 RENAME COLUMN ... TO ... 一起使用,示例如下。
ALTER TABLE table_name
RENAME COLUMN old_column_name TO new_column_name;
73. 如何從表中刪除列?
ALTER TABLE 與 DROP COLUMN一起使用,示例如下。
ALTER TABLE table_name
DROP COLUMN column_name;
34. 如何選擇表中的所有偶數(shù)或奇數(shù)的記錄?
通過計算除以 2 的余數(shù),實現(xiàn)這個操作。
在 PostgreSQL 或 My SQL 中,可以使用 MOD 函數(shù);在 SQL Server 和 SQLite 中使用 % 運(yùn)算符。
使用 MOD 選擇所有偶數(shù)記錄的示例代碼如下。
SELECT * FROM table_name
WHERE MOD(ID_column, 2) = 0;
使用 % 選擇所有偶數(shù)記錄的示例代碼如下。
SELECT * FROM table_name
WHERE ID_column % 2 = 0;
選擇所有奇數(shù)記錄時,其他的內(nèi)容不變,用 <> 運(yùn)算符替代 = 即可。
75、查詢時如何防止重復(fù)記錄?
在 SELECT 語句中使用 DISTINCT,或為該表創(chuàng)建唯一鍵。
76. 如何在表中插入多行數(shù)據(jù)?
使用 INSERT INTO 與 VALUES,示例如下。
INSERT INTO table_name
VALUES (value_1, value_2, ...),
(value_3, value_4, ...),
(value_5, value_6, ...),
...;
77. 如何找到表中某一列的第 n 個最高值?
使用 OFFSET 子句。查找某列中的第 6 個最高值的示例如下。
SELECT * FROM table_name
ORDER BY column_name DESC
LIMIT 1
OFFSET 5;
78. 如何查找表格文本列中以某個字母開頭的值?
使用 LIKE 運(yùn)算符和 % 與 _ 通配符。查找表中所有以 A 開頭的姓的示例如下。
SELECT * FROM table_name
WHERE surname LIKE 'A_';
假設(shè)姓里必須包含至少兩個字母。如果沒有這個假設(shè)則代表姓可以只是 A,示例如下。
SELECT * FROM table_name
WHERE surname LIKE 'A%';
79. 如何查找表中最后一個 id?
使用 MAX() 函數(shù)。在大部分 SQL 方言中的示例如下。
SELECT id
FROM table_name
ORDER BY id DESC
LIMIT 1;
在 SQL Server 中的示例如下。
SELECT TOP 1 id
FROM table_name
ORDER BY id DESC
80. 如何從表中隨機(jī)選擇行?
在 ORDER BY、LIMIT 中使用 RAND() 函數(shù)。在 PostgreSQL 中,使用 RANDOM()。
從 MySQL 的表中返回 5 個隨機(jī)行的示例如下。
SELECT * FROM table_name
ORDER BY RAND()
LIMIT 5;
結(jié)論
本文介紹了 80 個常見的 SQL 面試問題及其答案,希望能夠幫助你為面試做好準(zhǔn)備。
1.什么是SQL?
SQL 的全稱是 Structured Query Language,即結(jié)構(gòu)化查詢語言,它是用來與關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)交互的語言,包括從表中獲取、更新、插入和刪除數(shù)據(jù),也就是我們常說的增刪改查。
2. 什么是 SQL 方言?
SQL 包括多種免費(fèi)或付費(fèi)的版本,這些不同的版本都被稱為 SQL 方言。各種 SQL 方言的語法非常相似,只是功能有些差別。如 Microsoft SQL Server、PostgreSQL、MySQL、SQLite、T-SQL、Oracle 等。
3. SQL的主要應(yīng)用有哪些?
使用 SQL,可以實現(xiàn)以下功能。
- 創(chuàng)建、刪除和更新數(shù)據(jù)庫中的表。
- 訪問、操作和修改表中的數(shù)據(jù)。
- 從一個或多個表中提取和總結(jié)的信息。
- 在表中添加或刪除某些行或列。
總之,SQL 允許以多種方式查詢數(shù)據(jù)庫,還可以輕松地與 Python 或 R 等編程語言集成。
4.什么是 SQL 語句?舉一些例子。
SQL語句也叫作 SQL 命令,由 SQL 引擎解釋并執(zhí)行。SQL 語句包括 SELECT、CREATE、DELETE、DROP 和 REVOKE等。
5. 有哪些類型的 SQL 命令(或 SQL 子集)?
- 數(shù)據(jù)定義語言 (DDL) – 定義和修改數(shù)據(jù)庫的結(jié)構(gòu)。
- 數(shù)據(jù)操作語言 (DML) – 訪問、操作和修改數(shù)據(jù)庫中的數(shù)據(jù)。
- 數(shù)據(jù)控制語言 (DCL) – 控制用戶對數(shù)據(jù)庫中數(shù)據(jù)的訪問,并授予或撤銷特定用戶或一組用戶的權(quán)限。
- 事務(wù)控制語言 (TCL) – 控制數(shù)據(jù)庫中的事務(wù)。
- 數(shù)據(jù)查詢語言 (DQL) – 對數(shù)據(jù)庫中的數(shù)據(jù)執(zhí)行查詢以從中檢索必要的信息。
6. 給出每種類型的常見 SQL 命令的一些示例。
-
DDL:
CREATE、ALTER、TABLE、DROP、TRUNCATE、ADD COLUMN -
DML:
UPDATE、DELETE、INSERT -
DCL:
GRANT、REVOKE -
TCL:
COMMIT、SET TRANSACTION、ROLLBACK、SAVEPOINT -
DQL:
SELECT
7.什么是數(shù)據(jù)庫?
數(shù)據(jù)庫是一種結(jié)構(gòu)化的存儲空間,數(shù)據(jù)保存在許多表中,并可以輕松提取、操作和匯總數(shù)據(jù)信息。
8. 什么是 DBMS?你知道哪些類型的 DBMS?
DBMS 是數(shù)據(jù)庫管理系統(tǒng),可以對數(shù)據(jù)執(zhí)行各種操作,如訪問、更新、整理、插入和刪除數(shù)據(jù)。DBMS 有多種類型,如關(guān)系型、層次型、網(wǎng)絡(luò)型、圖型和面向?qū)ο笮?。這些類型的劃分基于數(shù)據(jù)在系統(tǒng)中的組織、結(jié)構(gòu)與存儲方式。
9.什么是關(guān)系型數(shù)據(jù)庫管理系統(tǒng)?舉一些 RDBMS 的例子。
RDBMS,即關(guān)系型數(shù)據(jù)庫管理系統(tǒng)。它是最常見的數(shù)據(jù)庫管理系統(tǒng),用于處理存儲表中的數(shù)據(jù)。SQL 是專門用于與關(guān)系型數(shù)據(jù)庫交互的語言。主流的關(guān)系型數(shù)據(jù)庫包括 MySQL、PostgreSQL、Oracle、MariaDB 等。
10. SQL中的表和字段是什么?
表是以行列表格形式存儲的有組織的數(shù)據(jù)。字段是列的別稱。
11. 什么是 SQL 查詢,你知道哪些類型的查詢?
查詢是 SQL 代碼,用于查詢或修改數(shù)據(jù)庫的數(shù)據(jù)。SQL 查詢有兩種:選擇和操作查詢。第一種用于檢索數(shù)據(jù)(包括限制、分組、排序數(shù)據(jù),以及從多個表中提取數(shù)據(jù)等)。第二種 SQL 查詢用于創(chuàng)建、添加、刪除、更新、重命名數(shù)據(jù)等。
12.什么是子查詢?
子查詢也稱為內(nèi)部查詢,是在一個查詢或外部查詢中的查詢。子查詢可能出現(xiàn)在 SELECT、FROM、WHERE 和UPDATE 等子句中。子查詢中還可以包含子查詢。最里面的子查詢首先運(yùn)行,并將結(jié)果傳遞給它的外部查詢。
13.你知道哪些類型的 SQL 子查詢?
- 單行子查詢 – 最多返回一行。
- 多行子查詢 – 返回至少兩行。
- 多列子查詢 – 返回至少兩列。
- 相關(guān)子查詢 - 與外部查詢的信息相關(guān)的子查詢。
- 嵌套子查詢 – 子查詢嵌套在另一個子查詢中。
14.什么是約束,為什么使用約束?
定義表中列的數(shù)據(jù)類型的條件。約束可確保表中數(shù)據(jù)的完整性,并阻止不需要的操作。
15.你知道哪些 SQL 約束?
-
DEFAULT– 為列提供默認(rèn)值。 -
UNIQUE– 只允許唯一值。 -
NOT NULL– 只允許非空值。 -
PRIMARY KEY– 必須是唯一值,且必須是非空值(NOT NULL和UNIQUE)。 -
FOREIGN KEY– 實現(xiàn)兩個或多個表之間共享的鍵。
16. 什么是 join?
用于從兩個或多個表中提取數(shù)據(jù)記錄的語句。SQL 表可以根據(jù)表之間的關(guān)系進(jìn)行連接。。
17. join 的類型都有哪些?
-
(INNER) JOIN– 只返回滿足兩個(或所有)表中定義的 join 條件的記錄。這是默認(rèn)的 SQL 連接。 -
LEFT (OUTER) JOIN– 返回左表中的所有記錄及右表中滿足定義的 join 條件的記錄。 -
RIGHT (OUTER) JOIN– 返回右表中的所有記錄及左表中滿足定義的 join 條件的記錄。 -
FULL (OUTER) JOIN– 返回兩個(或所有)表中的所有記錄。它是左連接和右連接的組合。
18.什么是主鍵?
把表的一列或多列設(shè)置為主鍵可以約束該列中的值是唯一值,而且必須是非空值。主鍵是 NOT NULL 和 UNIQUE 約束的組合。主鍵確保表中的每條記錄都是唯一的,每個表都應(yīng)該包含主鍵,但不能包含多個主鍵。
19. 什么是唯一鍵?
把表的一列或多列設(shè)置為 UNIQUE 可以約束該列中的值是唯一值,即便 NULL 值也只能是唯一的。
20.什么是外鍵?
把表的一列或多列設(shè)置為 FOREIGN KEY 可以將該列與另一個表(或多個表)中的主鍵相關(guān)聯(lián)。外鍵用于把數(shù)據(jù)庫的多個表連接起來。
21.什么是索引?
索引用于實現(xiàn)更快的數(shù)據(jù)檢索。索引對于大型數(shù)據(jù)庫特別有用,可以顯著提高查詢性能。
22. 你知道哪些類型的索引?
- 唯一索引 – 不允許表的列中存在重復(fù)項,便于維護(hù)數(shù)據(jù)完整性。
- 聚合索引 – 定義數(shù)據(jù)庫表中記錄的物理順序,并根據(jù)鍵值進(jìn)行數(shù)據(jù)搜索。一張表只能有一個聚合索引。
- 非聚合索引 – 表的記錄順序與磁盤數(shù)據(jù)的物理順序不匹配。這意味著數(shù)據(jù)存儲在一個位置,非聚合索引存儲在另一個位置。一個表可以有多個非聚合索引。
23.什么是 schema?
表、存儲過程、索引、函數(shù)和觸發(fā)器等數(shù)據(jù)庫結(jié)構(gòu)元素的集合,是數(shù)據(jù)庫的總體架構(gòu),指定了數(shù)據(jù)庫中對象之間的關(guān)系,并為它們定義不同的訪問權(quán)限。
24.什么是 SQL 注釋?
SQL 代碼注釋可以是單行注釋(--),也可以是多行注釋(/*comment_text*/:)。SQL 引擎運(yùn)行時會忽略代碼注釋。注釋是為了讓別人更方便地閱讀代碼。
25.什么是 SQL 運(yùn)算符?
用于執(zhí)行特定操作的保留字符或關(guān)鍵字。 SQL 運(yùn)算符通常與 WHERE 子句一起使用,以設(shè)置過濾數(shù)據(jù)的條件。
26. 你知道哪些類型的 SQL 運(yùn)算符?
-
算術(shù)運(yùn)算符:
+、-、*、/ -
比較運(yùn)算符:
>、<、=、>= -
復(fù)合運(yùn)算符:
+=、-=、*=、/= -
邏輯運(yùn)算符:
AND、OR、NOT、BETWEEN -
字符串運(yùn)算符:
%、_、+、^ -
集合運(yùn)算符:
UNION、UNION ALL、INTERSECT、MINUS或EXCEPT
27. 什么是別名?
執(zhí)行 SQL 查詢時為表(或表中的列)指定的臨時名稱。使用別名是為了提高代碼的可讀性,使代碼更加緊湊。別名的關(guān)鍵字是 AS:
SELECT col_1 AS column
FROM table_name;
28. 什么是子句?
SQL 查詢的條件,用于過濾數(shù)據(jù)以獲得查詢的結(jié)果。如,WHERE、LIMIT、HAVING、LIKE、AND、OR、ORDER BY 等。
29. SELECT 查詢中常用的語句有哪些?
主要有 FROM、GROUP BY、JOIN、WHERE、ORDER BY、LIMIT、HAVING 等。
30.如何創(chuàng)建表?
使用 CREATE TABLE。例如,要創(chuàng)建一個包含三列預(yù)定義數(shù)據(jù)類型的表:
CREATE TABLE table_name (col_1 datatype,
col_2 datatype,
col_3 datatype);
31.如何更新表?
使用 UPDATE 語句。語法是:
UPDATE table_name
SET col_1 = value_1, column_2 = value_2
WHERE condition;
32. 如何從數(shù)據(jù)庫中刪除表?
使用 DROP TABLE 聲明。語法是:DROP TABLE table_name;。
33. 如何獲取表中的記錄數(shù)?
使用聚合函數(shù) COUNT():SELECT COUNT(*) FROM table_name;。
34.如何排序表中的記錄?
使用 ORDER BY 語句:
SELECT * FROM table_name
ORDER BY col_1;
默認(rèn)排序為升序,使用關(guān)鍵字 DESC 可以指定降序的列。還可以實現(xiàn)多列排序,分別指定每一列是升序還降序。例如:
SELECT * FROM table_name
ORDER BY col_1 DESC, col_3, col_6 DESC;
35. 如何選擇表中的所有列?
在 SELECT 語句中使用星號 *。語法是:SELECT * FROM table_name;
36、如何從兩個表中選取共同的記錄?
使用 INTERSECT語句,示例如下。
SELECT * FROM table_1
INTERSECT
SELECT * FROM table_1;
37. 什么是 DISTINCT 語句,如何使用它?
DISTINCT 可以與 SELECT 一起使用,以過濾掉重復(fù)項,并僅返回表列中的唯一值。示例如下。
SELECT DISTINCT col_1
FROM table_name;
38.什么是實體?舉一些例子。
實體是可以收集并存儲到數(shù)據(jù)庫表中的現(xiàn)實世界中數(shù)據(jù)。每個實體對應(yīng)于表中的一行,表的列描述其屬性。實體的示例包括銀行交易、學(xué)校學(xué)生、銷售的汽車等。
39.什么是關(guān)系?舉一些例子。
關(guān)系是實體之間的連接性,是指數(shù)據(jù)庫中的多個表如何相互關(guān)聯(lián)。例如,可以在銷售數(shù)據(jù)表和客戶表中找到同一客戶的 ID。
40.什么是 NULL?它與 0 或空格有什么不同?
NULL 表示表格中的某個單元格不存在數(shù)據(jù)。0 是有效的數(shù)值,空字符串是長度為 0 的合法字符串。
40 個中級 SQL 面試題
41. SQL 中什么是函數(shù),為什么要使用函數(shù)?
執(zhí)行特定任務(wù)的一組 SQL 語句所表示的數(shù)據(jù)庫對象。函數(shù)接收輸入?yún)?shù),對它們執(zhí)行計算或其他操作,然后返回結(jié)果。函數(shù)有助于提高代碼可讀性,并避免重復(fù)相同的代碼片段。
42.你知道哪些類型的 SQL 函數(shù)?
- 聚合函數(shù) – 針對表中提供的列處理多個通常分組的記錄,并返回單個值(通常按組)。
- 標(biāo)量函數(shù) – 處理每個單獨(dú)的值并返回單個值。
另一方面,SQL 函數(shù)可以是內(nèi)置的(由系統(tǒng)定義)或用戶定義的(由用戶根據(jù)其特定需求創(chuàng)建)。
43.你知道哪些聚合函數(shù)?
-
AVG()– 返回平均值。 -
SUM()– 返回值的和。 -
MIN()– 返回最小值。 -
MAX()– 返回最大值。 -
COUNT()– 返回行數(shù),包括具有空值的行數(shù)。 -
FIRST()– 返回列中的第一個值。 -
LAST()– 返回列中的最后一個值。
44.你知道哪些標(biāo)量函數(shù)?
-
LEN()(或LENGTH()) – 返回字符串的長度,包括空格。 -
UCASE()(或UPPER()) – 返回轉(zhuǎn)換為大寫的字符串。 -
LCASE()(或LOWER()) – 返回轉(zhuǎn)換為小寫的字符串。 -
INITCAP()– 返回轉(zhuǎn)換為標(biāo)題大小寫的字符串(即字符串的每個單詞都以大寫字母開頭)。 -
MID()(或SUBSTR()) – 從字符串中提取子字符串。 -
ROUND()– 返回四舍五入到指定小數(shù)位數(shù)的數(shù)值。 -
NOW()– 返回當(dāng)前日期和時間
45. 什么是大小寫處理函數(shù)?舉一些例子。
大小寫操作函數(shù)是字符函數(shù),用于更改文本數(shù)據(jù)的大小寫,可以將數(shù)據(jù)轉(zhuǎn)換為大寫、小寫或首字母大寫。
-
UCASE()(或UPPER()) – 返回轉(zhuǎn)換為大寫的字符串。 -
LCASE()(或LOWER()) – 返回轉(zhuǎn)換為小寫的字符串。 -
INITCAP()– 返回轉(zhuǎn)換為首字母大寫的字符串。
46. 什么是字符操作函數(shù)?舉一些例子。
字符操作函數(shù)代表字符函數(shù)的子集,它們用于修改文本數(shù)據(jù)。
-
CONCAT()– 連接多個字符串值,將后一個字符串附加到前一個字符串的末尾。 -
SUBSTR()– 返回滿足所提供的起點和終點的字符串的一部分。 -
LENGTH()(或LEN()) – 返回字符串的長度,包括空格。 -
REPLACE()– 用另一個子字符串替換提供的字符串中所有出現(xiàn)的已定義子字符串。 -
INSTR()– 返回給定字符串中定義的子字符串的數(shù)字位置。 -
LPAD()/RPAD()– 返回右對齊/左對齊值的左側(cè)/右側(cè)字符的填充。 -
TRIM()– 從提供的字符串的左側(cè)、右側(cè)或兩端刪除所有定義的字符以及空格。
47. 局部變量和全局變量有什么區(qū)別?
局部變量只能在聲明的函數(shù)內(nèi)部訪問。
在函數(shù)外部聲明的全局變量存儲在內(nèi)存結(jié)構(gòu)中,可以在整個程序中使用。
48. ORDER BY 語句的默認(rèn)排序是什么??如何更改?
ORDER BY 語句的默認(rèn)排序是升序。要改為降序,需要添加 DESC 關(guān)鍵字,如下所示:
SELECT * FROM table_name
ORDER BY col_1 DESC;
49. 你知道哪些集合運(yùn)算符?
-
UNION– 返回多個查詢語句的結(jié)果合并后的唯一記錄集(不包括重復(fù)項)。 -
UNION ALL– 返回多個查詢語句的結(jié)果合并后的記錄集(包括重復(fù)項)。 -
INTERSECT– 返回多個查詢語句的結(jié)果交集的記錄集。 -
EXCEPT(MySQL 和 Oracle 中為MINUS) – 僅返回第一個語句查詢的結(jié)果,不返回第二個查詢的結(jié)果
50. 查詢中使用什么運(yùn)算符進(jìn)行模式匹配?
LIKE 運(yùn)算符與 % 和 _ 通配符結(jié)合使用。通配符 % 代表任意數(shù)量的字符,包括 0 個字符;_ 嚴(yán)格來說是一個字符。
51. 主鍵和唯一鍵有什么區(qū)別?
兩種類型的鍵都確保列中的值唯一,但主鍵唯一標(biāo)識表中的每個記錄,唯一鍵則防止該列中出現(xiàn)重復(fù)項。
52.什么是復(fù)合主鍵?
表的主鍵,基于多個列。
53. SELECT 查詢中常見語句的出現(xiàn)順序是什么?
SELECT – FROM – JOIN – ON – WHERE – GROUP BY – HAVING – ORDER BY - LIMIT
54.解釋器執(zhí)行 SELECT 查詢語句的順序是什么?
FROM – JOIN – ON – WHERE – GROUP BY – HAVING – SELECT – ORDER BY – LIMIT
55.什么是視圖,為什么要使用視圖?
視圖一種虛擬表,包含從一個或多個數(shù)據(jù)庫表(或其他視圖)中提取的數(shù)據(jù)。視圖占用的空間很少,還可以簡化復(fù)雜的查詢,限制對數(shù)據(jù)的訪問以確保安全,實現(xiàn)數(shù)據(jù)獨(dú)立性,并匯總多個表中的數(shù)據(jù)。
56. 可以基于一個視圖再創(chuàng)建一個視圖嗎?
可以。這也叫作嵌套視圖。但要避免嵌套多個視圖,因為代碼會變得難以理解,調(diào)試也更加困難。
57. 原表刪除后還可以使用視圖嗎?
不可以。刪除基表后,任何基于該表的視圖都將變得無效。使用這樣的視圖時,將收到一條錯誤消息。
58. 你知道哪些類型的 SQL 關(guān)系?
- 一對一 — 一個表中的每條記錄僅對應(yīng)于另一個表中的一條記錄。
- 一對多 — 一個表中的每條記錄對應(yīng)另一個表中的多條記錄。
- 多對多 — 兩個表中的每條記錄都對應(yīng)于另一個表中的多條記錄。
59. BOOLEAN 數(shù)據(jù)字段的能值有哪些?
在 PostgreSQL 中,BOOLEAN 類型的值包括 TRUE、FALSE 和 NULL。在其他 SQL 方言中,如 Microsoft SQL Server,BIT 類型用于將布爾值存儲為整數(shù) 1(true)或 0(false)。
60. SQL 中的范式(normalization )是什么,為什么要使用范式?
范式是數(shù)據(jù)庫的設(shè)計過程,旨在減少數(shù)據(jù)冗余、提高數(shù)據(jù)一致性和完整性,讓查詢效率更高,也更靈活,常用的范式有第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。
61. SQL 中的非范式(denormalization )是什么,為什么要使用非范式?
非范式是與范式相反的過程:它引入數(shù)據(jù)冗余,并組合來自多個表的數(shù)據(jù)。在讀操作比寫操作更重要的情況下,非范式可以優(yōu)化數(shù)據(jù)庫基礎(chǔ)設(shè)施的性能,有助于避免復(fù)雜的連接,并減少查詢運(yùn)行的時間。
62. 重命名列和為其指定別名有什么區(qū)別?
重命名列意味著永久更改其在原始表中的實際名稱。
為列指定別名意味著在執(zhí)行 SQL 查詢時為其指定一個臨時名稱,目的是使代碼更易讀,更簡潔。
63. 嵌套子查詢和相關(guān)子查詢(correlated subquery)有什么區(qū)別?
相關(guān)子查詢是嵌套在外部查詢中的內(nèi)部查詢,該查詢引用外部查詢中的值來執(zhí)行,這意味著相關(guān)子查詢依賴于其外部查詢。相反,非相關(guān)子查詢不依賴于外部查詢的數(shù)據(jù),并且可以獨(dú)立于外部查詢運(yùn)行。
64. 聚合索引和非聚合索引的區(qū)別是什么?
聚合索引定義表中記錄的物理順序,并根據(jù)鍵值執(zhí)行數(shù)據(jù)搜索,而非聚合索引的記錄順序與磁盤上實際數(shù)據(jù)的物理順序不匹配。一張表只能有一個聚合索引,但可以有多個非聚合索引。
65.CASE()功能是什么?
SQL 中 if-then-else 邏輯的實現(xiàn)方式。CASE() 函數(shù)順序檢查子句中提供的條件,并在滿足第一個條件時 WHEN 返回相應(yīng)子句中的值。THEN 如果沒有滿足任何條件,則該函數(shù)將返回 ELSE 子句中的值(如果已提供),否則返回 NULL。語法是:
CASE
WHEN condition_1 THEN value_1
WHEN condition_2 THEN value_2
WHEN condition_3 THEN value_3
...
ELSE value
END;
66. DELETE和語句有什么區(qū)別TRUNCATE?
DELETE 根據(jù) WHERE 子句中的條件從表中刪除一行或多行記錄。
TRUNCATE 是用于刪除表中的所有行。但包含外鍵的表不能使用 TRUNCATE 語句。
DELETE 的速度比 TRUNCATE 慢。
67. DROP 和 TRUNCATE 的區(qū)別是什么?
DROP 從數(shù)據(jù)庫中完全刪除表,包括表結(jié)構(gòu)、約束條件、多表關(guān)系及訪問權(quán)限。
TRUNCATE 刪除表中的所有行的數(shù)據(jù),但不影響表結(jié)構(gòu)和約束。
DROP 的速度比 TRUNCATE 慢。兩者都是不可逆的。
68. HAVING 和 WHERE 語句有什么區(qū)別?
HAVING 對分組后的數(shù)據(jù)進(jìn)行聚合處理。
WHERE 則核查每一行的數(shù)據(jù)。
如果兩個語句都出現(xiàn)在查詢中,優(yōu)先級為 WHERE – GROUP BY – HAVING。
SQL 引擎按此順序進(jìn)行解析。
69. 如何向表中添加記錄?
INSERT INTO 與 VALUES 結(jié)合使用。語法是:
INSERT INTO table_name
VALUES (value_1, value_2, ...);
70.如何刪除表中的記錄?
使用 DELETE 語句刪除記錄,可以搭配 WHERE。
DELETE FROM table_name
WHERE condition;
可以刪除符合條件的多條記錄。
71.如何向表格添加列?
ALTER TABLE 與 ADD 結(jié)合在一起使用。
ALTER TABLE table_name
ADD column_name datatype;
72. 如何重命名表的列?
ALTER TABLE 與 RENAME COLUMN ... TO ... 一起使用,示例如下。
ALTER TABLE table_name
RENAME COLUMN old_column_name TO new_column_name;
73. 如何從表中刪除列?
ALTER TABLE 與 DROP COLUMN一起使用,示例如下。
ALTER TABLE table_name
DROP COLUMN column_name;
34. 如何選擇表中的所有偶數(shù)或奇數(shù)的記錄?
通過計算除以 2 的余數(shù),實現(xiàn)這個操作。
在 PostgreSQL 或 My SQL 中,可以使用該 MOD 函數(shù);在 SQL Server 和 SQLite 中使用 % 運(yùn)算符。
使用 MOD 選擇所有偶數(shù)記錄的示例代碼如下。
SELECT * FROM table_name
WHERE MOD(ID_column, 2) = 0;
使用 % 選擇所有偶數(shù)記錄的示例代碼如下。
SELECT * FROM table_name
WHERE ID_column % 2 = 0;
選擇所有奇數(shù)記錄時,其他的內(nèi)容不變,用 <> 運(yùn)算符替代 = 即可。
75、查詢時如何防止重復(fù)記錄?
在 SELECT 語句中使用 DISTINCT,或為該表創(chuàng)建唯一鍵。
76. 如何在表中插入多行數(shù)據(jù)?
使用 INSERT INTO 與 VALUES,示例如下。
INSERT INTO table_name
VALUES (value_1, value_2, ...),
(value_3, value_4, ...),
(value_5, value_6, ...),
...;
77. 如何找到表中某一列的第 n 個最高值?
使用 OFFSET 子句。如查找某列中的第 6 個最高值的示例如下。
SELECT * FROM table_name
ORDER BY column_name DESC
LIMIT 1
OFFSET 5;
78. 如何查找表格文本列中以某個字母開頭的值?
使用 LIKE 運(yùn)算符和 % 與 _ 通配符。如要查找表中所有以 A 開頭的姓的示例如下。
SELECT * FROM table_name
WHERE surname LIKE 'A_';
假設(shè)姓里必須包含至少兩個字母。如果沒有這個假設(shè)(意味著姓可以只是 A),查詢?nèi)缦拢?/p>
SELECT * FROM table_name
WHERE surname LIKE 'A%';
79. 如何查找表中最后一個 id?
使用 MAX() 函數(shù)。在大部分 SQL 方言中的示例如下。
SELECT id
FROM table_name
ORDER BY id DESC
LIMIT 1;
在 SQL Server 中的示例如下。
SELECT TOP 1 id
FROM table_name
ORDER BY id DESC
80. 如何從表中隨機(jī)選擇行?
在 ORDER BY、LIMIT 中使用 RAND() 函數(shù)。在 PostgreSQL 中,使用 RANDOM()。從 MySQL 的表中返回 5 個隨機(jī)行的示例如下。
SELECT * FROM table_name
ORDER BY RAND()
LIMIT 5;
結(jié)論
本文介紹了 80 個常見的 SQL 面試問題及其答案。希望能夠幫助你為面試做好準(zhǔn)備。