一、了解MySQL
1、什么是數據庫?
數據庫是一種以某種有組織的方式存儲的數據集合。
2、模式(schema):關於數據庫和表的布局及特性的信息。
3、列:正確的將數據分解為多個列極為重要。通過把它分解開,才有可能利用特定的列對數據進行排序和過濾。
4、主鍵(primary key):一列,其值能夠唯一區分表中每個行,用來表示一個特定的行。應該保證創建的每個表具有一個主鍵,以便於以后的數據操縱和管理。
5、外鍵:
6、SQL語句不區分大小寫,但是開發人員通常對所有SQL關鍵字大寫,而對所有列和表名使用小寫,這樣做使代碼更易於閱讀和調試。
二、使用MySQL
1、連接 mysql -h localhost -u root -p xxxx
2、show命令:
show databases;
use databases;
show tables;
show columns from tablename; ==== describe tablename;
show status; 用於顯示廣泛的服務器狀態信息
show create database databasename;
show create table tablename; 分別用來顯示創建特定數據庫或表的MySQL語句。
show grants; 用來顯示授予用戶(所有用戶或特定用戶)的安全權限
show errors; show warnings; 用來顯示服務器錯誤或警告消息
help show; 顯示允許的show語句
MySQL 5支持一個新的Information_schema命令,可用它來獲得和過濾模式信息。
三、檢索數據
1、select語句:為了檢索數據,必須至少給出兩條信息--想選擇什么,從什么地方選。
select column from tablename; 檢索單個列,如果未排序,返回的順序可能是數據的添加順序也可能不是。
select column1,column2 from tablename; 檢索多個列
select * from tablename; 檢索所有列 ,除非你確實需要表中的每個列,否則最好別用*通配符。雖然使用通配符可能會使你自己省事,但檢索不需要的列通常會降低檢索和應用程序的性能
select distinct column from tablename; 只返回不同值,即剔除重復的數據。distinct 應用於所有列,不僅是前置它的列
select column form tablename limit 5;限制語句,不多於5行。
select column form tablename limit 5,5;限制語句,從第6行開始的5行 ,第一行的行號為0,
有一些情形需要完全限定名,tablename.columnname
2、order by子句排序檢索數據:
關系數據庫設計理論認為,如果不明確規定排序順序,則不應該嘉定檢索出的數據的順序有意義。
select column from tablename order by column;用選擇的列或非選擇的列排序都是合法的。默認升序排列,desc關鍵字降序,如果多個列排序,desc只應用到直接位於其前面的列名。
select column from tablename order by column1,column2;按多個列排序,先按第一個排序,如果重復則繼續按第二個排序。所以,列的順序選擇很重要。
在字典排序中,A被視為與a相同。這是MySQL的默認行為,如果有必要,可以用collation校對字符集改變這種行為。
select * from XXX order by limit 1;可以找到最大值。使用子句的次序不對會產生錯誤消息。
3、where子句過濾檢索數據:
只檢索所需要的數據,通常需要指定搜索條件(search crierria),即過濾條件
select column from table where name ='zhangsan' order by ..;過濾條件默認不區分大小寫。
where子句包含多種條件操作符:
=, <>, !=, <, <=, >, >=, between 5 and 10,(包括開始和結束)
select column from table where column is null;空值檢查
4、組合where子句建立功能更強,更高級的搜索條件:
AND操作符:
select A from table where B=2 and C<>5; 條件交集
OR操作符:
select A from table where B=2 or C<>5; 條件並集
where可以包含任意數目的AND和OR操作,允許兩者結合以進行復雜和高級的過濾。但是AND的優先級比OR的優先級高,所以需要使用圓括號來保證計算次序。不要依賴默認的計算次序。
IN操作符:
select A from table where B in (2,4,6) order by ..;
IN操作符用來指定清單時與OR功能相同,但IN還有很多優點:
IN操作符的語法更清楚且更直觀;IN操作符計算次序更容易管理;
IN操作符一般比OR清單執行更快;
IN操作符最大的優點是可以包含其他select語句,使得能夠更對台地建立where子句。
NOT操作符: not操作符有且只有一個功能,就是否定他之后所跟的任何條件。
Select A from table where B not in (2,4);
MySQL 支持使用 NOT 對 IN 、Between 和 exists 子句取反
5、使用通配符(wildcard)過濾:
搜索模式(search pattern): 由字面值、通配符或兩者組合構成的搜索條件。
LIKE操作符(謂詞):前面介紹的所有操作都是針對已知值進行過濾的。但是這種過濾方式並不是任何時候都好用。利用通配符可以創建比較特定的數據搜索模式。
百分號(%)通配符: %表示任何字符出現任意次數
select * from table where name like 'zhang%';
select * from table where name like '%ang%';
通過 % 可以組合多種搜索模式;但是 % 不能匹配 NULL值
下划線(_)統配符: _ 只匹配單個字符,不能多也不能少
select * from table where name like '_hang';
使用通配符的技巧:
MySQL通配符很有用,但是這種功能是花費代價的,通配符搜索的處理一般要比前面討論的其他搜索花費時間更長。所以需要一些技巧
不要過度使用通配符。如果其他操作符能達到相同的目的,應該使用其他操作符。
在確實需要使用通配符是,除非絕對有必要,否則不要把他們用在搜索模式的開始處。把通配符置於搜索模式的開始處,搜索起來是最慢的。
仔細注意通配符的位置,如果放錯地方,可能不會反悔想要的數據。
6、用正則表達式進行搜索: 用於匹配特定模式的文本,如電話號碼,郵箱等。
REGEXP操作符: regexp 替換立刻的作用
關於正則表達式的內容請參考正則表達式語法。
7、創建計算字段:
計算字段是運行時在select語句內創建的。
使用Concat()函數實現拼接。
select Contact(A, '(',B,')') from table ;
使用別名,別名有時也稱為導出列
select Contact(A, '(',B,')') as A(B) from table ;
執行算術計算
select A, B*C as BC from table;
8、使用數據處理函數:
文本處理函數:
Left()、Right()返回串左(右)邊的字符
Length() 返回串的長度
Locate()找出串的一個子串
Lower()、Upper()轉換大小寫
LTrim()、RTrim()去掉左(右)邊的空格
Soundex() 返回串的SOUNDEX值,將任何文本串轉換為描述其語音表示的字母數字模式的算法。即匹配所有發音類似的值。
SubString()返回子串的字符
日期和時間處理函數:
AddDate() 增加一個日期(天、周等)
AddTime() 增加一個時間(時、分等)
Now()、CurDate()、CurTime() 返回當前的日期和時間、日期部分、時間部分
Date()、Time()、Year()、Month()、Day()、Hour()、Minute()、Second()、返回日期時間的日期部分、時間部分、年、月、日、小時、分鍾、秒
DateDiff() 計算兩個日期之差
Date_ADD() 高度靈活的日期運算函數
Date_Format() 返回一個格式化的日期或時間串
DayOfWeek() 對於一個日期,返回對應的星期幾
數值處理函數:
Abs(), Cos(), Exp(), Mod(), Pi(), Rand(), Sin(), Sqrt(), Tan()
9、匯總數據:
聚集函數:運行在行組上,計算和返回單個值的函數
AVG(), COUNT(), MAX(), MIN(), SUM()
10、分組數據:
where group by having order by;
select from where group by having order by limit;
group by 通常與匯總函數連用。
11、使用子查詢:
select * from table where A in (select * from table where xxxx);
對於嵌套的子查詢的數目沒有限制,不過在實際使用時由於性能的限制,不能嵌套太多的子查詢。注意:列必須匹配。
12、聯結表:
外鍵(foreign key):外鍵為某個表中的一列,它包含另一個表的主鍵值,定義了兩個表之間的關系。
聯結查詢:規定要聯結的所有表以及他們如何關聯。
select A from table1,table2 where table1.id = table2.id;
笛卡爾積:
內聯結:inner join
外聯結:左外 left outer join;查詢左表中所有記錄的右表活動,如所有人的消費記錄,沒有就顯示空
右外 right outer jion;查詢右表所有記錄的關於左表的情況。
13、組合查詢:
UNION關鍵字:
14、全文本搜索:
MySQL中兩個最常使用的引擎:
MyISAM:支持全文本搜索
InnoDB:不支持全文本搜索
一般在創建表時啟用全文本搜索: fulltext(column);
在索引之后,使用兩個函數Match()和Against()執行全文本搜索,Match()指定被搜索的列,Against指定要使用的搜索表達式。
select column from table where Match(column) Against('模式');
四、插入數據
1、插入完整的行:
insert into tablename values(對應列的次序的值);
這種語法很簡單,但並不安全,應該盡量避免使用。編寫依賴於特定列次序的SQL語句,如果列發生了變化,有時難免會出問題。
insert into tablename(列的名列表) values(對應的值列表);
雖然麻煩,但即使標的結構改變,該語句仍能正確工作,
2、插入多個行:
insert inte tablename(列的名列表) values(對應的值列表),(對應的值列表);
3、插入檢索出的數據:
insert into tableA(列列表) select 列列表 from tableB;
五、更新和刪除數據
1、update: 一定要注意確定要更新的條件,一不小心就更新了所有行。
更新表中特定行:
update table set column='value' where id = 1;
如果刪除某個列的值,可以set null;
更新表中所有行:
2、delete:一定要仔細,因為稍不注意,就會錯誤的刪除表中的所有行
刪除表中特定的行:
delete from tablename where id = 1;
刪除表中所有的行:
delete from tablename;
truncate tablename; 這種完成相同的工作,但是效率更高,它是刪除原來的表在重新創建一個,而不是一行一行的刪除
六、創建表和操縱表
1、創建表:
create table user if not exists
(
id int not null auto_increment,
name varchar(10),
gender char(1) not null default '男',
primary key(id),
foreign key(id) references tableA(id)
)engine=InnoDB;
默認使用 MyISAM引擎,支持全文本搜索
InnoDB引擎,支持事務處理。
引擎類型可以混用,但是外鍵不能跨引擎
存儲引擎:
MySQL可以將數據以不同的技術存儲在文件(內存)中,這種技術就成為存儲引擎。
每一種存儲引擎使用不同的存儲機制、索引技巧、鎖定水平,最終提供廣泛且不同的功能。

2、更新表:
alter table,在理想狀態下,當表中存儲數據后,該表就不應該在被更新。在表的設計過程中需要花費大量時間來考慮,以便后期不對該表進行大的改動。
alter table add column ; 增加列
alter table drop column; 刪除列
alter table modify
alter table 的一種常見用途是定義外鍵:
alter table tableA add constraint 外鍵名 foreign key (列名) references tableB (列名);
alter table 要極為小心,應該在進行改動前做一個完整的備份(模式和數據的備份),數據庫表的更改不能撤銷,如果增加了不需要的列,肯呢過不能刪除他們,類似的,如果刪除了不應該刪除的列,可能會丟失該列中的所有數據。
3、刪除表:
drop table tableA; 該語句沒有確認,也不能撤銷,執行將永久刪除該表。
4、重命名表:
rename table tableA to tableB;
七、視圖
視圖是一個虛擬的表。與包含數據的表不一樣,試圖只包含使用動態檢索數據的查詢。即視圖中不包含表中應該有的任何列或數據,它包含的是一個SQL查詢。
視圖的作用:
重用SQL語句。
簡化復雜的SQL操作。在編寫查詢后,可以方便地重用它而不必知道它的基本查詢細節。
使用標的組成部分而不是整個表。
保護數據。可以給用戶授予表的特定部分的訪問權限而不是整個表的訪問權限。
更改數據格式和表示。試圖可返回與底層表的表示格式不同的數據。
使用視圖:
創建視圖:create view 視圖名 as select 一個聯結查詢;
查看創建視圖的語句:show create view viewname;
刪除視圖:drop view viewname;
更新視圖:create or replace view;
八、使用存儲過程
存儲過程簡單來書,就是為以后的使用而保存的一條或多條MySQL語句的集合。可將其視為批文件。
存儲過程的優點:簡單、安全、高性能
通過把處理封裝在容易使用的單元中,簡化復雜的操作。
由於不要求反復建立一系列處理步驟,這保證了數據的完整性。
簡化多變動的管理。如果表名、列名或業務邏輯有變化,只需要更改存儲過程的代碼,使用它的人員甚至不需要知道這些變化。
提高性能。
創建存儲過程:
執行存儲過程:
九、游標
MySQL游標只能用於存儲過程。
創建游標:
打開和關閉游標:
十、使用觸發器
觸發器是MySQL在響應 insert、update、delete時自動執行的一條語句。
創建觸發器:
刪除觸發器:
使用觸發器:
十一、事務處理
事務處理可以用來維護數據庫的完整性,它保證成批的MySQL操作要么完全執行,要么完全不執行。
相關術語:事務(transaction)、回滾(rollback)、提交(commit)、保留點(savepoint)
控制事務處理:
十二、全球化與本地化
1、字符集和校對順序:
數據庫表被用來存儲和檢索數據。不同的語言和字符集需要以不同的方式存儲和檢索。因此,MySQL需要使用不同的字符集,使用不同的排序和檢索數據的方法。
字符集:為字母和符號的集合
編碼:為某個字符集成員的內部表示
校對:為規定字符如何比較的指令,對 order by 命令的排序結果有重要影響。
show character set; 這條語句顯示所有可用的字符集以及每個字符集的描述和默認校對。
show collation; 顯示所有可用的校對,以及他們使用的字符集。
確定數據庫所用的字符集和校對:
show variables like 'character%';
show variables like 'collation%';
MySQL有六處使用了字符集,分別為:client、connection、database、results、server、system。
client是客戶端使用的字符集。
connection是連接數據庫的字符集設置類型,如果程序沒有指明連接數據庫使用的字符集烈性就按照服務器端默認的字符集設置。
database是數據庫服務器中某個使用的字符集設定,如果建庫是沒有指明,將使用服務器安裝時指定的字符集設置。
results是數據庫給客戶端返回時使用的字符集設定,如果沒有指明,使用服務器默認的字符集。
server是服務器安裝時指定的默認字符集設定。
system是數據庫系統使用的字符集設定。
實際上,字符集很少是服務器范圍的設置,不同的表,甚至不同的列都可能需要不同的字符集,而且兩者都可以在創建表時指定。
create table student(
id int,
name varchar(10) character set gbk collate
)default character set utf8
collate utf8_general_ci;
十三、安全管理
1、訪問控制:
用戶應該對他們需要的數據有適當的訪問權,既不能多也不能少。換句話說,用戶不能對過多的數據具有過多的訪問權。
使用MySQL Administrator 提供了一個圖形界面來管理用戶及賬號權限。
防止無意識的錯誤,訪問控制的目的不僅僅是防止用戶的惡意企圖。數據夢魘更為常見的是無意識錯誤的結果,如打錯MySQL語句,在不合適的數據庫中操作或其他一些用戶錯誤。通過保證用戶不能執行他們不應該執行的語句,訪問控制有助於避免這些情況的發生。
不要使用root,應該嚴肅對待root登錄的使用。僅在絕對需要時使用它,不用改在日常的MySQL操作中使用root。
2、管理用戶:
MySQL用戶賬號和信息存儲在名為mysql的數據庫中。
use mysql;
select user from user;
創建用戶賬號:
create user 用戶名 identified by '密碼';
重命名用戶賬號:
rename user old to new;
刪除用戶賬戶:同時刪除了所有相關的賬號權限。
drop user 用戶名;
設置訪問權限:在創建用戶賬號后,必須接着分配訪問權限。不然看不到任何數據。
show grants for 用戶名@主機名;查看用戶權限
grant用法:要授予的權限,被授予訪問權限的數據庫或表,用戶名
grant select on 數據庫名.表名 to 用戶名;
revoke用法:grant的反操作,用法一樣,被撤銷的訪問權限必須存在。
revoke select on 數據庫名.表名 from 用戶名;
權限列表:all, alter, create, select, insert,............很多
控制層次: 整個服務器, grant all;
整個數據庫, on 數據庫名.*;
特定的表, on 數據庫名.表名;
特定的列,
特定的存儲過程。
簡化多次授權:逗號分隔
grant select,insert on database.* to username;
更改口令:使用Password加密
set passward for user = Password('密碼');
十四、數據庫維護
1、備份數據:(經常備份,各種備份)
使用命令行程序 mysqldump 轉儲所有數據庫內容到某個外部文件。
mysqldump -u root -p 數據庫名> e:/backdatabase/備份文件名.sql(txt...).
恢復:mysql -u root -p 數據庫名<e:/backdatabase/備份文件名.sql(txt...).
或在數據庫內部使用source命令。
使用命令行程序 mysqlhotcopy 從一個數據庫復制所有數據。
使用MySQL的 backup table 或 select into outfile 轉儲所有數據到某外部文件。這兩條語句都接受將要創建的文件名,此文件必須不存在,否則會出錯。使用 restore table 來復原。
在備份前使用 flush tables 刷新未寫數據。
2、進行數據庫維護:
analyze table 表名;用來檢查表鍵是否正確。
check table 表名;用來針對許多問題對表進行檢查。
如果MyISAM表訪問產生不正確和不一致的結果,可能需要 repair table 來修復相應的表。這條語句不應該經常使用,如果經常使用,可能會有更大的問題要解決。
如果從一個表中刪除大量數據,應該使用 optimize table 來收回所用的空間,從而優化表的性能。
3、診斷啟動問題:
服務器啟動問題通常在對MySQL配置或服務器本身進行更改時出現。MySQL在這個問題發生時報告錯誤,但由於多數MySQL服務器是作為系統進程或服務自啟動的,這些消息可能看不到。
在排除系統啟動問題是,首先應該盡量用手動啟動服務器。MySQL服務器自身通過在命令行執行 mysqld 啟動。mysqld命令的參數有:
--help 顯示幫助。
--safe-mode 裝載減去某些最佳配置的服務器。
--verbose 顯示全文本消息(與help聯合使用)
--version 顯示版本信息然后退出
4、查看日志文件:
MySQL維護管理員依賴的一系列日志文件,主要日志文件有以下幾種:
錯誤日志:它包含啟動和關閉問題以及任意關鍵錯誤的細節。此日志通常名為 hostname.err, 位於data目錄中,此日志名可用 --log-error命令更改。
查詢日志:它記錄所有MySQL活動,在診斷問題時非常有用。此日志文件可能會很快地變得非常大,因此不應該長期使用它。此日志通常名為hostname.org,位於data目錄中,此名字可以用 --log命令更改。
二進制日志:它記錄更新過數據的所有語句。此日志通常名為hostname-bin,位於data目錄內。此名字可以用--log-bin命令更改。
緩慢查詢日志:顧名思義,此日志記錄執行緩慢的任何查詢。這個日志在確定數據庫何處需要優化很有用。此日志通常名為hostname-slow.log,位於data目錄中,此名字可以用 --log-slow-queries命令更改.
在使用日志時,可用flush logs語句來刷新和重新開始所有日志文件。
十五、改善性能:
1、MySQL使用一些列的默認設置預先配置的,這些設置開始通常是很好的,但過一段時間后你可能需要調整內存分配、緩沖區大小等。使用show variables; show status; 查看當前設置。
2、MySQL是一個多用戶多線程的DBMS,它經常同時執行多個任務。如果這些任務中的某一個執行緩慢,則所有請求都會執行緩慢,如果你遇到顯著的性能不良,可使用 show processlist; 顯示所有活動進程(以及它們的線程ID和執行時間)。你還可以用 kill 命令終結某個特定的進程。
3、總是有不止一種方法編寫同一條select語句。應該試驗聯結、並、子查詢等,找出最佳的方法。
4、使用 explain 語句讓MySQL解釋他講如何執行一條select語句。
5、一般來說,存儲過程執行得比一條一條地執行其中的各條MySQL語句塊。
6、應該總是使用正確的數據類型。
7、絕不要檢索比需求還要多的數據。不要使用select *(除非你真正需要每個列)
8、有的操作(包括insert)支持一個可選的 delayed 關鍵字,如果使用它,將把控制勵志返回給調用程序,並且一旦有可能就實際執行該操作。
9、在導入數據時,應該關閉自動提交。你可能還想刪除索引(包括 fulltext索引),然后再導入完成后再重建它們。
10、必須索引數據庫表以改善數據檢索的性能。確定索引什么不是一件微不足道的任務,需要分析使用的select語句以找出重復的 where 和 order by子句。如果一個簡單的 where 子句返回結果所花的時間太長,則可以斷定其中使用的列就是需要索引的對象。
11、你的select語句中有一系列復雜的 or 條件嗎?通過使用多條select語句和連接它們的union語句,你能看到極大的性能改進。
12、索引改善數據檢索的性能,但損害數據插入、刪除和更新的性能。則對經常需要添加刪除數據的表如果不必要的話不要索引它們。
13、like 很慢。一般來說最好使用fulltext而不是like。
14、數據庫是不斷變化的實體。一組優化良好的表一會兒后可能就面目全非了。由於表的使用和內容的更改,理想的優化和配置也會改變。
15、最重要的規則就是,每條規則在某些條件下都會被打破。