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的使用
圖形化工具進行資料庫的建立刪除,表格的建立刪除,以及資料的增刪改查操作