MySQL深入學習總結
MySQL

MySQL是瑞典的MySQL AB公司開發的典型的開源關系型數據庫管理系統,其中維護的都是二維表,類似于Excel表格;關系型數據庫除了MySQL,還有Oracle數據庫(甲骨文公司,閉源)、SQL Server(微軟,閉源);后來MySQLab被Sun公司收購,Sun公司又被甲骨文公司收購,所以現在MySQL是Oracle旗下產品。因害怕Oracle今后不再開放MySQL源代碼,其創始人重寫了一套關系型數據庫命名為MariaDB,其功能與MySQL基本沒有差別。
關系型數據庫:MySQL、MariaDB、SQL Server、Oracle等
非關系型數據庫(NOSQL):Redis、MongoDB、Hbase等
安裝MySQL數據庫(5.5版本):yum -y install mariadb mariadb-server
啟動MySQL:systemctl start mariadb.server
開機自啟動:systemctl enable mariadb.server
設置用戶名密碼:mysqladmin -uroot password 123456
登錄數據庫:mysql -uroot -p123456
SQL語句(92標準版SQL語句,適用于大部分關系型數據庫)
DDL 數據定義語言 create drop
DML 數據操縱語言 update delete insert
DQL 數據查詢語言 select
DCL 數據控制語言 grant
(一)查看數據庫內容
1.查看數據庫:show database;
進入數據庫:use 庫名;例:use mysql;
進入后,查看庫中的表:show tables;
(二)數據庫及表的操作
創建數據庫:create database 庫名;例:create database abc;
刪除數據庫:drop database 庫名;例:drop database abc;
創建表:create table 表名(字段1 數據類型1,字段2 數據類型2......);創建一個名為info的表,內含字段id和name,類型為整數和可變長字符串,()內是規定有多少位。
例:create table info(id int(3),name varchar(10));
查看表結構:desc 表名;例:desc info;
show create table 表名;
數據表內容的增刪改查
增加(insert)
插入一行數據:insert into 表名 values(值1,值2)
查看剛剛插入表中的數據:select * from 表名;例:select * from info;
一次性插入多行數據(中間的,可以分開多行數據):例:insert into info values(3,”xiaozhao”),(4,”xiaoqiang”);
刪除(delete)
刪除表中所有內容:delete from 表名;例:delete from info;
刪除某一條數據:delete from 表名 where 字段=值;例:如果刪除上表4號數據,則 delete from info where id=4;
修改(update)
修改表中name字段所有內容:update info set name=“xiaoming”
修改符合條件的值,update 表名 set 需要修改的字段=“新名稱” where 字段=值;例:修改表中的xiaozhao為xiaogang,則:update info set name=”xiaogang”where id=3;
查看(select)
查看表中內容:select * from 表名;例:select * from info;
表結構(字段)相關操作
查看表結構
desc 表名;或者show creat table 表名;
修改表結構
增加一個字段:alter table 表名 add 字段名 字段類型;例,為info表增加一個年齡字段:alter table info add age int(3);
注:如果想指定位置,則可在int(3)后寫first、after id、before
刪除一個字段:alter table 表名 drop 字段名;例,刪除info表中age1字段:alter table info drop age;
修改字段數據類型:alter table info modify 字段 更改的字段類型;例,修改age的類型為int(5):alter table info modify age int(5);
修改字段順序,例,將name字段移到第一行:alter table info modify name varchar(10)first;
修改已有字段的名稱,例,修改age為性別(sex):alter table info change age sex varchar(5);
修改表名,例,將info修改為info1:alter table info rename info1;
創建兩張表,第一張包含id、name、subject字段,第二張表包含id、source字段
為表t1插入數據:
insert into t1 values(1,"xiaoming","English"),(2,"xiaohong","English"),(3,"xiaogang","English");
為表t2插入數據:
為表2source字段插入數據:
(五)創建新一個新庫
創建一個新庫,指定字符編碼為utf8:create database abc charset=utf8;
進入abc庫,創建名為學生的新表,內含名字、編碼字段:create table student(name varchar(10),code int(3) zerofill);
創建名為info的新表,內含code、subject、score:create table info(code int(3) zerofill,subject varchar(10),score int(3));
向student表中插入數據:insert into student values("張三",001),("李四",002),("王五",003),("甲六",004);
向info表中插入數據:insert into info values(001,"數學",80),(002,"數學",75),(001,"語文",90),(002,"語文",80),(001,"英語",90),(002,"英語",85),(003,"英語",80),(004,"英語",70);
order by排序(內含limit分頁)
排序:以成績為標準對info表內數據升序排列:select * from info order by score;
降序排列:select * from info order by score desc;
查看info表中前兩條數據:select * from info limit 2;
只顯示某一行:select * from info limit 偏移量,行數;例:偏移量從0開始,即第一行為0。
根據表info中的數據按降序排列,并顯示出第一行數據:
select * from order by score desc limit 1;
注意:limit是用于分頁查看,偏移量是指從第幾行開始,第一行表示為0。
group by分組
根據表info對科目進行排序:select * from info group by subject;
聚合函數
聚合函數sum()求和,max()最大值,min()最小值,count()統計,avg()平均數。
格式:select 函數(值)from 表名;
根據score排序并列出最小值:select min(score) from info;
去重
distinct去重:格式,select distinct 字段 from 表名;
select distinct subject from info;
聚合
問題1:查詢出所有學生信息,SQL語句怎么編寫:select a.code,a.name,b.subject,b.score from student a,info b where a.code=b.code;
問題2:新學生小明,學號為005,需要將信息寫入學生信息表,SQL語句怎么編寫:insert into student values(“小明”,5);
問題3:李四語文成績被登記錯誤,成績實際為85分,更新到考試信息表中,SQL語句怎么編寫:update student a ,info b set score=85 where a.name="李四" and b.subject="語文"and a.code=b.code;
問題4:查詢出各科成績的平均成績avg(),顯示字段為:學科、平均分,請問SQL語句如何編寫:select subject,avg(score) from info group by subject;
問題5:查詢出所有學生的各科成績,顯示字段為:姓名、學號、學科、成績,并以學號與學科排序,沒有成績的學生也需要列出,SQL怎么編寫:select a.name,a.code,b.subject,b.score from student a,info b where a.code=b.code order by name,subject;
問題6:查詢出單科成績最高的,顯示字段為:姓名、學號、學科、成績,SQL語句如何編寫:select a.name,a.code,b.subject,max(b.score) from student a,info b group by subject;
問題7:列出每位學生的各科成績,要求輸出格式:姓名、學號、語文成績、數學成績、英語成績,SQL怎么寫:select student.name,student.code,sum(if(info.subject="語文",info.score,0)) 語文成績,sum(if(info.subject="數學",info.score,0)) 數學成績,sum(if(info.subject="英語",info.score,0)) 英語成績 from student,info where student student.code=info.code group by student.name;
在abc庫中創建一個新表:create table worker(salay int(10),id int(3));
將student表和worker表進行全連接:select * from student union all select * from ?worker;
全連接: union或union all
1.兩張表的數據數量相同
2.全連接內使用order by 沒有效果,可以對連接后的結果進行排序;
3.union會合并相同的數據;
授權與撤銷授權
授權:grant 權限[all,insert,delete,update,select] on 庫.表 to '用戶'@'地址' identified by '密碼';
撤銷權限:revoke 權限[all,insert,delete,update,select] on 庫.表 from '用戶'@'地址' ;
查看用戶授權:show grants for '用戶'@'地址';
數據類型
數字--> tinyint(一個字節) smallint(兩個字節) mediumint(三個字節) int(四個字節) bigint(八個字節)float(浮點數,也就是小數)double ?bit ?zerofill
auto_increment:自增
字符串 ?char ?varchar(可變長字符串)
時間 ???datetime(年月日時分秒) date(年月日) ?time(時分秒) year(年) now() ?length() year() lpad(str,n,pad)
生成隨機數(0-1范圍):rand()
if(值,t,f)
ifnull(值1,值2)
case when [值1] then [結果] ... else [默認值] end
MySQL密碼
忘記mysql密碼如何解決
修改MySQL的root密碼:
1.關閉MySQL :systemctl stop mysqld
2.執行語句,安全登錄:mysqld_safe --skip-grant-table &
3.免密登錄數據庫后,使用update語句修改密碼
update mysql.user set password=password(“密碼”)where=”root”;
殺死MySQL進程:kill -9 MySQL的pid(通過ps -aux查詢得到)
重新啟動
MySQL的命令選項:mysql ?-u ?指定用戶 ?-p密碼 -h 指定主機地址 -P 端口號 ?-e ?SQL語句
例:mysql -uroot -p123123 -e ”use mysql;select user from user;”
同理,在mysql中也可以執行系統命令,例:system ls
設置字符編碼,在mysql配置文件/etc/my.cnf中[mysqld]下添加character_set_server=utf8
MySQL內輸入:show variables like “character%”;查看字符編碼。
索引(相當于目錄,可以快速找到數據)
運維人員一般用不上,屬于開發要了解的
索引的分類:
普通索引: ???index
唯一性索引:unique
主鍵: ?????????primary key
全文索引: ??fulltext
創建索引
創建表時,創建索引:create table 表名(字段 數據類型(長度),.....,index 索引名稱(字段名[length]));
例:create table test(id int(3),name varchar(10),index idx_id(id));
查看索引:show index from test\G;
創建表后,創建索引(兩種方法)
(1)create index 索引名 on 表名(字段[length]);
(2)alter table 表名 add index 索引名稱(字段[length]);
例:alter table info add index idx_code(code); (索引名稱規范idx_索引的字段名)此處不寫長度
查看索引:show index from 表名\G;
前綴索引:在創建索引時使用length指定使用該字段數據的前幾個字符做索引,通常用于數據比較大時;
刪除索引
刪除索引drop index 索引名稱 on 表名;
例:刪除info表的索引idx_code:drop index idx_code on info;
主鍵
創建表時,添加主鍵:create table 表名(字段 數據類型,....,primary key(字段));
創建表后,添加主鍵:alter table 表名 add primary key(字段);
刪除主鍵:alter table 表名 drop primary key;
全文索引 fulltext
主要用于字段數據類型為text(文本文件)或varchar(可邊長字符串)。
索引作用
索引的作用
(1)加快查詢速度
(2)降低磁盤IO成本
(3)加快表與表之間的連接
(4)減少分組排序的時間
索引的使用
對于經常更新的數據字段,不要使用索引;
表特別小的時候,不需要使用索引-->全表掃描(select語句)比使用索引查詢快時,不創建索引
字段中數據唯一性比較差的,不適合創建索引
索引應該盡量建立在字段中數據比較小的,如果指定數據比較長應該創建前綴索引。
創建索引的字段盡量在where中使用。
表100萬行數據,code=001 select * from where code=001;
正常查詢:全表掃描
使用索引查詢:name使用索引,只掃描索引列
組合索引:
假設有a b 兩個字段,創建索引 where a=1 and b=1
MySQL查詢時,只會使用1個索引,所以先查詢a=1再查詢b=1,此時應該是用組合索引(a,b)
索引失效:
條件中有or
使用Like加% 模糊查詢
全表掃描比使用索引查詢快
索引是表達式的一部分
字段類型是字符串,數據沒有加“ ”
事務
是一種機制,其作用是保持數據一致性
MySQL的事務主要用來處理操作量大,復雜度高的數據;innodb存儲引擎支持事務,MyISAM不支持事務
事務的ACID特點:原子性、一致性、隔離性、持久性
原子性:事務是一個整體,是不可分割的,事物中的所有操作要不都執行成功,要不都失敗;rollback(回滾)可以撤銷事務中已經執行的SQL語句;Innodb存儲引擎中通過undo log實現回滾
一致性:當事務完成時,數據必須處于一致狀態,在事務開始之前數據處于一致狀態;當事務再進行時,數據可能處于不一致狀態;當事務執行完成后,數據必須處于一致狀態;
隔離性:對數據進行修改的所有并發事務都是隔離的;以防止多個食物并發執行時由于交叉執行導致數據不一致;
持久性:事務處理的結果都是永久的;
手動開啟事務:begin;(開始)commit;(提交)rollback;(回滾)
查看自動提交:show variables like “autocommit”;
開啟/關閉自動提交:set antocommit=1/0;
存儲引擎
查看MySQL默認支持的搜索引擎:show engines\G;
主要學習innodb和myisam,默認使用存儲引擎innodb,通過命令查看:show variables like “default_storage_engine”;
創建表時指定存儲引擎:create table 表名(字段1 字段類型,字段2 字段類型,...) engine="存儲引擎";
修改默認存儲引擎:set global default_storage_engine="存儲引擎";
Innodb 支持事務 行級鎖 64TB;
MyISAM不支持事務 表級鎖 256TB;
MyISAM 存儲引擎表存儲為三個文件:
.frm ?存儲表格式
.MYD ?存儲數據
.MYI ?存儲索引
MyISAM 以讀為主,不頻繁更新的表,對數據一致性要求不高
Innodb 以寫為主,對數據一致性要求比較高
MySQL日志(重點)
MySQL中包含6種日志:錯誤日志、查詢日志、慢查詢日志、二進制日志、中繼日志、元數據日志
錯誤日志:和MySQL啟動相關的信息,mariadb默認路徑/var/log/mariadb/mariadb.log
二進制日志(重點):記錄跟修改相關的SQL語句,例如updata insert delect create drop alter
二進制日志有三種格式:
語句
行
混合
將log-bin=mysql-bin寫入MySQL配置文件中,默認位置在/etc/my.cnf 開啟二進制日志,并指定日志文件名
查看二進制日志文件:ls /var/lib/mysql/ ?標黑處
查看二進制文件內容:mysqlbinlog mysql-bin.000001
MySQL內查看二進制狀態:show master status;
MySQL查看所有二進制日志:show master logs;
MySQL內清除二進制日志:reset master;
刪除指定二進制日志:purge master logs to “mysql-bin.000001”;
刪除指定二進制日志之前:purge master logs before “日期 時間”;
查看二進制日志過期時間:show variables like “expire_logs_days”;
設置二進制日志過期時間:set global expire_logs_days=3;
查看是否開啟二進制日志:show variables like "log_bin";
查看二進制日志的緩存大小:show variables ?like "binlog_cache_size";
查看二進制日志格式:show variables like "binlog_format";
查詢日志與慢查詢日志
查詢日志:記錄客戶端所有的語句,包括查詢語句(通常不開啟)
開啟/關閉查詢日志:set global general_log=1/0
慢查詢日志:記錄執行時間較長,超過long_query_time設定的值并且掃描數據行數不小于min_examined_row_limit的SQL語句。
show variable like “long%”;默認單位是秒,可以精確到微秒
show variables like “%row_limit”;
開啟/關閉 慢查詢日志:set global slow_query_log=1/0
設置慢查詢日志時間:set long_query_time=數值(默認單位是秒)
配置文件/etc/my.cnf中的mysqld段指定 slow_query_log_file=路徑文件名
數據庫備份
備份策略:全備份、增量備份、差異備份
熱備份 :數據庫在運行過程中進行備份,不需要對數據庫額外操作溫備份 :對表進行鎖定,表中數據不可以變化,此時數據庫還在運行過程中的備份??冷備份 :停止數據庫之后進行備份
Mysql備份方法1(導出):select * from 表名 into outfile "路徑文件名";例:備份表student到根下的test:select * from student into outfile “/var/lib/mysql/student.txt”;
注意:保存文件的目錄一定有mysql用戶權限
導入表:load data infile “路徑文件名”into table 表名;
將表導出為Excel文件:test:select * from student into outfile “/var/lib/mysql/student.csv”;
安裝lrzsz:yum -y install lrzsz
sz student.csv傳到桌面上
MySQL自帶的備份工具 mysqldump
mysqldump選項
-u 指定用戶
-P指定密碼
-p指定端口
-h指定主機地址
在linux命令行,備份數據庫abc,導出sql文件,格式:mysqldump -u用戶 -p密碼 庫名 > 文件名.sql
例:mysqldump abc > abc.sql
在linux命令行,備份abc庫中的表,同樣也是導出sql文件:mysqldump -u用戶 -p密碼 庫名 表名 > 文件名.sql
例:mysqldump abc student > student.sql
備份表結構
恢復數據庫,在數據庫中:source /路徑/備份文件.sql
恢復在數據庫外:cat 備份文件.sql |mysql -u用戶 -p密碼 庫名 ??????????????mysql -u用戶 -p密碼 庫名 < 備份文件.sql
mysqldumper 多線程并發執行備份,為每一個表創建一個備份文件
基于二進制節點位置進行數據恢復
mysqlbinlog --start-position=起始節點 --stop-position=結束節點 二進制名稱|mysql -uroot -p123123
基于二進制日志時間進行數據恢復
mysqlbinlog --start-datetime="起始時間" --stop-datetime="終止時間" 二進制日志名稱|mysql -uroot -p123123
MySQL客戶端工具
mysql
mysqladmin 管理工具 mysqladmin -uroot password 123123
mysqldump 數據導出工具
mysqlpump 并行導出數據工具(5.7版本之后才有)
mysqlcheck 表維護工具
mysqlimport 數據導入工具 mysqlimport -uroot -p密碼 庫名 備份文件名
MySQL5.7二進制包安裝
yum安裝lrzsz,然后上傳MySQL二進制包:yum -y install lrzsz
解包到usr下的src:tar xf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz -C /usr/src
為了更好實現版本控制,我們為解包好的文件創建個軟連接:ln -s /usr/src/mysql-5.7.22-linux-glibc2.12-x86_64/ /usr/local/mysql
創建MySQL程序用戶:useradd -M -s /sbin/nologin mysql
進入MySQL目錄:cd /usr/local/mysql
做一個環境變量:echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
執行source命令使其立即生效:source /etc/profile
初始化MySQL配置:mysqld --user=mysql --initialize --datadir=/usr/local/mysql/data
記錄密碼:TaKm#R5lb8ms(每個生成的不同)
將mysql啟動文件復制到/etc/init.d下:cp support-files/mysql.server /etc/init.d/mysqld
修改cnf配置文件,默認應該在support-files中有my_default.cnf文件,如果沒有,自己上傳
如果啟動不成功,大概率可能是,本機已經安裝過mysql或者mariadb,有殘留文件,yum -y remove卸載一下
啟動MySQL:/etc/init.d/mysqld start
使用剛剛生成的密碼登錄:mysql -uroot -pTaKm#R5lb8ms
登錄后首先修改初始化密碼:set password=password(“123123”);
安裝成功
附:MySQL配置文件my.cnf
由于在7.18開始,二進制包不再包含示例文件my-default.cnf,所以我從5.7.17版本中提取了樣例,但是發現里面也沒有太多項配置,my-default.cnf內容如下:
# For?advice on?how to change settings please see# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html# *** DO?NOT?EDIT THIS FILE.?It‘s a template which will be copied to the# *** default location during install, and will be replaced if?you# *** upgrade to a newer version of MySQL.
[mysqld]
# Remove leading # and set?to the amount of RAM for?the most important data# cache?in MySQL. Start?at 70% of total RAM for?dedicated server, else?10%.
# innodb_buffer_pool_size =?128M
# Remove leading # to turn on?a very important data integrity option: logging# changes to the binary log between backups.
#?log_bin
# These are commonly set, remove the # and set?as required.
# basedir = .....
# datadir = .....
# port = .....
# server_id = .....
# socket = .....
# Remove leading # to set?options mainly useful for?reporting servers.
# The server defaults are faster for?transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find?the optimal values.
# join_buffer_size =?128M# sort_buffer_size =?2M# read_rnd_buffer_size =?2M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
主從復制(數據庫熱備份)
主從復制主要通過二進制日志實現,在主庫上開啟二進制日志(修改相關的SQL語句),主庫將二進制日志發送到從庫,并寫入從庫的中繼日志中,從庫根據中繼日志的內容進行重做(重新執行一遍),從而達到主從數據一致。
部署兩臺MySQL主機:一臺名為mysql-master,另一臺為mysql-slave。上傳mysql5.7二進制包,并將其解壓移動到usr/local下,命名為mysql5.7
主從復制的優勢:
1.如果主庫出現問題,可以切換到從庫上提供服務;
2.從庫提供讀操作,可以減輕主庫I/O壓力;
3.可以在從庫上做數據備份,避免備份期間影響主庫的性能;
MySQL主從復制默認是異步復制;5.5版本開始支持半同步復制;
二進制日志格式:語句 行 混合;7.6之前默認是語句模式復制;5.7.7之后默認是行模式復制;
Mysql復制架構: 一主一從;一主多從;雙主復制;級聯復制;同源復制(多主一從);
首先,主庫開啟二進制日志(配置文件中):log-bin=mysql-bin
主庫更改配置文件中的server id=10,從庫等于11
主庫需要對從庫進行授權,在主庫中執行SQL語句:grant replication slave on *.* to "repl"@"%" identified by "123123";
主庫執行flush logs;再確定二進制日志文件:show master stautus;
從庫指向主庫,在從庫中執行SQL語句:change master to master_user='repl',master_password='123123',master_host='192.168.1.100',master_log_file='mysql-bin.000004',master_log_pos=154;
開啟從庫,在從庫執行SQL語句:start slave;
查看從庫狀態:show slave status\G;
上圖IO和SQ顯示yes,則主從復制就成功了。
刪除二進制日志,首先在從庫停掉slave:stop slave;然后reset slave;就重置主從復制配置了。
一臺從庫運行了一個月,增加一臺從庫,如何操作?
在主庫上鎖表,只可以讀:flush tables with read lock;
全量備份,在從庫上導入;開始配置主從;
主庫解鎖: unlock tables;
多源復制
Innodb MyISAM
sync_binlog -->將binlog寫入磁盤
=1時 ?表示開啟
=0時 ?表示關閉,mysql不控制二進制日志寫入磁盤,由操作系統控制
=N ?延遲binlog寫入磁盤
MySQL多線程復制
保證從庫并發應用relay log能力,2核32核的CPU 128G內存,硬盤HDD TPS(每秒事務處理能力:3萬次)
slave_paralel_type 指定并發復制的類型
首先開啟主從復制,然后在從庫上指定多少個工作線程:set global slave_parallel_workers=4;
從庫設置類型,此步設置前請stop slave;然后執行:set global master_info_repository=“table”;
從庫執行設置:set global relay_log_info_repository=“table”;
查看表結構:show creat 表名;如果搜索引擎不是InnoDB或MyISAM,可以修改:alter table slave_master_info engine="InnoDB/MyISAM ";
開啟從庫:start slave;
半同步復制
主庫安裝插件
install plugin rpl_semi_sync_master soname "semisync_master.so";
set global rpl_semi_sync_master_enabled=1;
從庫安裝插件
install plugin rpl_semi_sync_slave soname "semisync_slave.so";
set global rpl_semi_sync_slave_enabled=1;
stop slave io_thread;
start slave io_thread;
show variables like "%semi_sync%"; 查看半同步復制的值
show status like "rpl%"; 查看半同步復制的相關信息
基于GTID復制
GTID=source_id:事務id
show variables like "gtid_mode"; ?查看gtid狀態
set global gtid_mode=ON_PERMISSIVE;
select * from mysql.gtid_executed;
show master status;
gtid_executed ?保存的是上一個binlog日志中GTID
reset slave; 清除從庫配置后,配置信息保存在內存中,使用show slave status;還可以查看到信息;
reset slave all;
清除從庫配置后,使用show slave status; 查不到信息;
change master to master_user="repl",master_password="123123",master_host="192.168.2.10",master_auto_position=1;
不允許主從庫臨時開始gtid
在配置文件/etc/my.cnf中[mysqld]加入
gtid_mode=ON
enforce_gtid_consistency=ON
GTID復制可以在主從恢復時,自動根據GTID進行恢復;
讀寫分離-->緩解主庫IO壓力,避免從庫寫數據
基于代碼:
基于代理中間件:
mysql-proxy -->Atlas
mycat
MySQL數據庫壓測與性能
MySQL數據庫性能指標:
吞吐量:TPS/QPS
補充說明:磁盤 IOPS-->每秒IO請求數
磁盤吞吐量:每次IO操作產生的流量
show status like "%Questions%";
QPS:mysqladmin -uroot -p123123 -h 127.0.0.1 -i 1 -r ?extended|grep -i questions
響應時間:
1.例如現有一個訂單業務,要求5秒內響應
2.當有50并發時,TPM為2000事務,95%
3.100并發時,TPM為3500,55%
并發性
同時500在線,WEB 100并發請求,數據庫DB 50并發請求。
查看最大連接數,默認值為151:show variables like "%max_connection%";
附件: MySQL.docx 1.06MB 下載次數:0次
CentOS MySQL SQL
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。