- 精通MySQL 8(視頻教學版)
- 劉華貞
- 4084字
- 2019-11-22 18:46:16
5.1 簡單查詢
在MySQL中可以通過SQL語句來實現基本數據查詢,SQL語句可以通過如下幾種方式使用:查詢所有字段數據、查詢指定字段數據、避免重復數據查詢、實現數學四則運算數據查詢、設置顯示格式數據查詢。
數據庫中可能包含無數的表,表中可能包含無數的記錄,因此要獲得所需的數據并非易事。在MySQL中,可以使用SELECT語句來查詢數據,根據查詢條件的不同,數據庫系統會找到不同的數據,通過SELECT語句可以很方便地獲取所需的信息。
在MySQL中,SELECT語句的基本語法形式如下:
SELECT field1 field2 … fieldn FROM tablename [WHERE CONDITION1] [GROUP BY fieldm [HAVING CONDITION2]] [ORDER BY fieldn [ASC|DESC]]
其中,filed1~fieldn參數表示需要查詢的字段名;tablename參數表示表的名稱;CONDITION1參數表示查詢條件;fieldm參數表示按該字段中的數據進行分組;CONDITION2參數表示滿足該表達式的數據才能輸出;fieldn參數指按該字段中數據進行排序。排序方式由ASC和DESC兩個參數指出;ASC參數表示按升序的順序進行排序,是默認參數;DESC參數表示按降序的順序進行排序。
5.1.1 查詢所有字段數據
查詢所有字段是指查詢表中所有字段的數據,這種方式可以將表中所有字段的數據都查詢出來。MySQL有兩種方式可以查詢表中的所有字段。
1. 列出表的所有字段
通過SQL語句SELECT列出表的所有字段,具體語法形式如下:
SELECT field1,field2,…,fieldn FROM tablename;
其中,filed1~fieldn參數表示需要查詢的字段名;tablename參數表示表的名稱。
2. “*”符號的使用
查詢所有字段數據,除了使用上面的方式外,還可以通過符號“*”來實現,具體語法形式如下:
SELECT * FROM tablename;
其中,符號“*”表示所有字段名;tablename參數表示表的名稱。
與上一種方式相比,“*”符號方式的優勢比較明顯,即可用該符號代替表中的所有字段,但是這種方式不夠靈活,只能按照表中字段的固定順序顯示,不能隨便改變字段的順序。
5.1.2 查詢指定字段數據
查詢所有字段數據,需要在關鍵字SELECT后指定包含所有字段的列表或者符號“*”;如果需要查詢指定字段數據,只需修改關鍵字SELECT后的字段列表為指定字段即可。
例如,從學生表中查詢姓名、性別和年齡字段,SQL語句如下所示。
SELECT name,gender,age FROM t_student;
如果關鍵字SELECT后面的字段不包含在所查詢的表中,那么MySQL會報錯。
5.1.3 DISTINCT查詢
當在MySQL中執行簡單數據查詢時,有時會顯示出重復數據。為了實現查詢不重復數據,MySQL提供了DISTINCT功能,SQL語法如下:

在上述語句中,關鍵字DISTINCT去除重復的數據。下面將通過一個具體的示例來說明如何實現查詢不重復數據。
【示例5-1】執行SQL語句SELECT,在數據庫school中查詢學生表t_student中age字段的數據。具體步驟如下:
(1)使用如下SQL語句在學生表中查詢數據,執行結果如圖5-1所示。
SELECT age FROM t_student;
(2)為了避免查詢到重復的數據,可以執行SQL語句關鍵字DISTINCT,具體SQL語句如下,執行結果如圖5-2所示。
SELECT DISTINCT age FROM t_student;
在上述語句中,通過關鍵字DISTINCT修飾關鍵字SELECT后面的字段age,以避免查詢到重復的數據記錄。

圖5-1 查詢學生表數據記錄

圖5-2 查詢學生表不重復數據記錄
圖5-1所示的執行結果顯示,查詢到字段age有重復的數據;圖5-2所示的執行結果顯示,與圖5-1相比,關鍵字DISTINCT去除了重復的數據。
5.1.4 IN查詢
在MySQL中提供了關鍵字IN,用來實現判斷字段的數值是否在指定集合的條件查詢,該關鍵字的具體語句形式如下:
SELECT field1,field2,…,fieldn FROM tablename WHERE filedm IN(value1,value2,value3,…,valuen);
在上述語句中,參數fieldn表示名稱為tablename的表中的字段名,參數valuen表示集合中的值,通過關鍵字IN來判斷字段fieldm的值是否在集合(value1,value2,value3,…,valuen)中,如果字段fieldm的值在集合中,就滿足查詢條件,該記錄會被查詢出來,否則不會被查詢出來。
1. 在集合中的數據記錄查詢
下面通過一個具體的示例來說明如何實現在集合中的數據記錄查詢。
【示例5-2】執行SQL語句SELECT,在數據庫school的學生成績表s_score中查詢學生編號為1001、1004、1009、1010的學生。
執行SQL語句SELECT,通過關鍵字IN設置集合查詢條件,以實現查詢學生編號為1001、1004、1009和1010的學生數據記錄,具體SQL如下,執行結果如圖5-3所示。
SELECT name FROM s_score WHERE stuid IN(1001,1004,1009,1010);

圖5-3 查詢數據表記錄
2. 不在集合中的數據記錄查詢
通過關鍵字NOT IN設置集合查詢條件,以實現查詢學生編號不為1001、1004、1009、1010的學生,具體SQL語句如下:
SELECT name FROM s_score WHERE stuid NOT IN(1001,1004,1009,1010);
3. 集合查詢的注意點
在具體使用關鍵字IN時,查詢的集合中如果存在NULL,則不會影響查詢;使用關鍵字NOT IN,查詢的集合中如果存在NULL,則不會有任何的查詢結果。
【示例5-3】執行SQL語句SELECT,在數據庫school的學生成績表s_score中查詢學生編號為1001、1004、1009、1010的學生。具體操作如下:
(1)執行SQL語句SELECT,通過關鍵字IN設置集合查詢條件,以實現查詢學生編號為1001、1004、1009、1010的學生,集合里包含NULL,具體SQL語句如下,執行結果與圖5-3一致。
SELECT name FROM s_score WHERE stuid IN(1001,1004,1009,1010,NULL);
(2)通過關鍵字NOT IN設置集合查詢條件,以實現查詢學生編號不為1001、1004、1009、1010的學生,關鍵字NOT IN所操作的集合中包含了NULL值,具體SQL語句如下,執行結果如圖5-4所示。
SELECT name FROM s_score WHERE stuid NOT IN(1001,1004,1009,1010,NULL);

圖5-4 查詢數據信息
5.1.5 BETWEEN AND查詢
MySQL提供了關鍵字BETWEEN AND,用來實現判斷字段的數值是否在指定范圍內的條件查詢。該關鍵字的具體語法形式如下:
SELECT field1,field2,…,fieldn FROM tablename WHERE fieldm BETWEEN minvalue AND maxvalue
在上述語句中,參數fieldn表示名稱為tablename的表中的字段名,通過關鍵字BETWEEN和AND來設置字段field的取值范圍,如果字段field的值在所指定的范圍內,那么滿足查詢條件,該記錄會被查詢出來,否則不會被查詢出來。
BETWEEN minvalue AND maxvalue,表示的是一個范圍間的判斷過程,只針對數字類型。
1. 符合范圍的數據記錄查詢
通過關鍵字BETWEEN和AND設置查詢范圍,以實現查詢語文成績(字段Chinese)在85和90之間的學生,具體SQL如下:
SELECT name,Chinese FROM s_score WHERE Chinese BETWEEN 85 AND 90;
2. 不符合范圍的數據記錄查詢
通過關鍵字NOT設置非查詢范圍條件,具體SQL語句如下:
SELECT name,Chinese FROM s_score WHERE Chinese NOT BETWEEN 85 AND 90;
5.1.6 LIKE模糊查詢
MySQL提供了關鍵字LIKE來實現模糊查詢,具體語法形式如下:
SELECT field1,field2,…,fieldn FROM tablename WHERE fieldm LIKE value;
在上述語句中,參數tablename表示表名,參數fieldn表示表中的字段名字,通過關鍵字LIKE來判斷字段field的值是否與value字符串匹配,如果相匹配,則滿足查詢條件,該記錄就會被查詢出來;否則就不會被查詢出來。
在MySQL中,字符串必須加上單引號('')和雙引號(″″)。由于關鍵字LIKE可以實現模糊查詢,因此該關鍵字后面的字符串參數除了可以使用完整的字符串外,還可以包含通配符。LIKE關鍵字支持的通配符如表5-1所示。
表5-1 LIKE關鍵字支持的通配符

1. 帶有“%”通配符的查詢
(1)查詢字段name中以字母L開頭的數據記錄,具體SQL語句如下:
SELECT name FROM s_score WHERE name LIKE 'L%';
(2)MySQL不區別大小寫,上述SQL語句可以修改如下:
SELECT name FROM s_score WHERE name LIKE 'j%';
(3)如果想查詢不是以字母L開頭的全部學生,可以執行邏輯非運算符(NOT或!),具體SQL語句如下:
SELECT name FROM s_score WHERE NOT name LIKE 'j%';
2. 帶有“_”通配符的查詢
(1)查詢字段name中以第二個字母為A的數據記錄,具體SQL語句如下:
SELECT name FROM s_score WHERE name LIKE '_A%';
(2)如果想查詢第二個字母不是A的全部學生,可以執行邏輯非運算符(NOT或!),具體SQL語句如下:
SELECT name FROM s_score WHERE NOT name LIKE '_A%';
(3)如果想查詢第二個字母不是A的全部學生,也可以用以下SQL語句查詢:
SELECT name FROM s_score WHERE name NOT LIKE '_A%';
3. 使用LIKE關鍵字查詢其他類型數據
在MySQL中,LIKE關鍵字除了可以操作字符串類型的數據外,還可以操作其他任意的數據類型。
(1)執行SQL語句SELECT,查詢字段English帶有數字9的全部學生,具體SQL語句如下:
SELECT name,English FROM s_score WHERE English LIKE '%9%';
(2)對于LIKE關鍵字,如果匹配“%%”,就表示查詢所有數據記錄。
SELECT name FROM s_score WHERE name LIKE '%%';
5.1.7 對查詢結果排序
在MySQL中,從表中查詢出的數據可能是無序的,或者其排列順序不是用戶所期望的順序,為了使查詢結果的順序滿足用戶的要求,可以使用關鍵字ORDER BY對記錄進行排序,其語法形式如下:
SELECT field1, field2, field3, …, fieldn FROM tablename ORDER BY fieldm [ASC|DESC]
在上述語句中,參數tablename表示所要進行排序的表名,參數fieldn表示表中的字段名字,參數fieldm表示按照該字段進行排序;ASC表示按升序進行排序;DESC表示按降序進行排序。默認的情況下按ASC進行排序。
(1)執行SQL語句SELECT,查詢表s_score中所有的數據記錄,按照語文成績(字段Chinese)升序排序,具體SQL語句如下:
SELECT stuid,name,Chinese FROM s_score ORDER BY Chinese ASC;
(2)執行SQL語句SELECT,查詢表s_score中所有的數據記錄,按照語文成績(字段Chinese)降序排序,具體SQL語句如下:
SELECT stuid,name,Chinese FROM s_score ORDER BY Chinese DESC;
提示
如果存在一條記錄字段的值為空值(NULL),那么按升序排序時,含空值的記錄將最先顯示,可以理解為空值是該字段的最小值;按降序排列時,字段為空值的記錄將最后顯示。
在MySQL中,可以指定多個字段進行排序。例如,可以讓表s_score先按照字段Chinese升序排序,再按照字段English降序排序,具體SQL語句如下:

5.1.8 簡單分組查詢
MySQL軟件提供了5個統計函數來幫助用戶統計數據,可以使用戶很方便地對記錄進行統計數、計算和、計算平均數、計算最大值和最小值,而不需要查詢所有數據。
在具體使用統計函數時,都是針對表中所有記錄數或指定特定條件(WHERE子句)的數據記錄進行統計計算。在現實應用中,經常會先把所有數據記錄進行分組,再對這些分組后的數據記錄進行統計計算。
MySQL通過SQL語句GROUP BY來實現,分組數據查詢語法如下:
SELECT function() FROM tablename WHERE CONDITION GROUP BY field;
在上述語句中,參數field表示某字段名,通過該字段對名稱為tablename的表的數據記錄進行分組。
提示
在具體進行分組查詢時,分組所依據的字段上的值一定要具有重復值,否則分組沒有任何意義。
【示例5-4】使用SQL語句GROUP BY對所有數據記錄按不同字段進行分組。
(1)執行SQL語句GROUP BY,對所有數據記錄按學科(字段subject)進行分組,具體SQL語句如下,執行結果如圖5-5所示。
SELECT * FROM s_teacher GROUP BY subject;
(2)關于關鍵字GROUP BY,如果所針對的字段沒有重復值,那么分組沒有任何意義。比如按照教師編號tid進行分組,具體SQL語句如下,執行結果如圖5-6所示。
SELECT * FROM s_teacher GROUP BY tid;

圖5-5 查看表數據

圖5-6 查看表數據
圖5-5已經根據字段subject將表s_teacher進行分組,然后顯示每組中的一條數據。
圖5-6顯示表s_teacher的所有數據記錄,由于數據庫school的表s_teacher中字段tid的值沒有重復值,所以首先將每一條記錄分成一組,然后顯示每組中的一條記錄。該分組查詢與沒有分組查詢的結果是一樣的,所以沒有任何實際意義。
5.1.9 統計分組查詢
在MySQL中,只實現簡單的分組查詢是沒有任何實際意義的,因為關鍵字GROUP BY單獨使用時,默認查詢出每個分組中隨機的一條記錄,具有很大的不確定性,一般建議將分組關鍵字與統計函數一起使用。
如果想顯示每個分組中的字段,可以通過函數GROUP_CONCAT()來實現。該函數可以實現顯示每個分組中的指定字段,函數的具體語法形式如下:
SELECT GROUP_CONCAT(field) FROM tablename WHERE CONDITION GROUP BY field;
在上述語句中會顯示每個數組中的字段值。
【示例5-5】使用GROUP_CONCAT()對教師進行統計分組,并顯示每組人數。
(1)執行SQL語句GROUP_CONCAT(),顯示每個分組,具體SQL語句如下:
SELECT subject,GROUP_CONCAT(name) name FROM s_teacher GROUP BY subject;
(2)執行統計函數COUNT(),顯示每個分組中教師的個數,具體SQL語句如下:
SELECT subject,GROUP_CONCAT(name) name,COUNT(name) number FROM s_teacher GROUP BY subject;
- Python概率統計
- 測試驅動開發:入門、實戰與進階
- 數據結構(Python語言描述)(第2版)
- 名師講壇:Spring實戰開發(Redis+SpringDataJPA+SpringMVC+SpringSecurity)
- Julia高性能科學計算(第2版)
- Bootstrap 4 Cookbook
- SQL 經典實例
- Web性能實戰
- C語言程序設計習題與實驗指導
- Hands-On JavaScript for Python Developers
- 多模態數據分析:AGI時代的數據分析方法與實踐
- Mockito Essentials
- Learning Python Data Visualization
- DevOps 精要:業務視角
- 現代C++語言核心特性解析