MYSQL 101

在網上找到一個不錯的 MYSQL 教學,把整個主要功能做了一次紮實的盤整,以下是我做的一些筆記跟內容: 教程 代碼 Repo 定義 DDL: 数据定义语言(Data Definition Language) DDL 用于定义数据库结构和模式,包括创建、修改和删除数据库、表、视图、索引等数据库对象。它不涉及实际数据的操作,而是定义了数据的结构。在MySQL中,常见的DDL命令包括CREATE、ALTER和DROP等。 DML: 数据操作语言(Data Manipulation Language) DML用于操作数据库中的数据,包括插入、更新和删除数据记录。它允许用户查询和修改数据库中的实际数据。在MySQL中,常见的DML命令包括SELECT、INSERT、UPDATE和DELETE等。 DQL: 数据查询语言(Data Query Language) DQL用于查询数据库中的数据,但不对数据进行修改。它主要包括SELECT命令,允许用户从数据库中检索所需的数据。在MySQL中,SELECT命令是最常用的DQL命令。 DCL: 数据控制语言(Data Control Language) DCL用于授权和权限管理,确定哪些用户有权访问数据库中的数据和对象,以及在何种方式访问。在MySQL中,常见的DCL命令包括GRANT和REVOKE,用于授予和撤销用户对数据库对象的权限。 基礎操作 #createtablecreatetableplayer(idINT,nameVARCHAR(100),levelINT,expINT,goldDECIMAL(10,2))#描述tableDESCplayer#基本操作altertableplayermodifycolumnnameVARCHAR(200)altertableplayerrenamecolumnnametonick_namealtertableplayeraddCOLUMNlast_logindatetimealtertableplayerdropcolumnlast_logininsertintoplayer(id,nick_name)values(2,'hello');insertintoplayer(id,nick_name)values(3,'hello');insertintoplayer(id,nick_name)values(5,'hello'),(6,'aaa');updateplayersetlevel=1WHEREnick_name='hello'SELECT*FROMplayerwherelevel>1AND(level<5ORexp>1)andexp<5SELECT*FROMplayerwherelevelin(1,3,5)SELECT*FROMplayerwherelevelBETWEEN1AND10SELECT*FROMplayerwherenameLIKE'王%'SELECT*FROMplayerwherenameLIKE'王_'#批配一字符Regexp #REGEXP#.任一字符#^開頭#$結尾#[abc]其中任一#[a-z]範圍任一#A|BA或BSELECT*FROMplayerwherenameREGEXP'^王.$'SELECT*FROMplayerwherenameREGEXP'王'SELECT*FROMplayerwherenameREGEXP'王.$'SELECT*FROMplayerwherenameREGEXP'[王张]'SELECT*FROMplayerwherenameREGEXP'王|张'SELECT*FROMplayerwhereemailREGEXP'net$'SELECT*FROMplayerwhereemailisNULLSELECT*FROMplayerORDERBYlevelDESC,expASC#先以level->expGROUP BY #AVG#COUNT#MAX#MIN#SUMSELECTCOUNT(*)FROMplayerSELECTsex,COUNT(*)FROMplayergroupbysexSELECTlevel,COUNT(level)FROMplayergroupbylevelSELECTlevel,COUNT(level)FROMplayergroupbylevelHAVINGcount(level)>4ORDERBYcount(level)DESC差聯集 SELECTDISTINCTsexfromplayer#uniononlyselect*fromplayerwherelevelBETWEEN1and3UNIONselect*fromplayerwhereexpBETWEEN1and3;#unionallselect*fromplayerwherelevelBETWEEN1and3UNIONALLselect*fromplayerwhereexpBETWEEN1and3;#intersectselect*fromplayerwherelevelBETWEEN1and3INTERSECTselect*fromplayerwhereexpBETWEEN1and3;#exceptselect*fromplayerwherelevelBETWEEN1and3EXCEPTselect*fromplayerwhereexpBETWEEN1and3;子查詢 selectlevel,ROUND((SELECTAVG(level)fromplayer))asaverage,level-ROUND((SELECTAVG(level)fromplayer))asdifffromplayermigrate / exists #migrate,insertcreateTABLEnew_player2SELECT*fromplayerwherelevel<5SELECTEXISTS(select*fromplayerwherelevel>3)JOIN #innerjoin只返回兩表中都有的數據select*fromplayerinnerjoinequiponplayer.id=equip.player_id#也可以用,where意思一樣select*fromplayer,equipwhereplayer.id=equip.player_id#要有條件不然會產生笛卡爾積雙表數據都取出#leftjoin返回左表中所有數據+右表批配數據右表沒有則NULL填充select*fromplayerleftjoinequiponplayer.id=equip.player_id#rightjoin返回右表中所有數據+左表批配數據左表沒有則NULL填充select*fromplayerrightjoinequiponplayer.id=equip.player_id建立索引 CREATEINDEXindex_nameONtable_name(column1,column2,...);CREATEINDEXidx_employee_idONemployees(employee_id);#创建一个名为"idx_employee_id"的索引,以加速对"employee_id"列的检索CREATEINDEXidx_name_departmentONemployees(first_name,last_name,department);#创建一个名为"idx_name_department"的索引,它包括"first_name"、"last_name"和"department"列。复合索引可用于优化多列的查询。單索引只會作用在單獨條件下就會有索引,舉例來說 CREATEINDEXidx_employee_idONemployees(employee_id);其 select 須為: select*fromemployeeswhereemployee_id=1#作用複合索引則作用在建立條件下: CREATEINDEXidx_name_departmentONemployees(first_name,last_name,department);其 select 須為: select*fromemployeeswherefirst_name='a'ANDlast_name='b'ANDdepartment='c'#作用如果沒有滿足則不會作用 普通索引(B-tree index) 唯一索引(unique index) 主鍵索引(primary key index) 全文索引(full-text index) CREATEINDEXmy_indexONmy_table(id,name);CREATEUNIQUEINDEXmy_indexONmy_table(id,name);CREATEPRIMARYKEYmy_indexONmy_table(id,name);CREATEFULLTEXTINDEXmy_indexONmy_table(content);視圖 視圖是一種虛擬表,它不會存儲任何數據,而是對現有表的一種查看。視圖可以用來組織和過濾數據,也可以用來限制用戶對數據的訪問。 視圖的主要用途包括: 組織和過濾數據:視圖可以用來組織和過濾數據,使其更容易理解和使用。例如,可以創建一個視圖來包含來自不同表的數據,或者可以創建一個視圖來過濾掉不想要的數據。 限制用戶對數據的訪問:視圖可以用來限制用戶對數據的訪問。例如,可以創建一個只允許用戶查看數據的視圖,而不允許用戶更改數據。 提高查詢性能:視圖可以提高查詢性能,因為它可以用來預先計算查詢結果。例如,可以創建一個視圖來包含來自不同表的數據,這樣就可以在查詢數據時使用該視圖,而不需要每次都從不同表中查詢數據。 createviewtop10asselect*fromplayerorderbyleveldesclimit10;

August 23, 2023 · Yish