MYSQL資料庫常用命令
阿新 • • 發佈:2018-12-18
MySQL是一個關係型資料庫管理系統,由瑞典MySQL AB 公司開發,目前屬於 Oracle 旗下產品。MySQL 最流行的關係型資料庫管理系統,在 WEB 應用方面MySQL是最好的 RDBMS (Relational Database Management System,關係資料庫管理系統) 應用軟體之一。MySQL是一種關聯資料庫管理系統,關聯資料庫將資料儲存在不同的表中,而不是將所有資料放在一個大倉庫內,這樣就增加了速度並提高了靈活性。MySQL所使用的 SQL 語言是用於訪問資料庫的最常用標準化語言。MySQL 軟體採用了雙授權政策,它分為社群版和商業版,其體積小、速度快、總體擁有成本低,並且開源。 **資料庫:** 資料庫是一些關聯表的集合。. **資料表:** 表是資料的矩陣。在一個數據庫中的表看起來像一個簡單的電子表格。 **列:** 一列(資料元素) 包含了相同的資料, 例如郵政編碼的資料。 **行:**一行(=元組,或記錄)是一組相關的資料,例如一條使用者訂閱的資料。 **冗餘:**儲存兩倍資料,冗餘可以使系統速度更快。 **主鍵**:主鍵是唯一的。一個數據表中只能包含一個主鍵。你可以使用主鍵來查詢資料。 **外來鍵:**外來鍵用於關聯兩個表。 **複合鍵:**複合鍵(組合鍵)將多個列作為一個索引鍵,一般用於複合索引。 **索引:**使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構。類似於書籍的目錄。 **參照完整性:** 參照的完整性要求關係中不允許引用不存在的實體。與實體完整性是關係模型必須滿足的完整性約束條件,目的是保證資料的一致性。 **資料庫字母不區分大小寫** **建立資料庫:** ----- create database 資料庫名稱; **檢視資料庫編碼格式:** ----- \s; **指定字符集:**----- create database library character set utf8/gbk;(資料庫的指定) **刪除資料庫:** ----- drop database 資料庫名; **查詢資料庫詳情:** ----- show create database 資料庫名;; **查詢所有資料庫:** ----- show databases; **刪除資料庫:** ----- drop database 資料庫名;; **使用指定資料庫:** ----- use 資料庫名 **建立表:** ----- create table 表名(欄位1名 欄位1型別, 欄位2名 欄位2型別....)default charset=utf8;(表的指定) **主健約束:** ----- create table 表名(欄位 型別 primary key); ------create table emp(id int primary key) id int primary key 和 primary key (id)有什麼區別:在建立的過程中,如果只是一張表,那這兩個就沒什麼區別,如果多表,且有表的主鍵是多個,那就會用到你後面的這種,比如 primary key (s_id,c_id) **插入表資訊:** ----- insert into tb(引數)values(值)如下: ----- create table tb(username varchar(10))values("張三"),("李斯"); **查看錶的資訊:** ----- show create table 表名; **查看錶欄位:** ----- desc 表名; **刪除表:** ----- drop table 表名; **修改表名:** ----- rename table 表名1 to 表名2; **修改引擎字符集:**----- alter table 表名 engine=myisam/innodb charset=gbk/utf8; Innodb支援事務和行級鎖(如需同步提交修改 採用Innodb 反之使用myisam,myisam為預設) **檢視資料庫自動提交的狀態:** show variables like '%autocommit%'; ------關閉和開啟自動提交 0:關閉 1:開啟 ------set autocommit=0; **最後新增:** ----- alter table 表名 add 欄位名 型別; **最前新增:** ----- alter table 表名 add 欄位名 型別 first; **某個欄位後面新增:** ----- alter table 表名 add 欄位名 型別 after xxx; **刪除表字段:** ----- alter table 表名 drop 欄位名; **修改表字段名稱和型別:** ----- alter table 表名 change 原欄位名 新欄位名 新型別; **修改欄位型別和位置:** ----- alter table 表名 modify 欄位名 型別 first/(after xxx); alter table tb1 modify english int after chinese; **查詢資料:** ----- select * from 表名; **註釋 comment:** ----- create table 表名(id int primary key auto_increment comment '這是id表示唯一性', name varchar(10) comment '這是名字', sal int comment '這是工資'); ** ` 和 ' :** ----- -`-是用來修飾表名和欄位名的 可以省略- ' -是用來修飾字符串的 **SQL分類:** ----- 1. DDL:Data Definition Language 資料定義語言,包括:create,alter,drop,truncate。不支援事務 2. DML:Data Manipulation Language 資料操作語言,包括:insert delete update 和 select(DQL)。支援事務 3. DQL:Data Query Language 資料查詢語言,只有select 4. TCL:Transaction Control Language 事務控制語言,包括:commit,rollback,savepoint,rollback to xxx; 5. DCL:Data Control Language 資料控制語言,分配使用者許可權相關的SQL **刪除表並建立新表:** ----- truncate table 表名; **truncate、drop、delete區別:** drop只是刪除表,truncate是刪除表並建立一個空表,delete只是刪除資料自增數值不會清零 **日期型別:** ----- - date: 儲存年月日 - time: 儲存時分秒 - datetime: 儲存年月日時分秒 預設值為null,最大值9999-12-31 - timestamp(時間戳):儲存年月日時分秒 預設值為當前時間,最大值2038-1-19 - create table t_date(d1 date,d2 time,d3 datetime,d4 timestamp); - insert into t_date values('2018-03-18',null,null,null); - insert into t_date values(null,'17:23:18','2018-05-15 12:18:33',null); **is null:** ----- 表示為空 select empno,ename,sal from emp where mgr is null; **is not null:** 表示不能為空 ----- select * from emp where comm is not null; “is null”用來判斷運算元是否為空值(null)。運算元為null時,結果返回1;否則,返回0。is not null剛好與is null相反。 **運算子:** ----- +加,-減,*乘,/除,%求餘,== 等,<=> 安全的等於,<>(!=) 不等於,<= 小於等於,>= 大於等於,>大於.... **去重:** ----- distinct 用在查詢語句 create xxx from 表名的xxx條件前 **and 和 or:** ----- and和java中的 &&效果一樣,or 和java中的|| 效果一樣 多個的話可以用in代替 舉例:select * from 表名 where 部門=10 and 薪水>3000; **between x and y:** ----- select * from 表名 where 位元組 between 2000 and 4000; **模糊查詢 like:** ----- _: 代表單個未知字元 %:代表0或多個未知字元 舉例: 6. 名字以a開頭 ename like 'a%' 7. 以a結尾 %a 8. 包含a %a% 9. 第二個字母是a _a% 10. 倒數第三個字元是a %a__ 11. 第二個字母是a最後字母是b _a%b **order by:** ----- 如果有條件寫在條件的後面 沒條件寫在 表名的後面,預設是升序 desc降序 asc升序。 舉例:select 位元組 from 表名 order by 位元組 desc; order by 和 group by區別:oeder by按照一定的條件 升序或者降序 而group by是分組 顯示第二頁 每頁7條資料 **分頁查詢:** ----- 第一個引數代表跳過的條數 - 第二個引數代表每頁的數量 select * from 表名 位元組 limit 7,7; **聚合函式:** ----- 求和(sum),平均值(avg)最大值(max)最小值(min)統計數量(count)該欄位用在select()from之間 **字串的拼接:** ----- select concat(欄位,'元') from 表名; **字串的長度:** ----- select 欄位,char_length(欄位) from 表名; **獲取字串在另一個字串出現的位置 從1開始:** ----- 1-格式: instr(str,substr): select instr('abcdefg','d'); 4 ----- 2-格式: locate(substr,str); select locate('d','abcdefg'); 4 **轉大寫轉小寫:** ----- select upper('abc'),lower('NBA'); ABC nba **去空白:** ----- select trim(' a b '); a b只能去除兩頭的空白 **字串擷取:** ----- left()、right()、substring()、substring_index() 從左開始擷取字串 用法:left(str, length),即:left(被擷取字串, 擷取長度) SELECT LEFT('www.baidu.com',9) 結果為:www.baidu 從右開始擷取字串 用法:right(str, length),即:right(被擷取字串, 擷取長度) SELECT RIGHT('www.baidu.com',9) 結果為:baidu.com **擷取特定長度的字串:** ----- substring(str, pos),即:substring(被擷取字串, 從第幾位開始擷取)。substring(str, pos, length),即:substring(被擷取字串,從第幾位開始擷取,擷取長度) 1.從字串的第9個字元開始讀取直至結束 SELECT substring('www.xingzhexi.com', 9) 結果為:zhexi.com 2.從字串的第9個字元開始,只取3個字元 SELECT substring('www.xingzhexi.com', 9, 3) 結果為:zhe 3.從字串的倒數第6個字元開始讀取直至結束 SELECT substring('www.xingzhexi.com', -6) 結果為:xi.com 4.從字串的倒數第6個字元開始讀取,只取2個字元 SELECT substring('www.xingzhexi.com', -6, 2) 結果為:xi **反轉:** -----select reverse('abc'); ### cba **替換:** ----- select replace('abcdefg','de','mm'); abcdefg中的de替換成了mm 效果是abcmmfg **迴圈:** ----- select repeat('',2); **向下取整:** ----- select floor(3.84); 3 **四捨五入:** ----- select round(23.8); 24。另外一種四捨五入 round(num,m) m代表小數位數 **非四捨五入:** ----- select truncate(23.879,2); 23.87。 truncate(num,m) m代表小數位數 **rand() 隨機數:** ----- 0-1隨機數 ,select floor(rand()*9);------select floor(rand()*3)+3; 3-5 隨機數 **having:** ----- 普通欄位的條件寫在where後面,聚合函式的條件寫在having後面 **關聯查詢:** ----- select e.欄位,d.欄位 from 表名 e,表名 d where e.欄位=d.欄位; **笛卡爾積:** ----- 如果關聯查詢不寫關聯關係則查詢到的資料是兩張表的乘積,這個乘積稱為笛卡爾積,笛卡爾積是一種錯誤查詢方式的結果,工作中切記不要出現 **等值連線和內連線:** ----- 1. 等值連線:select * from A,B where A.x=B.x and A.age=18; ----- 2. 內連線: select * from A join B on A.x=B.x where A.age=18; **mysql左連線、右連線、內連線(等值連線)、全連線:** ----- 1.準備表、資料 create table a(id int, nameA varchar(16)); insert into a values(1,'a1'); insert into a values(2,'a2'); create table b(id int, nameB varchar(16)); insert into b values(1,'b1'); insert into b values(3,'b3'); 2.內連線、外連線 2.1內連線 ---------------------------------------------------------- SELECT * from a inner JOIN b on a.id = b.id; --內連線 1 a1 1 b1 SELECT * from a, b where a.id = b.id; --等值連線 = 內連線 1 a1 1 b1 2.2左連線 ---------------------------------------------------------- SELECT * from a left JOIN b on a.id = b.id; --左連線 1 a1 1 b1 2 a2 null null 2.3右連線 ---------------------------------------------------------- SELECT * from a right JOIN b on a.id = b.id; --右連線 1 a1 1 b1 null null 3 b3 2.4全連線 ---------------------------------------------------------- SELECT * from a full JOIN b; --全連線 1 a1 1 b1 2 a2 1 b1 1 a1 3 b3 2 a2 3 b3 這幾種連線的區別,大體可以理解為: 左連線以左邊為基準,右邊可能有空值; 右連線以右邊為基準,左邊可能有空值; 內連線則保證沒有空值,不對應的就不顯示了。 **巢狀查詢:** ----- select 欄位1 from 表名 where sal=(select 欄位2 from 表名); **關聯關係之表設計:** ------ 外來鍵: 用來建立關係的欄位稱為外來鍵 ------ 主鍵: 用來表示資料唯一性的欄位稱為主鍵 **關聯關係之表設計之一對一:** ----- 案例 - 有AB兩張表,A表中的一條資料對應B表中的一條資料同時B表一條對應A表一條,這種關係稱為一對一 - 應用場景:商品表和商品詳情表, - 如何建立關係: 在從表中新增外來鍵,外來鍵的值指向主表的主鍵 - 練習:請設計表儲存以下資料 - 1. 使用者名稱:wukong 密碼:123456 暱稱:齊天大聖 電話:13733666633 地址:花果山 - 2. 使用者名稱:bajie 密碼:abcd 暱稱:二師兄 電話:13833446622 地址:高老莊 - 3. 使用者名稱:libai 密碼:aabbcc 暱稱:李白 電話:13355668877 地址:語文書裡 create table user(id int primary key auto_increment,username varchar(10),password varchar(10)); create table userinfo(userid int,nick varchar(10),tel varchar(15),address varchar(20)); insert into user values(null,'wukong','123456'),(null,'bajie','bacd'),(null,'libai','aabbcc'); insert into userinfo values(1,'齊天大聖','13833446622','花果山'),(2,'二師兄','13833446622','高老莊'),(3,'李白','13833446622','語文書裡'); 完成以下查詢: 1. 查詢李白的使用者名稱和密碼是什麼 select u.username,u.password from user u join userinfo ui on u.id=ui.userid where ui.nick='李白'; 12. 查詢每一個使用者的所有資訊 select * from user u join userinfo ui on u.id=ui.userid; 13. 查詢使用者名稱bajie 的暱稱是什麼 select ui.nick from user u join userinfo ui on u.id=ui.userid where u.username='bajie'; **關聯關係之表設計之一對多:** ----- 案例 - AB兩張表,A表中一條資料對應B表中多條資料同時B表中一條資料對應A表中多條,稱為多對多 - 應用場景: 老師-學生 使用者-角色 - 如何建立關係:需要建立新的關係表,表中新增兩個外來鍵,指向兩個主表的主鍵 - 練習:建立表儲存以下資料 - 1. 唐僧的學生有:悟空,傳奇哥 - 2. 蒼老師的學生有: 傳奇哥,克晶姐2. 蒼老師的學生有: 傳奇哥,克晶姐 create table teacher(id int primary key auto_increment,name varchar(10)); create table student(id int primary key auto_increment,name varchar(10)); create table t_s(tid int,sid int); insert into teacher values(null,'唐僧'),(null,'蒼老師'); insert into student values(null,'悟空'),(null,'傳奇哥'),(null,'克晶姐'); insert into t_s values(1,1),(1,2),(2,2),(2,3); - 查詢蒼老師的學生姓名 select s.name from teacher t join t_s ts on t.id=ts.tid join student s on ts.sid=s.id where t.name='蒼老師'; - 查詢傳奇哥的老師姓名 select t.name from teacher t join t_s ts on t.id=ts.tid join student s on ts.sid=s.id where s.name='傳奇哥' **表設計之許可權管理案例:** ----- 案例 - 建立三張主表user(id,name) role(id,name) module(id,name) 和兩張關係表 u_r(uid,rid)(使用者和角色) r_m(rid,mid)(角色和許可權) create table user(id int primary key auto_increment,name varchar(10)); create table role(id int primary key auto_increment,name varchar(10)); create table module(id int primary key auto_increment,name varchar(10)); create table u_r(uid int,rid int); create table r_m(rid int,mid int); - 儲存以下資料: - 使用者表:劉德華,貂蟬 insert into user values(null,'劉德華'),(null,'貂蟬'); 角色表:男遊客,男管理員,女遊客,女會員 insert into role values(null,'男遊客'),(null,'男管理員'),(null,'女遊客'),(null,'女會員'); 許可權表:男瀏覽,男發帖,男刪帖,女瀏覽,女發帖 insert into module values(null,'男瀏覽'),(null,'男發帖'),(null,'男刪帖'),(null,'女瀏覽'),(null,'女發帖'); 關係:男遊客->男瀏覽;男管理員->男瀏覽,男發帖,男刪帖;女遊客-》女瀏覽;女會員-》女瀏覽,女發帖 劉德華-》男管理員和女遊客 貂蟬-》女會員和男遊客 insert into r_m values(1,1),(2,1),(2,2),(2,3),(3,4),(4,4),(4,5); insert into u_r values(1,2),(1,3),(2,4),(2,1); - 練習: - 3. 查詢每個使用者對應的所有許可權 select u.name,m.name from user u join u_r ur on u.id=ur.uid join r_m rm on ur.rid=rm.rid join module m on rm.mid=m.id; 14. 查詢劉德華的所有許可權 select m.name from user u join u_r ur on u.id=ur.uid join r_m rm on ur.rid=rm.rid join module m on rm.mid=m.id where u.name='劉德華'; 15. 查詢擁有男瀏覽許可權的使用者都是誰 select u.name from user u join u_r ur on u.id=ur.uid join r_m rm on ur.rid=rm.rid join module m on rm.mid=m.id where m.name='男瀏覽'; **約束:** ----- 約束就是給表字段新增限制條件 **非空約束 not null:** ----- 欄位的值不能為null-----案例 create table t1(id int,age int not null); -測試: insert into t1 values(1,20);//成功 insert into t1 values(2,null);//失敗 **#唯一約束 unique:** ----- 欄位的值不能重複------ 案例 create table t2(id int,age int unique); -測試: insert into t2 values(1,20);//成功 insert into t2 values(1,20);//失敗 **主鍵約束 primary key:** ----- 欄位的值唯一且非空 一般用於在建立表字段的時候 要讓id唯一 那麼我們會採用 primary key主健來約束id,上面有寫到 不清楚格式的翻倒上面檢視下copy此欄位查詢(primary key) **預設約束default:** ----- 給欄位設定預設值 ------ 案例 create table t3(id int,age int default 20); -測試: insert into t3 (id) values (1);//預設值生效 insert into t3 values (2,30); **外來鍵約束:** ----- 外來鍵:用來建立關係的欄位稱為外來鍵 外來鍵約束:新增外來鍵約束的欄位,值可以為null,可以重複,但是不能是關聯表中不存在的資料,外來鍵指向的資料不能先刪除,外來鍵指向的表不能先刪除 案例: 1. 建立部門表 create table dept(id int primary key auto_increment,name varchar(10)); 16. 建立員工表 create table emp(id int primary key auto_increment,name varchar(10),deptid int,constraint fk_dept foreign key(deptid) references dept(id)); -格式介紹:constraint 約束名稱 foreign key(外來鍵欄位名) references 表名(欄位名) -插入資料: insert into dept values(null,'神仙'),(null,'妖怪'); -測試: insert into emp values(null,'悟空',1);//成功 insert into emp values(null,'賽亞人',3);//失敗 delete from dept where id=1;//失敗 drop table dept;//失敗 drop table emp;//成功 工作中除非特定場景一般不是用外來鍵約束,因為新增約束後會影響測試效率,一般通過程式碼建立邏輯外來鍵。 **索引:** ----- 索引是資料庫中用來提高查詢效率的技術,類似於目錄 **為什麼使用索引:** ----- 如果不使用索引,資料會零散的儲存在磁碟塊中,查詢資料需要挨個遍歷每一個磁碟塊,直到找到資料為止,使用索引後會將磁碟塊以樹狀結構儲存,查詢資料時會大大降低訪問的磁碟塊數量,從而提高查詢效率。 **建立索引:** ----- create index 索引名 on 表名(欄位(字元長度));*name varchar(10)* create index index_item_title on item2(title); select * from item2 where title='100'; //耗時0.02秒 **檢視索引:** ----- 只要是給表新增主鍵約束,則資料庫會為此表自動建立主鍵欄位的索引。表示式: show index from item2; **刪除索引:** ----- drop index 索引名 on 表名; 表示式:create index index_item_title_price on item2(title,price); 索引總結: 17. 索引是用來提高查詢效率的技術,類似於目錄 18. 因為索引會佔用磁碟空間所以不是越多越好 2. 因為索引會佔用磁碟空間所以不是越多越好 19. 因為資料量小的表建立索引會降低查詢效率所以不是有索引就一定好3. 因為資料量小的表建立索引會降低查詢效率所以不是有索引就一定好 **事務:** ----- 資料庫中執行SQL語句的工作單元,保證全部成功或全部失敗 事務的ACID特性 - Atomicity: 原子性, 最小不可拆分 全部成功全部失敗 - Consistency: 一致性, 從一個一致狀態到另外一個一致狀態 - Isolation: 隔離性, 多個事務之間互不影響 - Durability:永續性,事務完成後資料提交到資料庫持久儲存 **事務操作命令:** ----- 在預設情況下MySQL開啟的是autocommit模式,也就是隱含的將每條語句當做一個事務處理,每條SQL都會被自動提交。當我們使用BEGIN或者START TRANSCATION時會把自動提交掛起,直到顯示的呼叫COMMIT。使用事務可以有如下兩種方法: BEGIN; //開始事務,掛起自動提交 insert into t_cart_shopcart (user_id, sku_id, amount, shop_id, status) values(10001, 10001, 1, 10001, 0); insert into t_cart_shopcart (user_id, sku_id, amount, shop_id, status) values(10001, 10002, 1, 10001, 0); COMMIT; //提交事務,恢復自動提交 set autocommit = 0; //掛起自動提交 insert into t_cart_shopcart (user_id, sku_id, amount, shop_id, status) values(10001, 10001, 1, 10001, 0); insert into t_cart_shopcart (user_id, sku_id, amount, shop_id, status) values(10001, 10002, 1, 10001, 0); COMMIT; //提交事務 set autocommit = 1; //恢復自動提交 1. 檢視自動提交狀態show variables like '%autocommit%'; 2. 修改狀態 set autocommit=0/1; 3. 提交 commit; 4. 回滾 rollback; 5. 儲存回滾點 savepoint s1; 6. 回滾到某個回滾點 rollback to s1; **group_concat():** ----- select deptno,group_concat(ename,'-',sal) from emp group by deptno; **後續更新....** -----