mysql安裝及基本操作
1 清除沖突軟件mariadb (如果安裝了的話)
rpm? -q? mariadb-server? mariadb
????????? systemctl? stop? mariadb
????????? rpm? -e? --nodeps? mariadb? mariadb-server
????????? rm? -rf? /etc/my.cnf?
????????? rm? -rf? /var/lib/mysql/*
?2 安裝軟件mysql 社區(qū)開源版軟件
??????? tar? -xf mysql-5.7.17.tar
??????? yum -y install mysql-community-*.rpm
?3 啟動服務(wù)并設(shè)置開機運行 查看進(jìn)程和端口
??????? systemctl? start mysqld
??????? systemctl? enable mysqld
??????? netstat? -utnlp? | grep? 3306? 等效與?? ss? -utnlp? | grep? 3306
??????? ps -C mysqld?? 等效于? ps? aux? |? grep?? mysqld
? 4 查看連接MySQL服務(wù)初始密碼
??????? [root@host50 ~]# grep password? /var/log/mysqld.log | tail -1
2021-12-06T01:47:49.262056Z 1 [Note] A temporary password is generated for root@localhost: p.7jr.uy.aiZ
5 使用初始密碼連接服務(wù)
[root@host50 ~]# mysql -hlocalhost -uroot -p'p.7jr.uy.aiZ'
?6 修改登錄密碼(服務(wù)強制修改且修改的密碼要符合服務(wù)要求的復(fù)雜度)
mysql>? alter user?? root@"localhost" identified by "123qqq...A";
?7 斷開連接
mysql> exit;
臨時修改密碼的復(fù)雜度
show variables like "%password%";? 查看與密碼相關(guān)的配置項
mysql> set global validate_password_policy=0;? 修改密碼等級為0
mysql> set global validate_password_length=6;? 修改最小密碼長度
永久修改密碼策略
vim /etc/my.cnf? (永久配置)把修改 添加到配置文件里 數(shù)據(jù)庫服務(wù)重啟了 依然有效
[mysqld]
validate_password_policy=0
validate_password_length=6
#破解數(shù)據(jù)庫root密碼
?1.vim /etc/my.cnf
[mysqld]
#validate_password_policy=0
#validate_password_length=6
skip-grant-tables? #跳過授權(quán)庫MySQL庫啟動服務(wù) 作用連接服務(wù)不需要輸入密碼
mysql> flush privileges;? ?使修改配置生效
2. 線上破解密碼
? ?
步驟如下:
??????????????????????????? 1? 拷貝其他數(shù)據(jù)庫服務(wù)器 管理員root用戶能正常連接數(shù)據(jù)庫服務(wù)的mysql庫 覆蓋本機的mysql庫
?????????????????????????????????? ?。。。ysql庫存放的是 數(shù)據(jù)庫服務(wù)器的用戶和密碼?。?!?
??????????????????????????? 2? 查看mysql服務(wù) 父進(jìn)程的pid
??????????????????????????? 3? 給mysql服務(wù)的父進(jìn)程發(fā)送 SIGHUP信息 (作用重新加載數(shù)據(jù)庫目錄下的文件 ,可以重新識別 mysql庫里的用戶和密碼)
??????????????????????????? 4? 使用破解后的密碼登錄(密碼和root用戶能正常登錄服務(wù)主機的的root密碼一樣)
? ? scp -r 192.168.4.51:/var/lib/mysql/mysql? /var/lib/mysql/
[root@host50 ~]# which? pstree || yum? -y install psmisc
[root@host50 ~]# pstree -p | grep mysqld | head? -1
[root@host50 ~]# kill? -SIGHUP? 1603
[root@host50 ~]# mysql -hlocalhost -uroot -pNSD2021...a
? mysqladmin? -uroot??? -p舊密碼?? password? 新密碼
安裝圖形軟件???
在數(shù)據(jù)庫服務(wù)器安裝圖形軟件 ,通過連接圖形軟件,對數(shù)據(jù)庫做管理)
要求:在IP地址192.168.4.50主機安裝phpmyadmin軟件
步驟一:安裝phpmyadmin軟件。
????????????????? 1) 部署phpmyadmin運行環(huán)境 LAP? (L 指的是 linux 系統(tǒng)? A 指的是apache?? P 指的是PHP)
????????????????? 2) 安裝phpmyadmin軟件
????????????????? 3)? 修改配置文件 :? 修改phpmyadmin軟件的配置文件
? ? 365? yum -y install httpd php? php-mysql
? 367? systemctl? start httpd? ; systemctl? enable httpd
? 371? tar -xf phpMyAdmin-2.11.11-all-languages.tar.gz
? 373? mv phpMyAdmin-2.11.11-all-languages /var/www/html/phpmyadmin
? 374? cd /var/www/html/phpmyadmin
? 378 ?cp config.sample.inc.php? config.inc.php? 創(chuàng)建主配置文件
? 380? vim +17 config.inc.php? #在''號里添加plj123
?步驟二:客戶端通過訪問phpmyadmin軟件管理數(shù)據(jù)庫。
????????????????? ? 打開真機的瀏覽器 輸入
????????????????? ? 訪問的網(wǎng)址? http://192.168.4.50/phpmyadmin
相關(guān)參數(shù)(必須熟知 )
主配置文件? /etc/my.cnf???
數(shù)據(jù)庫目錄?? /var/lib/mysql
服務(wù)的進(jìn)程名/端口?? mysqld/3306
進(jìn)程所有者和所屬組??? mysql/mysql
數(shù)據(jù)傳輸協(xié)議??? tcp
錯誤日志文件名 /var/log/mysqld.log
基本命令:
mysql> show? databases;??? 顯示服務(wù)器上已有的庫(文件夾)
mysql> select user();? 顯示當(dāng)前登錄的用戶名和客戶端地址
mysql> select??? version();? 顯示數(shù)據(jù)庫服務(wù)軟件的版本號
mysql> select database();?? 顯示當(dāng)前所在的庫
mysql> use mysql;?? 進(jìn)入到mysql庫里
mysql> show tables;? 顯示所在庫下已有的表 (表就是用來存數(shù)據(jù)的文件 )
mysql> select @@version;? 查看環(huán)境變量
mysql> desc tarena.user;? 查看表結(jié)構(gòu)
mysql>select name as 用戶名 , homedir 家目錄 from tarena.user;? ?取別名
mysql> select concat(name,"-",uid)? as? 用戶信息? from tarena.user;? 拼接
mysql> select distinct shell from? tarena.user;? ?不顯示重復(fù)項
數(shù)值比較 符號?? =????? !=?????? >?????? >=?????? <?????? <=
????????????? 相等??? 不相等?? 大于?? 大于等于??? 小于??? 小于等于
字符比較 符號?? =?? !=?
空?????? is? null????? 表頭下沒有數(shù)據(jù)
非空?????? is? not null? 表頭下有數(shù)據(jù)
范圍匹配條件?? in?? 、? not? in? 、? between? 數(shù)字1 and?? 數(shù)字2??
模糊匹配條件?? where? 字段名?? like? ‘表達(dá)式’
????????????????? ? 統(tǒng)配符號?
????????????????? ? _? 表示 1個字符
????????????????? ? %表示零個或多個字符
正則匹配?? 使用正則表達(dá)式做判斷條件??????? 格式:?? 字段名 regexp? '正則表達(dá)式'
??????????????? ^ 匹配行首
??????????????? $ 匹配行尾
??????????????? [] 匹配范圍內(nèi)任意一個
??????????????? *? 前邊的表達(dá)式出現(xiàn)零次或多次
??????????????? |? 或者
邏輯匹配? 就是有多個判斷條件
邏輯與?? and? &&??????? 多個判斷條件必須同時成立
邏輯或?? or?? ||??????? 多個判斷條件其中某個條件成立即可
邏輯非?? not? !???????? 取反
()? 提高優(yōu)先級? 作用:改變執(zhí)行順序
表管理
建庫的基本命令?? create? database? 庫名;
create? table? 庫名.表名(
表頭名1? 數(shù)據(jù)類型,
表頭名2? 數(shù)據(jù)類型,
表頭名3? 數(shù)據(jù)類型,
表頭名4? 數(shù)據(jù)類型
);
Create Table: CREATE TABLE `t1` (
? `level` tinyint(3) unsigned DEFAULT NULL,
? `money` double DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1? 西歐字符編碼
?命令格式: alter? table? 庫名.表名?? 操作命令;
?????????? 可以做哪些修改呢?(操作命令)
???????? 添加新表頭?? add????????
???????? 刪除表頭?? drop?????????
???????? 修改表頭存儲數(shù)據(jù)的 數(shù)據(jù)類型? modify
???????? 修改表頭名? change
???????? 修改表名? rename
mysql> alter table studb.stu rename studb.stuinfo;? 修改表名
mysql> alter table studb.stuinfo drop age ;? 刪除字段
mysql> alter table studb.stuinfo add? mail? char(30) ; 添加在末尾
添加在指定位置
?mysql> alter table? studb.stuinfo add? number? char(9) first , add? school char(10) after name;
mysql> alter table? studb.stuinfo?? 修改字段類型
??? -> modify
??? -> mail varchar(50) not null default "plj@tedu.cn";
?mysql> alter table studb.stuinfo change? class? class_name char(9) ; 修改表頭名
使用modify? 修改表頭的位置?
mysql> alter? table studb.stuinfo? modify age int? after name ;?
表頭和數(shù)據(jù)復(fù)制都復(fù)制的
命令格式?create? table? 庫名.表名?? select? *? from? 庫名.表名 ;
?僅僅復(fù)制表頭命令格式:(只復(fù)制表結(jié)構(gòu))
命令格式? CREATE? TABLE 庫.表?? LIKE? 庫.表
管理表記錄 :
對表中存儲的行做管理 ,
操作包括? 查看select?? 插入 insert into?? 更新 update? 刪除 delete
添加行?? insert? into
修改?? ??update
刪除行? ?delete
mysql> select? * from? studb.stuinfo;
mysql> insert into studb.stuinfo?
??? -> values
??? -> ("nsd211102" , "jim",21,"boy"),("nsd211103","lucy",18,"girl");
?
命令格式: update? 庫名.表名?? set? 字段名 =? 值 ,? 字段名 =? 值 ;
僅刪除符合條件的行?? (刪除命令有篩選條件)?
delete?? from? 庫.表? where? 篩選條件;
注意 也可以使用? truncate? table? 庫.表; 刪除表里的記錄
?????????????? ??
truncate 與 delete? 刪除記錄的區(qū)別?。?!? (要知道 )
- TRUNCATE不支持WHERE條件
- 自增長列,TRUNCATE后從1開始;DELETE繼續(xù)編號
- TRUNCATE不能回滾,DELETE可以
- 效率略高于DELETE
?
字符類型??? (表頭下存儲的是漢字或者是英文字母)?
char(字符個數(shù))??? 定長字符類型(固定長度)???? 存儲范圍 1-255字符? ?補空格
varchar(字符個數(shù)) 變長????? ?(長度不固定)??? 存儲范圍 1-65535字符 (有效存儲范圍到65532)? 不會補空格
一個英文字母 是一個字符
一個漢字也是一個字符
?char 和 varchar 共同點? 都不能超出指定的字符個數(shù)
char 和 varchar 不同點? 存儲的字符個數(shù)小于指定的字符個數(shù)時處理的方式不一樣,
枚舉類型??? 給表頭賦值時 ,值必須在類型規(guī)定的范圍內(nèi)選擇
單選??? enum(值1,值2,值3 ....)
多選??? set(值1,值2,值3 ....)
日期時間類型? 表頭存儲與日期時間格式的數(shù)據(jù)
年??????? year?????? YYYY???? 2021
日期??? date??????? YYYYMMDD??? 20211104
時間??? time?????? HHMMSS???????? 143358? ??
日期時間(既有日期又有時間)? ? datetime?? 或? timestamp? ??
timestamp類型????? 不賦值 使用系統(tǒng)時間自動賦值
datetime類型???????? 不賦值? 使用null? 賦值
? ? ?datetime?? 與? timestamp? 的區(qū)別?
? ? 第一個區(qū)別是存儲范圍不一樣 (datetime存儲范圍大? timestamp范圍?。?/p>
? ? ?存儲數(shù)據(jù)的方式不一樣
? 使用2位數(shù)給year的表頭賦值也是可以的? 但會自動補全4位數(shù)
?01-69? 之間的數(shù)字使用20補全4位數(shù)的年 2001~2069
?70-99? 之間的數(shù)字使用19補全4位數(shù)的年 1970~1999
?
#查看默認(rèn)的檢索目錄
mysql> show variables like? "secure_file_priv";
第二? 修改數(shù)據(jù)庫服務(wù)默認(rèn)的檢索目錄
[root@host50 ~]# vim /etc/my.cnf
[mysqld]
secure_file_priv=/myload????? #手動添加
數(shù)據(jù)導(dǎo)入格式:
mysql>? load?? data? infile?? "/檢索目錄/文件名"?? into? table??? 庫名.表名??
fields? terminated by? "文件中列的間隔符號"??
lines?? terminated by?? "\n"? ;
數(shù)據(jù)導(dǎo)出命令格式1)??
select?? 字段名列表 from? 庫.表?? where? 條件? into? outfile?? "/檢索命令名/文件名" ;
?數(shù)據(jù)導(dǎo)出命令格式2)??
select?? 字段名列表 from? 庫.表?? where? 條件?
into? outfile?? "/檢索命令名/文件名"? fields? terminated by? "符號" ;
一、字段約束
字段約束的作用是什么?
設(shè)置在表頭上 ,用來限制字段賦值
字段都有哪些約束?(每一種約束都有各自的功能)
字段約束分類:
1、 PRIMARY KEY:主鍵,用于保證該字段的值具有唯一性并且非空。
?2、NOT NULL :非空,用于保證該字段的值不能為空。
?3、DEFAULT:默認(rèn)值,用于保證該字段有默認(rèn)值。
?4、UNIQUE:唯一索引,用于保證該字段的值具有唯一性,可以為空。
?5、 FOREIGN KEY:外鍵,用于限制兩個表的關(guān)系,用于保證該字段的值必須來自于主表的關(guān)聯(lián)列的值,在從表添加外鍵約束,用于引用主表中某些的值。
?建表時,創(chuàng)建主鍵 (2種語法格式 要記?。?/p>
語法格式1
create? table? 庫.表( 字段名 類型? primary key? , 字段名 類型 , ..... );
語法格式2
create? table? 庫.表( 字段名 類型 , 字段名 類型 , primary key(字段名) );
刪除主鍵命令格式(要記住)向表頭下存儲數(shù)據(jù)不受主鍵的限制
mysql> alter? table?? 庫.表?? drop primary? key ;
添加主鍵命令格式(要記?。?/p>
mysql> alter? table? 庫.表? add? primary key(表頭名);
?主鍵與auto_increment連用:
當(dāng)給字段設(shè)置了auto_increment屬性后,插入記錄時,如果不給字段賦值
???????????????????? 字段會通過自加1的計算結(jié)果賦值
???????????????????? 要想讓字段有自增長 那么字段必須有主鍵的設(shè)置才可以
復(fù)合主鍵?
表中的多個表頭一起做主鍵
復(fù)合主鍵的約束方式: 多條記錄 主鍵字段的值不允許同時相同
創(chuàng)建有復(fù)合主鍵的表
create? table? db1.t39(cip?? varchar(15) , port? smallint ,?
status? enum("deny","allow") , primary key(cip,port)
刪除復(fù)合主鍵
mysql> alter table? db1.t39 drop primary key;
添加復(fù)合主鍵時 字段下的數(shù)據(jù)與主鍵約束沖突 不允許添加
mysql> alter table? db1.t39 add primary key(cip,port);
外鍵
核心思想:保證數(shù)據(jù)的一致性?
插入記錄時,字段值在另一個表字段值范圍內(nèi)選擇。
?外鍵的使用規(guī)則:
表存儲引擎必須是innodb (在進(jìn)階課程里講? 現(xiàn)在僅需要知道如何指定表使用innodb存儲引擎)
字段類型要一致
被參照字段必須要是索引類型的一種(通常是 primary key)
格式
create table?? 庫.表(表頭列表 ,
foreign key(表頭名)?? #指定外鍵
references 庫.表(表頭名)?? #指定參考的表頭名
on update? cascade?? #同步更新
on? delete? cascade? #同步刪除
)engine=innodb;
外鍵驗證:
?????? 1?? 外鍵字段的值必須在參考表字段值范圍內(nèi)
?????? 2?? 驗證同步更新( on update cascade)
?????? 3?? 驗證同步刪除( on? delete? cascade)?? 練習(xí)到? 17:18
mysql索引
ysql索引主要有三種結(jié)構(gòu):Btree、B+Tree 、Hash 。
?
索引優(yōu)點具體如下:
可以大大提高M(jìn)ySQL的檢索速度
索引大大減小了服務(wù)器需要掃描的數(shù)據(jù)量
索引可以幫助服務(wù)器避免排序和臨時表
索引可以將隨機IO變成順序IO
?索引的缺點:
雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,
如對表進(jìn)行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要保存數(shù)據(jù),還要保存索引文件。
建立索引會占用磁盤空間的索引文件。一般情況這個問題不太嚴(yán)重,但如果你在一個大表上創(chuàng)建了多種組合索引,索引文件的會膨脹很快。
如果某個數(shù)據(jù)列包含許多重復(fù)的內(nèi)容,為它建立索引就沒有太大的實際效果。
對于非常小的表,大部分情況下簡單的全表掃描更高效。
?
?索引的分類:
普通索引 (index)
不應(yīng)用任何限制條件的索引,該索引可以在任何數(shù)據(jù)類型中創(chuàng)建。
字段本身的約束條件可以判斷其值是否為空或唯一。
創(chuàng)建該類型索引后,用戶在查詢時,便可以通過索引進(jìn)行查詢。
?唯一索引 (unique)
使用UNIQUE參數(shù)可以設(shè)置唯一索引。
創(chuàng)建該索引時,索引的值必須唯一。
通過唯一索引,用戶可以快速定位某條記錄。
主鍵是一種特殊唯一索引。
?全文索引 (FULLTEXT)
使用FULLTEXT參數(shù)可以設(shè)置索引為全文索引。
全文索引只能創(chuàng)建在CHAR、VARCHAR或者TEXT類型的字段上。
查詢數(shù)據(jù)量較大的字符串類型的字段時,使用全文索引可以提高查詢速度。
在默認(rèn)情況下,應(yīng)用全文搜索大小寫不敏感。如果索引的列使用二進(jìn)制排序后,
可以執(zhí)行大小寫敏感的全文索引。
?單列索引
顧名思義,單列索引即只對應(yīng)一個字段的索引。
應(yīng)用該索引的條件只需要保證該索引值對應(yīng)一個字段即可。
可以包括普通、唯一、全文索引。
多列索引
多列索引是在表的多個字段上創(chuàng)建一個索引。
該索引指向創(chuàng)建時對應(yīng)的多個字段,用戶可以通過這幾個字段進(jìn)行查詢。
要想應(yīng)用該索引,用戶必須使用這些字段中的第一個字段。
? ? ?2.4 普通索引(index)的管理
普通索引(index)的使用規(guī)則(需要牢記)具體如下:
?一個表中可以有多個index
?字段的值可以重復(fù),且可以賦值為null
?通常在where條件中的字段上配置Index
?index索引字段的標(biāo)志為mul
?創(chuàng)建普通索引(index)
????????????? 1)建表時創(chuàng)建索引命令格式???
CREATE TABLE? 庫.表(
字段列表 ,
INDEX(字段名) ,
INDEX(字段名) ,
);
查看索引詳細(xì)信息?? show index?? from?? 庫.表;
刪除索引?
命令格式?? DROP? INDEX?? 索引名?? ON? 庫.表;
在已有表添加索引命令格式?
CREATE? INDEX? 索引名? ON? 庫.表(字段名);
?explain命令 : ??? ?可以查看執(zhí)行的查詢select語句, 是否使用到索引做查詢了
mysql用戶管理:
1? 用戶授權(quán)
1.3? 用戶授權(quán)命令格式
GRANT 權(quán)限列表 ON 庫名 TO 用戶名@"客戶端地址"?? IDENTIFIED? BY? “密碼”??? WITH GRANT OPTION;
? ? ? 權(quán)限列表? : 就是添加的用戶對指定的庫名具有的訪問權(quán)限表示方式(就是學(xué)過的sql命令)
ALL??????? 表示所有權(quán)限? (表示所有命令)
USAGE??? 表示無權(quán)限? (除了查看之外啥權(quán)限都沒有 , 看的命令show??? desc )
SELECT,UPDATE,INSERT????????? 表示只有個別權(quán)限
SELECT, UPDATE (字段1,字段N)?? 表示權(quán)限僅對指定字段有訪問權(quán)限
庫名? :添加的使用戶對服務(wù)器上的那些庫有訪問權(quán)限 可以表示的方式有:
*.*????????? 表示 所有庫所有表?? 第1個表示所有庫名? 第2個 表示所有表名
庫名.* ? ??表示一個庫下的所有表?? 例如 tarena.*
庫名.表名 ? 表是一張表?? 例如? tarena.user
客戶端地址:???? 表示網(wǎng)絡(luò)中的那些主機可以使用添加的用戶連接數(shù)據(jù)庫服務(wù)表示的方式有:
%? ? ????????? ?????表示網(wǎng)絡(luò)中的所有主機
192.168.4.%??? ? ?表示 192.168.4網(wǎng)段內(nèi)的所有主機
192.168.4.1???? ??表示僅僅是192.168.4.1?? 一臺主機
localhost????????? 表示數(shù)據(jù)庫服務(wù)器本機
?
WITH GRANT OPTION :?
讓添加的用戶也可以使用grant命令再添加用戶,但用戶本身要對mysql庫有insert的權(quán)限
權(quán)限撤銷 : 刪除已有授權(quán)用戶的權(quán)限?
命令格式如下
REVOKE 權(quán)限列表 ON 庫名 FROM? 用戶名@"客戶端地址";
注意 : 庫名的表示方式 要和 用戶授權(quán)時的表示方式一樣
? ? ?3 刪除添加的用戶
drop? user?? 用戶名@"客戶端地址";
?
查看用戶訪問權(quán)限
mysql> show grants for? root@"%";
mysql> set password for 用戶名@"客戶端地址"=password("新密碼");? ?#修改已有授權(quán)用戶的連接密碼