Zhong__MySQL笔记
時間:2022.01.02
環境:Windows、Linux
目的:MySQL筆記
說明:
作者:Zhong QQ交流群:121160124 歡迎加入!
安裝
卸載
Windows系統
停止服務
刪除
Linux系統
查看版本
連接登錄
數據庫
查看所有數據庫
創建數據庫
刪除數據庫
修改數據庫
數據庫結構信息
查看編碼
表
查看所有表
創建表
刪除表
修改表
查看表結構信息
CREATE增
DELETE刪
UPDATE改
SELECT查
as別名
DISTINCT去重
空值null
``反引號
常數
WHERE過濾
運算符
比較運算符
=
<=>
<>
!=
<
<=
>
>=
like(模糊查詢)
ISNULL
IS NULL
IS NOT NULL
LEAST最小的
GREATEST最大的
BETWEEN AND(在之間)
in(在)/not in
and/or
運算符
算術運算符
+(加)
-(減)
*(乘)
/(DIV)(除)
%(MOD)(取模)
比較運算符
=(等于)
<=>(安全等于)
<>(!=)(不等于)
<(小于)
<=(小于等于)
>(大于)
>=(大于等于)
邏輯運算符
NOT(!)(非)
AND(&&)(與)
OR(||)(或)
XOR(異或)
位運算符
&(按位與/位AND)
|(按位或/位OR)
^(按位異或/位XOR)
~(按位取反)
>>(按位右移)
<<(按位左移)
運算符優先級
正則表達式查詢
^(匹配文本的開始字符)
$(匹配文本的結束字符)
.(匹配任何單個字符)
*(匹配零個或多個在它前面的字符)
+(匹配前面的字符1次或多次)
<字符串>(匹配包含指定的字符串的文本)
[字符集合](匹配字符集合中的任何一個字符)
[^](匹配不在括號中的任何字符)
字符串{n,}(匹配前面的字符串至少n次)
字符串{n,m}(匹配前面的字符串至少n次 至多m次 如果n為0 此參數為可選參數)
排序與分頁
排序(ORDER BY)
ASC(升序)
DESC(降序)
多列排序(多級排序)
首先根據age升序 如果age相同的根據name升序
分頁(LIMIT)
note
表關系
一對一
一對多
多對多
多表查詢(關聯查詢)
等值連接/非等值連接
自連接/非自連接
內連接(INNER JOIN)/外連接(OUTER JOIN)
note
UNION(合并查詢結果)
UNION
UNION ALL
7種SQL JOINS
中圖:內連接 A∩B
左上圖:左外連接
右上圖:右外連接
左中圖:A - A∩B
右中圖:B-A∩B
右下圖
左中圖 + 右中圖 A ∪B- A∩B 或者 (A - A∩B) ∪ (B - A∩B)
語法格式
函數
內置函數
單行函數
數值函數
字符串函數
日期/時間函數
流程控制函數
加密與解密函數
信息函數
其他函數
聚合函數
AVG(平均值)
SUM(和值)
MAX(最大值)
MIN(最小值)
COUNT(計數)
GROUP BY
note
其它
DUAL(偽表)
笛卡爾積(交叉連接)
數據導入與導出
規則與規范
常見問題
安裝
官網下載最新的版本 mysql community server 選擇對應的版本
windows建議下載msi格式安裝包 Linux下載tar.gz包
卸載
Windows系統
停止服務
通過管理服務停止mysql服務
刪除
- 通過控制面板卸載
- 通過360等工具卸載
- 通過mysql提供的工具卸載
如果想徹底刪除可以刪除mysql數據文件(配置文件、數據庫和表等文件)、環境變量、注冊表(可選,用于早期的版本)
完成上述步驟后如果即時要重裝MySQL時最好重啟下電腦
Linux系統
查看版本
mysql -V
連接登錄
mysql -uroot -p mysql -uroot -p123456 -hlocalhost -P3306 # 指定ip地址和端口
數據庫
查看所有數據庫
show databases;
選擇數據庫
use db1;
創建數據庫
create database db1;
刪除數據庫
drop database db1;
修改數據庫
數據庫結構信息
show create database db1;
查看編碼
show variables like 'character_%'; show variables like 'collation_%';
表
查看所有表
show tables;
創建表
create table tb1(id int, name varchar(20));
刪除表
drop table tb1;
修改表
修改表字符編碼
alter table tb1 charset utf8mb4;
查看表結構信息
查看創建語句、表信息
show create table tb1;
查看表結構(字段)信息
DESC tb1;
CREATE增
insert into tb1 values(1, "hongzhenying");
DELETE刪
UPDATE改
SELECT查
as別名
可以使用空格/as定義
select username name,userage as age,usersex "user sex" from users;
DISTINCT去重
單字段去重
SELECT DISTINCT `name` FROM tb1;
多字段去重 默認為多字段聯合唯一
SELECT DISTINCT `sex`,`age` FROM tb1;
空值null
null不等于0/""/"/'null' 代表為空 參與運算時結果也為null
``反引號
``可用于強調內容不是關鍵字如order是一張表
select * from `order`;
常數
常數會作為一列填充
SELECT sex,age,"歌手" FROM tb1;
WHERE過濾
SELECT * FROM tb1 WHERE age = 18;
運算符
+、-、*、/(DIV)、%(MOD)、>、<、=
可在sql中使用加減乘除等運算符
SELECT `sex`, age * 0.5 age FROM tb1;
比較運算符
=
等于
<=>
安全的等于 針對Null使用
SELECT * FROM tb1 WHERE age = NULL; # age為Null的不會查詢到 SELECT * FROM tb1 WHERE age <=> NULL; # 等于 SELECT * FROM tb1 WHERE age is NULL; 都可以查詢為Null的數據
<>
!=
<
<=
>
>=
like(模糊查詢)
直接使用like效果等于=
SELECT * FROM `users` WHERE name LIKE "周杰倫";
%like% 包含'周'字的
SELECT * FROM `users` WHERE name LIKE "%周%";
%like 以'周'字結尾的
SELECT * FROM `users` WHERE name LIKE "%周";
like% 以'周'字開始的
SELECT * FROM `users` WHERE name LIKE "周%";
_ 占位符 查詢第二個字符為'杰'的 多個字符可用多個_占位
SELECT * FROM `users` WHERE name LIKE "_杰%";
\轉義_ 查詢第二個字符為'杰'的且第三個字符為'_'
SELECT * FROM `users` WHERE name LIKE "_杰\_%";
ISNULL
ISNULL是一個函數
IS NULL
查詢age為Null的
SELECT * FROM tb1 WHERE age is NULL;
IS NOT NULL
查詢age不為Null的
SELECT * FROM tb1 WHERE age IS NOT NULL;
LEAST最小的
查詢最小的
SELECT LEAST('a','b','c');
GREATEST最大的
查詢最大的
SELECT GREATEST('a',1,'c');
BETWEEN AND(在之間)
select * from tb1 where age between 8 and 18;
in(在)/not in
select * from tb1 where age in (18);
and/or
運算符
算術運算符
+(加)
-(減)
*(乘)
/(DIV)(除)
%(MOD)(取模)
比較運算符
=(等于)
<=>(安全等于)
<>(!=)(不等于)
<(小于)
<=(小于等于)
>(大于)
>=(大于等于)
邏輯運算符
NOT(!)(非)
AND(&&)(與)
OR(||)(或)
XOR(異或)
位運算符
&(按位與/位AND)
|(按位或/位OR)
^(按位異或/位XOR)
~(按位取反)
>>(按位右移)
<<(按位左移)
運算符優先級
正則表達式查詢
^(匹配文本的開始字符)
$(匹配文本的結束字符)
.(匹配任何單個字符)
*(匹配零個或多個在它前面的字符)
+(匹配前面的字符1次或多次)
<字符串>(匹配包含指定的字符串的文本)
[字符集合](匹配字符集合中的任何一個字符)
[^](匹配不在括號中的任何字符)
字符串{n,}(匹配前面的字符串至少n次)
字符串{n,m}(匹配前面的字符串至少n次 至多m次 如果n為0 此參數為可選參數)
正則表達式通常被用來檢索或替換那些符合某個模式的文本內容,根據指定的匹配模式匹配文本中符合
要求的特殊字符串。例如,從一個文本文件中提取電話號碼,查找一篇文章中重復的單詞或者替換用戶
輸入的某些敏感詞語等,這些地方都可以使用正則表達式。正則表達式強大而且靈活,可以應用于非常
復雜的查詢。
MySQL中使用REGEXP關鍵字指定正則表達式的字符匹配模式。下表列出了REGEXP操作符中常用字符匹配
列表
排序與分頁
排序(ORDER BY)
使用ORDER BY啟用排序 ASC/DESC來指定規則 默認ASC
ASC(升序)
從小到大排序
SELECT * FROM `users` ORDER BY age ASC;
DESC(降序)
從大到小排序
SELECT * FROM `users` ORDER BY age DESC;
單列排序(一級排序)
根據age升序
SELECT * FROM `users` ORDER BY age ASC;
多列排序(多級排序)
首先根據age升序 如果age相同的根據name降序
SELECT * FROM `users` ORDER BY age ASC, name DESC;
首先根據age升序 如果age相同的根據name升序
SELECT * FROM `users` ORDER BY age,name ASC;
分頁(LIMIT)
公式:LIMIT (pageNum-1) * pageSize, pageSize
LIMIT m, n LIMIT 從第m條開始, 取n條數據
每頁顯示10條數據 獲取第一頁數據
SELECT * FROM `users` LIMIT 0,10;
每頁顯示10條數據 獲取第二頁數據
SELECT * FROM `users` LIMIT 10,10;
note
順序
FROM ... ORDER BY ... LIMIT
MySQL8.x新特性OFFSET
LIMIT 2,10 等于 LIMIT 10 OFFSET 2
表關系
一對一
一表對一表
自關聯
一對多
多對多
多表查詢(關聯查詢)
建議對于數據庫中表記錄的查詢和變更,只要涉及多個表,都需要在列名前加表的別名(或表名)進行限定。對多表進行查詢記錄、更新記錄、刪除記錄時,如果對操作列沒有限定表的別名(或表名),并且操作列在多個表中存在時,就會拋異常。
等值連接/非等值連接
等值連接
不同的表使用值是否一致(=)比較連接 n個表,至少需要n-1個連接條件。比如,連接三個表,至少需要兩個連接條件。
SELECT * FROM users u,dep d WHERE u.name = d.name; # SELECT * FROM users AS u,dep AS d WHERE u.name = d.name;
非等值連接
不是(=)的條件 過濾查詢
查詢users表中age范圍在students表中的min_age與max_age范圍內數據
SELECT * FROM users AS u,students AS s WHERE u.age BETWEEN s.min_age AND s.max_age;
自連接/非自連接
內連接(INNER JOIN)/外連接(OUTER JOIN)
內連接: 合并具有同一列的兩個以上的表的行, 結果集中不包含一個表與另一個表不匹配的行
外連接: 兩個表在連接過程中除了返回滿足連接條件的行以外還返回左(或右)表中不滿足條件的
行 ,這種連接稱為左(或右) 外連接。沒有匹配的行時, 結果表中相應的列為空(NULL)。
如果是左外連接,則連接條件中左邊的表也稱為 主表 ,右邊的表稱為 從表 。
如果是右外連接,則連接條件中右邊的表也稱為 主表 ,左邊的表稱為 從表 。合并具有同一列的兩個以上的表的行, 結果集中不包含一個表與另一個表不匹配的行
SELECT CONCAT(u.name, "--", u1.name) FROM users AS u,users AS u1 WHERE u.id = u1.id;
note
表連接的約束條件可以有三種方式:WHERE, ON, USING
WHERE:適用于所有關聯查詢
ON :只能和JOIN一起使用,只能寫關聯條件。雖然關聯條件可以并到WHERE中和其他條件一起
寫,但分開寫可讀性更好。
USING:只能和JOIN一起使用,而且要求兩個關聯字段在關聯表中名稱一致,而且只能表示關聯字
段值相等
UNION(合并查詢結果)
合并查詢結果 利用UNION關鍵字,可以給出多條SELECT語句,并將它們的結果組合成單個結果集。合并
時,兩個表對應的列數和數據類型必須相同,并且相互對應。各個SELECT語句之間使用UNION或UNION
ALL關鍵字分隔。
UNION
UNION會去重
SELECT * FROM users UNION SELECT * FROM users;
UNION ALL
UNION ALL不去重
SELECT * FROM users UNION ALL SELECT * FROM users;
7種SQL JOINS
中圖:內連接 A∩B
SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`;
左上圖:左外連接
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`;
右上圖:右外連接
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;
左中圖:A - A∩B
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
右中圖:B-A∩B
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL #沒有去重操作,效率高
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;
右下圖
左中圖 + 右中圖 A ∪B- A∩B 或者 (A - A∩B) ∪ (B - A∩B)
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL
語法格式
函數
SQL提供了內置函數 另外可以自定義函數
內置函數
MySQL提供的內置函數從 實現的功能角度 可以分為數值函數、字符串函數、日期和時間函數、流程控制
函數、加密與解密函數、獲取MySQL信息函數、聚合函數等。根據功能可分為單行函數和聚合函數
單行函數
數值函數
基本函數
| 函數 | 用法 | 
| ABS(x) | 返回x的絕對值 | 
| SIGN(X) | 返回X的符號。正數返回1,負數返回-1,0返回0 | 
| PI() | 返回圓周率的值 | 
| CEIL(x),CEILING(x) | 返回大于或等于某個值的最小整數 | 
| FLOOR(x) | 返回小于或等于某個值的最大整數 | 
| LEAST(e1,e2,e3…) | 返回列表中的最小值 | 
| GREATEST(e1,e2,e3…) | 返回列表中的最大值 | 
| MOD(x,y) | 返回X除以Y后的余數 | 
| RAND() | 返回0~1的隨機值 | 
| RAND(x) | 返回0~1的隨機值,其中x的值用作種子值,相同的X值會產生相同的隨機 數 | 
| ROUND(x) | 返回一個對x的值進行四舍五入后,最接近于X的整數 | 
| ROUND(x,y) | 返回一個對x的值進行四舍五入后最接近X的值,并保留到小數點后面Y位 | 
| TRUNCATE(x,y) | 返回數字x截斷為y位小數的結果 | 
| SQRT(x) | 返回x的平方根。當X的值為負數時,返回NULL | 
e.g.
SELECT ABS(-123),ABS(32),SIGN(-23),SIGN(43),SIGN(0),PI(),CEIL(32.32),CEILING(-43.23),FLOOR(32.32),FLOOR(-43.23),FLOOR(-43.91),MOD(12,5) FROM DUAL;
SELECT RAND(),RAND(),RAND(10),RAND(10),RAND(-1),RAND(-1) FROM DUAL;
SELECT ROUND(12.33),ROUND(12.343,2),ROUND(12.324,-1),TRUNCATE(12.66,1),TRUNCATE(12.66,-1) FROM DUAL;
| 函數 | 用法 | 
| RADIANS(x) | 將角度轉化為弧度,其中,參數x為角度值 | 
| DEGREES(x) | 將弧度轉化為角度,其中,參數x為弧度值 | 
e.g.
SELECT RADIANS(30),RADIANS(60),RADIANS(90),DEGREES(2*PI()),DEGREES(RADIANS(90)) FROM DUAL;
三角函數
| 函數 | 用法 | 
| SIN(x) | 返回x的正弦值,其中,參數x為弧度值 | 
| ASIN(x) | 返回x的反正弦值,即獲取正弦為x的值。如果x的值不在-1到1之間,則返回NULL | 
| COS(x) | 返回x的余弦值,其中,參數x為弧度值 | 
| ACOS(x) | 返回x的反余弦值,即獲取余弦為x的值。如果x的值不在-1到1之間,則返回NULL | 
| TAN(x) | 返回x的正切值,其中,參數x為弧度值 | 
| ATAN(x) | 返回x的反正切值,即返回正切值為x的值 | 
| ATAN2(m,n) | 返回兩個參數的反正切值 | 
| COT(x) | 返回x的余切值,其中,X為弧度值 | 
e.g.
SELECT SIN(RADIANS(30)),DEGREES(ASIN(1)),TAN(RADIANS(45)),DEGREES(ATAN(1)),DEGREES(ATAN2(1,1)) FROM DUAL;
科學函數
| 函數 | 用法 | 
| POW(x,y),POWER(X,Y) | 返回x的y次方 | 
| EXP(X) | 返回e的X次方,其中e是一個常數,2.718281828459045 | 
| LN(X),LOG(X) | 返回以e為底的X的對數,當X <= 0 時,返回的結果為NULL | 
| LOG10(X) | 返回以10為底的X的對數,當X <= 0 時,返回的結果為NULL | 
| LOG2(X) | 返回以2為底的X的對數,當X <= 0 時,返回NULL | 
e.g.
SELECT POW(2,5),POWER(2,4),EXP(2),LN(10),LOG10(10),LOG2(4) FROM DUAL;
進制轉換
| 函數 | 用法 | 
| BIN(x) | 返回x的二進制編碼 | 
| HEX(x) | 返回x的十六進制編碼 | 
| OCT(x) | 返回x的八進制編碼 | 
| CONV(x,f1,f2) | 返回f1進制數變成f2進制數 | 
e.g.
SELECT BIN(10),HEX(10),OCT(10),CONV(10,2,8) FROM DUAL;
字符串函數
MySQL中,字符串的位置是從1開始的。
| 函數 | 用法 | 
| ASCII(S) | 返回字符串S中的第一個字符的ASCII碼值 | 
| CHAR_LENGTH(s) | 返回字符串s的字符數。作用與CHARACTER_LENGTH(s)相同 | 
| LENGTH(s) | 返回字符串s的字節數,和字符集有關 | 
| CONCAT(s1,s2,......,sn) | 連接s1,s2,......,sn為一個字符串 | 
| CONCAT_WS(x, s1,s2,......,sn) | 同CONCAT(s1,s2,...)函數,但是每個字符串之間要加上x | 
| INSERT(str, idx, len, replacestr) | 將字符串str從第idx位置開始,len個字符長的子串替換為字符串replacestr | 
| REPLACE(str, a, b) | 用字符串b替換字符串str中所有出現的字符串a | 
| UPPER(s) 或 UCASE(s) | 將字符串s的所有字母轉成大寫字母 | 
| LOWER(s) 或LCASE(s) | 將字符串s的所有字母轉成小寫字母 | 
| LEFT(str,n) | 返回字符串str最左邊的n個字符 | 
| RIGHT(str,n) | 返回字符串str最右邊的n個字符 | 
| LPAD(str, len, pad) | 用字符串pad對str最左邊進行填充,直到str的長度為len個字符 | 
| RPAD(str ,len, pad) | 用字符串pad對str最右邊進行填充,直到str的長度為len個字符 | 
| LTRIM(s) | 去掉字符串s左側的空格 | 
| RTRIM(s) | 去掉字符串s右側的空格 | 
| TRIM(s) | 去掉字符串s開始與結尾的空格 | 
| TRIM(s1 FROM s) | 去掉字符串s開始與結尾的s1 | 
| TRIM(LEADING s1 FROM s) | 去掉字符串s開始處的s1 | 
| TRIM(TRAILING s1 FROM s) | 去掉字符串s結尾處的s1 | 
| REPEAT(str, n) | 返回str重復n次的結果 | 
| SPACE(n) | 返回n個空格 | 
| STRCMP(s1,s2) | 比較字符串s1,s2的ASCII碼值的大小 | 
| SUBSTR(s,index,len) | 返回從字符串s的index位置其len個字符,作用與SUBSTRING(s,n,len)、 MID(s,n,len)相同 | 
| LOCATE(substr,str) | 返回字符串substr在字符串str中首次出現的位置,作用于POSITION(substr IN str)、INSTR(str,substr)相同。未找到,返回0 | 
| ELT(m,s1,s2,…,sn) | 返回指定位置的字符串,如果m=1,則返回s1,如果m=2,則返回s2,如 果m=n,則返回sn | 
| FIELD(s,s1,s2,…,sn) | 返回字符串s在字符串列表中第一次出現的位置 | 
| FIND_IN_SET(s1,s2) | 返回字符串s1在字符串s2中出現的位置。其中,字符串s2是一個以逗號分隔的字符串 | 
| REVERSE(s) | 返回s反轉后的字符串 | 
| NULLIF(value1,value2) | 比較兩個字符串,如果value1與value2相等,則返回NULL,否則返回value1 | 
e.g.
SELECT FIELD('mm','hello','msm','amma'),FIND_IN_SET('mm','hello,mm,amma') FROM DUAL;
SELECT NULLIF('mysql','mysql'),NULLIF('mysql', '') FROM DUAL;
日期/時間函數
| 函數 | 用法 | 
| CURDATE() ,CURRENT_DATE() | 返回當前日期,只包含年、 月、日 | 
| CURTIME() , CURRENT_TIME() | 返回當前時間,只包含時、 分、秒 | 
| NOW() / SYSDATE() / CURRENT_TIMESTAMP() / LOCALTIME() / LOCALTIMESTAMP() | 返回當前系統日期和時間 | 
| UTC_DATE() | 返回UTC(世界標準時間) 日期 | 
| UTC_TIME() | 返回UTC(世界標準時間) 時間 | 
日期與時間戳的轉換
| 函數 | 用法 | 
| UNIX_TIMESTAMP() | 以UNIX時間戳的形式返回當前時間。SELECT UNIX_TIMESTAMP() - >1634348884 | 
| UNIX_TIMESTAMP(date) | 將時間date以UNIX時間戳的形式返回。 | 
| FROM_UNIXTIME(timestamp) | 將UNIX時間戳的時間轉換為普通格式的時間 | 
e.g.
SELECT UNIX_TIMESTAMP(now()); SELECT UNIX_TIMESTAMP(CURDATE()); SELECT UNIX_TIMESTAMP(CURTIME()); SELECT UNIX_TIMESTAMP('2011-11-11 11:11:11');
月份、星期、星期數、天數等函數
| 函數 | 用法 | 
| YEAR(date) / MONTH(date) / DAY(date) | 返回具體的日期值 | 
| HOUR(time) / MINUTE(time) / SECOND(time) | 返回具體的時間值 | 
| MONTHNAME(date) | 返回月份:January,... | 
| DAYNAME(date) | 返回星期幾:MONDAY,TUESDAY.....SUNDAY | 
| WEEKDAY(date) | 返回周幾,注意,周1是0,周2是1,。。。周日是6 | 
| QUARTER(date) | 返回日期對應的季度,范圍為1~4 | 
| WEEK(date) , WEEKOFYEAR(date) | 返回一年中的第幾周 | 
| DAYOFYEAR(date) | 返回日期是一年中的第幾天 | 
| DAYOFMONTH(date) | 返回日期位于所在月份的第幾天 | 
| DAYOFWEEK(date) | 返回周幾,注意:周日是1,周一是2,。。。周六是 7 | 
日期的操作函數
| 函數 | 用法 | 
| EXTRACT(type FROM date) | 返回指定日期中特定的部分,type指定返回的值 | 
EXTRACT(type FROM date)函數中type的取值與含義
e.g.
SELECT EXTRACT(MINUTE FROM NOW()),EXTRACT( WEEK FROM NOW()),EXTRACT( QUARTER FROM NOW()),EXTRACT( MINUTE_SECOND FROM NOW()) FROM DUAL;
時間和秒轉換的函數
| 函數 | 用法 | 
| TIME_TO_SEC(time) | 將 time 轉化為秒并返回結果值。轉化的公式為: 小時*3600+分鐘 *60+秒 | 
| SEC_TO_TIME(seconds) | 將 seconds 描述轉化為包含小時、分鐘和秒的時間 | 
計算日期和時間的函數
| 函數 | 用法 | 
| DATE_ADD(datetime, INTERVAL expr type), ADDDATE(date,INTERVAL expr type) | 返回與給定日期時間相差INTERVAL時 間段的日期時間 | 
| DATE_SUB(date,INTERVAL expr type), SUBDATE(date,INTERVAL expr type) | 返回與date相差INTERVAL時間間隔的 日期 | 
| 函數 | 用法 | 
| ADDTIME(time1,time2) | 返回time1加上time2的時間。當time2為一個數字時,代表的是 秒 ,可以為負數 | 
| SUBTIME(time1,time2) | 返回time1減去time2后的時間。當time2為一個數字時,代表的 是 秒 ,可以為負數 | 
| DATEDIFF(date1,date2) | 返回date1 - date2的日期間隔天數 | 
| TIMEDIFF(time1, time2) | 返回time1 - time2的時間間隔 | 
| FROM_DAYS(N) | 返回從0000年1月1日起,N天以后的日期 | 
| TO_DAYS(date) | 返回日期date距離0000年1月1日的天數 | 
| LAST_DAY(date) | 返回date所在月份的最后一天的日期 | 
| MAKEDATE(year,n) | 針對給定年份與所在年份中的天數返回一個日期 | 
| MAKETIME(hour,minute,second) | 將給定的小時、分鐘和秒組合成時間并返回 | 
| PERIOD_ADD(time,n) | 返回time加上n后的時間 | 
e.g.
SELECT ADDTIME( NOW( ), 20 ), SUBTIME( NOW( ), 30 ), SUBTIME( NOW( ), '1:1:3' ), DATEDIFF( NOW( ), '2021-10- 01' ), TIMEDIFF( NOW( ), '2021-10-25 22:10:10' ), FROM_DAYS( 366 ), TO_DAYS( '0000-12-25' ), LAST_DAY( NOW( ) ), MAKEDATE( YEAR ( NOW( ) ), 12 ), MAKETIME( 10, 21, 23 ), PERIOD_ADD( 20200101010101, 10 ) FROM DUAL;
日期的格式化與解析
| 函數 | 用法 | 
| DATE_FORMAT(date,fmt) | 按照字符串fmt格式化日期date值 | 
| TIME_FORMAT(time,fmt) | 按照字符串fmt格式化時間time值 | 
| GET_FORMAT(date_type,format_type) | 返回日期字符串的顯示格式 | 
| STR_TO_DATE(str, fmt) | 按照字符串fmt對str進行解析,解析為一個日期 | 
流程控制函數
流程處理函數可以根據不同的條件,執行不同的處理流程,可以在SQL語句中實現不同的條件選擇。
MySQL中的流程處理函數主要包括IF()、IFNULL()和CASE()函數。
| 函數 | 用法 | 
| IF(value,value1,value2) | 如果value的值為TRUE,返回value1, 否則返回value2 | 
| IFNULL(value1, value2) | 如果value1不為NULL,返回value1,否 則返回value2 | 
| CASE WHEN 條件1 THEN 結果1 WHEN 條件2 THEN 結果2 .... [ELSE resultn] END | 相當于Java的if...else if...else... | 
| CASE expr WHEN 常量值1 THEN 值1 WHEN 常量值1 THEN 值1 .... [ELSE 值n] END | 相當于Java的switch...case... | 
e.g.
SELECT IF(1 > 0,'正確','錯誤'); # 如果條件成立那么a否則b SELECT IFNULL(null,'Hello Word'); # 如果條件為null那么a SELECT CASE WHEN 1 > 0 THEN '1 > 0' ELSE '3 > 0' END; SELECT CASE 1 WHEN 1 THEN '我是1' WHEN 2 THEN '我是2' ELSE "你是誰" END; SELECT name,score, CASE WHEN score >= 92 THEN "good" WHEN score < 92 AND score > 82 THEN "generiac" ELSE "Come On" END "評級" FROM users;
加密與解密函數
| 函數 | 用法 | 
| PASSWORD(str) | 返回字符串str的加密版本,41位長的字符串。加密結果 不可 逆 ,常用于用戶的密碼加密 | 
| MD5(str) | 返回字符串str的md5加密后的值,也是一種加密方式。若參數為 NULL,則會返回NULL | 
| SHA(str) | 從原明文密碼str計算并返回加密后的密碼字符串,當參數為 NULL時,返回NULL。 SHA加密算法比MD5更加安全 。 | 
| ENCODE(value,password_seed) | 返回使用password_seed作為加密密碼加密value | 
| DECODE(value,password_seed) | 返回使用password_seed作為加密密碼解密value | 
e.g.
SELECT md5('123'); SELECT SHA('Tom123');
信息函數
MySQL中內置了一些可以查詢MySQL信息的函數,這些函數主要用于幫助數據庫開發或運維人員更好地
對數據庫進行維護工作。
| 函數 | 用法 | 
| VERSION() | 返回當前MySQL的版本號 | 
| CONNECTION_ID() | 返回當前MySQL服務器的連接數 | 
| DATABASE(),SCHEMA() | 返回MySQL命令行當前所在的數據庫 | 
| USER(),CURRENT_USER()、SYSTEM_USER(), SESSION_USER() | 返回當前連接MySQL的用戶名,返回結果格式為 “主機名@用戶名” | 
| CHARSET(value) | 返回字符串value自變量的字符集 | 
| COLLATION(value) | 返回字符串value的比較規則 | 
其他函數
| 函數 | 用法 | 
| FORMAT(value,n) | 返回對數字value進行格式化后的結果數據。n表示 四舍五入 后保留 到小數點后n位 | 
| CONV(value,from,to) | 將value的值進行不同進制之間的轉換 | 
| INET_ATON(ipvalue) | 將以點分隔的IP地址轉化為一個數字 | 
| INET_NTOA(value) | 將數字形式的IP地址轉化為以點分隔的IP地址 | 
| BENCHMARK(n,expr) | 將表達式expr重復執行n次。用于測試MySQL處理expr表達式所耗費 的時間 | 
| CONVERT(value USING char_code) | 將value所使用的字符編碼修改為char_code | 
聚合函數
聚合函數作用于一組數據,并對一組數據返回一個值。
AVG(平均值)
可以對數值型數據使用AVG函數
SUM(和值)
可以對數值型數據使用SUM 函數
MAX(最大值)
可以對任意數據類型的數據使用MAX函數
MIN(最小值)
可以對任意數據類型的數據使用MIN函數
COUNT(計數)
COUNT(*)/COUNT(1)/COUNT(列名)
用哪個呢?對于MyISAM引擎的表是沒有區別的。這種引擎內部有一計數器在維護著行數。Innodb引擎的表用count(*),count(1)直接讀行數,復雜度是O(n),因為innodb真的要去數一遍。但好于具體的count(列名)。
count(*)會統計值為 NULL 的行,而 count(列名)不會統計此列為 NULL 值的行
COUNT(*)返回表中記錄總數,適用于任意數據類型
GROUP BY
SELECT列表中所有未包含在組函數中的列都應該包含在GROUP BY子句中 在GROUP BY子句中的列不必包含在SELECT列表中
HAVING
過濾分組
1. 行已經被分組。
2. 使用了聚合函數。
3. 滿足HAVING 子句中條件的分組將被顯示。
4. HAVING 不能單獨使用,必須要跟 GROUP BY 一起使用。
note
WHERE和HAVING的對比
區別1:WHERE 可以直接使用表中的字段作為篩選條件,但不能使用分組中的計算函數作為篩選條件;HAVING 必須要與 GROUP BY 配合使用,可以把分組計算的函數和分組字段作為篩選條件。這決定了,在需要對數據進行分組統計的時候,HAVING 可以完成 WHERE 不能完成的任務。這是因為,在查詢語法結構中,WHERE 在 GROUP BY 之前,所以無法對分組結果進行篩選。HAVING 在 GROUP BY 之后,可以使用分組字段和分組中的計算函數,對分組的結果集進行篩選,這個功能是 WHERE 無法完成的。另外,WHERE排除的記錄不再包括在分組中。
區別2:如果需要通過連接從關聯表中獲取需要的數據,WHERE 是先篩選后連接,而 HAVING 是先連接后篩選。這一點,就決定了在關聯查詢中,WHERE 比 HAVING 更高效。因為 WHERE 可以先篩選,用一個篩選后的較小數據集和關聯表進行連接,這樣占用的資源比較少,執行效率也比較高。HAVING 則需要先把結果集準備好,也就是用未被篩選的數據集進行關聯,然后對這個大的數據集進行篩選,這樣占用的資源就比較多,執行效率也較低。
| ? ? ? ?| 優點 ? ? ? ? ? ? ? ? ? ? ? ? | 缺點 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| ------ | ---------------------------- | -------------------------------------- |
| WHERE ?| 先篩選數據再關聯,執行效率高 | 不能使用分組中的計算函數進行篩選 ? ? ? |
| HAVING | 可以使用分組中的計算函數 ? ? | 在最后的結果集中進行篩選,執行效率較低 |
其它
DUAL(偽表)
select "age",1+1 from DUAL;
笛卡爾積(交叉連接)
笛卡爾乘積是一個數學運算。假設我有兩個集合 X 和 Y,那么 X 和 Y 的笛卡爾積就是 X 和 Y 的所有可能
組合,也就是第一個對象來自于 X,第二個對象來自于 Y 的所有可能。組合的個數即為兩個集合中元素
個數的乘積數。
users表有多條數據 dep表只有一條數據
SELECT * FROM users,dep;
為了避免笛卡爾積 可以加上WHERE連接條件
SELECT * FROM users,dep WHERE users.name = dep.name;
數據導入與導出
source <sql_path>
使用Navicat
規則與規范
字符串類型和日期時間類型的數據使用單引號表示
列的別名盡量使用雙引號表示,不建議省略as
數據庫名、表名、表的別名、變量名是嚴格區分大小寫的
關鍵字、函數名、列名/字段名、列的別名/字段的別名是忽略大小寫的
數據庫名、表名、表的別名、字段名、字段的別名等建議都小寫
SQL關鍵字、函數名、綁定變量等建議都大寫
列的別名只能在ORDER BY排序使用 不能在WHERE使用
常見問題
MySQL8.x采用新的密碼加密方式,如果圖形化工具連接報錯可以升級工具版本或者還原數據庫兼容5.7方式的加密方式,如果是程序的話就要看情況了例如Java有提供對應的依賴插件,Django沒有!
總結
以上是生活随笔為你收集整理的Zhong__MySQL笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 火狐无法安装扩展_立即安装的前5个Fir
- 下一篇: Smarty中文手册
