为你整理了一份 Mysql 的学习笔记,建议收藏学习!
作者 |?陳熹
責編 | Carol
來源 |?早起Python
SQL是一個存活近半個世紀的語言,如今仍有大量人在使用。它語法簡單,對培養數據整理和提取的思維有很大幫助。我將我過去的筆記分享給大家,希望能為大家的學習提供參考,更希望有人因此能邁出學習SQL的第一步~
既然是筆記,就省去了很多介紹性定義,一切都在代碼在注釋中!這一萬字符的筆記中包含了SQL中的全部常用操作,可以邊看邊敲也可以收藏當成速查手冊隨用隨查!
1、連接Mysql
mysql?-h$ip?-P$port?-u$user?-p net?start?mysql?#?或?mysql.server?start mysql?-u?root?-p? mysql?-u?user?-p?db_name?#?直接進入指定數據庫2、導入導出
導出現有數據庫數據: mysqldump?-u用戶名?-p密碼?數據庫名稱?>導出文件路徑???????????#?結構+數據 mysqldump?-u用戶名?-p密碼?-d?數據庫名稱?>導出文件路徑???????#?結構? 導入現有數據庫數據: mysqldump?-uroot?-p密碼??數據庫名稱?<導入文件路徑3、數據庫操作
SELECT?version(),?current_date,?now();?#?查看mysql版本號和日期、時間 SELECT?version();?select?now();?select?current_date;?#?分開寫則表格分開SOURCE?c://test.sql?#?用txt文件保存命令該后綴名?可直接執行文件內的命令 \c?#?撤銷先前輸入? \G?#?按行輸出 SHOW?DATABASES;?#?查看所有數據庫 SELECT?DATABASE();?#?進入數據庫后查看當前數據庫 #?數據庫名稱組成除了三大項還可以含$,但不能是純數字 CREATE?DATABASE?db_name;?#?創建spiders數據庫 CREATE?DATABASE?db_name?DEFAULT?CHARSET?utf8?COLLATE?utf8_general_ci;? #?安裝utf8規則排序 #?utf8mb4支持墨跡表情 USE?db_name;?#?進入數據庫 ALTER?DATABASE?db_name?DEFAULT?CHARSET?SET?utf8;??#?修改數據庫DROP?DATABASE?db_name;?#?刪除數據庫DROP?VARIABLES?LIKE?'datadir';?#?查看數據庫所在位置 SHOW?TABLES;?#?查看所有表 DESCRIBE?db_name;?#?查看表的描述,也可以用?DESC?table; SELECT?*?FROM?db_name;?#?查看表中所有數據 SELECT?host,user?FROM?db_name;?#?大小寫不敏感 INSERT?INTO?person(name,birth)?VALUES('A',1994-01-01);?#?VALUE也可4、表操作:創建表
CREATE?TABLE?students(nid?INT?NOT?NULL?AUTO_INCREMENT?PRIMARY?KEY,??#?自增列必須是索引,最好是主鍵name?VARCHAR(20),num?INT?NOT?NULL?DEFAULT?2)ENGINE=InnoDB?DEFAULT?CHARSET=utf8mb4;5、主鍵
一張表只能有一個主鍵,值是唯一的(或多列組合是唯一的),不能重復不能為空,一般情況下自增列設置為主鍵。常用nid INT NOT NULL AUTO_INCREMENT PRIMARY KEY一張表可以多個唯一列
主鍵的作用:
約束
索引,加速查找
6、外鍵
#?創建表時創建 CREATE?TABLE?color(INT?NOT?NULL?PRIMARY?KEY,name?CHAR(16)?NOT?NULL)ENGINE=InnoDB?DEFAULT?CHARSET=utf8mb4;;CREATE?TABLE?fruit(INT?NOT?NULL?PRIMARY?KEY,smt?CHAR(32)?NOT?NULL?,color_id?INT?NOT?NULL,CONSTRAINT?fk_fruit_color?FOREIGN?KEY?(color_id)?REFERENCES?color(nid))ENGINE=InnoDB?DEFAULT?CHARSET=utf8mb4;; #?表外創建 ALTER?TABLE?students?ADD?CONSTRAINT?fk_tb2_tb1?FOREIGN?KEY?tb2(info)?REFERENCES?tb1(nid);7、修改表屬性
#?添加列: 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?tbl?ALTER列名?SET?DEFAULT?1000; #?刪除默認值: ALTER?TABLE?tbl?ALTER列名?DROP?DEFAULT;?8、數據類型
bit(M):?
二進制位,M為1~64,默認M=1
int:
nid int unsigned最大4GB (2**32 ? 1)
整數類型中的m僅用于顯示,對存儲范圍無限制
tinyint:?有符號-128127,無符號0255,默認是signed
MySQL中無布爾值,使用tinyint(1)構造
bigint
smallint
decimal:?
精確的小數,能夠存儲精確值的原因在于其內部按照字符串存儲
num decimal(6,2) ? 6個有效數字(總長度),2位小數,最大是65和30
float,double: 不精確
char:
唯一定長,其他都是變長,數據不到該長度其他空間會閑置,查找速度快,浪費空間
varchar: 變長,相對于char效率低。查找下一列時不確定跳多少存儲空間
字符最大是255
text:字符最大是65535 2**16-1
mediumtext:2**24-1
longtext:2**32-1
二進制數據:
TinyBlob、Blob、MediumBlob、LongBlob
上傳文件,blob強制二進制方式?,F在多用varchar保存路徑,上傳文件保存在硬盤
時間
枚舉 enum
支持65535個元素枚舉
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
9、表內容操作
#?寫的順序 SELECT...?FROM... WHERE... GROUP?BY...?HAVING... ORDER??BY...? LIMIT...#?執行順序 FROM... WHERE... GROUP?BY... SELECT... HAVING... ORDER?BY... LIMIT...10、表內容操作—增
INSERT?INTO?表?(列名,列名...)?VALUES(值,值,值...); INSERT?INTO??表?(列名,列名...)?VALUES(值,值,值...),(值,值,值...);?#?增加多條數據INSERT?INTO??表?(列名,列名...)?SELECT?列名,列名?FROM?表;??#?后面選擇列不需要空格 #?如果數據可以轉則允許互轉 insert?into?students(name,age)?SELECT?caption,nid?FROM?tb2?WHERE?nid>2;11、表內容操作—刪
DELETE?FROM?表; DELETE?FROM?表?WHERE?id=1?AND?name='alex'; DELETE?FROM?表?WHERE?id?>?1?OR?name='alex';#?刪除和清空 DROP?TABLE?student;?#?刪除表 DELETE?FROM?student;?#?清空表,有自增列則清空后自增記憶存在 TRUNCATE?(TABLE) student;#?快速清空表,有自增列則清空后自增從1重新開始12、表內容操作—改
UPDATE?students?SET?name?=?'alex'?WHERE?id>1;UPDATE?salary?SET?sex?=?IF(sex?=?'m',?'f',?'m')??#?條件判斷更改 UPDATE?salary?SET?sex?=?char(ascii('m')?+?ascii('f')?-?ascii(sex)); UPDATE?salary? SET?sex?=?CASE?sex?WHEN?"m"?THEN?"f"?ELSE?"m"?END;#?UPDATE和JOIN UPDATE?A?JOIN?B?ON?A.URL?=?B.URL SET?member_id?=?'00012138'? WHERE?LOGIN_time?BETWEEN?'2019'?AND?'2020'? AND?B.class_id?=?'TNT';?#?BETWEEN?后可以再跟AND13、表內容操作—查
SELECT?*?FROM?表; #?要全部列可以把列名寫一遍,效率比*高 SELECT?*?FROM?表?WHERE?id?<>?1;?#?即!= SELECT?*?FROM?表?WHERE?id?BETWEEN?3?AND?5;??#?即?id>=3?AND?id<=5 SELECT?nid,name,gender?FROM?表?WHERE?id%2?=?1;SELECT?DISTINCE?name?FROM?score?WHERE?num?<?60; #?distinct?去重只保留各組一項?也可以使用group?byWHERE?(class,?name)?NOT?IN?(SELECT?class,?name?FROM?B)?#?多個字段限制14、表內容操作—條件選擇
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?表)15、表內容操作—通配符模糊匹配
SELECT?*?FROM?表?WHERE?name?LIKE?'ale%'??#?-?ale開頭的所有(多個字符串)?where?...?like?'' SELECT?*?FROM?表?WHERE?name?LIKE?'ale_'??#?-?ale開頭的所有(1個字符) SELECT?*?FROM?表?WHERE?name?LIKE?'_le%'16、表內容操作—限制/分頁
SELECT?*?FROM?表?LIMIT?5;????????????#?前5行 SELECT?*?FROM?表?LIMIT?4,5;??????????#?從第4行下一行開始的5行 SELECT?*?FROM?表?LIMIT?5?OFFSET?4????#?從第4行開始的5行,與上一條功能一樣17、表內容操作—排序
SELECT?*?FROM?表?ORDER?BY?列?ASC?????????????#?根據?“列”?從小到大排列 SELECT?*?FROM?表?ORDER?BY?列?DESC????????????#?根據?“列”?從大到小排列 SELECT?*?FROM?表?ORDER?BY?列1?DESC,列2?ASC???#?根據?“列1”?從大到小排列,如果相同則按列2從小到大排序,否則一列相同時其他列默認升序排序18、表內容操作—分組+聚合
#?group?by獲取各組第一行作為標識,其余行丟棄 SELECT?num?FROM?表?GROUP?BY?num? #?分組的原理默認是升序排序,也可以降序 SELECT?num?FROM?表?GROUP?BY?num?DESCSELECT?count(1)?FROM?表?GROUP?BY?num?#?也可使用 SELECT?count(name)?FROM?students?GROUP?BY?classid #?count(1)?和?count(name)區別 #?如果name中有null則count(name)不記錄,其余時候二者完全一樣 SELECT?count(distinct?name)?FROM?students?GROUP?BY?classid?#?去重#?sum只能對int類型計算?否則是0#?多列分組?多個均相同的分到一組 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(*)?AS?count,sum(score)?AS?sum,avg(score),max(score),min(score)?FROM?表?GROUP?BY?num,nid??#?as?是自定義命名#?如果要對聚合函數進行篩選需引入having?順序在group?by后 SELECT?num?FROM?表?GROUP?BY?num?HAVING?max(id)?>?10 #?聚集函數 count???sum???max???min???avg???group_concat(字符串拼接)?#?都會去除null #?sum(1)?等于?count(1)?只能針對int類型#?group_concat SELECT?id,GROUP_CONCAT(name)?FROM?aa?GROUP?BY?id; SELECT?id,GROUP_CONCAT(name?SEPARETOR?';')?FROM?aa?GROUP?BY?id;?? SELECT?id,GROUP_CONCAT(DISTINCT?name)?FROM?aa?GROUP?BY?id;?? SELECT?id,GROUP_CONCAT(name?ORDER?BY?name?DESC)?FROM?aa?GROUP?BY?id; #?語法如下 DISTINCT?name?ORDER?BY?id?DESC?SEPARETOR?'-'19、表內容操作—組合
#?縱向組合,并以第一個表字段為準 #?組合,自動處理重合 SELECT?nickname?FROM?A?UNION?SELECT?name?FROM?B;#?組合,不處理重合 SELECT?nickname?FROM?A?UNION?ALL?SELECT?name?FROM?B;20、表內容操作—連表
#?需要多行之間滿足一個需求就需要join#?笛卡爾積 SELECT?*?FROM?students,disc_info;#?根據對應關系連表,實際等同于inner?join SELECT?*?FROM?students,disc_info?WHERE?students.discipline?=?disc_info.nid; SELECT?students.name,disc_info.discipline?FROM?students,disc_info?WHERE?students.discipline?=?disc_info.nid;#?join?左右連接如果無對應關系顯示NULL,join效率高#?取交集,inner?join,也可以理解成過濾掉含NULL數據行的左右連接 SELECT?A.num,?A.name,?B.name?FROM? A?INNER?JOIN?B? ON?A.nid = B.nid;#?右連接,right?join SELECT?A.num,?A.name,?B.name?FROM? A?RIGHT?JOIN?B? ON?A.nid?=?B.nid#?左連接,right?join SELECT?A.num,?A.name,?B.name?FROM? A?LEFT?JOIN?B? ON?A.nid?=?B.nid21、表內容操作—CASE WHEN 判斷
CASE?WHEN?表達式THEN?輸出 WHEN?表達式?#?多少個WHEN都可以THEN?輸出 ELSE輸出 ENDSELECT?id,name, (CASE?WHEN?classid?=?1?THEN?2WHEN?classid?=2?THEN?1ELSE?classid?END )?AS?clid FROM?stu;#?把tidydata轉為正常數據 SELECT?name, MAX(CASE?WHEN?project?=?'基礎'?THEN?score?ELSE?NULL?END)?as?'基礎', MAX(CASE?WHEN?project?=?'爬蟲'?THEN?score?ELSE?NULL?END)?as?'爬蟲', MAX(CASE?WHEN?project?=?'SQL'?THEN?score?ELSE?NULL?END)?as?'SQL' FROM?score;#?查詢兩門及以上不及格同學信息 SELECT?st.Name,?AVG(score)?as?Score_n FROM?SC?JOIN?student?st?ON?SC.SId?=?st.SId GROUP?BY?SId HAVING?COUNT(CASE?WHEN?Score?<?80?THEN?1?ELSE?NULL?END)?>=2;22、表內容操作—半連接
SELECTid,NAME,classid FROMstudent?tf WHEREid?=?(SELECTmax(id)FROMstudent?tsWHEREts.classid?=?tf.classid);#?也可以用常規方法 SELECTid,NAME,classid FROM (SELECTmax(id)FROMstudentGROUP?BYclassid);23、表內容操作—索引
#?基于B+樹 #?數據分的越開的列則建索引效果越好 #?OR情況不能用索引 #?如果是聯合索引?前部過濾條件可以做為索引 #?在SQL語句前加EXPLAIN就可以明確是否走索引#?創建索引 CREATE?INDEX?name_index?ON?student(name);#?聚簇索引葉子節點跟著數據,非聚簇索引葉子節點跟著主鍵(聚簇索引) #?非聚簇走完多數會再走聚簇,除非SELECT內容均被包含于索引(全覆蓋索引) #?MySQL中主鍵是聚簇索引,其他均為非聚簇索引 #?如果沒有主鍵,內部會虛擬一個AUTO_INCREMENT的主鍵24、表內容操作—視圖
CREATE?VIEW?V1?AS??#?反復利用某個臨時表則可以創建視圖? SELECT?*?FROM?stu?WHERE?id?>?10; #?視圖是一個動態表,會從物理表動態讀出來。但無法直接對虛擬表即視圖修改 #?修改視圖 ALTER?VIEW?V1?AS?SELECT?*?FROM?stu?WHERE?id?>?20; #?刪除視圖 DROP?VIEW?V1;25、表內容操作—觸發器
DELIMITER?//?#?修改終止符 CREATE?TRIGGER?tri_before_insert_tb1?BEFORE?INSERT?INTO?tb1?FOR?EACH?ROW BEGININSERT?INTO?tb2(name)?VALUES('chenx');?INSERT?INTO?tb2(name)?VALUES(NEW.sname);??#?指代新插入的一行,OLD可以用在DELETE和UPDATE END?// DELIMITER?;?#?修改回原終止符#?BEFORE可以換成AFTER,INSERT可以換成DELETE或者UPDATE#?刪除觸發器 DROP?TRIGGER?tri_before_insert_tb1;26、表內容操作—函數
#?內置函數 SELECT?CURDATE();?#?執行函數的用法 SELECT?DATE_FORMAT(ctime,?"%Y-%m")?FROM?stu?GROUP?BY?DATE_FORMAT(ctime,?"%Y-%m")?#?時間格式化#?自定義函數 DELIMITER?\\ CREATE?FUNCTION?f1(i1?INT,i2?INT) RETURNS?INT#?強類型語言 BEGINDECLARE?num?INT?DEFAULT?0;?#?聲明變量SET?num?=?i1?+?i2;RETURN(num); END?\\ DELIMITER?;?
推薦閱讀
阿里技術專家告訴你,如何畫出優秀的架構圖?
一文帶你認識keepalived,再帶你通關LVS+Keepalived!
那個分分鐘處理 10 億節點圖計算的 Plato,現在怎么樣了?
“谷歌殺手”發明者,科學天才 Wolfram
數據庫激蕩 40 年,深入解析 PostgreSQL、NewSQL 演進歷程
超詳細!一文告訴你 SparkStreaming 如何整合 Kafka !附代碼可實踐
5分鐘!就能學會以太坊 JSON API 基礎知識!
真香,朕在看了!
總結
以上是生活随笔為你收集整理的为你整理了一份 Mysql 的学习笔记,建议收藏学习!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里巴巴宣布架构调整;英伟达放大招!重磅
- 下一篇: linux cmake编译源码,linu