MySQL自學筆記

數據庫簡介
數據庫:存儲數據的倉庫
數據庫系統:DBS,由數據庫、數據庫管理系統、應用開發工具構成
數據庫管理系統:DBMS,定義管理和維護數據的軟件
常見數據庫系統:Oracle DB2 SQLserver Access Mysql Postgresql

SQL簡介
SQL:結構化查詢語言 數據庫管理系統經過SQL語言來管理數據庫中的數據
SQL組成:DDL 數據定義語言
        DML 數據操做語言
    DQL 數據檢索語句
    DCL 數據控制語句
DDL 定義數據庫、表、視圖、索引和觸發器,像DROP、CREATE、ALTER
DML 對數據的增刪改 INSERT UPDATE DELETE
DQL 從表中得到數據 SELECT
DCL 控制用戶的訪問權限GRANT REVOKE COMMIT ROLLBACK


MySQL簡介
目前Internet上流行的網站構架方式是:LAMP
Linux Apache MySQL Php

mysql下載地址 http://www.mysql.com
在線安裝
離線安裝
爲何使用MySQL
           MySQL是開放源代碼的數據庫
           MySQL的跨平臺性
           開源免費
           功能強大,使用方便


啓動、中止mysql服務器
1.經過系統服務器
2.命令提示符
net start mysql
net stop mysql

斷開、鏈接MySQL服務器
1.mysql -uroot -h127.0.0.1 -p
服務器所在的地址能夠不寫(-h127.0.0.1)
2.quit exit


MySQL數據類型和運算符
數據類型
數字、字符、日期和時間
運算符
算數運算、比較運算、邏輯運算、位運算

字段判null
is null is not null
in 指定範圍內

數字類型
整型 7
tinyint bit bool  1個字節

浮點數
float
double
decimal 可變
根據真實的數據長度,設置的可能無效

字符串類型
1.常規 char varchar
2.可變類型 TEXT存儲長文本 BLOB存儲二進制數據 2 16  65535
3.特殊類型
set  64    容納一組值或null
enum 65535 容納所列值之一


日期和時間
date
time
datetime
timestamp
year 可指定2位和4位數字的格式

賦予不合理的值,將會被0替代

運算符
算術運算符
比較運算符
is null
is not null
between and
in
not in
like
not like
regexp

判斷是否爲null
<=> ;is null is; not null


MYSQL存儲引擎
查詢
show engines; \g \G
show variables like 'have%'

innodb
優勢:提供事務、回滾、崩潰修復;事務處理能力強;支持自增加,外鍵
缺點:讀寫效率稍差,佔用的數據空間較大
使用狀況:
更新密集的表
處理事務
自動災難恢復

myisam
存儲格式:靜態存儲、動態存儲、壓索存儲
優勢:佔用空間小處理速度快
缺點:不支持事務的完整性和併發性

memory
優勢:處理速度快
缺點:數據容易丟失,生命週期短
使用狀況:
暫時數據
丟失無關


第五章
數據庫
create databases db;
show databases;
use database;
drop database db;

設置編碼格式
set names gb2312
數據表
create table if not exists
not null,null,default value,auto_increment,primary key,reference_definition
查看錶結構
desc table;
show columns from 數據表.數據庫

修改表結構
alter [ignore] table alter_spec
//ignore,當出現重複關鍵行,則只執行一行,其餘重複行被刪除
//alter修改表列時,前提條件是必須把表的數據刪除

重命名錶
rename table t1 to t2
刪除表
drop table if exists t1


插入記錄
insert into t1() values(),()

查詢數據庫
select s_list from 數據表名
where
group by group_concat()//每一個組中全部字段都顯示出來
order by(ASC DESC )
having
limit count
//數據表名 既能夠從一個表中查詢,也能夠從多個表中查詢,中間用,隔開

where條件語句
經常使用比較運算符
!= <>
is null
is not null
between and
in
not in
like
not like
regexp

distinct
在結果中去除重複行

like 模糊查詢
%匹配一個或多個字符
_只匹配一個字符

concat()聯合多列
select id,concat(bookname,";",price) as info form tb;

limit限定結果行數
select * form tb where id limit 1,4//從1開始的4行

函數表達式
AVG)平均值
count()非空記錄;distinct,統計不一樣值;count(*)包含空的全部=count(1)
min()最小
max()最大

修改記錄
update數據表名 set

刪除記錄delete
delete from 數據表名 where condition  


內鏈接 外鏈接

子查詢
in; not in
比較運算符
帶exists關鍵字的子查詢 exists;not exists
帶any關鍵字的子查詢
帶all關鍵字的子查詢

合併查詢
union:將全部查詢結果合併到一塊兒,去除相同記錄
union all:簡單將結果合併到一塊兒

爲表取別名:select * from tb_book b where b.talk='JAVA'
爲字段取別名:AS

使用正則表達式查詢
字段名 regexp '匹配方式‘
^:開頭
$:結尾
.:任意一個字符
[]:集合中的任意一個字符
[^]:除了字符集之外的任意一個字符
s1|s2|s3:任意一個字符串
*:匹配多個該符號以前的字符,包括0和1;select books from tbook where books regexp 'J*A';A以前出現過J的字符記錄
+:匹配多個該符號以前的字符,包括1個:select books from tbook where books regexp 'J+A';A以前至少出現過1個J的字符記錄
{N}:匹配字符串出現N次:select books from tbook where books regexp 'a{3}'連續出現3次a的記錄
{M,N};匹配字符串最少M,最多N次;select books from tbook where books regexp 'a{2,4}



mysql函數
數學函數
ABS(X):絕對值
CEIL(X)CEILIN(X):不小於X的最小整數
FLOOR(X):不大於x的最大整數值
RAND(X):返回0到1之間的隨機小數 ,包括0 不包括1, 兩個相同的RAND()返回的數值不一樣,兩個相同的RAND(X),只要裏面的X同樣,返回數就相同。
TRUNCATE(X,Y):返回X保留到小數點後Y位
ROUND(X):返回離X最近的整數
ROUND(X,Y): 返回X保留到小數點後Y位
SORT(X):求平方根

字符串函數
INSERT(S1,X,LEN,S2):將字符串S1中從X位置開始、長度爲len的字符串用S2替換
UPPER(S)和UCASE(S):變成大寫字母
LEFT(S,N):字符串S的前N個字符
RTRIM(S):去掉字符串S結尾處空格
SUBSTRING(S,N,LEN)從字符串S的第N個位置開始獲取長度爲len的字符串
REVERSE(S):將字符串S的順序反過來
FIELD(S,S1,S2...)返回函數第一個與字符串S匹配的字符串的位置

日期和時間函數
CURRENT_DATE()=CURDATE():當期日期
CURTIME()=CURRENT_TIME():當前時間
NOW():當前日期和時間 URRENT_TIMESTAMP(),LOCALTIME(),SYSDATE(),LOCALTIMESTAMP()
DATEDIFF(D2,D2):兩個日期之間相差的天數
ADDDATE(D,N):從D日期上加上N天的日期
ADDDATE(D,INTERVAL EXPR TYPE):當前日期加上時間段後的日期
SUBDATE(D,N):返回起始日期D減去N天后的日期

條件判斷函數
IF(expr,v1,v2):表達式成立返回v1不然返回v2
CASE WHEN expr THEN v1[WHEN expr2 THEN v2][ELSE vn]END
CASE expr WHEN E1 THEN v1[WHEN e2 THEN v2][ELSE vn]END

系統信息函數
VERSION()
CONNECTION_ID()
DATEBASE(),SCHEMA()
USER(),SYSTEM_USER(),SESSION_USER()
CURRENT_USER(),CURRENT_USER
CHARSET(str)
COLLATION(str)
LASR_INSERT_ID()

加密函數
PASSWORD(str)
MD5(str)
ENCODE(str,pswd_str)
DECODE(crypt_str,pswd_str)

其餘函數
FORMAT(x,n)
ASCII(s)
BIN(x)HEX(x)OCT(x)
CONV(x,f1,f2)
INET_ATON(IP)
INET_NTOA(n)

eg:生成3個0-100之間的隨機數
ROUND(RAND()*100),FLOOR(RAND()*100),CEILINE(RAND()*100)
ROUND:與X最接近的數
FLOOR:小於或者等於X的最大整數
CEILINE:大於或者等於X的最小整數


索引
1.什麼事索引
索引由數據庫中一列或多列組合而成,做用是提升數據表的查詢速度
優勢是提升檢索數據的速度
缺點是建立和維護索引須要耗費時間
索引能夠提升查詢速度,減慢寫入速度
2.索引結構
B-tree hash
3.索引分類
普通索引
惟一索引 unique
全文索引(fulltext)char varchar text 只有MYISAM支持
單列索引
多列索引
空間索引

主鍵是特殊的索引
4.如何建立索引
建立表時建立
[UNIQUE|FULLTEXT|SPATIAL] INDEX]|KEY 別名(屬性名 長度 ASC|DESC)
在已存在的表上建立
CREATE UNIQUE|FULLTEXT|SPATIAL] INDEX]|KEY 別名 ON TABLE_NAME(屬性名 長度 ASC|DESC)
修改數據表添加索引
ALTER TABLE TABLE_NAME ADD UNIQUE|FULLTEXT|SPATIAL] INDEX]|KEY 別名 (屬性名 長度 ASC|DESC)
刪除索引
DROP INDEX index_name ON TABLE_NAME


視圖
1.概念
視圖是一個虛擬表,是從一個或多個表中導出來的表。
視圖是存儲在數據庫中的查詢的SQL語句。

2.做用
簡單-使複雜的查詢易於理解和使用
安全-用戶只能看到表中特定的行
邏輯數據獨立

3.建立視圖
查看是否有建立視圖權限
SELECT select_priv,create_view_priv from mysql.user where user='用戶名'
建立
create view 視圖名(屬性清單) as select 語句

查看
desc 視圖名
show table status like '視圖名'
show create view 視圖名

修改
create or replace view 視圖名(屬性清單) as select 語句
alter view 視圖名(屬性清單) as select 語句

更新
對視圖的更新就是對錶的更新
更新限制
a.視圖中包含count(),sum(),max(),min()等函數
b.視圖中包含union,union all,distinct,group by,having
c.常量視圖
d.視圖中select中包含子查詢
e.由不可更新的視圖導出的視圖
f.建立視圖時,algorithm爲temptale
g.視圖對應的表上存在沒有默認的列,並且該列沒有包含在視圖裏。

刪除視圖
drop view if exists 視圖名 [restrict | cascade]級聯刪除

查看視圖詳細
select * form information_schema.views;


存儲過程和函數
建立的意義
避免開發人員重複編寫相同的SQL語句,減小客戶端和服務器端數據的傳輸

建立存儲過程
delimiter $$;
create procedure proc_name (in,out,inout name 類型)
begin
.....
end

函數的建立
create function sp_name(std_id int)
returns type
begin
return
end

變量的應用
declare a int default 4;
定義的局部變量只在begin end內有效
全局變量(回話變量)不須要定義,直接使用,用@做爲起始字符

爲變量賦值
set var=expr;
select col_name into var_name from table where condition


光標的運用
聲明
declare cursor_name cursor for select_statement
打開
open cursor_name
使用
fetch cursor_name into var_name
關閉
close cursor_name


流程控制
IF
IF condition THEN
ELSE conditon THEN
ELSE
ENDIF


CASE
CASE value
     WHEN value THEN
     ELSE...
END CASE



WHILE
WHILE condition do
...
END WHILE;


LOOP
LOOP
LEAVE LABEL
END LOOP


REPEAT
REPEAT
...
UNTIL condition
END REPEAT



調用存儲過程
call sp_name(parameter)
select @n
調用函數
select function_name(parameter)

查詢存儲過程和函數
show {procedure| function} status like 'pattern'
狀態查詢
show create {procedure| function} sp_name

修改存儲過程和函數
alter {procedure| function} sp_name [characteristic]

刪除存儲過程和存儲函數
drop {procedure| function} if exists sp_name

捕獲存儲過程當中的錯誤
declare can_not_find condition for sqlstate '42s20'
declare can_not_find condition for 1146

存儲過程和函數信息
select * from information_schema.Routines where routine_name='count_of_student'\G

觸發器
只有一個執行語句的觸發器
create trigger 觸發器名 before/after 觸發事件 on 表名 for each row 執行語句
多個執行語句的觸發器
create trigger 觸發器名 before/after 觸發事件 on 表名 for each row
begin
執行語句列表
end

查看觸發器
show triggers;
查看triggers表中觸發器信息
select * from information_schema.triggers;
select * from information_schema.triggers where trigger_name='觸發器名稱'

觸發器執行順序
before觸發器、表操做、after觸發器

注意事項
觸發器不能包含start transcation、commit、rollback等關鍵詞,也不能包含call語句

刪除觸發器
drop trigger 觸發器名稱

事務(只有innodb支持)
ACID 事務必須遵照的4個屬性:原子性、一致性、隔離性、持久性

建立innodb表
create table table_name() type=innodb
alter table table_name type=innodb(alter tbale可能致使數據庫中的數據丟失,使用以前備份數據)

初始化事務
start  transaction

建立事務
SQL語句

提交事務
commit

事務回滾
rollback


mysql行爲
能夠控制行爲的變量
autocommit transactionisolaction level
set autocommit=0
select @@autocommit

修改事務的孤立級
select @@tx_isolation
set global transaction isolation leve1

mysql僞事務
設置表鎖替代事務
1.爲指定表添加鎖定
lock tables table_name lock_type
2.執行操做
3.解鎖
unlock tables;

應用表鎖實現僞事務

1.對數據庫中的數據表進行鎖定操做,能夠對多個表作出不一樣的方式鎖定
lock table table_name1 lock_type1,table_name2 lock_type2
2.執行數據庫操做
3.釋放鎖定的數據表

mysql備份與還原
備份一個數據庫
mysqldump -uroot -proot db table1 table2>路徑名稱
備份多個數據庫
mysqldump -uroot -proot --datebases  db1 db2>路徑名稱
備份全部數據庫
mysqldump -uroot -proot --all-datebases>路徑名稱

經過複製進行備份

使用mysqlhotcopy工具快速複製(只能備份myisam)
1.將須要備份的數據表加上一個讀鎖;
2.用flush tables將內存中的數據寫會到硬盤的數據庫上;
3.把須要備份的數據庫文件複製的目標目錄
mysqlhotcopy[option] db1 db2 backupdir/

數據庫還原
經過MySQL命令還原
mysql -uroot -proot [dbname]>backup.sql
經過複製還原(保證MySQL版本一致)
chown -R mysql.mysql datadir(將數據庫的用戶和組變成MySQL)

導出數據表
用select into outfile導出文本
select[列名]from table where into outfile '目錄文件'[option]
用mysqldump命令導出文件
mysqldump -uroot -proot -T 目標目錄 dbname table [option]
導出XML文件
mysqldump -uroot -proot -xml -X dbname table >D:\ name.xml
用MySQL命令導出文本文件
mysqldump -uroot -proot -e "select 語句" dbname >D:\ name.txt
mysqldump -uroot -proot -xml -X -e "select 語句" dbname >D:\ name.xml
mysqldump -uroot -proot --html -H -e "select 語句" dbname >D:\ name.html


mysql系統管理
MySQL系統管理的構成
1.MySQL服務器-mysqld
2.MySQL客戶程序和工具程序-mysql mysqladmin mysqlcheck isamchk  myisanchk mysqldump mysqlhotcopy
3.服務器的語言SQL
4.MySQL數據目錄

MySQL平常管理
服務器的啓動與關閉
對用戶帳號進行管理
對日誌文件進行管理
對數據庫進行備份和搬遷
創建數據庫鏡像
對服務器進行配置和優化
同時運行多個服務器
對MySQL進行軟件升級

安全問題
增強文件系統的安全性
增強MySQL服務器的安全性

數據庫維護
崩潰恢復
預防性維護

數據目錄的位置和結構
mysqladmin variables
show variables like 'datadir'
多服務器的狀況
mysqladmin --host=127.0.0.1 --port=port_num variables
mysqladmin --host=localhost --socket=/path/to/socket  variables
mysqladmin --host=. --socket=pip_name  variables
mysqladmin --host=hostname  variables

%ps axww | grep mysql
$ps -ef | grep mysqld
%mysqld --help
%find / -name "*.frm" --print

MySQL支持的數據表類型
myisam
.frm
.myd
.myi

innodb
.frm

SQL語句如何操做數據表
建立數據表
建立.frm保存數據表的結構定義

跟新數據表
對.frm進行從新編碼

刪除數據表
刪除數據表目錄下相關的文件

MySQL狀態文件和日誌文件
進程ID文件
常規查詢日誌
慢查詢日誌
變動日誌
二進制變動日誌
二進制變動日誌的索引文件
錯誤日誌

數據目錄的結構對系統性能的影響
儘量少的建立文件用-innoDB,只須要一個文件



MySQL性能優化
查詢MySQL數據庫性能
show status like 'value'
connection:鏈接服務器次數
uptime:服務器上線時間
show_queries:慢查詢次數
com_select:查詢操做次數
com_insert:插入操做次數
com_delete:刪除操做次數

查詢innodb參數
innodb_rows_read
innodb_rows_insert
innodb_rows_updated
innodb_rows_deleted

優化查詢
分析查詢語句
explain select 語句
describe select 語句 desc

索引對查詢 速度的影響
explain 數據庫查詢語句

使用索引優化查詢
1.應用like關鍵字優化索引進行查詢
2.查詢語句中使用多列查詢
3.查詢語句中使用or關鍵字


查詢高速緩存
1.檢驗高速緩存是否開啓
show variables like '%query_cache%'
2.使用高速緩存
select SQL_CACHE * from 表名

優化數據庫結構
分析表
analyze table 表名
檢查表
check table 表名
優化表
optimize table 表名
將多字段的表分解成多個表
創建中間表

優化插入記錄速度
1.禁用索引
2.禁用惟一性檢查
3.優化insert語句

優化多表查詢和表設計
優化多表查詢
優化表設計




MySQL安全技術
基本安全策略
1.設置MySQL的root密碼
2.禁止全部不使用的系統服務
3.爲操做系統和全部安裝的軟件打補丁
4.關閉端口
5.審計服務器的用戶帳號

用戶和權限管理
create user
drop user
rename user
grant all on * to mr identified by 'mr' with grant option
revoke all privileges,grant from fred

MySQL安全的常見問題
權限更改什麼時候生效
flush privileges
mysqladmin flush-privileges
mysqladmin reload

設置用戶密碼
mysqladmin -u user_name -h host_name password "newpwd"
set password for 'jeffrey'@'%'=password('biscuit')
grant usage on '.' to 'jeffrey'@'%'indentified by 'biscuit';
mysql -u root mysql insert into user(host,user,password) values('%','jeffrey',password('biscuit')); flush privilges
mysql -u root mysql update user set password=password('bagel') where host='%'and user='francis';


mysql平常管理
UNIX套接字文件被誤刪
% mysqladmin -h 127.0.0.1 -u root -p shutdowm

忘記root口令
%kill -TERM PID
%kill 9 PID
net stop mysql
flush privileges

日誌失效處理
日誌輪轉
按期刪除過時的日誌
使用鏡像機制

MySQL服務器鏡像配置
鏡像機制建立步驟
1.肯定主從服務器的鏡像ID號,主從服務器的ID號不能相同 用--server_id
2.從服務器必須在主服務器上有一個具有足夠權限的帳號
grant replication slave on *.* to'slave_user'@'slave_host' identified by 'salve_pass'
3.把主服務器上的數據庫文件複製到從服務器上完成同步工做
4.關閉主服務器
5.對主服務器的配置進行修改,使他知道之間的ID,並激活二進制日誌功能
[mysqld]
server-id=master_server_id
log_bin=binlog_name
6.從新啓動主服務器
7.關閉從服務器
8.對從服務器進行配置,使他知道本身的ID,到哪裏去找主服務器和如何去鏈接主服務器
[mysqld]
server_id=salve_server_id
master_host=master_host
master_user=slave_user
master-password=slave_pass;
master-connet-retry=30
master-retry-count=100000
9.從新啓動從服務器

MySQL服務器的優化
參數變量的設置
--table_cache=128
[mysqld]
table-cache=128
set-variable=table_cache=128

指定全局變量
set global var_name=value
set @@global.var_name=value
指定回話變量
set session var_name=value
set @@session.var_name=value

set var_name=value
set @@var_name=value

set session sql1=0,sq3=3;
--set-variable=table_cache=128 -O table_cache=128

PHP操做MySQL
php訪問MySQL的步驟
1.鏈接MySQL服務器
mysql_connect() mysql_pconnect()
2.選擇數據庫
mysql_select_db()
3.執行SQL語句
mysql_query()
4.關閉鏈接集
mysql_free_result($result)

mysql_fetch_array() 從數組集中獲取信息
mysql_fetch_object()從結果集中獲取一行
mysql_fetch_row()逐行獲取結果的每條記錄
mysql_num_rows()獲取查詢結果中的記錄數
mysql_close()關閉鏈接
5.斷開與MySQL的鏈接

php

相關文章
相關標籤/搜索