Query Cache
sql
查詢執行路徑中的組件:查詢緩存、解析器、預處理器、優化器、查詢執行引擎、存儲引擎;
緩存
SELECT語句的執行流程:
bash
FROM Clause --> WHERE Clause --> GROUP BY --> HAVING Clause --> ORDER BY --> SELECT --> LIMITide
①、數據去重,相同數據只顯示一次優化
MariaDB [hellodb]> SELECT DISTINCT Gender FROM students; #DISTINCT: 數據去重。SQL_CACHE: 顯式指定存儲查詢結果於緩存之中。SQL_NO_CACHE: 顯式查詢結果不予緩存 MariaDB [hellodb]> SHOW GLOBAL VARIABLES LIKE 'query_cache_type'\G *************************** 1. row *************************** Variable_name: query_cache_type Value: ON #ON,查詢緩存開啓。OFF,查詢緩存不開啓。DEMAND,查詢緩存按需進行,顯式指定SQL_CACHE的SELECT語句纔會緩存,其它均不予緩存 MariaDB [hellodb]> SHOW GLOBAL VARIABLES LIKE 'query_cache_size'\G
②、字段顯示能夠使用別名spa
MariaDB [hellodb]> SELECT DISTINCT Gender AS Gder FROM students; +------+ | Gder | +------+ | M | | F | +------+
③、WHERE子句:指明過濾條件(布爾型表達式)以實現「選擇」的功能orm
算術操做符:+, -, *, /, %blog
MariaDB [hellodb]> SELECT Name,Age FROM students WHERE Age+10 > 20;
比較操做符:=, !=, <>, <=>, >, >=, <, <=排序
MariaDB [hellodb]> SELECT Name,Age FROM students WHERE Age = 20;
肯定範圍閉區間:BETWEEN min_num AND max_num。NOT BETWEEN min_num AND max_numelement
MariaDB [hellodb]> SELECT Name,Age FROM students WHERE Age BETWEEN 32 AND 50; MariaDB [hellodb]> SELECT Name,Age FROM students WHERE Age NOT BETWEEN 32 AND 50;
肯定集合:IN(element1, element2, ...)。NOT IN(element1, element2, ...)
MariaDB [hellodb]> SELECT Name,Age FROM students WHERE Age IN (32,50); MariaDB [hellodb]> SELECT Name,Age FROM students WHERE Age NOT IN (32,50);
空值查詢:IS NULL。IS NOT NULL。
MariaDB [hellodb]> SELECT Name,ClassID FROM students WHERE ClassID IS NULL; MariaDB [hellodb]> SELECT Name,ClassID FROM students WHERE ClassID IS NOT NULL;
字符模糊匹配:LIKE:(%: 任意長度的任意字符。_:任意單個字符)
MariaDB [hellodb]> SELECT Name,ClassID FROM students WHERE Name LIKE 'X%'; MariaDB [hellodb]> SELECT Name,ClassID FROM students WHERE Name LIKE 'X_ Z%';
邏輯操做符:NOT、AND、OR、XOR
MariaDB [hellodb]> SELECT * FROM students WHERE Gender = 'F' AND ClassID = 3;
④、GROUP:根據指定的條件把查詢結果進行「分組」以用於作「聚合」運算
「聚合」運算:avg(), max(), min(), count(), sum()
MariaDB [hellodb]> SELECT AVG(Age),Gender FROM students GROUP BY Gender; #對性別進行分組,而後計算出各組員的平均年齡 MariaDB [hellodb]> SELECT MAX(Age),Gender FROM students GROUP BY Gender; #對性別進行分組,而後計算出各組員的最大年齡
⑤、HAVING: 對分組聚合運算後的結果指定過濾條件
MariaDB [hellodb]> SELECT AVG(Age) AS Ages,Gender FROM students GROUP BY Gender HAVING Ages > 20; #對性別進行分組,而後計算出各組員的平均年齡,並值顯示Ags大於20的 MariaDB [hellodb]> SELECT COUNT(StuID) AS SID,ClassID FROM students GROUP BY ClassID HAVING SID > 2; #對班級進行分組,而後計算出各組員的個數,並顯示組員個數大於2的
⑥、ORDER BY: 根據指定的字段對查詢結果進行排序;
升序:ASC、降序:DESC
MariaDB [hellodb]> SELECT * FROM students ORDER BY Age DESC;
⑦、LIMIT [[offset,]row_count]:對查詢的結果進行輸出行數數量限制;
MariaDB [hellodb]> SELECT * FROM students ORDER BY Age DESC LIMIT 1,3; #對查詢的結果偏移一個後取三個
⑧、對查詢結果中的數據請求施加「鎖」:
FOR UPDATE: 寫鎖,排他鎖、LOCK IN SHARE MODE: 讀鎖,共享鎖
⑨、多表查詢
交叉鏈接:笛卡爾乘積。通常不會使用到,很消耗資源
MariaDB [hellodb]> SELECT * FROM students,classes;
內鏈接:等值鏈接,讓表之間的字段以「等值」創建鏈接關係、不等值鏈接、天然鏈接、自鏈接
MariaDB [hellodb]> SELECT * FROM students,teachers WHERE students.TeacherID = teachers.TID; MariaDB [hellodb]> SELECT s.Name AS StuName,t.Name AS TeaName FROM students AS s,teachers AS t WHERE s.TeacherID = t.TID; #等值鏈接 MariaDB [hellodb]> SELECT s.Name,t.Name FROM students AS s,students AS t WHERE s.TeacherID = t.StuID; #自鏈接
外鏈接:左外鏈接,FROM tb1 LEFT JOIN tb2 ON tb1.col=tb2.col、右外連,FROM tb1 RIGHT JOIN tb2 ON tb1.col=tb2.col
MariaDB [hellodb]> SELECT s.Name,c.Class FROM students AS s RIGHT JOIN classes AS c ON s.ClassID = c.ClassID; MariaDB [hellodb]> SELECT s.Name,c.Class FROM students AS s LEFT JOIN classes AS c ON s.ClassID = c.ClassID;
⑩、子查詢:在查詢語句嵌套着查詢語句,基於某語句的查詢結果再次進行的查詢,Mysql對子查詢優化不是很好,建議少用
用在WHERE子句中的子查詢:(1) 用於比較表達式中的子查詢;子查詢僅能返回單個值;
MariaDB [hellodb]> SELECT Name,Age FROM students WHERE Age>(SELECT avg(Age) FROM students); #顯示大於平均年齡的同窗
(2) 用於IN中的子查詢:子查詢應該單鍵查詢並返回一個或多個值從構成列表;
MariaDB [hellodb]> SELECT Name,Age FROM students WHERE Age IN (SELECT Age FROM teachers);
用於FROM子句中的子查詢;
MariaDB [hellodb]> SELECT s.aage,s.ClassID FROM (SELECT avg(Age) AS aage,ClassID FROM students WHERE ClassID IS NOT NULL GROUP BY ClassID) AS s WHERE s.aage>30;
⑩①、聯合查詢:UNION
MariaDB [hellodb]> SELECT Name,Age FROM students UNION SELECT Name,Age FROM teachers;