目錄
1. 數據查詢語言DQL(Data Query Language)
2 .數據操縱語言DML(Data manipulation Language)
3. 數據定義語言DDL(Data Define Language)
2. MySQL表鎖定 - 瞭解如何使用MySQL鎖來協調會話之間的表訪問。
一、 RDBMS關係數據庫管理系統的一些概念
RDBMS | 表示 |
數據庫 | 數據庫是表的集合,具有相關數據 |
表 | 表是用數據矩陣。在一個數據庫中的表看起來就像一個簡單的電子表格 |
列 | 一列(數據元素)包含一個的數據和相同種類,例如,列郵政編碼。行一行(元組,條目或記錄)是一組相關的數據,例如一個訂閱的數據。 |
冗餘 |
存儲數據兩次,冗餘使系統更快。 |
主鍵 | 主鍵是唯一的。不能在一個表中出現的一個鍵兩次。使用鍵可以快速找到一行。 |
複合鍵 | 複合鍵是由多個列,因爲有時一個列是不夠唯一標識鍵的。 |
外鍵 | 外鍵是兩個表之間的連接值。 |
索引 | 在數據庫中的索引類似於索引在一本書(書的目錄)。 |
參照完整性 | 參照完整性可以確保外鍵值總是指向現有的行。 |
其他都很容易理解,索引理解參考這篇文章 深入淺出數據庫索引原理https://www.cnblogs.com/aspwebchh/p/6652855.html
1.聚集索引
大意是,如果給表上了主鍵,那麼表在磁盤上的存儲結構就由整齊排列的結構轉變成了樹狀結構,也就是「平衡樹」結構,換句話說,就是整個表就變成了一個索引。也就是所謂的「聚集索引」。 這就是爲什麼一個表只能有一個主鍵, 一個表只能有一個「聚集索引」,因爲主鍵的作用就是把「表」的數據格式轉換成「索引(平衡樹)」的格式放置。
如運行下面代碼時:
select * from table where id = 1256;
首先根據索引定位到1256這個值所在的葉結點,然後再通過葉結點取到id等於1256的數據行。從上圖能看出,樹一共有三層, 從根節點至葉節點只需要經過三次查找就能得到結果。
索引能讓數據庫查詢數據的速度上升, 但會使寫入數據的速度下降, 因爲平衡樹這個結構必須一直維持在一個正確的狀態, 增刪改數據都會改變平衡樹各節點中的索引數據內容,破壞樹結構, 因此,在每次數據改變時, DBMS(數據庫管理系統)必須去重新梳理樹(索引)的結構以確保它的正確,這會帶來不小的性能開銷,也就是爲什麼索引會給查詢以外的操作帶來副作用的原因。
2.非聚集索引
非聚集所以就是我們平時經常提起和使用的常規索引,非聚集索引和聚集索引一樣, 同樣是採用平衡樹作爲索引的數據結構。索引樹結構中各節點的值來自於表中的索引字段, 假如給user表的name字段加上索引 , 那麼索引就是由name字段中的值構成,在數據改變時, DBMS需要一直維護索引結構的正確性。如果給表中多個字段加上索引 , 那麼就會出現多個獨立的索引結構,每個索引(非聚集索引)互相之間不存在關聯。
每次給字段建一個新索引, 字段中的數據就會被複制一份出來, 用於生成索引。 因此,給表添加索引,會增加表的體積,佔用磁盤存儲空間。
非聚集索引和聚集索引的區別在於,通過聚集索引可以查到需要查找的數據,而通過非聚集索引可以查到記錄對應的主鍵值 ,再使用主鍵的值通過聚集索引查找到需要的數據,如下圖。
不管以任何方式查詢表, 最終都會利用主鍵通過聚集索引來定位到數據, 聚集索引(主鍵)是通往真實數據所在的唯一路徑。
3.覆蓋索引
然而, 有一種例外可以不使用聚集索引就能查詢出所需要的數據, 這種非主流的方法 稱之爲「覆蓋索引」查詢, 也就是平時所說的複合索引或者多字段索引查詢。 文章上面的內容已經指出, 當爲字段建立索引以後, 字段中的內容會被同步到索引之中, 如果爲一個索引指定兩個字段, 那麼這個兩個字段的內容都會被同步至索引之中。
先看下面這個SQL語句
//建立索引
create index index_birthday on user_info(birthday);
//查詢生日在1991年11月1日出生用戶的用戶名
select user_name from user_info where birthday = '1991-11-1'
這句SQL語句的執行過程如下
- 通過非聚集索引index_birthday查找birthday等於1991-11-1的所有記錄的主鍵ID值
- 通過得到的主鍵ID值執行聚集索引查找,找到主鍵ID值對應的真實數據(數據行)存儲的位置
- 最後, 從得到的真實數據中取得user_name字段的值返回, 也就是取得最終的結果
我們把birthday字段上的索引改成雙字段的覆蓋索引
create index index_birthday_and_user_name on user_info(birthday, user_name);
這句SQL語句的執行過程就會變爲
- 通過非聚集索引index_birthday_and_user_name查找birthday等於1991-11-1的葉節點的內容,
- 葉節點中除了有user_name表主鍵ID的值以外, user_name字段的值也在裏面, 不需要通過主鍵ID值的查找數據行的真實所在
- 直接取得葉節點中user_name的值返回
通過這種覆蓋索引直接查找的方式, 可以省略不使用覆蓋索引查找的後面兩個步驟, 提高了查詢性能。
二、MySQL存儲引擎
轉載自:https://www.cnblogs.com/andy6/p/5789248.html
1.什麼是存儲引擎
MySQL中的數據用各種不同的技術存儲在文件(或者內存)中。
這些技術中的每一種技術都使用不同的存儲機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。
通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能。
例如,如果你在研究大量的臨時數據,你也許需要使用內存MySQL存儲引擎。內存存儲引擎能夠在內存中存儲所有的表格數據。又或者,你也許需要一個支持事務處理的數據庫(以確保事務處理不成功時數據的回退能力)。
這些不同的技術以及配套的相關功能在 MySQL中被稱作存儲引擎(也稱作表類型)。
MySQL默認配置了許多不同的存儲引擎,可以預先設置或者在MySQL服務器中啓用。
你可以選擇適用於服務器、數據庫和表格的存儲引擎,以便在選擇如何存儲你的信息、如何檢索這些信息以及你需要你的數據結合什麼性能和功能的時候爲你提供最大的靈活性。
2.mysql命令查看MySQL支持的引擎
show engines;
3 主要的MySQL引擎
https://www.cnblogs.com/andy6/p/5789248.html
二、數據類型
參考:
http://www.cnblogs.com/zbseoag/archive/2013/03/19/2970004.html
http://www.runoob.com/mysql/mysql-data-types.html
MySQL支持多種類型,大致可以分爲三類:數值、日期/時間和字符串(字符)類型。
1.數值:
類型 | 大小 | 範圍(有符號) | 範圍(無符號) | 用途 |
---|---|---|---|---|
TINYINT | 1 字節 | (-128,127) | (0,255) | 小整數值 |
SMALLINT | 2 字節 | (-32 768,32 767) | (0,65 535) | 大整數值 |
MEDIUMINT | 3 字節 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整數值 |
INT或INTEGER | 4 字節 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整數值 |
BIGINT | 8 字節 | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 極大整數值 |
FLOAT | 4 字節 | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 單精度 浮點數值 |
DOUBLE | 8 字節 | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 雙精度 浮點數值 |
DECIMAL | 對DECIMAL(M,D) ,如果M>D,爲M+2否則爲D+2 | 依賴於M和D的值 | 依賴於M和D的值 | 小數值 |
取值範圍如果加了unsigned,則最大值翻倍,如 tinyint unsigned 的取值範圍爲(0~256)。
int(m)裏的m是表示SELECT查詢結果集中的顯示寬度,並不影響實際的取值範圍,沒有影響到顯示的寬度,不知道這個m有什麼用。
2.日期/時間
類型 | 大小 (字節) |
範圍 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 時間值或持續時間 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和時間值 |
TIMESTAMP | 4 |
1970-01-01 00:00:00/2038 結束時間是第 2147483647 秒,北京時間 2038-1-19 11:14:07,格林尼治時間 2038年1月19日 凌晨 03:14:07 |
YYYYMMDD HHMMSS | 混合日期和時間值,時間戳 |
若定義一個字段爲timestamp,這個字段裏的時間數據會隨其他字段修改的時候自動刷新,所以這個數據類型的字段可以存放這條記錄最後被修改的時間。
3.字符串(字符)類型
類型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字節 | 定長字符串 |
VARCHAR | 0-65535 字節 | 變長字符串 |
TINYBLOB | 0-255字節 | 變長 不超過 255 個字符的二進制字符串 |
TINYTEXT | 0-255字節 | 變長 短文本字符串 |
BLOB | 0-65 535字節 | 變長 二進制形式的長文本數據 |
TEXT | 0-65 535字節 | 變長 長文本數據 |
MEDIUMBLOB | 0-16 777 215字節 | 變長 二進制形式的中等長度文本數據 |
MEDIUMTEXT | 0-16 777 215字節 | 變長 中等長度文本數據 |
LONGBLOB | 0-4 294 967 295字節 | 變長 二進制形式的極大文本數據 |
LONGTEXT | 0-4 294 967 295字節 | 變長 極大文本數據 |
1、一個漢字佔多少長度與編碼有關:
UTF-8:一個漢字=3個字節
GBK:一個漢字=2個字節
2、varchar(n) 表示 n 個字符,無論漢字和英文,Mysql 都能存入 n 個字符,僅是實際字節長度有所區別
3、MySQL 檢查長度,可用 SQL 語言來查看:
select LENGTH(fieldname) from tablename
char 和 varchar:
- 1.char(n) 若存入字符數小於n,則以空格補於其後,查詢之時再將空格去掉。所以 char 類型存儲的字符串末尾不能有空格,varchar 不限於此。
- 2.char(n) 固定長度,char(4) 不管是存入幾個字符,都將佔用 4 個字節,varchar 是存入的實際字符數 +1 個字節(n<=255)或2個字節(n>255),所以 varchar(4),存入 3 個字符將佔用 4 個字節。
- 3.char 類型的字符串檢索速度要比 varchar 類型的快。
varchar 和 text:
- 1.varchar 可指定 n,text 不能指定,內部存儲 varchar 是存入的實際字符數 +1 個字節(n<=255)或 2 個字節(n>255),text 是實際字符數 +2 個字節。
- 2.text 類型不能有默認值。
- 3.varchar 可直接創建索引,text 創建索引要指定前多少個字符。varchar 查詢速度快於 text, 在都創建索引的情況下,text 的索引似乎不起作用。
4.數據類型的屬性
MySQL關鍵字 | 含義 |
NULL | 數據列可包含NULL值 |
NOT NULL | 數據列不允許包含NULL值 |
DEFAULT | 默認值 |
PRIMARY KEY | 主鍵 |
AUTO_INCREMENT | 自動遞增,適用於整數類型 |
UNSIGNED | 無符號 |
CHARACTER SET name | 指定一個字符集 |
三、數據庫
1.創建RUNOOB數據庫
DROP DATABASE IF EXISTS RUNOOB;
create DATABASE RUNOOB;
- 如果數據庫不存在則創建,存在則不創建。
- 創建RUNOOB數據庫,並設定編碼集爲utf8
CREATE DATABASE IF NOT EXISTS RUNOOB DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
2.刪除數據庫
drop database RUNOOB;
3.使用數據庫
use RUNOOB;
四、數據表 操作
1.創建表
包括:
- 表的名稱
- 字段名稱
- 定義每個字段(類型、長度等)
字段間用逗號,每個sql語句結束用分號
創建student表
CREATE TABLE IF NOT EXISTS student(
stu_id INT UNSIGNED auto_increment,
stu_name VARCHAR(100) NOT NULL,
stu_adress VARCHAR(100) NOT NULL,
stu_bir DATE,
PRIMARY KEY (stu_id)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
- PRIMARY KEY關鍵字用於定義列爲主鍵。 可以使用多列來定義主鍵,列間以逗號分隔。
- ENGINE=INNODB 表示將數據庫的引擎設置爲InnoDB,從MySQL 5.6開始默認使用該引擎。
- DEFAULT CHARSET=utf8表示設置數據庫的默認字符集爲utf8
參考:innodb存儲引擎: https://www.cnblogs.com/Aiapple/p/5689634.html
注意當用到反單引號時:
CREATE TABLE IF NOT EXISTS `runoob_tbl`(
`runoob_id` INT UNSIGNED AUTO_INCREMENT,
`runoob_title` VARCHAR(100) NOT NULL,
`runoob_author` VARCHAR(40) NOT NULL,
`submission_date` DATE,
PRIMARY KEY ( `runoob_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
創建 MySql 的表時,表名和字段名外面的符號 ` 不是單引號,而是英文輸入法狀態下的反單引號,也就是鍵盤左上角 esc 按鍵下面的那一個 ~ 按鍵。反引號是爲了區分 MySql 關鍵字與普通字符而引入的符號,一般的,表名與字段名都使用反引號。
2.刪除表/刪除表內數據
(1)刪除表和數據 drop
刪除表全部數據和表結構,立刻釋放磁盤空間,不管是 Innodb 和 MyISAM;
DROP TABLE IF EXISTS student;
(2) 刪除表全部數據 truncate
關鍵字不區分大小寫,表名和字段名等區分大小寫。
刪除表全部數據,保留表結構,立刻釋放磁盤空間 ,不管是 Innodb 和 MyISAM;
truncate table student;
(3)刪除表全部數據,表結構不變,對於 MyISAM 會立刻釋放磁盤空間,InnoDB 不會釋放磁盤空間;
delete from student;
(4) 部分刪除、帶條件的刪除,表結構不變,不管是 innodb 還是 MyISAM 都不會釋放磁盤空間;實例:
delete from student where T_name = "張三";
(5)delete 操作以後,使用optimize table table_name;會立刻釋放磁盤空間,不管是 innodb 還是 myisam;
實例,刪除學生表中姓名爲 "張三" 的數據:
delete from student where T_name = "張三";
optimize table student;
delete from 表以後雖然未釋放磁盤空間,但是下次插入數據的時候,仍然可以使用這部分空間。
五、SQL語言
SQL語言共分爲四大類:數據查詢語言DQL,數據操縱語言DML,數據定義語言DDL,數據控制語言DCL。
參考:https://blog.csdn.net/weixin_42077001/article/details/80726055
1. 數據查詢語言DQL(Data Query Language)
數據查詢語言DQL基本結構是由SELECT子句,FROM子句,WHERE
子句組成的查詢塊:
SELECT <字段名錶>
FROM <表或視圖名>
WHERE <查詢條件>
2 .數據操縱語言DML(Data manipulation Language)
數據操縱語言DML主要有三種形式:
1) 插入:INSERT
2) 更新:UPDATE
3) 刪除:DELETE
3. 數據定義語言DDL(Data Define Language)
數據定義語言DDL用來創建數據庫中的各種對象-----表、視圖、索引、同義詞、聚簇等如:
CREATE TABLE/VIEW/INDEX/SYN/CLUSTER| | | | |表 視圖 索引 同義詞 簇
DDL操作是隱性提交的!不能rollback
4. 數據控制語言DCL
數據控制語言DCL用來授予或回收訪問數據庫的某種特權,並控制數據庫操縱事務發生的時間及效果,對數據庫實行監視等。如:
1) GRANT:授權。
2) ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一點。
回滾---ROLLBACK
回滾命令使數據庫狀態回到上次最後提交的狀態。其格式爲:
SQL>ROLLBACK;
3) COMMIT [WORK]:提交。
在數據庫的插入、刪除和修改操作時,只有當事務在提交到數據庫時纔算完成。在事務提交前,只有操作數據庫的這個人才能有權看到所做的事情,別人只有在最後提交完成後纔可以看到。提交數據有三種類型:顯式提交、隱式提交及自動提交。下面分
別說明這三種類型。
(1) 顯式提交
用COMMIT命令直接完成的提交爲顯式提交。其格式爲:
SQL>COMMIT;
(2) 隱式提交
用SQL命令間接完成的提交爲隱式提交。這些命令是:
ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,
EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。
(3) 自動提交
若把AUTOCOMMIT設置爲ON,則在插入、修改、刪除語句執行後,
系統將自動進行提交,這就是自動提交。其格式爲:
SQL>SET AUTOCOMMIT ON;
六、數據操作、子句
具體來看,增刪改查等SQL是如何實現的。
1.增 insert
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
實例:
insert into student (stu_name,stu_adress,stu_bir) values ('wang5','beijing','1996-09-28');
添加數據的時候可以規定列進行添加,如上面的代碼,
如果所有的列都要添加數據,可以不寫出列名,按順序添加即可。
insert into student values (null,'wang6','beijing','1996-09-28');
當添加過主鍵自增(PRINARY KEY AUTO_INCREMENT)第一列在增加數據的時候,可以寫爲0或者null,這樣添加數據可以自增。
2.查 select
語法:
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
- 查詢語句中你可以使用一個或者多個表,表之間使用逗號(,)分割,並使用WHERE語句來設定查詢條件。
- SELECT 命令可以讀取一條或者多條記錄。
- 你可以使用星號(*)來代替其他字段,SELECT語句會返回表的所有字段數據
- 你可以使用 WHERE 語句來包含任何條件。
- 你可以使用 LIMIT 屬性來設定返回的記錄數。
- 你可以通過OFFSET指定SELECT語句開始查詢的數據偏移量。默認情況下偏移量爲0。
實例:
select * from student where stu_bir = '1996-09-28' limit 3;
DISTINCT去重
SELECT DISTINCT lastname FROM employees ORDER BY lastname;
3. 改 update
- 可以同時更新一個或多個字段。
- 可以在 WHERE 子句中指定任何條件。
- 可以在一個單獨表中同時更新數據。
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
update student set stu_name='xiaowen' where stu_id=1;
4.刪delete
DELETE FROM table_name [WHERE Clause]
DELETE from student where stu_id=1;
5. 過濾數據
(1)where 子句
SELECT field1, field2,...fieldN FROM table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
- 查詢語句中你可以使用一個或者多個表,表之間使用逗號, 分割,並使用WHERE語句來設定查詢條件。
- 你可以在 WHERE 子句中指定任何條件。
- 你可以使用 AND 或者 OR 指定一個或多個條件。
- WHERE 子句也可以運用於 SQL 的 DELETE 或者 UPDATE 命令。
- WHERE 子句類似於程序語言中的 if 條件,根據 MySQL 表中的字段值來讀取指定的數據。
(2) Like子句
LIKE - 提供基於特定模式匹配查詢數據的技術示例,以執行一些模糊查詢。
SELECT field1, field2,...fieldN
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
- 你可以在 WHERE 子句中指定任何條件。
- 你可以在 WHERE 子句中使用LIKE子句。
- 你可以使用LIKE子句代替等號 =。
- LIKE 通常與 % 一同使用,類似於一個元字符的搜索。
- 你可以使用 AND 或者 OR 指定一個或多個條件。
- 你可以在 DELETE 或 UPDATE 命令中使用 WHERE...LIKE 子句來指定條件。
'%a' //以a結尾的數據
'a%' //以a開頭的數據
'%a%' //含有a的數據
'_a_' //三位且中間字母是a的
'_a' //兩位且結尾字母是a的
'a_' //兩位且開頭字母是a的
(3)
- AND運算符 - 介紹如何使用
AND
運算符以組合布爾表達式以形成用於過濾數據的複雜條件。 - OR運算符 - 介紹
OR
運算符,並展示如何將OR
運算符與AND
運算符組合以過濾數據。 - IN運算符 - 學習如何在
WHERE
子句中使用IN
運算符來確定值是否匹配列表或子查詢中的指定值。 - BETWEEN運算符 - 顯示如何使用
BETWEEN
運算符來根據指定範圍查詢數據。 - LIMIT子句 - 使用
LIMIT
來限制SELECT
語句返回的行數
(4)IS NULL - 使用IS NULL
運算符測試值是否爲NULL
。
- IS NULL: 當列的值是 NULL,此運算符返回 true。
- IS NOT NULL: 當列的值不爲 NULL, 運算符返回 true。
- <=>: 比較操作符(不同於=運算符),當比較的的兩個值爲 NULL 時返回 true。
關於 NULL 的條件比較運算是比較特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。
在 MySQL 中,NULL 值與任何其它值的比較(即使是 NULL)永遠返回 false,即 NULL = NULL 返回false 。
MySQL 中處理 NULL 使用 IS NULL 和 IS NOT NULL 運算符。
select * , columnName1+ifnull(columnName2,0) from tableName;
columnName1,columnName2 爲 int 型,
當 columnName2 中,有值爲 null 時,columnName1+columnName2=null, ifnull(columnName2,0) 把 columnName2 中 null 值轉爲 0。
7.UNION 操作符
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
查找兩個表中的某列數據
-
expression1, expression2, ... expression_n: 要檢索的列。
-
tables: 要檢索的數據表。
-
WHERE conditions: 可選, 檢索條件。
-
DISTINCT: 可選,刪除結果集中重複的數據。默認情況下 UNION 操作符已經刪除了重複數據,所以 DISTINCT 修飾符對結果沒啥影響。
-
ALL: 可選,返回所有結果集,包含重複數據。
UNION 語句:不包括重複數據
UNION ALL 語句:包括重複數據
8.MySQL 排序
SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]
- 使用任何字段來作爲排序的條件,從而返回排序後的查詢結果。
- 設定多個字段來排序。
- ASC 升序或 DESC降序 。 默認升序
- 可以添加 WHERE...LIKE 子句來設置條件。
MySQL 拼音排序
如果字符集採用的是 gbk(漢字編碼字符集),直接在查詢語句後邊添加 ORDER BY:
SELECT *
FROM runoob_tbl
ORDER BY runoob_title;
如果字符集採用的是 utf8(萬國碼),需要先對字段進行轉碼然後排序:
SELECT *
FROM runoob_tbl
ORDER BY CONVERT(runoob_title using gbk);
9.GROUP BY 語句 可統計數量
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
實例:
SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;
可以實現一個最簡單的去重查詢;
分組後的條件使用 HAVING 來限定,WHERE 是對原始數據進行條件限制。幾個關鍵字的使用順序爲 where 、group by 、having、order by ,例如:
SELECT name, COUNT(*) FROM employee_tbl GROUP BY name HAVING count(*)>2 order by count(*) desc;
10.aliasea別名
表的別名:
SELECT po.OrderID,p.LastName,p.FirstName
WHERE p.LastName=' Adams' AND p.FirstName='John'
FROM Persons AS p, Product_Orders AS po
列的別名:
SELECT LastName AS Family,FirstName AS Name FROM Persons;
11. 連接
- INNER JOIN(內連接,或等值連接):獲取兩個表中字段匹配關係的記錄。
- LEFT JOIN(左外連接):獲取左表所有記錄,即使右表沒有對應匹配的記錄。
- RIGHT JOIN(右外連接): 與 LEFT JOIN 相反,用於獲取右表所有記錄,即使左表沒有對應匹配的記錄
連接參考:http://www.runoob.com/mysql/mysql-join.html
七、MySQL正則表達式
http://www.runoob.com/mysql/mysql-regexp.html
八、MySQL事務
1 MySQL事務 -
瞭解MySQL事務,以及如何使用COMMIT
和ROLLBACK
來管理MySQL中的事務。
MySQL 事務主要用於處理操作量大,複雜度高的數據。比如說,在人員管理系統中,你刪除一個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些數據庫操作語句就構成一個事務!
- 在 MySQL 中只有使用了 Innodb 數據庫引擎的數據庫或表才支持事務。
- 事務處理可以用來維護數據庫的完整性,保證成批的 SQL 語句要麼全部執行,要麼全部不執行。
- 事務用來管理 insert,update,delete 語句
mysql中的變量:https://www.cnblogs.com/gavin110-lgy/p/5772577.html
select @變量名
對用戶變量賦值有兩種方式,一種是直接用"="號,另一種是用":="號。
其區別在於使用set命令對用戶變量進行賦值時,兩種方式都可以使用;當使用select語句對用戶變量進行賦值時,只能使用":="方式,因爲在select語句中,"="號被看作是比較操作符。
易學教程:https://www.yiibai.com/mysql/transaction.html
start transaction;
select @orderNumber := max(orderNumber) from orders;
set @orderNumber =@orderNumber +1;
insert into orders(orderNumber,
orderDate,
requiredDate,
shippedDate,
status,
customerNumber)
values(@orderNumber,
now(),
date_add(now(), INTERVAL 5 DAY),
date_add(now(), INTERVAL 2 DAY),
'In Process',
145);
insert into orderdetails(orderNumber,
productCode,
quantityOrdered,
priceEach,
orderLineNumber)
values(@orderNumber,'S18_1749', 30, '136', 1),
(@orderNumber,'S18_2248', 50, '55.09', 2);
-- commit changes
commit;
select * from orders a
inner join orderdetails b on a.ordernumber = b.ordernumber
where a.ordernumber = @ordernumber;
菜鳥教程:http://www.runoob.com/mysql/mysql-transaction.html
2. MySQL表鎖定 - 瞭解如何使用MySQL鎖來協調會話之間的表訪問。
到這裏:http://www.runoob.com/mysql/mysql-alter.html
八、MySQL索引
九、MySQL約束
八、經典SQL語句
j
經典SQL語句大全(絕對的經典)https://www.cnblogs.com/1234abcd/p/5530314.html
參考資料:
https://www.2cto.com/database/201801/715205.html
https://www.yiibai.com/mysql/basic-mysql.html
-未完