mysql數據庫總結復習 1.mysql數據庫復習加強 2.mysql事務觸發器 3.mysql 索引外鍵加強 4.zendstudio 的安裝使用 5.svn版本控制器的使用 1.mysql數據庫復習加強 1,導出mysql數據庫裡ecshop到d盤 mysqldump 指令和 mysql指令是一樣的 引出一個環境變量: 就是系統找到需要運行的程序的路徑 Mysqldump -u root -p 數據庫名 > 導出的文件名 1,找到mysqldump.exe這個程序,它是用來備份的 2,執行備份命令 E:\wamp\mysql\bin>mysqldump -u root -p ecshop > d:/ecshopbak.sql (2)備份數據庫中某個數據表 1,找到mysqldump.exe這個程序,它是用來備份的 2,執行備份命令 E:\wamp\mysql\bin>mysqldump -u root -p ecshop ecs_goods > d:goodsbak.sql 導入外部數據庫文件 source 指令是屬於mysql的 刪除數據表 drop table ecs_goods; 清空數據表中的數據: delete from 表名 delete 和 drop 區別: delete q清空數據表中的數據(結構) drop 刪除整個表 編碼: utf-8 統一的編碼,它支持中文和英文,建議建表的時候都是用utf-8,利於網站國際化 gb2312 支持大陸的中文, gbk 包括gb2312,支持韓文,日文,香港。。。 mysql 數據庫數據類型(列類型) 1,數值類型(整型,浮點型,定點型) 2,字符串類型(char, varchar,text,enum(枚舉類型)) 但是enum類型由於兼容性和移植性,不太建議使用 3,日期和時間類型 datetime()------年月日時分秒 date----------年月日 time--------時分秒 時間戳表示時間---------timestamp---------now() int表示的范圍是 --- 0--- tinyint 表示的范圍------0-255 smallint-------- 有符號 signed ------正負數 -128 到 127 表示的范圍也是255個長度 無符號 unsigned------沒有正負數 0 -255 如果給全班同學建表 unsinged 字符串類型 char 定長(固定長度)字符串----- 0-65535 varchar 可變長度----varchar (255)多少個字節 ,最多255個 text 大的文本數據 時間日期類型 date() 解析這個數據庫函數 timestamp ------------不解析-----所以速度要比mysql日期函數快 我建議使用時間戳表示時間 練習: 給我們的同學建一張數據表,字段包括 學生id 姓名 入學時間 tinyint 255 -128 127 0-255 unsigned varchar(10) 可變長度,最多10個字節,真正使用幾個給你分配幾個 char() ---------定長 0-65535,不管字符串或多或少都占用 65535長度 name time date, datetime mysql內置的日期函數,mysql引擎查詢的時候要先解析 函數,速度慢 timestamp 字符串(‘2013-04-16’) 優化表注意事項: 1,創建id-----盡量表前綴連上id,假如 商品表 goods_id 分類表 cat_id 2,創建表的時候---指定存儲引擎------如果查詢為主的話,engine=myisam ,為了避免亂碼----指定utf8 default charset 3,盡量使用時間戳或字符串 表示日期和和時間 4,字段(數值,字符串) (2)查詢語句: 獲得商品id為 3 5 7 8 的商品信息 group by 分組的使用 1,商品表和商品分類表,通過在商品表中增加 cat_id字段,關聯起來了 2,ecs_category分類表,保存的是商品的分類 id 注意: //查詢不同cat_id,下面對應的不同的商品數量 (1)先根據分類,分組 (2)再統計分組裡面的商品的數量 group by 根據xx來分組, 如果合計函數,和group by 一起使用的話,統計的是當前分組內的數據 練習題: 查詢不同的商品分類下面,商品價格的總和 查詢不同的商品分類下面,價格最高的商品 查詢不同的商品分類下面,商品價格的平均數 合計函數: Max:最大值 M1in:最小值 Count():統計總的記錄數 Avg:平均數 Sum:求和 having 和 where 區別: where:限制的是整個數據表中字段 select goods_name from ecs_goods where goods_id=9; having: 限制的條件是:前面查詢的結果,這個結果有什麼條件 union查詢 union 聯合 連接 union可以將多個查詢語句連接起來,select 1 union select2 (select goods_name from ecs_goods where cat_id=3 order by shop_price desc limit 3) union (select goods_name from ecs_goods where cat_id=4 order by shop_price asc li mit 3); //查詢手機類型下面的所有的手機品牌 mysql> select cat_name from ecs_category where cat_id=1 union select cat_name fr om ecs_category where parent_id=1; 子查詢 如果一個select查詢語句 包含了另一select查詢語句 就稱之為子查詢 (1)select型子查詢 select goods_name from ecs_goods where cat_id=(select cat_id from ecs_cat egory where cat_name = 'GSM手機'); (2)from型子查詢 需要注意: from後面的子查詢列表 要有自己的別名 select goods_name from(select * from ecs_goods where cat_id in(3,5)) as tem_goods where goods_name like '諾基亞%'; 思路1: select avg(score),name from score where name in(select name from score where score < 60 group by name having count(*)>=2) group by name; 思路2: 1,統計每個分組中,分數小於60的功課數量 select count(subject) as na from score group by subject having na >=2; 思路3: 1,統計每個分組中,分數小於60的功課數量 select sum(score<60) as su from score group by name having su>=2; select avg(score),name from score where name in(select name from score where score < 60 group by name having count(*)>=2) group by name; 2.mysql事務觸發器 1,連接查詢 union 連接的是多個select 語句 join 連接查詢: 當我們期望的結果不再同一張表上時,我們需要使用join連接查詢 語法: table1 join table2 on table1的某個字段 = table2的某個字段 條件是 商品表中商品的分類id = 分類表中這個分類的id 當查詢語句中,多次使用某個表,或者這個表名特別長的時候,我們建議給這個表添加一個別名 mysql> select goods_name,shop_price,cat_name from ecs_goods as g join ecs_catego ry as c on g.cat_id = c.cat_id where g.shop_price>=1000; join的分類: 左連接查詢 left join:查詢的結果是只要左邊有的記錄,都會顯示,右邊沒有的顯示為null 右連接查詢 right join 內連接查詢 inner join : 查詢的結果是兩個表都有的數據 事務: 什麼是事務? 事務是邏輯上的一組操作,組成這組操作的各個單元,要不全都成功要不全都失敗,這個特性就是事務 注意:mysql數據支持事務,但是要求必須是innoDB存儲引擎 解決這個問題: mysql的事務解決這個問題,因為mysql的事務特性,要求這組操作,要不全都成功,要不全都失敗,這樣就避免了某個操作成功某個操作失敗。利於數據的安全 如何使用: (1)在執行sql語句之前,我們要開啟事務 start transaction; (2)正常執行我們的sql語句 (3)當sql語句執行完畢,存在兩種情況: 1,全都成功,我們要將sql語句對數據庫造成的影響提交到數據庫中,committ 2,某些sql語句失敗,我們執行rollback(回滾),將對數據庫操作趕緊撤銷 php代碼: 開啟事務後,只要不執行commit,sql語句不會對真實的數據庫造成影響 只有執行commit之後,才會對真實數據庫造成影響 觸發器: 觸發器是數據庫的一個程序,他是用來監聽著數據表的某個行為,一旦數據表的這個行為發生了,馬上執行相應的sql語句 觸發器的語法結構: create trigger 觸發器的名稱 觸發器事件 on 監聽的表名 for each row 行為發生後執行的sql語句 觸發器事件組成:;兩部分組成: 觸發器事件發生的時間-----是在監聽的表的行為 after before 常用的是after 觸發器執行的內容:增刪改 創建order 表的時候,需要注意,因為order在mysql中是一個關鍵字 排序,為了避免錯誤的發生,我們可以添加反引號,表明這不是一個關鍵字 如何使用觸發器: 案例研究: 一旦生成訂單,對應的庫存表要減去相應的數據 (1)建商品表和訂單表 訂單表 (2)給訂單表綁定觸發器,一旦訂單表增加訂單,馬上執行sql語句,將商品庫存表減去相應的數據 現在有個問題: 每次下訂單後,庫存表都是減去相應的數量固定死的,但是我們的需求是:用戶下幾個訂單,庫存表減去幾個庫存 如何在觸發器中使用觸發數據? 什麼是觸發的數據:就是用戶在訂單表中購買的數量 new 關鍵字代表新增加的數量,訂單表中新下的訂單數量 old 關鍵字代表是舊的記錄(過去的記錄,取消的訂單數量) new 的使用: old的使用: 舊的過去的記錄,之前買了幾個商品,但是又不想要了,取消訂單 取消訂單後,庫存中要增加的相應的數量 update中new 和 old的使用 現在的需求是: 之前購買了5個samsung手機,現在想買10個,需要更新訂單表 這個時候,觸發器就需要監聽著 update這個行為 先將之前下的訂單撤銷,再重新下訂單 觸發器是什麼? 用來監聽數據表的某個行為(insert,delete,update),一旦這個行為發生了,馬上執行相應的sql語句 刪除觸發器: drop trigger 觸發器的名稱 3.mysql 索引外鍵加強 1,索引 什麼是索引? 索引------搜索---引導------引導著我去搜索到某個記錄的 定義: 沒有索引的情況下,我們查詢一條記錄,需要從第一條記錄一直往下查詢,知道查找到我們需要的記錄,如果記錄數特別大的話,相當於大海撈針,速度特別慢 索引:建一個索引-----指向的是數據的位置-----反映到新華字典-----記錄所在的頁數 優勢: 查詢速度快了,但是不足: 增加了維護索引的工作量-----每增加一條記錄----我就要在索引列表中增加一個索引號指向這條記錄的位置 查詢速度快了,但是增 刪除 更新 速度慢了 擴展一點 數據庫中索引保存在哪裡? 保存在 索引的分類: 1,主鍵索引:當我們創建一個表後,指定主鍵後,自動將主鍵設置為主鍵索引 2,普通索引:就是在一個普通的字段上建立索引 3,唯一索引:數據表中的某個字段是唯一的,沒有重復---- 4,全文索引:在某個字段上建立全文索引,將記錄內的關鍵字抽取出來,然後對每個關鍵字進行索引 sphinx-----可以建立全文索引 創建索引: (1)create [索引類型] index 索引名 on 表名(表的某個字段上) (2)alter table 表名 add [索引類型] index (表的字段) 創建索引之前查詢的記錄數 創建索引之後查詢一條記錄,經過的記錄數 刪除索引: 修改索引: 只能是先刪除在增加 外鍵: 什麼是外鍵: 學生舉例: 每個學生對應一張 個人信息表(姓名,學號) 學生詳細信息表(成績,違紀記錄,獲得獎勵,家庭地址,學費,) 這兩個表通過外鍵關聯之後,如果有一天你畢業了,應該將你姓名,學號刪除,這個學生下面對應的詳細信息(成績,違紀記錄,獲得獎勵,家庭地址,學費)自動刪除 使用外鍵的條件: (1)保證數據表的存儲引擎必須是innoDB (2)外鍵關系的兩個表的列必須數據類型相似 int tinyint int----------varchar 外鍵定義的語法: create table tem(id int, name varchar, foreign key(id) references outTable(id) on delete cascade on update cascade ) 監聽的外鍵表的行為:delete update foreign key(id) 指定當前表哪個字段是外鍵 references 和外部哪個表關聯 constrict ‘’; 指定一個名稱,(外鍵關聯的名稱,為了將來刪除這個外鍵的話,通過這個名稱來刪除)約束的名稱 mysql> create table xiaodi(id int primary key auto_increment,foreign_id int,name varchar(32),constraint xiaodi_for foreign key(foreign_id) references dage(id) o n delete cascade on update cascade)engine=innodb default charset=utf8; (1)使用外鍵將兩個表關聯 在當前表創建外鍵字段------和外部表的某個字段可關聯:foreign key(foreign_id) references dage(id) 關聯起來之後監聽著外部那個表,如果他刪除了,我要做什麼?如果他更新了,我又要做什麼 on delete (參數3個) on update (參數3個) 當前表監聽著 外鍵關聯的那個表,監聽的行為有兩種(delete,update),一旦這些行為發生之後,我(xiaodi)要做哪些操作 操作分為3中(常用的有3中),cascade:瀑布,表示跟隨著外鍵關聯的哪個表 restrict 嚴格,表示外部關聯的那個表刪除了,我自己嚴格要求自己(不跟隨變化) NO ACTION -------- 無動作,沒有反映 刪除外鍵: alter table 表名 drop foreign key 外鍵名稱 重置數據庫密碼 (1)我們要明確數據庫的密碼保存在哪裡? mysql數據庫 的 user表 要想修改密碼,先進入mysql窗口,然後修改user表的password字段 步驟: (1)先關閉mysqld服務器端的進程 (2)再次開啟mysqld這個服務,以不帶權限驗證形式開啟(再打開一個窗口,開啟mysqld-nt.exe這個進程之後不要關閉窗口) (3)通過客戶端 鏈接到mysql服務器端,這個時候我們登錄的是root用戶 (4)趕緊修改密碼 注意:需要使用mysql的password()加密函數加密 (5)趕緊把跳過權限驗證登錄的形式 關閉(結束進程,重新開啟服務進程) 4.zendstudio 的安裝使用 如同dw notepad 的結合體~ 5.svn版本控制器的使用 包括服務器端, 客戶端 服務器端在根目錄創建repository庫存放庫文件 如 weibo 在cmd窗口 運行 svnserve -d -r create 路徑 在客戶端創建文件夾並從相關路徑獲取即可 修改文件後 使用commit 交托給服務器 更新時使用update 選擇相應version進行更新