注:cmd需要以管理員身份運行
1,啓動與關閉
net start mysql ,
net stop mysql
2,登錄與退出
mysql -u(username) -p(password) -P(端口號) -h(服務器地址),
exit; quit; \q;
默認端口號:3306,本機服務器地址:127.0.0.1
3,修改MySQL提示符
①連接客戶端時 :mysql -u(username) -p(password) --prompt 提示符
②連接客戶端後 :mysql>prompt 提示符
4,常用命令
SELECT VERSION(); 顯示當前服務器版本
SELECT NOW(); 顯示當前日期時間
SELECT USER(); 顯示當前用戶
SELECT DATABASE(); 顯示當前打開的數據庫
5,語句規範
① 關鍵字與函數名稱全部大寫
② 數據庫名稱,表名稱,字段名稱全部小寫
③ SQL語句必須以分號結尾
6,創建數據庫
CREATE {DATABASE | SCHEMA } [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset_name
7,查看當前服務器下的數據庫列表
SHOW DATABASES;
8,修改數據庫
ALTER {DATABASE | SCHEMA} db_name [DEFAULT] CHARACTER SET [=] charset_name;
9,刪除數據庫
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name;
10,數據類型
整形 :
浮點型
日期
字符型
定長:用空格補齊
L+1或L+2裏多出來的字節是用來保存數據值的長度的。在對長度可變的數據進行處理時,MySQL要把數據內容和數據長度都保存起來。
11,創建數據表:先打開數據庫 USE db_name
CREATE TABLE [IF NOT EXISTS] tb_name(column_name data_type,...)
column_name:列名稱,data_type:數據類型
12,查看數據表
SHOW TABLES [FROM db_name] [LIKE 'pattern'|WHERE expr]
13,查看數據表結構
SHOW COLUMNS FROM tb_name;
14,記錄插入(爲行內容賦值)
INSERT [INTO] tb_name [(col_name,...)] VALUES(val,...);
(col_name,...)若省略則需要寫入所有要插入的字段
15,記錄的查找(查看賦值結果如何)
SELECT expr,...FROM tb_name;
16,自動編號
AUTO_INCREMENT
必須與主鍵組合使用,起始值爲1,每次增量爲1;類型可以爲整數或者浮點數,浮點數的小數部分必須爲0
17,主鍵約束 PRIMARY KEY
① 一張數據表中只能有一個主鍵
② 主鍵保證記錄的唯一性
③ 主鍵自動爲NOT NULL
自動編號不需要賦值,主鍵約束可以賦值,但是不允許重複
18,唯一約束 UNIQUE KEY
① 唯一約束可以保證記錄的唯一性
② 唯一約束的字段可以爲空值
③ 每張數據表可以存在多個唯一的約束
唯一約束不允許有多個空值
19,默認約束 DEFAULT
當插入記錄時,如果沒有明確爲字段賦值,則自動賦予默認值
eg:
CREATE TABLE tb1(
id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(20) NOT NULL UNIQUE KEY,
sex ENUM('1','2','3') DEFAULT '3'
);
20,根據約束所針對的字段的數目可以分爲 表級約束(>=2字段)和列級約束(1字段)
21,根據功能將約束分爲
NOT NULL (非空約束)
PRIMARY KEY (主鍵約束)
UNIQUE KEY (唯一約束)
DEFAULT (默認約束)
FOREIGN KEY (外鍵約束)
22,外鍵約束 FOREIGN KEY(chl_col_name)REFERENCES fath_tb_name(fath_col_name)
23,表級約束與列級約束
(1)對一個數據列建立的約束,稱爲列級約束
(2)對多個數據列建立的約束,稱爲表級約束
(3)列級約束既可以在列定義時聲明,也可以在列定以後聲明
(4)表級約束只能在列定義後聲明
24,修改數據表(改)
添加單列 ALTER TABLE tb_name ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name ]
添加多列 ALTER TABLE tb_name ADD [COLUMN] (col_name column_definition,...);
刪除列 ALTER TABLE tb_name DROP [COLUMN] col_name;
添加主鍵約束 ALTER TABLE tb1_name add [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)
添加唯一約束 ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUWE [INDEX | KEY] [index_name] [index_type] (index_col_name,...)
添加外鍵約束 ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_col_name,...) reference_definition
添加/刪除默認約束 ALTER TABLE tbl_name ALTER [COLUMN] col_name{SET DEFAULT literal | DROP DEFAULT }
刪除主鍵約束 ALTER TABLE tbl_name DROP PRIMARY KEY
刪除唯一約束 ALTER TABLE tbl_name DROP {INDEX | KEY } index_name
刪除外鍵約束 ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol
修改列定義 ALTER TABLE tbl_name MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]
修改列名稱 ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST | AFTER col_name]
數據表更名
① ALTER TABLE tbl_name RENAME [TO | AS] new_tbl_name
② RENAME TABLE tbl_name TO new_tbl_name [,tbl_name2 TO new_tbl_name2]...
插入記錄(增)
① INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
② INSERT [INTO] tbl_name SET col_name={expr | DEFAULT},... 與第一種方式的區別在於,法②可以使用子查詢(SubQuery),且一次只能插入一條記錄
③ INSERT [INTO] tbl_name [(col_name,...)] SELECT ... 從一個數據表導入
更新記錄(單表更新)
UPDATE [LOW_PRIORITY][IGNORE] tbale_reference SET col_name1={expr1 | DEFAULT} [,col_name2={expr2 | DEFAULT}] ... [WHERE where_condition]
刪除記錄(單表刪除)(刪)
DELETE FROM tbl_name [WHERE where_condition]
25, SELECT:
SELECT select_expr[,select_expr...]
[
FROM table_references
[WHERE where_condition]
[GROUP BY {col_name|position} [ASC|DESC],...]
[HAVING where_condition]
[ORDER BY {col_name|expr|position}[ASC|DESC],...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
]
select_expr(查詢表達式)
每一個表達式表示想要的一列,必須有至少一個
多個列之間以逗號分隔
星號*表示所有列,tbl_name.*表示命名錶的所有列
查詢表達式可以使用[AS] alias_name爲其賦予別名
別名可用於GROUP BY , ORDRE BY 或 HAVING 字句
26,查詢結果的操作(查)
where的條件查詢
GROUP BY的查詢結果分組
[GROUP BY {col_name | position} [ASC | DESC],...]
ASC表示升序,DESC表示降序
HAVING 的分組條件 [HAVING where_condition]
eg:
SELECT id,age FROM tb_name GROUP BY id HAVING expr;
expr中出現的字段必須爲聚合函數或者在前面的SELECT語句中出現的字段,該例中只能爲id,age或者其他聚合函數。
聚合函數爲max()min()avg()sum()count()等,只有一個返回值。
ORDER BY 對查詢結果進行排序
[ORDER BU {col_name | expr | position} [ASC | DESC],...]
eg: SELECT * FROM tb_name ORDER BY id DESC; //按id的降序排列
LIMIT 限制查詢結果返回的數量
[LIMIT {[offset,]row_count | row_count OFFSET offset}]
eg: SELECT * FROM tb_name LIMIT 1; //只顯示第一條
SELECT * FROM tb_name LIMIT 3,2; //顯示第四條和第五條,排序時從0開始的
27, 修改客戶端顯示的內容編碼(不影響數據表的內容)
SET NAMES gbk/utf8...
28 , 子查詢 指嵌套在查詢內部,且必須始終出現在圓括號內,子查詢可以包含多個關鍵字或條件,如 DISTINCT,GROUP BY,ORDER BY,LIMIT 函數等。子查詢的外層查詢可以是:SELECT,INSERT,UPDATE,SET或DO。子查詢可以返回標量,一行,一列,或者一個子查詢
分類:
① 使用比較運算符的子查詢 = ,>=, < ,<= ,<> ,!= ,<=>
語法結構 operand comparison_operator subquery
eg:
SELECT ROUND(AVG(goods_price),2) FROM tbd_goods; //對價格字段求平均值,四捨五入保留兩位,不寫2,默認保留整數。
SELECT goods_id,goods_price,goods_name FROM tbd_goods WHERE goods_price >= (SELECT ROUND(AVG(goods_price),2) FROM tbd_goods) //用子查詢查找數據表中價格大於價格平均值的項
用ANY,SOME,ALL修飾的比較運算符
operand comparsion_operator ANY (subquery)
operand comparsion_operator SOME (subquery)
operand comparsion_operator ALL (subquery)
② 使用[NOT] IN
語法結構 operand comparison_operator [NOT] IN (subquery)
ANY 運算符與IN等效,!=ALL或<>ALL 與NOT IN等效
③ 使用[NOT] EXISTS 的子查詢,如果子查詢返回任何行,EXISTS將返回TRUE,否則爲FALSE。(不常用)
29 ,INSERT ... SELECT 將查詢結果寫入數據表
INSERT [INTO] tbl_name [(col_name,...)] SELECT ...
30 , 多表更新
UPDATE table_references SET col_name1 = {expr | DEFAULT} [,col_name2 = {expr2 | DEFAULT} ... [WHERE where_condition]
table_references : {[INNER | CROSS] JOIN | {LEFT | RIGHT} [OUTER] JOIN}
31 , CREATE ... SELECT 創建數據表同時將查詢結果寫入到數據表
CREATE TABLE [IF NOT EXISTS] tbl_name [create_definition,...]select_statement
32 , 連接
①{[INNER | CROSS] JOIN | {LEFT | RIGHT} [OUTER] JOIN}
②table_reference
③ON conditional_expr
JOIN
INNER JOIN:內連接和交叉連接等價,都是笛卡爾積運算
CROSS JOIN:交叉連接
LEFT [OUTER] JION 左連接:是根據最左表的記錄,在被連接右表中找出符合條件的記錄與之匹配,找不到與左表匹配的,用null填充。
RIGHT [OUTER] JOIN 右連接:是根據最右表的記錄,在被連接左表中找出符合條件的記錄與之匹配,找不到與右表匹配的,用null填充。
連接類型:
INNER JOIN,內連接。在MySQL中,JOIN,CROSS JOIN和INNER JOIN是等價的。
LEFT [OUTER] JOIN ,左外連接
RIGHT [OUTER] JOIN,右外連接
連接條件:使用On關鍵字來設定連接條件,也可以用WHERE來代替。通常使用ON關鍵字來設定連接條件,使用WHERE關鍵字進行結果集記錄的過濾
內連接:顯示左表及右表符合連接條件的記錄
左外連接:顯示左表的全部及右表中符合條件的記錄
右外連接:顯示右表的全部及左表中符合條件的記錄
多表連接
SELECT col_name1,col_name2,col_name3,col_name4,col_name5 FROM tbl_name1 AS t1
INNER JOIN tbl_name2 AS t2 ON join_condition
INNER JOIN tbl_name3 AS t3 ON join_condition\G;
SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g
-> INNER JOIN tdb_goods_cate AS c ON g.cate_id=c.cate_id
-> INNER JOIN tdb_goods_brands AS b ON g.brand_id=b.brand_id\G;
連接三個表聯合顯示查詢結果,注意不同的INNER JOIN中間沒有逗號!!沒有逗號!!沒有逗號!!
顯示的結果和商品表tdb_goods的記錄一樣,不過之前是通過單表的查詢來顯示,這次是通過三張表的連接來顯示。
多表的連接實際上是外鍵的逆向約束。外鍵把數據分開存儲,多表連接又把數據聯繫在一起。
多表刪除
DELETE tbl_name[.*] [,tbl_name[.*]] ... FROM table_references [WHERE where_condition]
子查詢與連接總結:
子查詢:出現在mysql語句的select子句,而子查詢必須要出現在小括號()內,它的外層可以是select語句,insert語句,update語句,delete語句,而且在子查詢中可以包含多個關鍵詞:group by,order by,limit以及相關函數。。。引發子查詢的情況有比較運算符,(Not)in運算符,exist(Not exists)引發的子查詢
連接:連接分爲外連接和內連接,內連接主要顯示的是左表和右表當中都符合連接條件的記錄。外鏈接有分爲左外連接和右外連接,左外連接顯示的是左表中的全部記錄和右表符合條件的記錄,右外連接和左外連接相反
33,字符函數
CONCAT(); 連接多個字段
eg(面試題):SELECT CONCAT(first_name,'_',last_name) AS full_name FROM test;
CONCAT_WS(); 用某個分隔符連接多個字段
eg:SELECT CONCAT_WS('_',first_name,last_name,...);
FORMAT() 數字格式化(返回類型爲字符型)
eg: SELECT FORMAT(12530.75,2) //12,530.75
SELECT FORMAT(12530.75,1) //12,530.8
SELECT FORMAT(12530.75,0) //12,531
UPPER() 轉換成大寫字母
LOWER() 轉換成小寫字母
eg:SELECT UPPER('MySQL') //MYSQL
SELECT LOWER(;MySQL') //mysql
LEFT() 獲取左側字符串
RIGHT() 獲取右側字符串
eg:SELECT LEFT('mysql',2) //my
SELECT RIGHT('mysql',3) //sql
SELECT UPPER(LEFT('mysql',2)) //MY 函數嵌套
SELECT CONCAT(UPPER(LEFT('mysql',2)),LOWER(RIGHT('mysql',3))) //MYsql 函數嵌套
LENGTH() 獲取字符串長度
eg: SELECT LENGTH('MY SQL') //6
LTRIM() 刪除字符串的前導空格
RTRIM() 刪除字符串的後續空格
TRIM() 刪除字符串的前導和後續空格
eg: SELECT LENGTH(LTRIM(' mysql ')) //9
SELECT LENGTH(RTRIM(' mysql ')) //7
SELECT LENGTH(TRIM(' MYSQL ')) //5
SELECT TRIM(LEADING '?' FROM '???MYSQL??') //MYSQL?? 刪除前導指定字符
SELECT TRIM(TRAILING '?' FROM '???MYSQL??')//???MYSQL 刪除後續指定字符
SELECT TRIM(BOTH '?' FROM '???MYSQL??') //MYSQL 刪除前導和後續的指定字符
REPLACE 替換指定字符
eg: SELECT REPLACE('??MY??SQL???','?','') //MYSQL
SUBSTRING 從某字符串的某個位置開始截取指定長度的字符
eg: SELECT SUBSTRING('MYSQL',1,2); //MY 從1開始計數
SELECT SUBSTRING('MYSQL',2); //YSQL
SELECT SUBSTRING('MYSQL',-2); //QL從右往左數
SELECT SUBSTRING('MYSQL',-1,-2); //輸出空
[NOT]LIKE 模式匹配
eg: SELECT 'MYSQL' LIKE 'M%' //1 即true,MySQL中的%爲通配符,類似Windows下的*,%代表任意字符,_代表任意一個字符
SELECT 'MYSQL' LIKE 'm%' //1 不區分大小寫
34,數值運算函數
CEIL() 向上取整
FLOOR() 向下取整
DIV 整除運算
MOD 取模
POWER() 冪運算
ROUND() 四捨五入
TRUNCATE() 數字截取
35 ,比較運算符與函數
[NOT] BETWEEN AND(); //(不)在某個範圍內
eg:SELECT 15 BETWEEN 1 AND 22; //1(true),包括兩邊 [1,22]
SELECT 15 BETWEEN 15 AND 15; //1(true)
[NOT] IN(); //(不)在列出值範圍內
eg:SELECT 15 IN(10,15,20); //1(true)
SELECT 15 IN(10,12,20); //0(true)
IS [NOT] NULL; //(不)爲空
eg:SELECT NULL IS NULL; //1(true)
SELECT '' IS NULL; //0(false)
36 , 日期時間函數
NOW(); //當前日期和時間
CURDATE(); //當前日期
CURTIME(); //當前時間
DATE_ADD(); //日期的變化
eg:SELECT DATE_ADD('2017-7-25',INTERVAL 365 DAY); //2018-07-25
SELECT DATE_ADD('2017-7-25',INTERVAL -365 DAY); //2016-07-25
SELECT DATE_ADD('2017-7-25',INTERVAL 48 HOUR); //2017-07-27 00:00:00
SELECT DATE_ADD('2017-7-25',INTERVAL 48*60 MINUTE); //2017-07-27 00:00:00
DATE_DIFF() //日期差值
eg:SELECT DATEDIFF('2019-6-10','2015-6-8'); //1463
DATE_FORMAT() //日期格式化
eg:SELECT DATE_FORMAT('2017-7-25','%m/%d/%Y'); //07/25/2017
37 , 信息函數
CONNECTION_ID() //連接ID
eg:SELECT CONNECTION_ID(); //8(服務器不同輸出不同)
DATABASE(); //當前數據庫
eg:SELECT DATABASE();
LAST_INSERT_ID() //最後插入記錄的ID號。 表中必須存在一個自動編號的字段,設置爲主鍵,名字不一定叫ID。而且如果最後一條記錄一次插入了多個數據,顯示的是插入的多個數據的第一個數據的ID號
USER(); //當前用戶
38 , 聚合函數
AVG() 平均值
COUNT() 計數
MAX() 最大值
MIN() 最小值
39 ,加密函數
MD5():信息摘要算法,爲以後的Web頁面做準備,儘量使用MD5()
eg: SELECT MD5('admin');
PASSWORD():密碼算法,通過PASSWORD()修改(重要用於MYSQL數據庫)當前用戶和其他用戶的密碼,修改客戶端自己的密碼
eg: SET PASSWORD=PASSWORD(‘dimitar’); 把密碼修改成dimitar。
40 , 自定義函數(udf user-define-function):
兩個必要條件:a,參數,b,返回值
創建自定義函數:
CREATE FUNCTION function_name RETURNS{STRING|INTEGER|REAL|DECIMAL} routine_body
eg:
CREATE FUNCTION F1() RETURNS VARCHAR(30) RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H點:%i分:%s秒');
SELECT F1(); //2017年07月25日 16點:33分:01秒 輸出當前時間並格式化
創建帶參數的自定義函數:
eg:
CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)
RETURNS FLOAT(10,2) UNSIGNED
RETURN(num1+num2)
SELECT f2(10,15) //12.5
刪除函數:
DROP [IF EXISTS]FUNCTION fun_name;
修改分隔符: DELIMITER 分隔符
41,存儲過程:存儲過程是SQL語句和控制語句的預編譯集合,以一個名稱存儲並作爲一個單元處理
優點:
a)增強SQL語句的功能和靈活性
b)實現較快的執行速度
c)減少網絡流量
創建存儲過程 CREATE [DEFINER = {user| CURRENT_USER}] PROCEDURE sp_name([proc_parameter[,...]]) [characteristic ...]routine_body
proc_parameter: [IN|OUT|INOUT] param_name type
IN:表示該參數的值必須在調用存儲過程時指定
OUT:表示該參數的值可以被存儲過程改變,並且可以返回
INOUT:表示該參數的調用時指定,並且可以被改變和返回
eg: CREATE PROCEDURE sp() SELECT VERSION();
調用存儲過程:
CALL sp_name([parameter[,...]])
CALL sp_name[()]
eg:CALL sp();
修改存儲過程:只可以修改參數類型和註釋,過程體不可以修改,只能刪除再重建。
ALTER ORICEDURE sp_name [characteristic ...] COMMENT 'string' | {CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}|SQL SECURITY{DEFINER|INVOKER}
刪除存儲過程: DROP PRICEDURE[IF EXISTS] sp_name;
eg: CREATE PROCEDURE removeUsersAndReturnUserNums(IN p_id INT UNSIGNED,OUT userNums INT UNSIGNED)
BEGIN
DELETE FROM users WHERE id = p_id;
SELECT count(id) FROM users INTO userNums;
END
CALL removeUsersAndReturnUserNums(10,@nums); //變量
SELECT @nums; //輸出剩餘條目數
SET @nums = 7; //定義用戶變量,只對當前客戶端有效
SELECT ROW_COUNT(); //系統函數;得到插入,刪除,更新 影響的記錄總數
eg:INSERT test(username)VALUES('A'),('B'),('C');
SELECT ROW_COUNT(); //3
UPDATE test SET username = CONCAT(username,'--CHINA') WHERE id<=2;
SELECT ROW_COUNT(); //2
42,存儲引擎:可以將數據以不同的技術存儲在文件(內存)中,這種技術就稱爲存儲引擎。每一種存儲引擎使用不同的存儲機制,索引技巧,鎖定水平,最終提供廣泛且不同的功能
查看數據表的存儲引擎: SHOW CREATE TABLE tb_name;
mysql支持的存儲引擎:
MySAM(常用):存儲限制可達256TB,支持索引,表級鎖定,數據壓縮
InnoDB(常用): 限制爲64TB,支持事務和索引,鎖顆粒爲行鎖
Memory
CSV
Archive
相關知識點:
①併發處理:
併發控制:當多個連接對記錄進行修改時保證數據的一致性和完整性。對於併發讀或者併發寫,系統採用“鎖”系統解決
a)鎖:
共享鎖(讀鎖):在同一時間段內,多個用戶可以讀取同一個資源,讀取過程中數據不會發生任何變化。
排他鎖(寫鎖):在任何時候只能有一個用戶寫入資源,當進行寫鎖時會阻塞其他的讀鎖或者寫鎖操作。
b)鎖顆粒:
表鎖:是一種開銷最小的鎖策略。
行鎖:是一種開銷最大的鎖策略。
②事務處理:
事務:用於保證數據庫的完整性。
事務的特性:
原子性(Atomicity)
一致性(Consistency)
隔離性(Isolation)
持久性(Durability)
③外鍵:是保證數據一致性的策略
④索引:是對數據表中一列或多列的值進行排序的一種結構。是快速定位的一種方法
普通索引
唯一索引
全文索引
btree索引
hash索引
...
修改存儲引擎的方法
①通過修改MySQL配置文件實現 ———— default-storage-engine = engine
②通過創建數據表命令實現 ———— CREATE TABLE table_name( ... )ENGINE = engine;
③通過修改數據表命令實現 ———— ALTER TABLE table_name ENGINE [=] engine_name;
43,數據庫管理工具:PHPMyAdmin,Navicat,MySQL Workbench