- left(str, length)
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iYlR2MkVTNmJDM4MWY1UWY5ITZ0Y2YwYDNxMTN3MTNy8CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
right(str, length)
substring(字元串,起始位置); substring(字元串,起始位置,長度)
#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 不記錄在日志中,是以它不能激活觸發器