1. 程式人生 > >MySQL基礎之資料管理與常用函式

MySQL基礎之資料管理與常用函式

一.MySQL資料操作

1.新增記錄

INSERT [INTO] tbl_name [(col_name,...)] {VALUE|VALUES}(VALUES...);
  • 不指定欄位名稱INSERT tbl_name VALUE (value)需要按照建表時的欄位順序給每一個欄位賦值

  • 列出指定欄位INSERT tbl_name(欄位名稱...) VALUES (值...)

  • INSERT … SET的形式INSERT tbl_name SET 欄位名稱=值,...;

    eg.INSERT user SET username='d',age=45,email='[email protected]

    ';

  • INSERT … SELECT的形式INSERT tbl_name [(欄位名稱...)] SELECT 欄位名稱,... FROM tbl_name [WHERE 條件];

  • 一次新增多條記錄INSERT tbl_name [(欄位名稱,...)] VALUES (值,...),(值...),(值...)

2.修改記錄

UPDATE tbl_name SET 欄位名稱=值,欄位名稱=值 [WHERE 條件]
#如果不新增條件,整個表中的記錄都會被更新

3.刪除記錄

DELETE FROM tbl_name [WHERE 條件]
#如果不新增條件,整個表中的記錄都會被刪除
  • 使用DELETE清空資料表的時候不會重置AUTO_INCREMENT的值,可以通過ALTER語句將其重置
    • 檢視當前自增長內容的編號SHOW CREATE TABLE tbl_name;
    • 修改當前表中自增長的編號的值ALTER TABLE tbl_name AUTO_INCREMENT=1;
  • 徹底清空資料表TRUNCATE [TABLE] tbl_name;
    • 清空表中所有記錄
    • 重置AUTO_INCREMENT的值

4.查詢記錄

SELECT select_expr,... FROM tbl_name 
[WHERE 條件]
[GROUP BY {col_name|position} HAVING
二次篩選] [ORDER BY {col_name|position|expr} [ASC|DESC]] [LIMIT 限制結果集的顯示條數]
  • 查詢表中所有記錄SELECT * FROM tbl_name;

  • 查詢指定欄位資訊SELECT 欄位名稱 FROM tbl_name;

  • 不用開啟資料庫,直接傳指定庫中的表的資訊SELECT * FROM database_name.tbl_name;

  • 給欄位起別名SELECT 欄位名稱 [AS] 別名名稱 FROM db_name.tbl_name;

    eg.SELECT id AS '編號',username AS '使用者名稱',sex AS '性別' FROM user1;

  • 給資料表起別名SELECT 欄位名稱,... FROM tbl_name [AS] 別名;

  • 表名.欄位名的形式SELECT tbl_name.col_name,... FROM tbl_name;

  • WHERE條件用於篩選出符合條件的記錄

    • 比較運算子> >= < <= != <> <=> 【注意:<=> NULL 和is NULL檢測是否為NULL值】

    • =和<=>的區別:<=>可以檢測NULL值。

    • 可以使用IS [NOT] NULL檢測值是否為NULL或者NOT NULL

    • 指定範圍[NOT] BETWEEN ... AND

    • 指定集合[NOT] IN (值1,...)

    • 邏輯運算子AND邏輯與 OR邏輯或

    • 匹配字元[NOT] LIKE

    • %萬用字元匹配任意長度的字串

    • _萬用字元匹配任意一個字元

    eg.

    
    #查詢使用者長度為三位的使用者
    
    SELECT id,username,age,sex FROM user1
    WHERE username LIKE '___';
    
    #%與_混合使用,查詢姓張且有一個或多個名的使用者
    
    SELECT * FROM user1
    WHERE username LIKE '張_%';
  • GROUP BY 分組

    • 把值相同放到一個組中,最終查詢出的結果只會顯示組中一條記錄

    • 分組配合GROUP_CONCAT()檢視組中某個欄位的詳細資訊

    eg.
    
    #分組檢視資訊,使用GROUP_CONCAT()將該組對應欄位的內容全部輸出
    
    SELECT GROUP_CONCAT(username),age,sex,addr FROM user1
    GROUP BY sex;
    • 配合聚合函式使用

      • COUNT():統計記錄總數
      
      #COUNT(*)和COUNT(欄位名)的區別
      
      COUNT(欄位名)當對應記錄為null時,記錄個數不算在內
      COUNT(*)會統計null的記錄
      • SUM():求和

      • MAX():求最大值

      • MIN():求最小值

      • AVG():求平均值

    • 配合WITH ROLLUP關鍵字使用:會在記錄末尾新增一條記錄,是上面所有記錄的總和

    • 按照欄位的位置來分組

    SELECT id,sex,GROUP_CONCAT(username) AS usersDetail,COUNT(*) AS totalUsers
    FROM user1
    GROUP BY 1;#相當於GROUP BY id,即以第一個查詢內容的位置進行排序
    • HAVING子句對分組結果進行二次篩選
    
    #對分組後的結果只保留總人數大於3的記錄
    
    SELECT addr,GROUP_CONCAT(username) AS usersDetail,COUNT(*) AS totalUsers
    FROM user1
    GROUP BY addr
    HAVING totalUsers >=3;
  • ORDER BY排序:ORDER BY 欄位名稱 ASC|DESC

    • 按照多個欄位排序ORDER BY 欄位名稱1 ASC|DESC,欄位名稱2 ASC|DESC;

    • 實現隨機記錄(通過RAND()函式)

    SELECT id,username,age
    FROM user1
    ORDER BY RAND();
  • LIMIT限制結果集顯示條數

    • LIMIT值:顯示結果集的前幾條記錄

    • LIMIT offset,row_count:從offset開始,顯示row_count條記錄[offset從0開始]

    
    #顯示user表中前5條記錄
    
    SELECT * FROM user LIMIT 5;
    
    #或
    
    SELECT * FROM user LIMIT 0,5;

5.多表連線

  • 笛卡爾積的形式[得到表1記錄*表2記錄長度的表]

    eg.
    SELECT emp.id,emp.username,emp.age,dep.depName FROM emp,dep;#結果為emp記錄數*dep記錄數
  • 內連線的形式

    • 查詢兩個表中符合連線條件的記錄

    • 語法

    SELECT 欄位名稱,... FROM tbl_name1
    INNER JOIN tbl_name2
    ON 連線條件
    • 舉例
    SELECT e.id,e.username,e.age,d.depName FROM emp AS e
    [INNER] JOIN dep AS d
    ON e.depId=d.id;
  • 外連線的形式

    • 左外連線[先顯示左表中的全部記錄,再去右表中查詢符合條件的記錄,不符合的以NULL值代替]
    SELECT 欄位名稱,... FROM tbl_name1
    LEFT [OUTER] JOIN tbl_name2
    ON 條件;
    • 右外連線[先顯示右表中的全部記錄,再去左表中查詢符合條件的記錄,不符合的以NULL值代替]
    SELECT 欄位名稱,... FROM tbl_name1
    RIGHT [OUTER] JOIN tbl_name2
    ON 條件;

6.外來鍵約束

  • 只有InnoDB儲存引擎支援外來鍵

  • 保證資料的一致性和完整性

  • 建立外來鍵

    • 建表時指定外來鍵

    [CONSTRAINT 外來鍵名稱]FOREIGN KEY(欄位名稱) REFERENCES 主表(欄位名稱)

    注意:

    (1)子表的外來鍵欄位和主表的主鍵欄位型別要相似;如果是數值型要求一致,並且無符號也要一致;如果是字元型,要求型別一致,長度可以不同。

    (2)如果外來鍵欄位沒有建立索引,MySQL會自動幫我們新增索引。

    (3)子表的外來鍵關聯的必須是父表的主鍵。

    (4)外來鍵約束的參照操作:CASCADE從父表刪除或更新,子表也跟著刪除或更新,級聯的操作;SET NULL從父表刪除或者更新記錄,並設定子表的外來鍵列為NULL;NO ACTION|RESTRICT拒絕對父表做更新或刪除操作(預設)

    ALTER TABLE news 
    ADD FOREIGN KEY(cateId) REFERENCES new_cate(id)
    ON DELETE CASCADE ON UPDATE CASCADE
    • 動態新增外來鍵
    ALTER TABLE tbl_name
    ADD [CONSTRAINT 外來鍵名稱] FOREIGN KEY(外來鍵欄位) REFERENCES 主表(主鍵欄位)
    • 動態新增外來鍵之前表中的記錄一定是合法的記錄,沒有髒值,否則外來鍵新增不成功
  • 刪除外來鍵

    • 動態刪除外來鍵
    ALTER TABLE tbl_name
    DROP FOREIGN KEY fk_name;

7.特殊形式的查詢

  • 子查詢

    SELECT 欄位名稱 FROM tbl_name WHERE col_name = (SELECT col_name FROM tbl_name);
    SELECT 欄位名稱 FROM tbl_name WHERE col_name IN (SELECT col_name FROM tbl_name);
    • 內層語句查詢的結果,可以作為外層語句查詢的條件

    • 由IN引發的子查詢

    • 由比較運算子引出子查詢

    • 由EXISTS引發的子查詢(看EXISTS後面的語句真假進行判斷)

    SELECT * FROM emp WHERE EXISTS(SELECT depName from dep WHERE id=10);
    • ANY SOME ALL
關鍵字 ANY SOME ALL
> >= 最小值 最小值 最大值
< <= 最大值 最大值 最小值
= 任意值 任意值
<> != 任意值

* INSERT…SELECT * CREATE…SELECT * CREATE TABLE tbl_name1 LIKE tbl_name2(建立跟表2一樣表結構的表1)

  eg.
  #建立一個user1表,id username
  CREATE TABLE user1(
    id int UNSIGNED AUTO_INCREMENT KEY,
      username VARCHAR(20)
  )SELECT id,username FROM emp;
  #將user表中的使用者名稱寫入到user1表中
  INSERT user1(username) SELECT username FROM user;
  #將stu表中天才使用者名稱新增到user2表中
  INSERT user2 SET username = (SELECT username FROM stu WHERE id=9);
  • 去掉重複值,使用關鍵字distinct

  • 聯合查詢

    • UNION(合併重複記錄的聯合查詢)
    SELECT 欄位名稱,... FROM tbl_name1
    UNION
    SELECT 欄位名稱,... FROM tbl_name2;
    • UNION ALL(不合並重復記錄的聯合查詢)
    SELECT 欄位名稱,... FROM tbl_name1
    UNION ALL
    SELECT 欄位名稱,... FROM tbl_name2;
    • UNION ALL是簡單的合併,UNION會去掉表中的重複記錄
  • 自身連線查詢

    • 無限級分類的實現形式

      • 表如下【pid為0表示頂級分類,其他表示對應分類下的子分類】
    id cateName pid
    1 服裝 0
    2 數碼 0
    3 男裝 1
    4 女裝 1
    5 電視 2
    6 液晶電視 5
    7 等離子電視 5
    • 自身連線查詢如下
    eg.
    
    #查詢所有的分類資訊,並且得到其父分類
    
    SELECT s.id,s.cateName AS sCateName,p,cateName AS pCateName
    FROM cate AS s
    LEFT JOIN cate AS p
    ON s.pid=p.id;
    
    #查詢所有的分類及其子分類
    
    SELECT p.id,p,cateName AS pCateName,s.cateName AS sCateName
    FROM cate AS s
    RIGHT JOIN cate AS p
    ON s.pid=p.id;
    
    #查詢所有的分類並且得到子分類的數目
    
    SELECT p.id,p.cateName AS pCateName,count(s.pCateName) AS count
    FROM cate AS s
    RIGHT JOIN cate AS p
    ON s.pid=p.id
    GROUP BY p.cateName
    ORDER BY id ASC;

8.MYSQL常用函式

  • 數學函式

    • CEIL()進一取整
    • FLOOR()舍掉小數部分
    • ROUND()四捨五入
    • TRUNCATE()擷取小數點後幾位
    • MOD()取餘數
    • ABS()取絕對值
    • POWER()冪運算
    • PI()圓周率
    • RAND()或者RAND(X)0~1之間的隨機數
    • SIGN(X)得到數字符號
    • EXP(X)計算e的x次方
    eg.
    SELECT CEIL(1.2);#2
    SELECT FLOOR(2.9);#2
    SELECT ROUND(3.56789,2);#3.57
    SELECT TRUNCATE(3.56789,2);#3.56
    SELECT SIGN(-12);#-1
    SELECT SIGN(12);#1
    SELECT SIGN(0);#0
    ...
  • 字串函式

    • CHAR_LENGTH()得到字串的字元數

    • LENGTH()返回字串的位元組數

    • CONCAT(s1,s2,...)將字串合併成一個字串[注意:如果字串中包含NULL,返回拼接結果為NULL]

    • CONCAT_WS(x,s1,s2,...)以指定分隔符拼接字串

    • UPPER(s1)|UCASE(s1)將字串轉換成大寫

    • LOWER(s1)|LCASE(s1)將字串轉換成小寫

    • REVERSE(s1)字串反轉

    • LEFT()|RIGHT()返回字串的前幾個字元或後幾個字元

    • LPAD()|RPAD()用字串填充到指定長度

    • TRIM()|LTRIM()|RTRIM()去掉字串兩端的空格;去掉字串左側的空格;去掉字串右側的空格

    • REPEAT(s,num)重複指定的次數

    • REPLACE()字串替換

    • SUBSTRING(s,startIndex,num)擷取字串[注意:startIndex下標從1開始]

    • STRCMP(s1,s2)比較字串,比較ASCII碼,如果s1小於s2則返回-1,s1大於s2返回1,s1=s2返回0

    SELECT CHAR_LENGTH('你好呀');#3
    SELECT LENGTH('你好呀');#9[原因:在UTF-8下中文為3個位元組]
    SELECT CONCAT('a','b','c');#abc
    SELECT CONCAT('a','b','c',NULL);#NULL
    SELECT CONCAT_WS('-','a','b','c');#a-b-c
    SELECT CONCAT_WS('-','a','b','c',NULL);#a-b-c
    SELECT CONCAT_WS(NULL,'a','b','c');#NULL
    SELECT UPPER('aBc');#ABC
    SELECT LOWER('AbC');#abc
    SELECT LEFT('hello',2),RIGHT('hello',2);#he lo
    SELECT LPAD('abc',10,'?');#???????abc
    SELECT RPAD('abc',10,'!');#abc!!!!!!!
    SELECT CONCAT('*',TRIM(' abc  '),'*'),CONCAT('*',LTRIM(' abc  '),'*'),CONCAT('*',RTRIM(' abc  '),'*');#*abc*,*abc  *,* abc*
    SELECT REPEAT('hello',3);#hellohellohello
    SELECT REPLACE('hello king','king','queen');#hello queen
    SELECT SUBSTRING('abcdef',1,3);#abc
    SELECT STRCMP('a','b');#-1
  • 日期時間函式

    • 返回當前日期
    SELECT CURDATE(),CURRENT_DATE();
    • 返回當前時間
    SELECT CURTIME(),CURRENT_TIME();
    • 返回當前的日期時間
    SELECT NOW(),CURRENT_TIMESTAMP(),SYSDATE();
    • 返回日期中的月份
    SELECT MONTH('2017-02-19');#2
    SELECT MONTH(CURDATE());#9
    SELECT MONTH(CURDATE()),MONTHNAME(CURDATE());#9 September
    • 返回星期幾
    SELECT DAYNAME(NOW());#Wednesday
    • 返回一週內的第幾天[注意:星期天為1,…]
    SELECT DAYOFWEEK(NOW());#4
    • 返回一年中的第幾個星期
    SELECT WEEK(NOW());#36
    • 計算兩個日期相差的天數
    SELECT DATEDIFF('2017-03-01','2017-03-05');#-4
  • 其他常用函式

    • 獲得版本SELECT VERSION();#5.7.22
    • 獲得當前連線數SELECT CONNECTION_ID();#81
    • 獲得當前開啟的資料庫SELECT DATABASE();或者SELECT SCHEME();
    • 獲得當前登入的使用者SELECT USER()|CURRENT_USER()|SYSTEM_USER()|SESSION_USER();
    • 得到上一步插入操作產生的AUTO_INCREMENT的值SELECT LAST_INSERT_ID();
    • 加密演算法加密SELECT MD5(str);
    • mysql預設的密碼加密演算法(新增使用者時使用的加密演算法)SELECT PASSWORD(str);

9.MYSQL Workbench的使用

圖形化工具進行資料庫的建立刪除,表格的建立刪除,以及資料的增刪改查操作