停止命令:net stop mysql
啟動(dòng)命令: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ī)范
-
不區(qū)分大小寫,但建議關(guān)鍵字大寫,表名、列名小寫
-
每條命令最好用英文分號(hào)結(jié)尾
-
每條命令根據(jù)需要,可以進(jìn)行縮進(jìn)或換行
-
注釋
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ā)中,我們會(huì)碰到有些定義整型的寫法是int(11),這種寫法個(gè)人感覺在開發(fā)過程中沒有什么用途,不過還是來說一下,int(N)我們只需要記住兩點(diǎn):
decimal采用的是四舍五入
float和double采用的是四舍六入五成雙
什么是四舍六入五成雙?
就是5以下舍棄5以上進(jìn)位,如果需要處理數(shù)字為5的時(shí)候,需要看5后面是否還有不為0的任何數(shù)字,如果有,則直接進(jìn)位,如果沒有,需要看5前面的數(shù)字,若是奇數(shù)則進(jìn)位,若是偶數(shù)則將5舍掉
char類型占用固定長度,如果存放的數(shù)據(jù)為固定長度的建議使用char類型,如:手機(jī)號(hào)碼、身份證等固定長度的信息
數(shù)據(jù)類型選擇的一些建議
-
選小不選大:一般情況下選擇可以正確存儲(chǔ)數(shù)據(jù)的最小數(shù)據(jù)類型,越小的數(shù)據(jù)類型通常更快,占用磁盤,內(nèi)存和CPU緩存更小。
-
簡單就好:簡單的數(shù)據(jù)類型的操作通常需要更少的CPU周期,例如:整型比字符操作代價(jià)要小得多,因?yàn)樽址托?duì)規(guī)則(排序規(guī)則)使字符比整型比較更加復(fù)雜。
-
盡量避免NULL:盡量制定列為NOT NULL,除非真的需要NULL類型的值,有NULL的列值會(huì)使得索引、索引統(tǒng)計(jì)和值比較更加復(fù)雜。
-
浮點(diǎn)類型的建議統(tǒng)一選擇decimal
-
記錄時(shí)間的建議使用int或者bigint類型,將時(shí)間轉(zhuǎn)換為時(shí)間戳格式,如將時(shí)間轉(zhuǎn)換為秒、毫秒,進(jìn)行存儲(chǔ),方便走索引
權(quán)限生效時(shí)間
用戶及權(quán)限信息放在庫名為mysql的庫中,mysql啟動(dòng)時(shí),這些內(nèi)容被讀進(jìn)內(nèi)存并且從此時(shí)生效,所以如果通過直接操作這些表來修改用戶及權(quán)限信息的,需要重啟mysql或者執(zhí)行flush privileges;才可以生效。
用戶登錄之后,mysql會(huì)和當(dāng)前用戶之間創(chuàng)建一個(gè)連接,此時(shí)用戶相關(guān)的權(quán)限信息都保存在這個(gè)連接中,存放在內(nèi)存中,此時(shí)如果有其他地方修改了當(dāng)前用戶的權(quán)限,這些變更的權(quán)限會(huì)在下一次登錄時(shí)才會(huì)生效。
創(chuàng)建用戶
語法:
create user 用戶名[@主機(jī)名] [identified by '密碼'];
說明:
-
主機(jī)名默認(rèn)值為%,表示這個(gè)用戶可以從任何主機(jī)連接mysql服務(wù)器
-
密碼可以省略,表示無密碼登錄
通過修改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)限,多個(gè)權(quán)限之間用逗號(hào)分開。
-
ON 用來指定權(quán)限針對(duì)哪些庫和表,格式為數(shù)據(jù)庫.表名 ,點(diǎn)號(hào)前面用來指定數(shù)據(jù)庫名,點(diǎn)號(hào)后面用來指定表名,*.* 表示所有數(shù)據(jù)庫所有表。
-
TO 表示將權(quán)限賦予某個(gè)用戶, 格式為username@host,@前面為用戶名,@后面接限制的主機(jī),可以是IP、IP段、域名以及%,%表示任何地方。
-
WITH GRANT OPTION 這個(gè)選項(xiàng)表示該用戶可以將自己擁有的權(quán)限授權(quán)給別人。注意:經(jīng)常有人在創(chuàng)建操作用戶的時(shí)候不指定WITH GRANT OPTION選項(xiàng)導(dǎo)致后來該用戶不能使用GRANT命令創(chuàng)建用戶或者給其它用戶授權(quán)。
備注:可以使用GRANT重復(fù)給用戶添加權(quán)限,權(quán)限疊加,比如你先給用戶添加一個(gè)select權(quán)限,然后又給用戶添加一個(gè)insert權(quán)限,那么該用戶就同時(shí)擁有了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)建用戶的時(shí)候限制用戶的登錄主機(jī),一般是限制成指定IP或者內(nèi)網(wǎng)IP段
-
初始化數(shù)據(jù)庫的時(shí)候刪除沒有密碼的用戶,安裝完數(shù)據(jù)庫的時(shí)候會(huì)自動(dòng)創(chuàng)建一些用戶,這些用戶默認(rèn)沒有密碼
-
為每個(gè)用戶設(shè)置滿足密碼復(fù)雜度的密碼
-
定期清理不需要的用戶,回收權(quán)限或者刪除用戶
總結(jié)
-
通過命令的方式操作用戶和權(quán)限不需要刷新,下次登錄自動(dòng)生效
-
通過操作mysql庫中表的方式修改、用戶信息,需要調(diào)用flush privileges;刷新一下,下次登錄自動(dòng)生效
-
mysql識(shí)別用戶身份的方式是:用戶名+主機(jī)
-
本文中講到的一些指令中帶主機(jī)的,主機(jī)都可以省略,默認(rèn)值為%,表示所有機(jī)器
-
mysql中用戶和權(quán)限的信息在庫名為mysql的庫中
修改列
alter table 表名 modify column 列名 新類型 [約束];
或者
alter table 表名 change column 列名 新列名 新類型 [約束];
2種方式區(qū)別:modify不能修改列名,change可以修改列名
delete單表刪除
delete [別名] from 表名 [[as] 別名] [where條件];
注意:
如果無別名的時(shí)候,表名就是別名
如果有別名,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;
多表刪除
可以同時(shí)刪除多個(gè)表中的記錄,語法如下:
delete [別名1,別名2] from 表1 [[as] 別名1],表2 [[as] 別名2] [where條件];
說明:
別名可以省略不寫,但是需要在delete后面跟上表名,多個(gè)表名之間用逗號(hào)隔開。
示例1
delete t1 from test1 t1,test2 t2 where t1.a=t2.c2;
刪除test1表中的記錄,條件是這些記錄的字段a在test.c2中存在的記錄
-
drop (刪除表):刪除內(nèi)容和定義,釋放空間,簡單來說就是把整個(gè)表去掉,以后要新增數(shù)據(jù)是不可能的,除非新增一個(gè)表。
drop語句將刪除表的結(jié)構(gòu)被依賴的約束(constrain),觸發(fā)器(trigger)索引(index),依賴于該表的存儲(chǔ)過程/函數(shù)將被保留,但其狀態(tài)會(huì)變?yōu)椋篿nvalid。
如果要?jiǎng)h除表定義及其數(shù)據(jù),請(qǐng)使用 drop table 語句。
-
truncate (清空表中的數(shù)據(jù)):刪除內(nèi)容、釋放空間但不刪除定義(保留表的數(shù)據(jù)結(jié)構(gòu)),與drop不同的是,只是清空表數(shù)據(jù)而已。
注意:truncate不能刪除具體行數(shù)據(jù),要?jiǎng)h就要把整個(gè)表清空了。
-
delete (刪除表中的數(shù)據(jù)):delete 語句用于刪除表中的行。delete語句執(zhí)行刪除的過程是每次從表中刪除一行,并且同時(shí)將該行的刪除操作作為事務(wù)記錄在日志中保存,以便進(jìn)行進(jìn)行回滾操作。
truncate與不帶where的delete :只刪除數(shù)據(jù),而不刪除表的結(jié)構(gòu)(定義)
truncate table 刪除表中的所有行,但表結(jié)構(gòu)及其列、約束、索引等保持不變。
對(duì)于由foreign key約束引用的表,不能使用truncate table ,而應(yīng)使用不帶where子句的delete語句。由于truncate table 記錄在日志中,所以它不能激活觸發(fā)器。
delete語句是數(shù)據(jù)庫操作語言(dml),這個(gè)操作會(huì)放到 rollback segement 中,事務(wù)提交之后才生效;如果有相應(yīng)的 trigger,執(zhí)行的時(shí)候?qū)⒈挥|發(fā)。
truncate、drop 是數(shù)據(jù)庫定義語言(ddl),操作立即生效,原數(shù)據(jù)不放到 rollback segment 中,不能回滾,操作不觸發(fā) trigger。
如果有自增列,truncate方式刪除之后,自增列的值會(huì)被初始化,delete方式要分情況(如果數(shù)據(jù)庫被重啟了,自增列值也會(huì)被初始化,數(shù)據(jù)庫未被重啟,則不變)
-
如果要?jiǎng)h除表定義及其數(shù)據(jù),請(qǐng)使用 drop table 語句
-
安全性:小心使用 drop 和 truncate,尤其沒有備份的時(shí)候,否則哭都來不及
-
刪除速度,一般來說: drop> truncate > delete