SQL 面試題(一)
從baseball數據表中,選出第20到30條數據
本題應該使用 limit 來完成操作
select * from baseball limit 19,11;
or
select * from baseball limit 11 offset 19;
這兩句的作用是一樣的,都是讀取第2030條數據。由于數據表是從0開始的,所以第20條數據的行號是19。2030條一共有11條數據,故選擇的數據條數是11.
drop、truncate、delete的差別
在SQL中,這三個關鍵詞的作用都是用來刪除,但是存在一些差別
- drop用來刪除整個表格,包括表的結構、依賴和數據;truncate和delete用來刪除表格中所有的數據,不刪除表的結構;
- truncate用來刪除表格中所有數據,delete可以結合where來使用,刪除選中的數據,若不結合where使用,則也是刪除表格中所有數據;
- drop和truncate屬于DDL(data define language數據庫定義語音),操作直接生效,不會放到rollback segment中,故不能回滾;
- delete屬于DML(Data Manipulation Language數據庫操作語音),操作會被放到rollback segment中,事務提交后才能生效,也就是需要commit,故可以回滾;
- 運行速度上,一般drop > truncate > delete;
- 表和索引所占空間。當表被TRUNCATE 后,這個表和索引所占用的空間會恢復到初始大小,而DELETE操作不會減少表或索引所占用的空間。drop語句將表所占用的空間全釋放掉。
操作語句
delete from table_name where colum_name = 'str';
// 可以刪除所有 colum_name = 'str'的行
delete from table_name;
// 可以刪除該表中所有數據,保留表的結構和依賴
drop table table_name;
// 刪除數據表 table_name,包括表結構,依賴和數據,并釋放所占空間
// 在sqlite3中,沒有truncate關鍵詞,可以使用delete或者drop代替truncate進行操作;
drop、delete與truncate分別在什么場景之下使用?
不再需要一張表的時候,用drop
想刪除部分數據行時候,用delete,并且帶上where子句
保留表而刪除所有數據的時候用truncate
表格名稱有空格時,如何修改表格名稱?
可以用單引號將表格名稱括起來,作為一個整體。例如表格名稱為 Titanic Data ,要改名為 titanic
alter table 'Titanic Data' rename to titanic;
用alter來更改表格的名稱。alter是DDL語言,立即生效。
超鍵、候選鍵、主鍵、外鍵分別是什么?
首先,定義如下:
超鍵(super key):在關系中能唯一標識元組的屬性集稱為關系模式的超鍵,超鍵包含候選鍵和主鍵;
候選鍵(candidate key):不含有多余屬性的超鍵稱為候選鍵;候選鍵是可以作為唯一標識的屬性;候選鍵包含主鍵;
主鍵(primary key):用戶選作元組標識的一個候選鍵稱為主鍵,主鍵是從候選鍵中選出來的,是人為定義的。
外鍵(foreign key):如果關系模式其他表的主鍵,可以作為當前表的外鍵,主要用來描述兩個表的關系。
(其中,元組指數據表中的一行,也就是一條記錄。在數據表中,每行是一個元組,每列是一個屬性。)
結合實例的具體解釋:
假設有如下兩個表:
學生(學號,姓名,性別,身份證號,教師編號)
教師(教師編號,姓名,工資)
超鍵:
由超鍵的定義可知,學生表中含有學號或者身份證號的任意組合都為此表的超鍵。如:(學號)、(學號,姓名)、(身份證號,性別)等。
候選鍵:
候選鍵屬于超鍵,它是最小的超鍵,就是說如果再去掉候選鍵中的任何一個屬性它就不再是超鍵了。學生表中的候選鍵為:(學號)、(身份證號)。
主鍵:
主鍵就是候選鍵里面的一個,是人為規定的,例如學生表中,我們通常會讓“學號”做主鍵,教師表中讓“教師編號”做主鍵。
外鍵:
外鍵比較簡單,學生表中的外鍵就是“教師編號”。外鍵主要是用來描述兩個表的關系。
什么是事務?
事務(Transaction)是并發控制的基本單位。所謂的事務,它是一個操作序列,這些操作要么都執行,要么都不執行,它是一個不可分割的工作單位。事務是數據庫維護數據一致性的單位,在每個事務結束時,都能保持數據一致性。
DML的操作都需要事務提交后才能生效,也就是需要commit。
DML是數據庫操作語言 Data Manipulation Language,包括select、insert、update、delete
事務就是一系列的操作語言組成的操作序列,當我們commit之后,就可以運行。
// 選出表中所有的數據
SELECT * FROM table_name;
// 我們可以使用 where 來設置篩選條件,用order by對數據進行排序,用limit來設置需要的數據條數和數據開始的索引,用 distinct 來對數據去重
// 插入一條數據
INSERT INTO table_name VALUES (值1,值2,……);
or
INSERT INTO table_name (列1,列2,……) VALUES (值1,值2,……);
// 使用方法一時,需要給每列都賦值,使用方法二時,可以選擇需要插入數據的列,以及對應插入的值,主鍵必須要有數據
DELETE FROM table_name WHERE colum_name = ‘str’;
// 刪除colum_name列中,所有等于str的行
DELETE FROM table_name;
// 刪除所有的行
// update用來修改表中的數據
UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值
UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson' ;
// 如果 Lastname 為 'Wilson' 的元組的 FirstName為空,則新添 FirstName值,如果 FirstName 已經有值了,則更新 FirstName 的值
UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'
WHERE LastName = 'Wilson';
// 此處是設置多列的情況