全書共有30章,在通讀完之后深浮。進(jìn)行總結(jié)。
全書可以劃分為1眠冈,2章節(jié)是對MYSQL數(shù)據(jù)庫的介紹飞苇;3章節(jié)是連接數(shù)據(jù)庫;4-18章主要是查詢的各種操作蜗顽,是重點布卡;19章是插入數(shù)據(jù);20章是更新和刪除數(shù)據(jù)雇盖;21章是對表的操作忿等;22章-25章是對視圖,存儲過程崔挖,游標(biāo)贸街,觸發(fā)器的介紹,剩下的章節(jié)是關(guān)于安全性和性能的一些知識狸相。對常用的命令進(jìn)行提取和注意點的總結(jié)薛匪。
對于性能的知識得格外的注意,防止開發(fā)過程中出現(xiàn)慢查詢脓鹃,導(dǎo)致阻塞逸尖。總結(jié)中采用 紅色+傾斜+加粗的字體引起重視。其中娇跟,對于聚集函數(shù)的使用岩齿,應(yīng)該根據(jù)實際項目中開發(fā)所碰到的表的數(shù)據(jù)量來決定是否使用,對于多人操作的量大的表苞俘,還是不要直接對表查詢的時候進(jìn)行一些聚集函數(shù)的操作盹沈,可以將數(shù)據(jù)返回之后,進(jìn)行處理苗胀。
1.MYSQL數(shù)據(jù)庫的介紹
數(shù)據(jù)庫:保存有組織的數(shù)據(jù)的容器(通常是一個文件或者是一組文件)襟诸。
表:?? ??? ?同一數(shù)據(jù)庫,表具有唯一的名字基协。
模?? ?式:關(guān)于數(shù)據(jù)庫和表的布局及特性的信息歌亲。貌似沒有用過,先暫時省略澜驮。陷揪。
主?? ?鍵:并不強(qiáng)求一定有主鍵,但還是最好保證創(chuàng)建的表具有一個主鍵杂穷,便于數(shù)據(jù)的操縱和管理悍缠。
?有幾個好的習(xí)慣:
????1.不更新主鍵列中的值
? ? 2.不重用主鍵列中的值
? ? 3.不在主鍵列中使用可能會更改的值。(例如耐量,如果使用一個名字)
SQL:是一種專門用來與數(shù)據(jù)庫通信的語言飞蚓。
MYSQL工具:
? ?????1.mysql命令行實用程序
brew install mysql
mysql.server start
mysql -h 10.10.0.27 -u XXX -p
? ? ? ?2.mysql Administrator
? ? ? ?3.mysql Query Browser
2.連接數(shù)據(jù)庫
? ? 命令行:
? ? 1.選擇一個數(shù)據(jù)庫
? ? USE database;
?輸出:Database changed
? ? 2.顯示信息——> HELP SHOW;
? ? SHOW DATABASES;
? ?輸出:可用數(shù)據(jù)庫的列表
? ? SHOW TABLES;
? ?輸出:當(dāng)前選擇的數(shù)據(jù)庫內(nèi)可用表的列表
? ? SHOW COLUMNS FROM customers; ?或者 DESCRIBE?customers;
? ?輸出:SHOW COLUMNS要求給出一個表名,它對每個字段返回一行廊蜒,行中包括字段名(Field)趴拧,數(shù)據(jù)類型(Type),是否允許NULL(Null),鍵信息(Key)山叮,默認(rèn)值(Default)以及其他信息(Extra).
? ? SHOW STATUS;
? ?輸出:用于顯示廣泛的服務(wù)器狀態(tài)信息著榴;
? ? SHOW GRANTS;
? ?輸出:用來顯示授予用戶(所有用戶或特定用戶)的安全權(quán)限
? ? SHOW ERRORS和SHOW WARNINGS屁倔;
? ?輸出:用來顯示服務(wù)器錯誤或者警告的信息
3.對數(shù)據(jù)庫的查詢
注意點:
? ? 1.多條SQL語句必須以分號(脑又;)分隔,不需要在單條之后加锐借,但是總是加上總不會錯问麸;mysql的命令行,則必須加上分號來結(jié)尾瞎饲;
? ? 2.SQL語句不區(qū)分不小寫口叙,但為了規(guī)范對SQL的關(guān)鍵字使用大寫,對所有列名和表名使用小寫嗅战;
? ? 3.使用空格:在處理SQL語句時妄田,其中所有空格都被忽略俺亮。可以在一行或者多行給出疟呐。建議分成多行更容易閱讀脚曾。
查詢語句匯集:
1.檢索單個列
?? ?? ? SELECT prod_name FROM products;
注:這條語句將返回表中的所有行,不用的人使用可能返回的數(shù)據(jù)順序不一樣启具,這是一種正常的情況本讥。返回的數(shù)據(jù)沒有特殊的意義,順序可能是數(shù)據(jù)被添加到表中的順序鲁冯,也可能不是拷沸。只要返回相同數(shù)目的行,就是正確的薯演。
2.檢索多個列
SELECT prod_name,prod_id,prod_price FROM products;
3.檢索所有列
?? ?? ? SELECT * FROM?products;
注:除非確定需要所有的列撞芍,一般不建議直接使用通配符,檢索不需要的列會降低檢索和應(yīng)用程序的性能跨扮。
4.檢索不同的行
SELECT DISTINCT vend_id FROM products;
注:不能部分使用DISTINCT序无,DISTINCT關(guān)鍵字應(yīng)用與所有列而不僅僅是前置它的列。如果給出SELECT DISTINCT vend_id,prod_price FROM products衡创,除非指定的所有列都不相同帝嗡,否則所有行都將被檢索出來。
5.限制結(jié)果
SELECT prod_name FROM products LIMIT 5;
注:LIMIT 5,5指示返回從行5開始的5行璃氢。第一個數(shù)字為開始位置哟玷,第二個數(shù)字為要檢索的行數(shù)。在行數(shù)不夠時一也,LIMIT中指定要檢索的行數(shù)為檢索的最大行數(shù)碗降,如果沒有足夠的行(例如LIMIT10,5塘秦;但只有13行),將只返回它能返回的那么多行动看。??
6.使用完全限定的表名
SELECT products.prod_name FROM products;
7.排序順序
SELECT prod_name FROM products ORDER BY prod_name;
?注:按字母順序排列尊剔。
8.按多個列排序
SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price,prod_name;
注:在按多個列排序時,排序完全按所規(guī)定的順序進(jìn)行菱皆。也就是僅在多個行具有相同的prod_price值時才對產(chǎn)品按prod_name進(jìn)行排序须误,如果prod_price列中的所有的值都是唯一的,則不會按prod_name排序仇轻。
9.指定排列方向
SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price DESC;
SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price DESC,prod_name;
注:DESC只應(yīng)用到直接位于其前面的列京痢。上面,只對prod_price排序篷店,對prod_name不排序祭椰。如果想在多個列上進(jìn)行降序排序臭家,必須對每個列指定DESC關(guān)鍵字。
10.使用WHREE子句
SELECT prod_name,prod_price,FROM products WHERE prod_name = 2.50;
?? ?? ?注:WHRER子句操作符:=方淤,<>,!=,<,<=,>,>=,BETWEEN…AND..
? ?11.空值檢查
SELECT prod_id FROM products WHERE prod_name IS NULL;
注:NULL 與不匹配钉赁,在通過過濾選擇出不具有特定值的行時,你可能希望返回具有NULL值的行携茂。但是你踩,不行。因為未知具有特殊的含義讳苦,數(shù)據(jù)庫不知道他們是不是匹配带膜,所以在匹配過濾或者不匹配過濾時不返回他們。因此鸳谜,在過濾數(shù)據(jù)時膝藕,一定要驗證返回數(shù)據(jù)中確實給出了被過濾行具有NULL的行。
? ?12.AND操作符
SELECT prod_id,prod_price,prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 10;
? ? 13.OR操作符
SELECT prod_name,prod_price FROM products WHERE vend_id = 1002 OR vender_id =1003;
注:AND和OR的計算次序卿堂,由于AND的優(yōu)先級高于OR束莫,所以在碰到a OR b AND c會處理成a ?OR (b AND c),所以解決問題的方法是使用圓括號明確的進(jìn)行分組。
14.IN操作符
SELECT prod_name,prod_price FROM products WHERE vend_id IN (1002,1003) ORDER BY prod_name;
注:上面的IN可以使用OR也生效草描。但是為什么要使用IN览绿?
1.在使用長的合法選項清單時,IN操作符的語句更清楚且更直觀穗慕。
?2.在使用IN時饿敲,計算的次序更容易管理(因為使用的操作符更少)。
3.IN操作符一般比OR操作符的執(zhí)行更快逛绵。
4.IN的最大優(yōu)點是可以包含其他SELECT語句怀各,使得能夠更動態(tài)的建立WHERE語句。
15.NOT操作符
SELECT prod_name,prod_price FROM products WHERE vend_id NOT IN (1002,1003) ORDER BY prod_name;
?注:mysql支持使用NOT對IN术浪,BETWEEN和EXISTS子句取反瓢对。
16.LIKE操作符
%通配符:任何字符出現(xiàn)任意次數(shù)。
SELECT prod_id,prod_name FROM products WHERE prod_name LIKE?‘jet%’;
?注:1.尾空格可能會干擾通配符匹配胰苏。解決這個問題的辦法一是在搜索模式的最后附加一個%硕蛹,另一個辦法是使用函數(shù)去掉首位空格。2.WHERE prod_name LIKE?‘%’不會匹配到NULL值硕并。
?_通配符:單個字符出現(xiàn)任意次數(shù)法焰。
SELECT prod_id,prod_name FROM products WHERE prod_name LIKE?‘_ ton anvil’;
注:與%能匹配0個字符不一樣,_總能匹配一個字符倔毙,不能多也不能少埃仪。
注:通配符搜索的處理一般要花費時間更長。下面是一些技巧:
1.不要過度使用通配符陕赃。如果其他操作符能達(dá)到相同的目的卵蛉,應(yīng)該使用其他操作符颁股。
2.在確實需要使用通配符時,除非絕對有必要毙玻,否則不要把他們用到搜索模式的開始處豌蟋。把通配符置于搜索模式的開始處,搜索起步時最慢的桑滩。
3.仔細(xì)注意通配符的位置梧疲。如果放錯位置,可能你不會返回想要的數(shù)據(jù)运准。
17.正則表達(dá)式
基本字符匹配 :包含XXX的行
SELECT prod_name FROM products WHERE prod_name REGEXP?‘1000’ ORDER BY prod_name;
====================
LIKE 和 REGEXP:在LIKE和REGEXP之間有一個重要的差別幌氮。請看一下兩條語句:
?? ?? ? SELECT prod_name FROM products WHERE prod_name LIKE?‘1000’ ORDER BY prod_name;
?? ?? ? SELECT prod_name FROM products WHERE prod_name REGEXP?‘1000’ ORDER BY prod_name;
?如果執(zhí)行上面兩條語句,會發(fā)現(xiàn)第一條語句不返回數(shù)據(jù)胁澳,而第二條語句返回一行该互。為什么?
LIKE 匹配整個列韭畸,如果被匹配的文本在列值中出現(xiàn)宇智,LIKE將不會找到它,相應(yīng)的行也不被返回(除非使用通配符)胰丁。而REGEXP在列值內(nèi)進(jìn)行匹配随橘,(指的是包含1000的行)如果被匹配的文本在列值中出現(xiàn),REGEXP將會找到它锦庸,相應(yīng)的行將被返回机蔗。這是一個非常重要的區(qū)別。
? 那么,REGEXP能不能用來匹配整個列值(從來起于LIKE相同的作用)甘萧?使用^和定位符即可萝嘁。
OR匹配
SELECT prod_name FROM products WHERE prod_name REGEXP?‘1000|2000’ ORDER BY prod_name;
匹配幾個字符之一
SELECT prod_name FROM products WHERE prod_name REGEXP?‘[123] Tom’ ORDER BY prod_name;
?注:[^123]匹配除這些字符外的任何東西。
?匹配范圍
SELECT prod_name FROM products WHERE prod_name REGEXP?‘[1-5] Tom’ ORDER BY prod_name;
?匹配特殊字符
SELECT vender_name FROM venders WHERE vend_name REGEXP?‘\\.’ ORDER BY vender_name;
?注意:mysql的轉(zhuǎn)義需要兩個反斜杠扬卷,mysql解釋一個牙言,正則表達(dá)式解釋一個。