LCL WARNING前端
這是我學習《PHP和MySQL Web 開發》的讀書筆記,一些重要的知識點我會記錄下來,固然只會寫我以爲重要的。mysql
若是有幸有人看到這個學習筆記了,你要結合着書看,不要光看這個筆記。sql
在筆記裏我會記錄一些我學習中遇到的問題和解決辦法與注意事項。數據庫
爲了方便管理和查找,文章或者說筆記的目錄我就按照書裏的排了,方便對比着看。編程
不是教學!重要的是說一遍!我是PHP和MySQL 的初學者,我自己是個前端,爲了面向工資編程,拓寬知識面才學的。後端
其實仍是有一些私心得,由於都說教學相長 和 小黃鴨調試法,我這個是小老虎學習法,對着小老虎講知識點,保證本身學的紮實,能掙錢。服務器
歡迎探討和指教,須知一山更比一山高,可是拒絕槓精!學習
李重樓編碼
本章主要是介紹了:spa
你仔細看,每章前的描述,本章主要有介紹什麼什麼內容,那基本上都是你要掌握的,看完一章回來對對這個列表,都會了嘛。開始吧。
SQL的全稱是Structured Query Language。它是訪問關係數據庫管理系統的標準語言。
Structured Query Language 結構化查詢語言,structured 結構化的,讀['strʌktʃəd] 。
用於定義數據庫的數據定義語言(Data Definition Language,DDL)和用於查詢數據庫的數據操做語言(Data Manipulation Language,DML).SQL包含這兩個基礎部分。
insert 語句一般格式以下:
INSERT [INTO] table [(col1,col2,col3,...)] VALUES (value1,value2,value3,...);
書中給的例子:
insert into customers values (null,'Julie Smith','25 Oak Street','Airport West');
結合書都能看明白吧?
劃重點:mysql中的字符串應該包含在一對單引號或雙引號中。
使用 insert 語句指定插入的值會按照插入的順序添加到表中的列。
如不按照列順序添加,要指定添加列以下:(好比說只更新用戶名)
insert into customers (name,city) values('Melissa Jones','Nar Nar Goon North');
或
insert into customers ->set name = '李重樓', ->address = '蓮花池水溝子', ->city = '北京';
然好好好看看關於customerid列指定爲null是爲何?(一下子結合查詢看一下查詢出來的結果,customerid列的值是什麼。)
插入多條數據時,參看程序清單10-1,每一個括號內是一條數據,括號間逗號分隔。
LOW_PRIORITY關鍵字
LOW_PRIORITY 低優先級,主動的下降了語句執行的優先級。(瞭解便可,我問了後端和爬蟲的同事,說不怎麼用...)
MySQL的默認的調度策略可用總結以下:
· 寫入操做優先於讀取操做。
· 對某張數據表的寫入操做某一時刻只能發生一次,寫入請求按照它們到達的次序來處理。
· 對某張數據表的多個讀取操做能夠同時地進行。
DELAYED關鍵字
DELAYED 延遲,延遲插入。這個也先了解,我看到後面重要的話,我回來再修改補充這裏。
DELAYED調節符應用於INSERT和REPLACE語句。當DELAYED插入操做到達的時候, 服務器把數據行放入一個隊列中,並當即給客戶端返回一個狀態信息,這樣客戶端就能夠在數據表被真正地插入記錄以前繼續進行操做了。
前邊的基本格式我就不寫了,太長了關鍵是,實在是懶得敲了。
此處有個重點要說明一下:from 是從..的意思 是 F !! R!! O!!! M!!! form是表單!!!別寫錯了,出錯誤的時候檢查一下這個命令關鍵字!再看看錶名!列名有沒有寫錯!少個S多個S啥的! 這都是血淚換來經驗啊!要好好記住啊~乖!!!
上面那段紅字,實際上是在我初次看書,實操代碼時候記下來的,這裏一樣寫了出來。但願對你有幫助。
書上的代碼必定要跟着敲,多敲才能手熟,才能發現問題,好比我用bookorama帳號登陸的數據庫,查詢結果就都變成了亂碼,首先我敢確定,這是編碼問題。而後我Google了怎麼解決,可是呢,我不敢改,由於我用的是公司項目的開發版本數據庫,雖然有正式版本做後盾,可是亂改配置我也得掂量一下,因此呢,這裏我先放一下。(若是你解決了你告訴我怎麼解決的,我這裏的編碼是utf8mb4的,也請告訴我,root不錯亂,可是bookorama 爲啥錯亂,謝謝。)
select name ,city from customers;
經過在select關鍵字後給出列名稱,能夠指定(查詢)任何數量的列。
其中一個有用的是通配符 「 * 」(星號),它能夠匹配指定一個或多個表中的全部列。
如今呢,嘗試一下經過通配符查詢customers表,看一下在插入數據時,指定爲null或爲空的customerid列的值都是什麼,這可以幫助你理解自增量。
查詢結果以下:(我這個本身改了點數據,可能和你的不同,以理解爲主吧)
+------------+-----------------+--------------------+--------------------+ | customerid | name | address | city | +------------+-----------------+--------------------+--------------------+ | 1 | 劉能 | 牡丹江大街 | 牡丹江 | | 2 | 李重樓 | 北京中 | 北京 | | 3 | 謝廣坤 | 保定市徐水縣 | 保定 | | 4 | Alan Wong | 1/47 Haines Avenue | 保定 | | 5 | Michelle Arthur | 357 North Road | Yarraville | | 6 | Melissa Jones | c3-1 | Nar Nar Goon North | +------------+-----------------+--------------------+--------------------+
另外一個是,若是不知道當前表,或者你須要操做的表都包含哪些列,列名,數據類型,主鍵是什麼的話,下面這個命令沒忘吧?
describe tablename;
查詢結果以下:(customers表結果)
+------------+-----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+-----------+------+-----+---------+----------------+ | customerid | int(11) | NO | PRI | NULL | auto_increment | | name | char(70) | NO | | NULL | | | address | char(100) | NO | | NULL | | | city | char(30) | NO | | NULL | | +------------+-----------+------+-----+---------+----------------+
WHERE語句指定了用於選擇特定行的條件。
首先翻回去一頁,看一下 where 在select查詢語句基本格式中的樣式。
它是方括號內的,表示可選的。也就是你有須要能夠加上。因此,你要學會看基本格式。
select * from orders where customerid= 3;
能夠看出,命令是分行的,你也能夠按回車分行敲,也能夠一行敲,區別是,若是你分行敲,方便MySQL指出第幾行由錯誤。(我都是一行敲的,方便按鍵盤方向鍵上下鍵切換語句)
我書裏的命令是 where customerid= 3,可是書中寫的是customerid爲5的行將被選中。我以爲是書寫錯了,查詢出來的應該是按照條件查詢出的結果,一切以實際操做結果爲準。(個人書是原書第四版,若是不是編輯沒校訂這一塊,那他媽就是盜版書的問題了)
表10-1中列出了經常使用的的比較操做符,本身看吧,能夠都操做一下,看一下效果。
特別的列出 BETWEEN 的列子:(between 是這麼用的)
select * from customers where customerid between 10 and 16;
而後嘗試一下AND和OR組合,使用條件。
這一節的點睛之筆來了啊,其實數據庫的點睛之筆也是這句話。(我的認爲)
要經過數據回答一個問題。
開始吧。
這些數據分佈在不一樣的表中,由於他們與現實世界的對象相關。
書中說在第8章介紹過了。
當建立一個數據庫時,咱們常常爲現實世界的實體和關係創建模型,而且儲存這些實體對象與關係的信息。
要在SQL中獎這些信息放到一塊兒,必須執行一個名爲關聯的操做。簡單地說,這意味着須要根據數據間的關係將兩個或更多的表關聯到一塊兒。
select orders.orderid,orders.amount,orders.date from customers,orders where customers.name='Julie Smith' and customers.customerid = orders.customerid;
一個很重要的關聯準則請記住:
由於是經過來自兩個表的信息來完成這個查詢,所以咱們必須將兩個表都列在這裏。(你的查詢中,須要列出你要查詢的列數據從哪一個數據表中來。)
表名之間的逗號等價於輸入INNER JOIN 或 CROSS JOIN。
有時也稱爲徹底關聯或表的笛卡爾乘積。
笛卡爾乘積...這個比較迷,我給數學很差的同窗們解釋一下:(兩兩相乘?)
簡單的說就是兩個集合相乘的結果。
具體的定義去看看有關代數系的書的定義。
直觀的說就是
集合A{a1,a2,a3} 集合B{b1,b2}
他們的 笛卡爾積 是 A*B ={(a1,b1),(a1,b2),(a2,b1),(a2,b2),(a3,b1),(a3,b2)}
任意兩個元素結合在一塊兒
而後書裏說了,這個沒意義。確實沒有意義,你輸入一下 select * from customers,orders; 你就會看到這兩個數據表的笛卡爾乘積 。我就不貼,太長了。
因此,咱們須要經過 where子句使用關聯條件,來篩選出有意義的數據。
書中例子已經給出了(customers.name='Julie Smith' and customers.customerid = orders.customerid;)篩選出Julie Smith的訂單。
我的總結一下: