安裝MySQL
linux安裝:阿里雲服務器ecs配置之安裝mysql
windows安裝: 解壓 管理員身份進cmd執行解壓目錄下的可執行文件 初始化 D:\mysql-8.0.12-winx64\mysql-8.0.12-winx64\bin\mysqld --initialize-insecure 運行服務端 D:\mysql-8.0.12-winx64\mysql-8.0.12-winx64\bin\mysqld 運行客戶端 D:\mysql-8.0.12-winx64\mysql-8.0.12-winx64\bin\mysql -u root -p 安裝windows服務: C:\Windows\system32>D:\mysql-8.0.12-winx64\mysql-8.0.12-winx64\bin\mysqld --install [--remove移除] 添加後能夠在windows的服務裏看到「MySQL」,管理員身份運行cmd,輸入net start/stop MySQL便可啓動
手動啓動能成功,自啓動的話,win10 下須要手動建data目錄my.ini文件,否則沒法啓動服務;可能你們狀況不一,請自行百度
數據庫相關操做
建立數據庫: create database 數據庫名稱 default charset utf8 collate utf8_general_ci; -- 設置默認編碼 刪除數據庫: drop database 數據庫名; drop database if exists 數據庫名稱; 查看數據庫: show databases; 使用數據庫: use db_name; -- 查看當前使用的數據庫中全部表:SHOW TABLES; # select database(); # 查看當前使用的是哪一個數據庫 # 表示的是當前使用的是哪一個數據庫或者說會話登陸到了哪一個數據庫中。
用戶相關操做
-- ip 填 % 表示全部的ip地址均可登錄 create user '用戶名'@'IP地址' identified by '密碼'; -- 建立用戶 drop user '用戶名'@'IP地址'; -- 刪除用戶 rename user '用戶名'@'IP地址' to '新用戶名'@'IP地址'; -- 修改用戶 set password for '用戶名'@'IP地址' = Password('新密碼'); -- 修改密碼 爲用戶受權: select host,user from mysql.user; -- 查看用戶 show grants for '用戶'@'IP地址'; -- 查看權限 grant all privileges on db.t to 'username'@'ip';-- 受權 -- all privileges表示除受權權限外擁有全部的權限,也可填select,delete (查權限和刪權限)等 -- db.t 表示對哪一個數據庫下的哪一個表有此權限,填*.*意味着擁有全部數據庫下的全部表的權限 -- 'username'@'ip' 用戶只能在該IP下才能訪問 # flush privileges 將數據讀取到內存中,從而當即生效。 取消受權:revoke update,delete on db.t1 from 'username'@'ip'; 若是忘記密碼: # 啓動免受權服務端 mysqld --skip-grant-tables # 客戶端 mysql -u root -p # 修改用戶名密碼 update mysql.user set authentication_string=password('666') where user='root'; flush privileges;
# 遠程數據庫
# mysql -h 192.168.3.233 -P 3306 -u root -p 123123
數據庫表相關操做
建立表: create table t1( -- 列名 類型 是否能夠爲空, id int auto_increment primary key, -- auto_increment 自增:若是爲某列設置自增列,插入數據時無需設置此列,默認將自增(表中只能有一個自增列) -- primary key 主鍵,不能爲空 nid int not null defalut 2, -- 默認值,建立列時能夠指定默認值,當插入數據時若是未主動設置,則自動添加默認值 name char(10) )engine=innodb default charset=utf8; -- 引擎、默認字符 主鍵:一種特殊的惟一索引,,若是主鍵使用單個列,則它的值必須惟一,若是是多列,則其組合必須惟一。 create table tb1( nid int not null, num int not null, primary key(nid,num) ) 外鍵: create table fruit( id int not null primary key, fk_id int not null, constraint fk_tb1 foreign key (fk_id) references tb1(nid) ) 刪除表: drop table 表名; drop table if exists 表名; 清空表: delete from 表名; -- 自增的id不重置 truncate table 表名; -- 自增的id重置 修改表: 添加列:alter table 表名 add 列名 類型; 刪除列:alter table 表名 drop column 列名; 修改列: alter table 表名 modify column 列名 類型; -- 類型 alter table 表名 change 原列名 新列名 類型; -- 列名,類型 添加主鍵: alter table 表名 add primary key(列名); 刪除主鍵: alter table 表名 drop primary key; alter table 表名 modify 列名 int, drop primary key; 添加外鍵:alter table 從表 add constraint 外鍵名稱(形如:FK_從表_主表) foreign key 從表(外鍵字段) references 主表(主鍵字段); 刪除外鍵:alter table 表名 drop foreign key 外鍵名稱 修改默認值:ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000; 刪除默認值:ALTER TABLE testalter_tbl ALTER i DROP DEFAULT; desc tabl_name; -- 顯示錶結構,字段類型,主鍵,是否爲空等屬性,但不顯示外鍵。 show create table table_name; -- 該命令把建立表的DDL顯示出來,因而表結構、類型,外鍵,備註所有顯示出來了。
索引:
# 建立表時 create table in1( nid int not null auto_increment primary key, -- 主鍵索引,兩個功能:加速查詢 和 惟一約束(不可含null) name varchar(32) not null, addr varchar(32) not null -- index ix_name (name) -- 普通索引,僅有一個功能:加速查詢 -- unique ix_name (name) -- 惟一索引,有兩個功能:加速查詢 和 惟一約束(可含null) -- primary key(nid) -- 也可在此建立主鍵索引 -- index ix_name_addr (name(10),addr(5)) -- 組合索引 ) # 表已建立 create index index_name on table_name(column_name);-- 建立普通索引 drop index index_name on table_name; -- 刪除普通索引 alter table 表名 add primary key(列名); -- 建立主鍵 alter table 表名 drop primary key; -- 刪除主鍵 alter table 表名 modify 列名 int, drop primary key; -- 刪除主鍵 create unique index 索引名 on 表名(列名); -- 建立惟一索引 drop unique index 索引名 on 表名; -- 刪除惟一索引 create index 索引名 on 表名(列名1,列名2); -- 建立組合索引 組合索引最左前綴,若是組合索引爲:(name,email) name and email -- 使用索引 name -- 使用索引 email -- 不使用索引 show index from table_name; -- 查看索引 不會使用索引的狀況: -- like '%xx' select * from tb1 where name like '%xx'; -- 使用函數 select * from tb1 where reverse(name) = 'xx'; -- or -- 當or條件中有未創建索引的列才失效 select * from tb1 where nid = 1 or age = 18; -- != -- 若是是主鍵,則仍是會走索引 select * from tb1 where name != 'xx' -- > -- 若是是主鍵或索引是整數類型,則仍是會走索引 select * from tb1 where name > 'alex' -- order by -- 若是對主鍵排序,則仍是走索引 select email from tb1 order by name desc; -- 當根據索引排序時候,選擇的映射若是不是索引,則不走索引 -- 組合索引最左前綴 若是組合索引爲:(name,email) name and email -- 使用索引 name -- 使用索引 email -- 不使用索引
字段:
bit[(M)] 二進制位(101001),m表示二進制位的長度(1-64),默認m=1 tinyint[(m)] [unsigned] [zerofill] 小整數,數據類型用於保存一些範圍的整數數值範圍: 有符號: -128 ~ 127. 無符號: ~ 255 特別的: MySQL中無布爾值,使用tinyint(1)構造。 int[(m)][unsigned][zerofill] 整數,數據類型用於保存一些範圍的整數數值範圍: 有符號: -2147483648 ~ 2147483647 無符號: ~ 4294967295 特別的:整數類型中的m僅用於顯示,對存儲範圍無限制。例如: int(5),當插入數據2時,select 時數據顯示爲: 00002 bigint[(m)][unsigned][zerofill] 大整數,數據類型用於保存一些範圍的整數數值範圍: 有符號: -9223372036854775808 ~ 9223372036854775807 無符號: ~ 18446744073709551615 decimal[(m[,d])] [unsigned] [zerofill] 準確的小數值,m是數字總個數(負號不算),d是小數點後個數。 m最大值爲65,d最大值爲30。 特別的:對於精確數值計算時須要用此類型 decaimal可以存儲精確值的緣由在於其內部按照字符串存儲。 FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] 單精度浮點數(非準確小數值),m是數字總個數,d是小數點後個數。 無符號: -3.402823466E+38 to -1.175494351E-38, 1.175494351E-38 to 3.402823466E+38 有符號: 1.175494351E-38 to 3.402823466E+38 **** 數值越大,越不許確 **** DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] 雙精度浮點數(非準確小數值),m是數字總個數,d是小數點後個數。 無符號: -1.7976931348623157E+308 to -2.2250738585072014E-308 2.2250738585072014E-308 to 1.7976931348623157E+308 有符號: 2.2250738585072014E-308 to 1.7976931348623157E+308 **** 數值越大,越不許確 **** char (m) char數據類型用於表示固定長度的字符串,能夠包含最多達255個字符。其中m表明字符串的長度。 PS: 即便數據小於m長度,也會佔用m長度 varchar(m) varchars數據類型用於變長的字符串,能夠包含最多達255個字符。其中m表明該數據類型所容許保存的字符串的最大長度,只要長度小於該最大值的字符串均可以被保存在該數據類型中。 注:雖然varchar使用起來較爲靈活,可是從整個系統的性能角度來講,char數據類型的處理速度更快,有時甚至能夠超出varchar處理速度的50%。所以,用戶在設計數據庫時應當綜合考慮各方面的因素,以求達到最佳的平衡 text text數據類型用於保存變長的大字符串,能夠組多到65535 (2**16 − 1)個字符。 mediumtext A TEXT column with a maximum length of 16,777,215 (2**24 − 1) characters. longtext A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 − 1) characters. enum 枚舉類型, An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.) 示例: CREATE TABLE shirts ( name VARCHAR(40), size ENUM('x-small', 'small', 'medium', 'large', 'x-large') ); INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small'); set 集合類型 A SET column can have a maximum of 64 distinct members. 示例: CREATE TABLE myset (col SET('a', 'b', 'c', 'd')); INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d'); DATE YYYY-MM-DD(1000-01-01/9999-12-31) TIME HH:MM:SS('-838:59:59'/'838:59:59') YEAR YYYY(1901/2155) DATETIME YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y) TIMESTAMP YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某時)
操做數據庫表的內容
# 補:=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- # 查詢時格式化時間 mysql> select date_format(create_time,'%Y-%m') from blog_article;
# MYSQL避免批量插入重複數據報錯的解決方案
insert ignore into ip_pool(proxy) values (666); # 只警告,跳過繼續執行sql
replace into ip_pool(proxy) values (666); # 更新,自增id會變
# 建立自動生成時間的列 和 修改時自動更新時間的列
CREATE TABLE temp (
id INT(11) PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(10),
created timestamp null DEFAULT CURRENT_TIMESTAMP,
updated timestamp null DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
INSERT INTO temp (id, name);
# 插入數據時,自動填寫建立時間和更新時間,修改時更新updated列的時間,created的不變 增: insert into 表名(列名,列名2) value(列1值,列2值); insert into 表 (列名,列名...) select (列名,列名...) from 表;
補充:insert into 表 values(列1值,列2值),(列1值,列2值),(列1值,列2值);
-- 主鍵自增,第一列在增長數據的時候,能夠寫爲0或者null,這樣添加數據能夠自增, 從而能夠添加所有數據,而不用特地規定那幾列添加數據。
刪: delete from 表; delete from 表 where id = 1 and name = 'xx'; 改: update 表 set name = 'xx' where id > 1; 查:
# 補:=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
select count(*) from table_name; -- 查詢表中有多少條數據
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
select * from 表; select * from 表 where id > 1; select nid,name,gender as gg from 表 where id > 1; 條件: select * from 表 where id > 1 and name != 'xx' and num = 12; select * from 表 where id between 5 and 16; select * from 表 where id in (11,22,33); select * from 表 where id not in (11,22,33); select * from 表 where id in (select nid from 表); 通配符: select * from 表 where name like 'a%'; -- 匹配a開頭的字符串 -- %匹配全部字符 select * from 表 where name like 'a_'; -- _匹配以a開頭和一個其餘字符的字符串 -- _一個佔位符 分頁: select * from 表 limit 5; -- 前5行 select * from 表 limit 4,5; -- 從第4行開始的5行 select * from 表 limit 5 offset 4; -- 從第4行開始的5行 排序: select * from 表 order by 列 asc; -- 根據 「列」 從小到大排列 select * from 表 order by 列 desc; -- 根據 「列」 從大到小排列 select * from 表 order by 列1 desc,列2 asc; -- 根據 「列1」 從大到小排列,若是相同則按列2從小到大排序 分組: select num from 表 group by num; select num,nid from 表 group by num,nid; select num,nid from 表 where nid > 10 group by num,nid order by nid desc; select num,nid,count(*),sum(score),max(score),min(score) from 表 group by num,nid; select num from 表 group by num having max(id) > 10; 注:group by 必須在where以後,order by以前,having對分組後的數據作篩選 臨時表: SELECT * FROM ( SELECT age, NAME FROM tb1 WHERE nid > 2 ) AS A WHERE A. age > 'xx'; 連表: select A.num, A.name, B.name from A,B Where A.nid = B.nid; -- 無對應關係則不顯示 select A.num, A.name, B.name from A -- inner join B -- 內鏈接,無對應關係則不顯示 -- left join B -- 左鏈接,以左表爲準,右表無值爲null -- right join B -- 右鏈接,以右表爲準,左表無值爲null on A.nid = B.nid; -- 按哪一個字段連表 組合,將數據揉到一塊兒: select nickname from A union -- 自動處理重合 union all -- 不處理重合 select name from B
備份
全量備份(數據+結構): #mysqldump -uroot -pmima -A > 備份文件路徑 指定庫備份(數據+潔構): #mysqldump -uroot -p密碼 庫名 > 備份文件路徑 多個庫備份(數據+結構): #mysqldump -uroot -p123456 --databases dbl db2 > 備份文件路徑 備份數據庫某個(些)表: #mysqldump -uroot -p123456 db table1 table2 > 備份文件路徑
還原
還原部分(1) mysql命令行source方法和(2)系統命令行方法 1、還原所有數據庫: (1) mysql命令行: mysql> source 備份交件路徑 (2) 系統命令行: #mysql -uroot -p123456 < 備份文件路徑 2、還原單個數據庫(需指定數據庫) (1) mysql> use 庫名 mysql> source 備份文件路徑 (2) mysql -uroot -p123456 庫名 < 備份文件路徑
視圖
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
視圖是一個虛擬表(非真實存在),可將其看成表來使用。應用:屢次查詢某個複雜查詢的結果集 建立視圖: --格式:CREATE VIEW 視圖名稱 AS SQL語句 CREATE VIEW v1 AS SELET nid, name FROM A WHERE nid > 4 刪除視圖: --格式:DROP VIEW 視圖名稱 DROP VIEW v1; 修改視圖: -- 格式:ALTER VIEW 視圖名稱 AS SQL語句 ALTER VIEW v1 AS SELET A.nid, B. NAME FROM A LEFT JOIN B ON A.id = B.nid LEFT JOIN C ON A.id = C.nid WHERE A.id > 2 AND C.nid < 5 使用視圖: 使用視圖時,將其看成表進行操做便可,因爲視圖是虛擬表,因此沒法使用其對真實表進行建立、更新和刪除操做,僅能作查詢用。 select * from v1
事務
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
事務 # 事務用來管理insert,update,delete語句 # 使用Innodb數據庫引擎,保證SQL語句要麼所有執行,要麼所有不執行,要麼成功,要麼撤回。 # 事務是必須知足4個條件: 1、事務的原子性:一組事務,要麼成功;要麼撤回。 2、穩定性: 有非法數據(外鍵約束之類),事務撤回。 三、隔離性:事務獨立運行。一個事務處理後的結果,影響了其餘事務,那麼其餘事務會撤回。事務的100%隔離,須要犧牲速度。 4、可靠性:軟、硬件崩潰後,InnoDB數據表驅動會利用日誌文件重構修改。 # 在Mysql控制檯使用事務來操做 mysql> begin; # 開始一個事務 mysql> insert into a(age) values(18); mysql> rollback; # 回滾,這樣數據是不會寫入的 mysql> commit; # 若是數據沒問題,輸入commit提交命令