天天看點

MySQL資料庫面試題(2020最新版)必知必會(中)replace函數    2 CREATE DATABASE和CREATE SCHEMA3 視圖4 删除

  • left(str, length)
MySQL資料庫面試題(2020最新版)必知必會(中)replace函數    2 CREATE DATABASE和CREATE SCHEMA3 視圖4 删除

right(str, length)

MySQL資料庫面試題(2020最新版)必知必會(中)replace函數    2 CREATE DATABASE和CREATE SCHEMA3 視圖4 删除

substring(字元串,起始位置); substring(字元串,起始位置,長度)

MySQL資料庫面試題(2020最新版)必知必會(中)replace函數    2 CREATE DATABASE和CREATE SCHEMA3 視圖4 删除
MySQL資料庫面試題(2020最新版)必知必會(中)replace函數    2 CREATE DATABASE和CREATE SCHEMA3 視圖4 删除
MySQL資料庫面試題(2020最新版)必知必會(中)replace函數    2 CREATE DATABASE和CREATE SCHEMA3 視圖4 删除

#order by排序

設定你想按哪個字段哪種方式來進行排序,再傳回搜尋結果。

SELECT field1, field2,...fieldN table_name1, table_name2... ORDER BY field1, [field2...] [ASC [DESC]]

可用任何字段作為排序條件

可設定任意個字段來排序

可用 asc 或 desc 設定查詢結果按升/降序

預設升序排列

可添加 where ... like 設定條件

#ength和char_length

length

擷取字元串長度的内置函數方法,utf8編碼下一個漢字是算三個字元,一個數字或字母算一個字元

其他編碼下,一個漢字算兩個字元, 一個數字或字母算一個字元。

char_length

在任何編碼下,不管漢字還是數字或者是字母都算是一個字元

replace函數    

根據主鍵确定被替換的是哪一條記錄、

  • replace(object,search,replace)

把object中出現search的全部替換為replace ,傳回替換後的字元串

select replace('www.jb51.net','w','Ww')--->WwWwWw.jb51.net

把表table中的name字段中的aa替換為bb

update table set name=replace(name,'aa','bb')

  • replace into

replace into table (id,name) values('1','aa'),('2','bb')

向表中插入兩條記錄。如果主鍵id為1或2不存在

就相當于

insert into table (id,name) values('1','aa'),('2','bb')

如果存在相同的值則不會插入資料 。

2 CREATE DATABASE和CREATE SCHEMA

在MySQL中,官方的中文文檔在 CREATE DATABASE 文法一節中寫了一句:也可以使用CREATE SCHEMA。那麼CREATE SCHEMA和CREATE DATABASE在MySQL難道是一樣的嗎?

MySQL 5.0官方的英文文檔中有這麼一句:

這個說法譯成中文應該是:CREATE DATABASE根據給定的名稱建立資料庫,要用這個文法,你需要有資料庫的CREATE權限,CREATE SCHEMA從MySQL5.0.2起,可作為CREATE DATABASE的一個代名詞。

按照這個說法,CREATE SCHEMA是和CREATE DATABASE是一樣的,為了驗證這個說法,參閱了後繼的官方文檔,在MySQL5.5的英文文檔中,官方如是說:

中文:CREATE DATABASE根據給定的名稱建立資料庫,你需要擁有資料庫的CREATE權限來使用這個語句。CREATE SCHEMA是CREATE DATABASE的一個代名詞。

由此可見,在MySQL的文法操作中(MySQL5.0.2之後),可以使用CREATE DATABASE和CREATE SCHEMA來建立資料庫,兩者在功能上是一緻的。在使用MySQL官方的MySQL管理工具MySQL Workbench 5.2.47建立資料庫時,使用的是CREATE SCHEMA來建立資料庫的。而這和MS SQL中的SCHEMA有很大差别。

3 視圖

視圖是虛拟的表,與包含資料的表不一樣,視圖隻包含使用時動态檢索資料的查詢;不包含任何列或資料。

使用視圖可以簡化複雜的sql操作,隐藏具體的細節,保護資料;視圖建立後,可以使用與表相同的方式利用它們。

視圖不能被索引,也不能有關聯的觸發器或預設值,如果視圖本身内有order by 則對視圖再次order by将被覆寫。

建立視圖:create view XXX as XXXXXXXXXXXXXX;

對于某些視圖比如未使用聯結子查詢分組聚集函數Distinct Union等,是可以對其更新的,對視圖的更新将對基表進行更新;但是視圖主要用于簡化檢索,保護資料,并不用于更新,而且大部分視圖都不可以更新。

4 删除

  • drop直接删掉表
  • truncate删除表中資料,再插入時自增長id又從1開始
  • delete删除表中資料,可以加where字句

(1)

  • DELETE

    每次從表中删除一行,并同時将該行的删除操作作為事務記錄在日志中儲存,以便復原

  • TRUNCATE TABLE

    一次性地從表中删除所有的資料,并不把單獨的删除操作記錄記入日志儲存,删除行是不能恢複的,在删除的過程中不會激活與表有關的删除觸發器。執行速度快。

(2)表和索引所占空間

  • 表被TRUNCATE 後,這個表和索引所占用的空間會恢複到初始大小
  • 而DELETE操作不會減少表或索引所占用的空間
  • drop語句将表所占用的空間全釋放掉

(3) 一般而言,drop > truncate > delete

(4) 應用範圍

  • TRUNCATE 隻能對TABLE
  • DELETE可以是table和view

(5)

  • TRUNCATE 和DELETE隻删除資料
  • 而DROP則删除整個表(結構和資料)

(6)

  • truncate與不帶where的delete :隻删除資料,而不删除表的結構(定義)
  • drop語句将删除表的結構被依賴的限制(constrain),觸發器(trigger)索引(index);依賴于該表的存儲過程/函數将被保留,但其狀态會變為:invalid。

(7)

  • delete語句為DML(data maintain Language),這個操作會被放到 rollback segment中,事務送出後才生效。如果有相應的 tigger,執行的時候将被觸發
  • truncate、drop是DLL(data define language),操作立即生效,原資料不放到 rollback segment中,不能復原

(8)

在沒有備份情況下,謹慎使用 drop 與 truncate

要删除部分資料行采用delete且注意結合where來限制影響範圍。復原段要足夠大。

要删除表用drop;

若想保留表而将表中資料删除

如果與事務無關,用truncate即可實作。

如果和事務有關,或老是想觸發trigger,還是用delete

(9) Truncate table 表名 速度快,而且效率高,因為:

truncate table 在功能上與不帶 WHERE 子句的 DELETE 語句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和事務日志資源少。DELETE 語句每次删除一行,并在事務日志中為所删除的每行記錄一項。TRUNCATE TABLE 通過釋放存儲表資料所用的資料頁來删除資料,并且隻在事務日志中記錄頁的釋放。

(10)

  • TRUNCATE TABLE 删除表中的所有行,但表結構及其列、限制、索引等保持不變。新行辨別所用的計數值重置為該列的種子。
  • 如果想保留辨別計數值,請改用 DELETE。
  • 如果要删除表定義及其資料,請使用 DROP TABLE 語句。

(11) 對于由 FOREIGN KEY 限制引用的表,不能使用 TRUNCATE TABLE,而應使用不帶 WHERE 子句的 DELETE 語句。由于 TRUNCATE TABLE 不記錄在日志中,是以它不能激活觸發器