mysql面试必会6题经典_经典sql面试题及答案第7期
delete from salary where not exists (
select wid from worker where worker.wid = salary.wid)
a. 直接創建索引和間接創建索引
直接創建:使用sql語句創建
間接創建:定義主鍵約束或者唯一性鍵約束,可以間接創建索引,主鍵默認為唯一索引。
b. 普通索引和唯一性索引
普通索引:
CREATE INDEX mycolumn_index ON mytable (myclumn)
唯一性索引:保證在索引列中的全部數據是唯一的,對聚簇索引和非聚簇索引都可以使用:
CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn)
c. 單個索引和復合索引
單個索引:索引建立語句中僅包含單個字段,如上面的普通索引和唯一性索引創建示例。
復合索引:又叫組合索引,在索引建立語句中同時包含多個字段:
CREATE INDEX name_index ON username(firstname, lastname)
其中firstname為前導列。
d. 聚簇索引和非聚簇索引(聚集索引,群集索引)
聚簇索引:物理索引,與基表的物理順序相同,數據值的順序總是按照順序排列:
CREATE CLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn) WITH ALLOW_DUP_ROW
其中WITH ALLOW_DUP_ROW表示允許有重復記錄的聚簇索引。
非聚簇索引:
CREATE UNCLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn)
索引默認為非聚簇索引。
a. 對于復合索引,把使用最頻繁的列做為前導列(索引中第一個字段)。如果查詢時前導列不在查詢條件中則該復合索引不會被使用。如:
create unique index PK_GRADE_CLASS on student (grade, class)
select * from student where class = 2 未使用到索引
select * from dept where grade = 3 使用到了索引
b. 避免對索引列進行計算,對where子句列的任何計算如果不能被編譯優化,都會導致查詢時索引失效。
c. 比較值避免使用NULL
d. 多表查詢時要注意是選擇合適的表做為內表。連接條件要充份考慮帶有索引的表、行數多的表,內外表的選擇可由公式:外層表中的匹配行數*內層表中每一次查找的次數確定,乘積最小為最佳方案。實際多表操作在被實際執行前,查詢優化器會根據連接條件,列出幾組可能的連接方案并從中找出系統開銷最小的最佳方案。
e. 查詢列與索引列次序一致。
f. 用多表連接代替EXISTS子句。
g. 把過濾記錄數最多的條件放在最前面。
h. 善于使用存儲過程,它使sql變得更加靈活和高效。
update B set B.value =
(select A.value from A where A.key = B.key)
where B.id in(select B.id from B, A where B.key = A.key);
事務就是被綁定在一起作為一個邏輯工作單元的SQL語句分組,如果任何一個語句操作失敗那么整個操作就被失敗,以后操作就會回滾到操作前狀態,或者是上有個節點。為了確保要么執行,要么不執行,就可以使用事務。要將有組語句作為事務考慮,就需要通過ACID測試,即原子性,一致性,隔離性和持久性。
在所以的DBMS中,鎖是實現事務的關鍵,鎖可以保證事務的完整性和并發性。與現實生活中鎖一樣,它可以使某些數據的擁有者,在某段時間內不能使用某些數據或數據結構。當然鎖還分級別的。
select * from EMPLOYEE where FIRST_NAME not in ('John','Roy');
游標是對查詢出來的結果集作為一個單元來有效的處理。游標可以定在該單元中的特定行,從結果集的當前行檢索一行或多行。可以對結果集當前行做修改。一般不使用游標,但是需要逐條處理數據的時候,游標顯得十分重要。
數據庫一般的操作是集合操作,也就是對由WHERE子句和選擇列確定的結果集作集合操作,游標是提供的一個非集合操作的途徑。一般情況下,游標實現的功能往往相當于客戶端的一個循環實現的功能,所以,大部分情況下,我們把游標功能搬到客戶端。
游標是把結果集放在服務器內存,并通過循環一條一條處理記錄,對數據庫資源(特別是內存和鎖資源)的消耗是非常大的,所以,我們應該只有在沒有其他方法的情況下才使用游標。
select cid, cname, score, (case when score<60 then 'fail' else 'pass' end) as mark from course;
總結
以上是生活随笔為你收集整理的mysql面试必会6题经典_经典sql面试题及答案第7期的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle pl sql面试题,SQL
- 下一篇: 经典Hive-SQL面试题及答案