SELECT 語句總結

Query Cache
sql

   查詢執行路徑中的組件:查詢緩存、解析器、預處理器、優化器、查詢執行引擎、存儲引擎;
緩存

SELECT語句的執行流程:
bash

wKiom1Y2DAKy7IZpAAEzJcpM-do468.jpg


   FROM Clause --> WHERE Clause --> GROUP BY --> HAVING Clause --> ORDER BY --> SELECT --> LIMITide

wKioL1Y2DFHDKhG9AAGEVXWpf0s774.jpg


①、數據去重,相同數據只顯示一次優化

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;
相關文章
相關標籤/搜索