一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Mysql數(shù)據(jù)庫 深度知識點(diǎn)

 頭號碼甲 2022-05-07 發(fā)布于北京
停止命令:net stop mysql
啟動命令:net start mysql
 

mysql登錄命令

mysql -h ip -P 端口 -u 用戶名 -p
 
mysql --version 或者mysql -V用于在未登錄情況下,查看本機(jī)mysql版本
select version();:登錄情況下,查看鏈接的庫版本
 
顯示所有數(shù)據(jù)庫:show databases;
進(jìn)入指定的庫:use 庫名;
顯示當(dāng)前庫中所有的表:show tables;
查看其他庫中所有的表:show tables from 庫名;
查看表的創(chuàng)建語句:show create table 表名;
查看表結(jié)構(gòu):desc 表名;
查看當(dāng)前所在庫:select database();
 

mysql語法規(guī)范

  1. 不區(qū)分大小寫,但建議關(guān)鍵字大寫,表名、列名小寫
  2. 每條命令最好用英文分號結(jié)尾
  3. 每條命令根據(jù)需要,可以進(jìn)行縮進(jìn)或換行
  4. 注釋
    • 單行注釋:#注釋文字
    • 單行注釋:-- 注釋文字 ,注意, 這里需要加空格
    • 多行注釋:/ **注釋文字 **/

SQL的語言分類

  • DQL(Data Query Language):數(shù)據(jù)查詢語言
    select 相關(guān)語句
  • DML(Data Manipulate Language):數(shù)據(jù)操作語言
    insert 、update、delete 語句
  • DDL(Data Define Languge):數(shù)據(jù)定義語言
    create、drop、alter 語句
  • TCL(Transaction Control Language):事務(wù)控制語言
    set autocommit=0、start transaction、savepoint、commit、rollback
 
主要包括以下五大類
整數(shù)類型:bit、bool、tinyint、smallint、mediumint、int、bigint
浮點(diǎn)數(shù)類型:float、double、decimal
字符串類型:char、varchar、tinyblob、blob、mediumblob、longblob、tinytext、text、mediumtext、longtext
日期類型:Date、DateTime、TimeStamp、Time、Year
其他數(shù)據(jù)類型:暫不介紹,用的比較少。
 

類型(n)說明

在開發(fā)中,我們會碰到有些定義整型的寫法是int(11),這種寫法個人感覺在開發(fā)過程中沒有什么用途,不過還是來說一下,int(N)我們只需要記住兩點(diǎn):
  • 無論N等于多少,int永遠(yuǎn)占4個字節(jié)
  • N表示的是顯示寬度,不足的用0補(bǔ)足,超過的無視長度而直接顯示整個數(shù)字,但這要整型設(shè)置了unsigned zerofill才有效
 
decimal采用的是四舍五入 
float和double采用的是四舍六入五成雙
什么是四舍六入五成雙?
就是5以下舍棄5以上進(jìn)位,如果需要處理數(shù)字為5的時候,需要看5后面是否還有不為0的任何數(shù)字,如果有,則直接進(jìn)位,如果沒有,需要看5前面的數(shù)字,若是奇數(shù)則進(jìn)位,若是偶數(shù)則將5舍掉
char類型占用固定長度,如果存放的數(shù)據(jù)為固定長度的建議使用char類型,如:手機(jī)號碼、身份證等固定長度的信息

數(shù)據(jù)類型選擇的一些建議

  • 選小不選大:一般情況下選擇可以正確存儲數(shù)據(jù)的最小數(shù)據(jù)類型,越小的數(shù)據(jù)類型通常更快,占用磁盤,內(nèi)存和CPU緩存更小。
  • 簡單就好:簡單的數(shù)據(jù)類型的操作通常需要更少的CPU周期,例如:整型比字符操作代價要小得多,因?yàn)樽址托σ?guī)則(排序規(guī)則)使字符比整型比較更加復(fù)雜。
 
  • 盡量避免NULL:盡量制定列為NOT NULL,除非真的需要NULL類型的值,有NULL的列值會使得索引、索引統(tǒng)計和值比較更加復(fù)雜。
  • 浮點(diǎn)類型的建議統(tǒng)一選擇decimal
  • 記錄時間的建議使用int或者bigint類型,將時間轉(zhuǎn)換為時間戳格式,如將時間轉(zhuǎn)換為秒、毫秒,進(jìn)行存儲,方便走索引
 

權(quán)限生效時間

用戶及權(quán)限信息放在庫名為mysql的庫中,mysql啟動時,這些內(nèi)容被讀進(jìn)內(nèi)存并且從此時生效,所以如果通過直接操作這些表來修改用戶及權(quán)限信息的,需要重啟mysql或者執(zhí)行flush privileges;才可以生效。
用戶登錄之后,mysql會和當(dāng)前用戶之間創(chuàng)建一個連接,此時用戶相關(guān)的權(quán)限信息都保存在這個連接中,存放在內(nèi)存中,此時如果有其他地方修改了當(dāng)前用戶的權(quán)限,這些變更的權(quán)限會在下一次登錄時才會生效。

創(chuàng)建用戶

語法:
create user 用戶名[@主機(jī)名] [identified by '密碼'];
說明:
  1. 主機(jī)名默認(rèn)值為%,表示這個用戶可以從任何主機(jī)連接mysql服務(wù)器
  2. 密碼可以省略,表示無密碼登錄
通過修改mysql.user表修改密碼
use mysql;
update user set authentication_string = password('321') where user = 'test1' and host = '%';
flush privileges;
 
給用戶授權(quán):
grant privileges ON database.table TO 'username'[@'host'] [with grant option]
 
grant命令說明:
  • priveleges (權(quán)限列表),可以是all,表示所有權(quán)限,也可以是select、update等權(quán)限,多個權(quán)限之間用逗號分開。
  • ON 用來指定權(quán)限針對哪些庫和表,格式為數(shù)據(jù)庫.表名 ,點(diǎn)號前面用來指定數(shù)據(jù)庫名,點(diǎn)號后面用來指定表名,*.* 表示所有數(shù)據(jù)庫所有表。
  • TO 表示將權(quán)限賦予某個用戶, 格式為username@host,@前面為用戶名,@后面接限制的主機(jī),可以是IP、IP段、域名以及%,%表示任何地方。
  • WITH GRANT OPTION 這個選項(xiàng)表示該用戶可以將自己擁有的權(quán)限授權(quán)給別人。注意:經(jīng)常有人在創(chuàng)建操作用戶的時候不指定WITH GRANT OPTION選項(xiàng)導(dǎo)致后來該用戶不能使用GRANT命令創(chuàng)建用戶或者給其它用戶授權(quán)。
    備注:可以使用GRANT重復(fù)給用戶添加權(quán)限,權(quán)限疊加,比如你先給用戶添加一個select權(quán)限,然后又給用戶添加一個insert權(quán)限,那么該用戶就同時擁有了select和insert權(quán)限。

查看用戶有哪些權(quán)限

show grants for '用戶名'[@'主機(jī)']
show grants -- 查看當(dāng)前用戶的權(quán)限
撤銷用戶的權(quán)限:revoke privileges ON database.table FROM '用戶名'[@'主機(jī)'];
刪除用戶:
1.drop user '用戶名'[@'主機(jī)’]
2.delete from user where user='用戶名' and host='主機(jī)';
 
 

授權(quán)原則說明

  • 只授予能滿足需要的最小權(quán)限,防止用戶干壞事,比如用戶只是需要查詢,那就只給select權(quán)限就可以了,不要給用戶賦予update、insert或者delete權(quán)限
  • 創(chuàng)建用戶的時候限制用戶的登錄主機(jī),一般是限制成指定IP或者內(nèi)網(wǎng)IP段
  • 初始化數(shù)據(jù)庫的時候刪除沒有密碼的用戶,安裝完數(shù)據(jù)庫的時候會自動創(chuàng)建一些用戶,這些用戶默認(rèn)沒有密碼
  • 為每個用戶設(shè)置滿足密碼復(fù)雜度的密碼
  • 定期清理不需要的用戶,回收權(quán)限或者刪除用戶
 

總結(jié)

  1. 通過命令的方式操作用戶和權(quán)限不需要刷新,下次登錄自動生效
  2. 通過操作mysql庫中表的方式修改、用戶信息,需要調(diào)用flush privileges;刷新一下,下次登錄自動生效
  3. mysql識別用戶身份的方式是:用戶名+主機(jī)
  4. 本文中講到的一些指令中帶主機(jī)的,主機(jī)都可以省略,默認(rèn)值為%,表示所有機(jī)器
  5. mysql中用戶和權(quán)限的信息在庫名為mysql的庫中
 
 

修改列

alter table 表名 modify column 列名 新類型 [約束];
或者
alter table 表名 change column 列名 新列名 新類型 [約束];
2種方式區(qū)別:modify不能修改列名,change可以修改列名
 
delete單表刪除
delete [別名] from 表名 [[as] 別名] [where條件];
注意:
如果無別名的時候,表名就是別名
如果有別名,delete后面必須寫別名
如果沒有別名,delete后面的別名可以省略不寫。
示例
-- 刪除test1表所有記錄delete from test1;
-- 刪除test1表所有記錄delete test1 from test1;
-- 有別名的方式,刪除test1表所有記錄delete t1 from test1 t1;
-- 有別名的方式刪除滿足條件的記錄delete t1 from test1 t1 where t1.a>100;
多表刪除
可以同時刪除多個表中的記錄,語法如下:
delete [別名1,別名2] from 表1 [[as] 別名1],表2 [[as] 別名2] [where條件];
說明:
別名可以省略不寫,但是需要在delete后面跟上表名,多個表名之間用逗號隔開。
示例1
delete t1 from test1 t1,test2 t2 where t1.a=t2.c2;
刪除test1表中的記錄,條件是這些記錄的字段a在test.c2中存在的記錄
 

drop,truncate,delete區(qū)別

  • drop (刪除表):刪除內(nèi)容和定義,釋放空間,簡單來說就是把整個表去掉,以后要新增數(shù)據(jù)是不可能的,除非新增一個表。
    drop語句將刪除表的結(jié)構(gòu)被依賴的約束(constrain),觸發(fā)器(trigger)索引(index),依賴于該表的存儲過程/函數(shù)將被保留,但其狀態(tài)會變?yōu)椋篿nvalid。
    如果要刪除表定義及其數(shù)據(jù),請使用 drop table 語句。
  • truncate (清空表中的數(shù)據(jù)):刪除內(nèi)容、釋放空間但不刪除定義(保留表的數(shù)據(jù)結(jié)構(gòu)),與drop不同的是,只是清空表數(shù)據(jù)而已。
    注意:truncate不能刪除具體行數(shù)據(jù),要刪就要把整個表清空了。
  • delete (刪除表中的數(shù)據(jù)):delete 語句用于刪除表中的行。delete語句執(zhí)行刪除的過程是每次從表中刪除一行,并且同時將該行的刪除操作作為事務(wù)記錄在日志中保存,以便進(jìn)行進(jìn)行回滾操作。
    truncate與不帶where的delete :只刪除數(shù)據(jù),而不刪除表的結(jié)構(gòu)(定義)
    truncate table 刪除表中的所有行,但表結(jié)構(gòu)及其列、約束、索引等保持不變。
    對于由foreign key約束引用的表,不能使用truncate table ,而應(yīng)使用不帶where子句的delete語句。由于truncate table 記錄在日志中,所以它不能激活觸發(fā)器。
    delete語句是數(shù)據(jù)庫操作語言(dml),這個操作會放到 rollback segement 中,事務(wù)提交之后才生效;如果有相應(yīng)的 trigger,執(zhí)行的時候?qū)⒈挥|發(fā)。
    truncate、drop 是數(shù)據(jù)庫定義語言(ddl),操作立即生效,原數(shù)據(jù)不放到 rollback segment 中,不能回滾,操作不觸發(fā) trigger。
    如果有自增列,truncate方式刪除之后,自增列的值會被初始化,delete方式要分情況(如果數(shù)據(jù)庫被重啟了,自增列值也會被初始化,數(shù)據(jù)庫未被重啟,則不變)
  • 如果要刪除表定義及其數(shù)據(jù),請使用 drop table 語句
  • 安全性:小心使用 drop 和 truncate,尤其沒有備份的時候,否則哭都來不及
  • 刪除速度,一般來說: drop> truncate > delete
drop
truncate
delete
 
條件刪除
不支持
不支持
支持
刪除表結(jié)構(gòu)
支持
不支持
不支持
事務(wù)的方式刪除
不支持
不支持
支持
觸發(fā)觸發(fā)器
別名中有特殊符號的,比如空格,此時別名必須用引號引起來。
 
不等于符號的使用:
<> 這個是最早的用法。
!=是后來才加上的。
兩者意義相同,在可移植性上前者優(yōu)于后者
故而sql語句中盡量使用<>來做不等判斷
 
 

 

like(模糊查詢)

select 列名 from 表名 where 列 like pattern;
pattern中可以包含通配符,有以下通配符:
%:表示匹配任意一個或多個字符
_:表示匹配任意一個字符。

 

查詢運(yùn)算符、like、between and、in、not in對NULL值查詢不起效
 

<=>(安全等于)

<=>:既可以判斷NULL值,又可以判斷普通的數(shù)值,可讀性較低,用得較少
 

總結(jié)

  • like中的%可以匹配一個到多個任意的字符,_可以匹配任意一個字符
  • 空值查詢需要使用IS NULL或者IS NOT NULL,其他查詢運(yùn)算符對NULL值無效
  • 建議創(chuàng)建表的時候,盡量設(shè)置表的字段不能為空,給字段設(shè)置一個默認(rèn)值
  • <=>(安全等于)玩玩可以,建議少使用
語法:
select 列 from 表 limit [offset,] count;
說明:
offset:表示偏移量,通俗點(diǎn)講就是跳過多少行,offset可以省略,默認(rèn)為0,表示跳過0行;范圍:[0,+∞)。
count:跳過offset行之后開始取數(shù)據(jù),取count行記錄;范圍:[0,+∞)。
limit中offset和count的值不能用表達(dá)式。
 

limit中不能使用表達(dá)式,limit后面的2個數(shù)字不能為負(fù)數(shù)

 

字段存在相同的值,當(dāng)排序過程中存在相同的值時,沒有其他排序規(guī)則時,mysql懵逼了,不知道怎么排序了; 
建議:分頁排序時,排序不要有二義性,二義性情況下可能會導(dǎo)致分頁結(jié)果亂序,可以在后面追加一個主鍵排序
where 多字段同時限制:
SELECT
user_id 用戶id,
price 最大金額,
the_year 年份
FROM
t_order t1
WHERE
(t1.user_id , t1.price)
IN
(SELECT
t.user_id, MAX(t.price)
FROM
t_order t
GROUP BY t.user_id);
現(xiàn)在我們來討論java輸出的順序?yàn)楹魏蛃ql不一致?
上面java代碼中兩個表的連接查詢使用了嵌套循環(huán),外循環(huán)每執(zhí)行一次,內(nèi)循環(huán)的表都會全部遍歷一次,如果放到mysql中,就相當(dāng)于內(nèi)標(biāo)全部掃描了一次(一次全表io讀取操作),主表(外循環(huán))如果有n條數(shù)據(jù),那么從表就需要全表掃描n次,表的數(shù)據(jù)是存儲在磁盤中,每次全表掃描都需要做io操作,io操作是最耗時間的,如果mysql按照上面的java方式實(shí)現(xiàn),那效率肯定很低。
那mysql是如何優(yōu)化的呢?
msql內(nèi)部使用了一個內(nèi)存緩存空間,就叫他join_buffer吧,先把外循環(huán)的數(shù)據(jù)放到j(luò)oin_buffer中,然后對從表進(jìn)行遍歷,從表中取一條數(shù)據(jù)和join_buffer的數(shù)據(jù)進(jìn)行比較,然后從表中再取第2條和join_buffer數(shù)據(jù)進(jìn)行比較,直到從表遍歷完成,使用這方方式來減少從表的io掃描次數(shù),當(dāng)join_buffer足夠大的時候,大到可以存放主表所有數(shù)據(jù),那么從表只需要全表掃描一次(即只需要一次全表io讀取操作)。
mysql中這種方式叫做Block Nested Loop。
 
 
字段值為NULL的時候,not in查詢有大坑,這個要注意
建議創(chuàng)建表的時候,列不允許為空
 

delimiter關(guān)鍵字  sql語句結(jié)束符

delimiter用來設(shè)置結(jié)束符,當(dāng)mysql執(zhí)行腳本的時候,遇到結(jié)束符的時候,會把結(jié)束符前面的所有語句作為一個整體運(yùn)行,存儲過程中的腳本有多個sql,但是需要作為一個整體運(yùn)行,所以此處用到了delimiter
 
/*在執(zhí)行過程中出任何異常設(shè)置hasSqlError為TRUE*/
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET hasSqlError=TRUE;
根據(jù)hasSqlError判斷是否有異常,做回滾和提交操作
 
 
mysql使用binlog和relaylog記錄數(shù)據(jù)庫的變化
binlog有三種格式:ROW STATEMENT MIXED ,ROW記錄national數(shù)據(jù)被修改了,修改成了什么樣子;STATEMENT 記錄修改的sql到binlog;MIXED就是以上兩種模式的混合。
binlog是一個二進(jìn)制文件,解析binlog有兩種方式:
1.在命令行使用,show binlog events in 'binlog-filename';方式查看
2.下載分析binlog,然后通過mysqlbinlog工具進(jìn)行解析
 
 
扇區(qū):磁盤存儲的最小單位,扇區(qū)一般大小為512Byte
磁盤塊:文件系統(tǒng)與磁盤交互的最小單位(計算機(jī)系統(tǒng)讀寫磁盤的最小單位),一個磁盤塊由連續(xù)幾個扇區(qū)組成,塊一般大小為4KB
 
二分法查找數(shù)據(jù)的優(yōu)點(diǎn):定位數(shù)據(jù)非???,前提是:目標(biāo)數(shù)組是有序的。
 

總結(jié)一下使用索引的一些建議

  1. 在區(qū)分度高的字段上面建立索引可以有效的使用索引,區(qū)分度太低,無法有效的利用索引,可能需要掃描所有數(shù)據(jù)頁,此時和不使用索引差不多
  2. 聯(lián)合索引注意最左匹配原則:必須按照從左到右的順序匹配,mysql會一直向右匹配直到遇到范圍查詢(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調(diào)整
  3. 查詢記錄的時候,少使用*,盡量去利用索引覆蓋,可以減少回表操作,提升效率
  4. 有些查詢可以采用聯(lián)合索引,進(jìn)而使用到索引下推(IPC),也可以減少回表操作,提升效率
  5. 禁止對索引字段使用函數(shù)、運(yùn)算符操作,會使索引失效
  6. 字符串字段和數(shù)字比較的時候會使索引無效
  7. 模糊查詢'%值%'會使索引無效,變?yōu)槿頀呙?,但?值%'這種可以有效利用索引
  8. 排序中盡量使用到索引字段,這樣可以減少排序,提升查詢效率

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    三级理论午夜福利在线看| 日韩国产欧美中文字幕| 久久国产青偷人人妻潘金莲| 日韩偷拍精品一区二区三区| 久久99夜色精品噜噜亚洲av| 亚洲日本中文字幕视频在线观看| 在线精品首页中文字幕亚洲| 风韵人妻丰满熟妇老熟女av| 日韩中文无线码在线视频| 国产不卡在线免费观看视频| 国产亚洲精品香蕉视频播放| 欧美一区二区三区十区| 99福利一区二区视频| 一区二区三区国产日韩| 国产午夜精品久久福利| 91欧美日韩国产在线观看 | 国产亚洲精品一二三区| 国产不卡视频一区在线| 午夜国产成人福利视频| 中文字幕禁断介一区二区| 国产精品久久熟女吞精| 亚洲午夜福利视频在线| 99少妇偷拍视频在线| 国产欧美亚洲精品自拍| 国产午夜福利在线免费观看| 国产麻豆一线二线三线| 国产精品内射视频免费| 精品人妻精品一区二区三区| 黄色片国产一区二区三区| 在线观看国产午夜福利| 欧美精品在线播放一区二区| 国产日本欧美特黄在线观看| 亚洲欧洲日韩综合二区| 扒开腿狂躁女人爽出白浆av| 国产一级内片内射免费看| 91人妻人人精品人人爽| 午夜午夜精品一区二区| 亚洲高清一区二区高清| 国产精品伦一区二区三区四季| 欧美一区二区三区喷汁尤物| 中文字幕欧美精品人妻一区|