MySQL基礎總結

20170708――20170807
注: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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章