您好,登錄后才能下訂單哦!
第一部分:MySQL基礎概念 Mariadb的基礎: 設計范式: 第一范式:字段是原子性的 第二范式:非主屬性完全依賴于主屬性 存在可用主鍵 第三范式:非主屬性對主屬性不存在傳遞函數依賴關系。 任何都不應該依賴于其他表的非主屬性 約束:主鍵、唯一鍵、外鍵、檢查性約束 SQL組件 數據庫、表、索引、視圖、存儲過程、存儲函數、觸發器、事件調度器、用戶和權限 元數據數據庫:mysql Mariadb安裝方式: rpm包 通用二進制 編譯安裝 第二部分:SQL語句 DDL,DML DDL:create,alter,drop DML:insert,delete,update,select DCL:grant,revoke, MySQL圖形化管理工具
第一部分:MySQL基礎概念
一、基礎架構
1.數據庫系統:(通用模型)
分析器:分析sql語句,命令,語法,庫名,字段名,表名等
操作求解器:操作過程應該怎樣執行,可能會提供多條執行路徑
計劃執行器:選擇最優執行路徑,
鎖管理器是事務管理器的一個基本組件
文件存取方法 //r或w
緩沖區管理方法 //
磁盤空間管理器 //限定表或者庫占用空間大小
事務管理器 //
恢復管理器 //恢復此前未執行完成的事務
2.事務概念
事務(transaction):組織多個操作為一個整體,要么全部執行,要么全部都不執行
回滾:rollback,假如未執行完成,所有的都要回滾
Bos:8000-1000
Alice:5000,5000+1000
一個存儲系統是否支持事務:測試標準
ACID:
A:原子性,不可分割的一個整體
C:一致性,前后的總和是一致的,變化前后是一致的
I:隔離性,事務彼此之間是隔離的,我在取錢的時候,其他人不能操作該賬戶
D:持久性,事務執行成功,則保存在disk中,則不能修改
原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)
二、數據庫范式
數據庫設計具有一定的規范性
員工信息:
約束:外鍵約束,A表依賴于B表的某個字段
表達式約束:限定age范圍為1-100
主鍵:唯一的標識身份
RDBMS: //一般滿足第三范式即可,范式是遞進關系
1.第一范式1NF //列不可再分,列唯一
每一列都是不可分割的原子數據,而不能是集合,屬組等非原子數據項
實體中有多個值時,必須拆分為不同的屬性,即無重復的域
關系模式中,每個屬性不可再分。屬性原子性
職工號,姓名,電話號碼組成一個表(一個人可能有多個電話號碼)
方案1:重復存儲職工號和姓名。這樣,關鍵字只能是電話號碼。//不滿足
方案2:二是職工號為關鍵字,電話號碼分為單位電話和住宅電話兩個屬性
2.第二范式2NF//
在一范式的基礎上,非主屬性完全依賴于主屬性,即消除非主屬性對主屬性的部分函數依賴關系。
sc(sid,cid,grade,credit)其中sid為學號, cid為課程號,grade為成績,credit為學分。 由以上條件,關鍵字為組合關鍵字(sid,cid)
sc(sid,cid,grade,credit)//非關鍵字屬性credit僅函數依賴于cid,也就是credit部分依賴組合關鍵字(sid,cid)而不是完全依賴。
必須拆分為:sc(sid,cid,grade),c(cid,credit)
3.第三范式3NF //
二的基礎上,非主屬性對主屬性不存在傳遞函數依賴關系。
s(sid,sname,did,dname,location) 各屬性分別代表學號,姓名,所在系,系名稱,系地址。
問題:did,dname,location將重復存儲
原因:關系中存在傳遞依賴造成的。即sid -> did。而did ->sid卻不存在,did -> location, 因此關鍵字sid對location函數決定是通過傳遞依賴did->location 實現的。也就是說,sid不直接決定非主屬性location。
方法:分為兩個關系 s(sid,sname,did),d(dno,dname,location)
注意:關系s中必須有外關鍵字did。否則兩個關系之間失去聯系。
4.第五范式,巴斯特科范式
http://www.cnblogs.com/hi-bazinga/archive/2012/06/05/2536806.html
三、數據庫其他概念
數據庫:數據的集合
表:為了滿足范式設計要求,將一個數據集拆分為多個 約束:constraint,向數據表插入要遵循的限制規則 主鍵:一個或多個字段的組合,主鍵的數據必須唯一,不能重復 外鍵:A表某字段能插入的數據依賴于B表的主鍵中的數據 唯一鍵:一個或多個字段的組合,填入唯一鍵中的約束,必須不同于已存在的數據,可以為空 檢查性約束:取決于表達式的請求 索引:將表中的某一個或某些字段抽取出來,單獨存儲為一個獨特的數據結構; 索引是一個數據結構: 常見的索引類型: 樹狀: hash: 目的:加快查找速度,但不利于w請求 關系運算: 選擇:選擇符合條件的行 投影:選擇符合條件的列 連接:將多張表關聯起來 左連接,右鏈接,笛卡爾積,內連接 數據抽象: 物理層:決定數據的存儲格式,即如何將數據組織為物理文件 邏輯層:描述DB存儲什么數據,以及數據間存在什么關系 視圖層:描述DB中的部分數據; 關系模型的分類: 一般關系模型: 實體關系模型: 基于對象的關系模型: 半結構化關系模型: xml
Mariadb(Mysql)
Unireg:
MySQL AB--->公司,早期是針對Unireg做的應用接口,
賣給了Sun公司,早期是運行在Solaris:二進制版本,后來才在linux上
Sun被oracle收購了
My:作者的大女兒
Maria:作者的三女兒
mysql:www.mysql.com
Mariadb:wwww.mariadb.org
四、安裝MariaDB
Mariadb的特性:
插件式存儲引擎,存儲管理器有多種實現版本,用戶可根據需要靈活選擇
存儲引擎也稱為“表類型"
1.更多的存儲引擎 //show engines
MyISAM //5.1默認使用
MyISAM-->Aria //
InnoDB-->XtraDB //支持事務5.5以后
2.諸多擴展新特性:
3.提供了較多的測試組件
4.truly open source;真的開源
MySQl的發行機制
Enterprise:提供了更豐富的功能
Community:
安裝方式:
1.rpm包
1.由OS的發行商提供
2.程序官方提供
2.源碼包
3.通用二進制格式//解壓后,簡單配置即可
通用二進制格式安裝mariadb: //先卸載之前安裝的版本
1.卸載原有版本解壓新版本
systemctl stop mariadb cp /usr/lib/systemd/system/mariadb.service /root 備份unit文件 yum remove mariadb-server https://downloads.mariadb.org/ mariadb-5.5.46-linux-x86_64.tar.gz //文件名 tar xvf mariadb-5.5.46-linux-x86_64.tar.gz -C /usr/local/ cd /usr/local ln -sv mariadb-5.5.46-linux-x86_64/ mysql
2. 屬組,目錄及權限,配置文件
id mysql || group add -r -g 306 mysql //沒有的話,就創建該系統用戶 cd /usr/local/mysql/ chown -R root:mysql ./* mkdir /mydata/data -pv chown -R mysql.mysql /mydata/data/ 注:/etc/my.cnf 是以前的包,需要刪除,或者移動到其他地方 /usr/local/mysql/support-files :提供有配置文件 mkdir /etc/mysql cp support-files/my-large.cnf /etc/mysql/my.cnf //這個目錄也會被讀取配置 vim /etc/mysql/my.cnf [mysqld] ... datadir = /mydata/data skip_name_resolve = ON innodb_file_per_table = ON ...
3.初始化元數據:
scripts/mysql_install_db --help scripts/mysql_install_db --user=mysql --datadir=/mydata/data --skip-name-resolve 啟動: 1.cp support-files/mysql.server /etc/init.d/mysqld //使用centos6的方式 chmod +x chkconfig --add mysqld service mysqld start 2.vim /root/mairadb.service //使用unit文件啟動 unit文件修改添加
小結:
1.添加系統用戶,修改屬組
2.創建目標目錄,修改屬主屬組
3.復制并修改配置文件
4.初始化數據庫(指定user,datadir,--skip-name-resolve)
后續步驟:
1.添加lib
vim /etc/ld.so.conf.d/mariadb2.conf
/usr/local/mysql/httpd
ldconfig -p |grep mysqld
2.path
vim /etc/profile.d/mysql.sh
export PATH=$PATH:/usr/local/mysql/bin
source /etc/profile
3.man //在/usr/local目錄下能自己找到
4.頭文件include
ln -sv /usr/local/mysql/include/mysql/ /usr/include/
步驟:cat INSTALL-BINARY //這個文件有具體的安裝步驟
1.準備/mydata/datda 2.useradd -r mysql cd /usr/local ln -sv mari-server mysql cd /usr/local/mysql/ chown -R root:mysql ./* scripts/mysql_install_db --user=mysql --datadir=/mydata/data cp support-files/mysql.server /etc/init.d/mysqld chconfig --add mysqld 3.配置文件 ini格式的配置文件,各程序均可通過此配置文件獲取配置信息; [program_name] 配置文件查找次序:mysql --help //可以看到次序 1.RPM包的 /etc/mysql/my.cnf-->/etc/my.cnf---> ~/.my.cnf 假如沖突:越靠后,起作用 2.通用二進制 /etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf 假如沖突:越靠后,起作用 cp support-files/my-large.cnf /etc/my.cnf 添加: datadir = /mydata/data innodb_file_per_table = ON skip_name_resolve = ON 4.啟動服務 service mairadb start
注:數據庫系統非常浪費內存和硬件
原有的/etc/my.cnf會影響,需要處理
注意:
1. 5.x就是為了兼容MySQL5.x的,接口幾乎一致,把支持開源自由軟件的用戶從社區版MySQL拿到MariaDB上
2.10.x說過會大量使用新技術,接口會與mysql徹底分道揚鑣了。目標就是以后想MariaDB新接口過渡。
問題:unit文件
1.受systemd控制
安裝后生成的文件:/usr/lib/systemd/system/dhcpd.service
[root@MT ~]# systemctl enable dhcpd
Created symlink from /etc/systemd/system/multi-user.target.wants/dhcpd.service to /usr/lib/systemd/system/dhcpd.service.
2.cp mariadb55.service /usr/lib/systemd/system/
vim /usr/lib/systemd/system/mariadb55.service
ExecStart=/usr/local/mysql/bin/mysqld_safe --basedir=/usr/local/mysql //修改,pre和post都刪除即可
配置文件,扔為原有的
第二部分:SQL語句
DDL,DML
DDL:create,alter,drop
DML:insert,delete,update,select
DCL:grant,revoke,
MySQL圖形化管理工具
一、Mariadb程序的組成:
C:client
mysql:CLI交互式客戶端程序
mysqldump:備份
mysqladmin:管理工具
mysqlbinlog:查看二進制日志
...
S:server
三類套接字地址:
IPv4,3306/tcp
Unix Sock:/var/lib/mysql/mysql.lock ,/tmp/mysql.lock //服務啟動生成,關閉刪除
本機:C===S:127.0.0.1
mysqld
mysqld_safe //建議運行使用的服務端程序,默認使用
mysqld_multi:多實例;
mysqld_upgrade:升級工具
...
獲取其讀取次序的方法
mysqld --verbose --help | less
mysql --help | less
mysql命令
常用選項
-u 用戶名,默認為root
-h 遠程主機,默認為localhost
-p 密碼,默認為空
-D --database=name,直接選擇數據庫 //在6上默認顯示當前所處的庫,select database();查看,use db_name 使用該庫
-e --excute=name ,直接運行該命令,并不進入交互式
注意:mysql的用戶賬號由兩部分組成:'usernmae'@'host';其中host用于限制此用戶可通過哪些遠程主機連接當前的mysql服務
host的表示方式,支持使用通配符;
%:任意長度的任意字符;
172.16.%.%
_:匹配單個字符:
二、c/s相關命令
客戶端命令;
服務器命令;通過mysql連接發往服務器執行并取回結果
客戶端:
mysql> help \u db_name \q 退出 \d CHAR:設定新的語句結束符 \g 發送給服務器,通用結束符 \G 語句結束標記,結果豎排方式顯示 \s 連接狀態,
服務端命令:
DDL,DML,DCL
注意:每個語句必須有語句結束符,默認為分號(;)
三、數據類型://目的,確定數據格式,能夠參與的運算,可用有效范圍
表:行和列
創建表:定義表中的字段
定義字段時:確定數據類型非常關鍵
用于確定:數據存儲格式、能參與運算種類、可表示的有效的數據范圍
字符型:字符集
碼表:在字符和二進制數字之間建立映射關系
Db、client、server、Conn可以有不同的字符集
show characet set
類型:
字符型 定長字符型:// 0-255個字符 char(#):不區分字符大小寫 binary(#):區分大小寫 0-255 varbinary(#):0-65535 變長字符型:// 0-65535多個 varchar(#):需要一個結束符 varbinary(#):需要結束符,占用一個字符 對象存儲://表中存放的是指針,真實的數據存儲在其他地方 text:存儲大量文本,2^32次方個字符 tinytext 0-255 //字節 text 0-65535 mediumtext 0-2^24 longtext 0-2^32 blob:二進制大對象,區分大小寫 tinyblob,blob,mediumblob,longblob 與text類似 內置類型: set:集合 SET (‘a’,’b’,’c’)表示插入的值可以是a,b,c三個字符的任意組合,即插入‘a',‘ac',‘abc'都是合法的 enum:枚舉 ENUM (‘a’, ‘b’,‘c’)表示插入的值只能在a,b,c中進行選擇 數值型 精確數值型 int(tinyint,smallint,mediumint,int,bigint) 1,2,3,4,8 int:2^32-1 或者-(2^32/2)-(2^32/2-1) //有無符號 bit Bit類型只有1和0兩個值 近似數值型 float 4字節 dobule 8字節 DECIMAL占用(m+2)個字節 DECIMAL(m,d)中,m表示數字的總長度,小數點不占位; d表示小數點后面的數字長度 日期時間型 日期型:date 時間型:time 日期時間型:datetime 時間戳:timestamp //1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至現在的總秒數 年份:year(2),year(4) 數據類型修飾符: unsigned:無符號數值型 not null:非空 // default value:默認值
字符型:
數值型:
字符修飾符:
not null/null/default 'string'/collation ''/ 排序的規則
show character set;
show collation ;
DML:數據操作語言,主要用于管理表中的數據,實現數據的增,刪,改,查
insert,delete,update,select
數值類型修飾符:
not null/null/default numer/
auto_increment/select last_insert_id() //查看增長到了哪個
float和double修飾符:
auto_increment,default,not null,null,unsigned,zerofile
bit:二級制類型
booltype:
tinyint(1) //mysql的bool型是只顯示tinyint(1),1或者0
boolean
bool
日期修飾符:
null/not null/default
enum和set類型
enum //從1-65535個字符串,任意一個元素,但是不能組合
set //1-64 bit個字符串的集合,元素可任意組合
存儲時:enum('a','1') //在存儲數據的時候,存儲的是,enmu中的索引
例如insert .. value('a') //存儲的是 0 ,也就是enum('a')的索引,而不是a字串
set存儲:
set('a','b','c') //insert 數據'a' ,存儲的是100 /因為a出現,其他沒有出現
//因此一般enum和set不拿來排序和比較
修飾符:
not null/null/default
四、服務器端命令
DDL:數據定義語言,主要用于定義數據庫組件,例如表,索引,視圖,用戶,存儲過程
create,alter,drop
DML:數據操作語言,主要用于管理表中的數據,實現數據的增,刪,改,查
insert,delete,update,select
獲取命令的幫助
mysql>help COMMAND
數據庫管理:
1.創建:CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_specification] ...
create_specification:
[DEFAULT] CHARACTER SET [=] charset_name [DEFAULT] COLLATE [=] collation_name
字符集查看:show character set
查看排序規則:show collation;
2.修改ALTER {DATABASE | SCHEMA} [db_name] alter_specification ...
alter_specification:
[DEFAULT] CHARACTER SET [=] charset_name [DEFAULT] COLLATE [=] collation_name
3.刪除DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
注:可以通過在data目錄中創建子目錄,來建立數據庫,但是不建議這么做
表管理:
創建:create table if not exists tb_name (create_defination) create_defination 字段:col_name data_type 鍵:primary key(col1,col2,...) unique key (col1,col2,...) foreign key(clo) 索引: key|index [index_name} (col1,col2,..) create table student(id int unsigned not null,name char(30) not null,age tinyint unsigned,gender enum('f','m')); create table student(id int unsigned not null,name char(30) not null,age tinyint unsigned,gender enum('f','m'),primary key(id,name)); 注:unsigned 應該放在not null之前,緊挨著int之后,否則會出錯 engine = 存儲引擎 show tables status \G;查看默認引擎 show tables status like student \G;查看指定表 show engines:查看所有支持的引擎 show table status like 'student' \G;
注:數據庫有專門的設計工具
修改:alter table table_name alter_specification
alter_specification
字段:
add: ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name ] alter table student add class varchar(100) not null first; drop:DROP [COLUMN] col_name|PRIMARY KEY|FOREIGN KEY fk_symbol alter table student drop column class; modifty:MODIFY [COLUMN] col_name column_definition 只修改定義 lter table student modify class varchar(100) not null after id; change:CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name]
鍵:
添加:add {primary key|unique key|unique key} index_name
刪除:
drop primary key
drop froeign key fk_symbol
drop key|index index_name //鍵在一定程度上也是索引
索引:
添加:add {index|key} [index_name} {col1,col2,...}
刪除:drop primary key
alter table student drop primary key;
alter table student add unique key (name);
查看:show indexes from student
表選項:
engine = engine_name //不建議,創建時直接指定即可
表的引用方式:
tbl_name
create mydb.class //絕對路徑,庫名.表明
五、DDL和DML語句
第二種創建方式:復制表結構
第三種創建方式; 復制表數據
1.索引:加速查詢,但是不利于查詢操作
索引是特殊的數據結構:
索引要有名稱:
創建:crete [索引選項] index index_name [index_type] on tbl_name (col1,col2,...)
索引選項:unique,fulltext,spatial
index_type: btree/hash
mysql中只有memory才支持hash,而memroy表很少手動創建
create index named_class on student (name,class);
ALTER TABLE table_name ADD INDEX index_name (column_list)
ALTER TABLE table_name ADD UNIQUE (column_list)
ALTER TABLE table_name ADD PRIMARY KEY (column_list)
刪除
DROP INDEX index_name ON talbe_name
ALTER TABLE table_name DROP INDEX index_name
ALTER TABLE table_name DROP PRIMARY KEY
//沒有修改,因為索引是及時創建的
查看索引:
SHOW INDEX FROM mytable FROM mydb;
SHOW INDEX FROM mydb.mytable;
mysql> show index from tblname;
mysql> show keys from tblname;
2.DML語句:
insert [into] tbl_name {col1,clo2,,,} {values|value} (va1,va2,va3...),(va1,va2,va3,,,),...
注意:
字符型:引號
數值型:前萬不要引號
insert into student values (1,'xiyu','ou yang feng',78,'f');
insert into student (id,name) values (2,'huang yao shi'),(3,'zhou botong');
select * from student;
select
1.select * from tbl_name
2.select col1,col2,col3,.. from tbl_name
顯示時,字段可以顯示為別名
select id as stuid,name from student; //投影
3.select col1,col2,... from tbl_name where claues
where clause:用于指明挑選條件
age>30
操作符:
>,>=,=,小于,小于等于
組合測試:
and
or
not
操作符:
between // age between 30 and 80
like 'pattern' //
like支持的通配符
%:任意長度的任意字符
_:單個字符
rlike //正則表達式
^ 行首
$ 結尾
is
is null//為空的
is not null //非空的
4.select col1,col2,... tbl_name [where clause] order by col_name,col_name2 [asc|desc]
desc 將序排序
select id,name,age from student where age>30;
elect id,name,age from student where name='OU yANG FENG' and age>30;
select name from students where name like '%ang%'
select name from student where name rlike '^z.*bo*';
select id,name from student order by id desc;
delete
delete from tbl_name [where where_conditon] [order by ...] [limit row_count]
刪除是按行刪除的,不能只刪除一行的一個字段
delete from student where age is null //假如不給where,會刪除整個表
生成隨機數據:
for i in {1..100} ; do AGE=$RANDOM%100;mysql -e "insert into testdb.student (id,name,age) values ($i,'stu$i',$AGE);"; done
stu$i,%ARG //使用“” 也可以
delete from student order by age desc limit 20;
select * from student order by age desc;
update:
update //id最大的人的年齡減去10歲
update student set age=age-5 order by id desc limit 10;
select id,name,age from student order by id desc;
update student set age=age-15 where name not like 'stu%';
六、用戶賬號及權限管理
用戶賬號: 'username'@'host'
host:此用戶訪問當前服務器時,允許其通過哪些主機遠程創建鏈接
表示方式:IP,網絡,主機名,通配符{%和_}
禁止檢查主機名:my.cnf
[mysqld]
skip_name_resolve = ON
create user 'wolf'@'host' identified by 'password' //只有查看test庫權限
刪除用戶:
drop user test;
查看用戶信息:
select host,user,password from user;
授權級別:
權限級別:管理權限、數據庫、表、字段、存儲過程;
grant priv_type,... on [object_type] db_name.tbl_name to 'user'@'host' [identified by 'password']
db_name.tb_name
db_name.* //庫內的所有表
*.* 所有的庫和表
db_name.routine_name: 指定庫上的存儲過程或存儲函數
[object_type]
TABLE
FUNCTION
PROCEDURE
grant select on testdb.* to 'testdb'@'192.168.4.%'; //假如沒有改用戶的話,會自動創建該用戶
grant select on testdb.student to 'wolf'@'192.168.4.%';
flush privileges;
show grants for 'wolf'@'192.168.4.%';
show grants for current_user; //查看當前用戶授權
收回權限:
revoke select on testdb.student from 'wolf'@'192.168.4.%';
revoke ... from
grant ... on .... to ..A@B
注意:MariaDB服務進程啟動時,會讀取mysql庫的所有授權表至內存中;
1.grant或revoke命令等執行的權限操作,會保存于表中,MariaDB此時一般會自動重新 讀取授權表,權限修改會立即生效
2.其他方式實現的權限,要想生效,必須flush privileges
注意;安全選項
/usr/local/mysql/bin/mysql_secure_installation 設置初始化密碼
后期添加密碼:
grant all privileges on MT.* to 'mt'@'192.168.4.%'; //假如忘了加 identified by "password"
select user,host,password from user; //是沒有密碼的
update user set password=password('mingtian') where user='mt'; //只能使用這種
insert 是插入一個新行,在這里不能使用
七、phpMyAdmin //mysql圖形化管理工具
解壓到網頁目錄
ln -sv phpMyAdmin-3.4.10.1-all-languages MyAdmin
cp config.sample.inc.php config.php
openssl rand -base64 15
FSJJJFVLvfiQeoepws88
vim config.php //加密cookie
$cfg['blowfish_secret'] = 'FSJJJFVLvfiQeoepws88'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
systemctl restart httpd
yum install php-mbstring -y //多種語言支持
問題:缺少mcrypt擴展
yum install php-mcrypt
問題:必須啟用cookie才能使用
1.vim config.inc.php
$cfg['blowfish_secret'] = 'cookie';
$cfg['Servers'][$i]['connect_type'] = 'socket'; //如果 MySQL 使用 socket 方式連接
2.vim libraries/config.default.php
$cfg['blowfish_secret'] = 'cookie'; 文件中默認為空,這里需要填寫和 config.inc.php 一樣的值。
$cfg['Servers'][$i]['socket'] = '/tmp/mysql.sock'; 這個需要根據自己 mysql 配置內容填寫,如果不知道置空
圖形管理工具:
phpMyAdmin
Navicat
Mysql-Front
ToadForMySQL
SQLyog
存儲引擎的概念: myisam,innodb,
Myisam:不支持事務
innodb:支持事務,不支持fulltext索引
后面的文章會詳細解釋
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。