1. 簡述
查詢資料是指從資料庫中獲取所需要的資料。如Jack 要達到驗證使用者名稱和密碼的目的,就需要從資料庫已儲存的使用者表中讀取當前使用者的密碼進行驗證,以驗明正身!儲存查詢資料是資料庫操作中常用且重要的操作。使用者可以根據自己對資料的需求,使用不同的查詢方式,獲得不同的資料。
2. 簡單查詢
在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參數列示按降序的順序進行排序。
2.1 詢所有欄位資料
查詢所有欄位是指查詢表中所有欄位的資料,這種方式可以將表中所有欄位的資料都查詢出來。MySQL 有兩種方式可以查詢表中的所有欄位。
2.1.1 列出表的所有欄位
通過SQL語句 SELECT 列出表的所有欄位,具體語法形式如下:
SELECT field1,field2,…,fieldn FROM tablename;
其中,filed1~fieldn 參數列示需要查詢的欄位名;tablename 參數列示表的名稱。
2.1.2 * 符號表示所有欄位
查詢所有欄位資料,除了使用上面的方式外,還可以通過符號 “ * ” 來實現,具體語法形式如下:
SELECT * FROM tablename;
其中,符號 “ * ” 表示所有欄位名;tablename 參數列示表的名稱。與上一種方式相比,“*”符號方式的優勢比較明顯,即可用該符號代替表中的所有欄位,但是這種方式不夠靈活,只能按照表中欄位的固定順序顯示,不能隨便改變欄位的順序。
2.2 查詢指定欄位資料
查詢指定欄位資料,只需修改關鍵字 SELECT 後的欄位列表為指定欄位即可。
SELECT field1,field2,…,fieldn FROM tablename;
例如,從班級表中查詢班主任欄位,SQL語句如下所示。
SELECT teacher FROM class;
如果關鍵字 SELECT 後面的欄位不包含在所查詢的表中,那麼MySQL會報錯。
1 mysql> create database school; #建立資料庫school 2 mysql> use school; #選擇資料庫school 3 mysql> create table class(id int UNIQUE AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64)); #建立表class,指定id 欄位自增長 4 mysql> insert into class(id, name, teacher) values(1, '一班', 'ABC'),(2,'二班', 'BCD'),(3, '三班', 'CDE'),(4,'四班', 'DEF'); # 插入多條記錄 5 mysql> select teacher from class ; #查詢 class 表中的 teacher 域
2.3 查詢不重複資料 DISTINCT
當在 MySQL 中執行簡單資料查詢時,有時會顯示出重複資料。為了實現 查詢不重複 資料,MySQL 提供了 DISTINCT 功能,SQL語法如下:
SELECT DISTINCT field1,field2,…,fieldn FROM tablename;
在上述語句中,關鍵字 DISTINCT 去除重複的資料。下面將通過一個具體的示例來說明如何實現查詢不重複資料。
執行 SQL 語句 SELECT,在資料庫 school 中查詢班級表 class 中 teacher 欄位的資料。具體步驟如下:
1 mysql> create database school; #建立資料庫school 2 mysql> use school; #選擇資料庫school 3 mysql> create table class(id int UNIQUE AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64)); #建立表class,指定id 欄位自增長 4 mysql> insert into class(id, name, teacher) values(1, '一班', 'ABC'),(2,'二班', 'BCD'),(3, '三班', 'CDE'),(4,'四班', 'CDE'); # 插入多條記錄 5 mysql> select teacher from class; #查詢 class 表中的 teacher 域,包含重複記錄 6 mysql> select distinct teacher from class; #查詢 class 表中的 teacher 域,去重
2.4 查詢集合 IN
有的時候,當我們需要查詢的目標記錄限定在某個集合中的時候,在 MySQL 中可以使用關鍵字 IN 來實現,關鍵字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 mysql> create database school; #建立資料庫school 2 mysql> use school; #選擇資料庫school 3 mysql> create table class(id int UNIQUE AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64)); #建立表class,指定id 欄位自增長 4 mysql> insert into class(id, name, teacher) values(1, '一班', 'ABC'),(2,'二班', 'BCD'),(3, '三班', 'CDE'),(4,'四班', 'DEF'); # 插入多條記錄 5 mysql> select * from class where teacher in ('ABC','BCD') ; #查詢 class 表中的 teacher 域是 ABC 和 BCD 的記錄
使用 NOT IN 可以反向查詢非集合中的資料
SELECT field1,field2,…,fieldn FROM tablename WHERE filedm NOT IN(value1,value2,value3,…,valuen);
集合查詢的 注意: 集合中慎用 NULL
在具體使用關鍵字IN時,查詢的集合中如果存在NULL,則不會影響查詢,NULL 存不存在的效果都一樣;但如果使用關鍵字NOT IN,查詢的集合中如果存在NULL,則不會查詢到任何的結果。
2.5 指定範圍查詢資料 BETWEEN AND
當我們需要查詢指定範圍內的資料(如: id 從 0 到 100)的時候,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,表示的是一個範圍間的判斷過程,只針對數字型別。
2.5.1 符合範圍的資料記錄查詢
通過關鍵字 BETWEEN 和 AND 設定查詢範圍,以實現查詢語文成績(欄位 Chinese)在 80 和 90 之間的學生,具體 SQL 如下:
1 mysql> create database school; # 建立資料庫school 2 mysql> use school; # 選擇資料庫school 3 mysql> create table grade(id int UNIQUE AUTO_INCREMENT, name varchar(128) NOT NULL, chinese tinyint unsigned, create_date date); # 建立成績表 grade 4 mysql> insert into grade values(1, '甲', 80,'2020-02-03'),(2,'乙', 72, '2020-05-01'),(3, '丙', 87,'2020-04-21'),(4,'丁', 89, '2020-06-04'); # 插入多條記錄 5 mysql> select * from class where chinese between 80 and 90 ; # 查詢成績表中語文成績在 80 和 90 之間的學員記錄 6 mysql> select * from grade where create_date between '2020-05-01' and '2020-06-04' # 查詢日期之間的資料
2.5.2 不符合範圍的資料記錄查詢
通過關鍵字 NOT 設定反向查詢非查詢範圍的條件,具體 SQL 語句如下:
SELECT name,chinese FROM grade WHERE Chinese NOT BETWEEN 85 AND 90;
上面語句等同於:
select name,chinese from grade where chinese < 85 or chinese > 90;
2.6 模糊查詢 LIKE
當我們只想用字串中間的一部分特徵查詢含有特徵字串的資訊時,MySQL提供了關鍵字LIKE來實現模糊查詢,需要使用萬用字元,具體語法形式如下:
SELECT field1,field2,…,fieldn FROM tablename WHERE fieldm LIKE value;
在上述語句中,引數tablename表示表名,引數fieldn表示表中的欄位名字,通過關鍵字LIKE來判斷欄位field的值是否與value字串匹配,如果相匹配,則滿足查詢條件,該記錄就會被查詢出來;否則就不會被查詢出來。
在MySQL中,字串必須加上單引號('')和雙引號(″″)。由於關鍵字LIKE可以實現模糊查詢,因此該關鍵字後面的字串引數除了可以使用完整的字串外,還可以包含萬用字元。LIKE關鍵字支援的萬用字元如表5-1所示。
符號 | 功能描述 |
_ | 該萬用字元值能匹配單個字元 |
% |
該萬用字元可以匹配任意長度的字串,既可以是0個字元\1個字元, 也可以是很多字元 |
以下給出幾種查詢示例
2.6.1 查詢某個欄位含有某個文字的記錄:
SELECT * FROM class WHERE teacher LIKE ‘%三%’;
注意: 將會把 teacher 欄位為 “三爺”,“張三”,“張貓三”、“三腳貓”,“唐三藏” 等等含 “三” 的記錄全找出來。
2.6.2 查詢既有 某個字 又有 另一個字 的記錄
使用 and 條件,查詢既有 "三" 又有 "貓", 可以分別查詢多個欄位
SELECT * FROM class WHERE teacher LIKE ‘%三%’ AND teacher LIKE ‘%貓%’;
2.6.3 查詢某個欄位中既有 某個字 又有 另一個字 的記錄,同時區分文字先後
SELECT * FROM class WHERE teacher LIKE ‘%三%貓%’;
注意: 雖然能搜尋出 “三腳貓”,但不能搜尋出符合條件的“張貓三” 。
2.6.4 找出規定字數 且規定某個字的
SELECT * FROM [user] WHERE u_name LIKE ‘_三_’;
注意:_表示任意單個字元。匹配單個任意字元,它常用來限制表示式的字元長度語句:(可以代表一箇中文字元)
找出“三腳貓”這樣teacher為三個字且第一個字是“三”的;
SELECT * FROM class WHERE teacher LIKE ‘三__’;
2.7 對查詢結果排序 ORDER BY
在MySQL中,從表中查詢出的資料可能是無序的,或者其排列順序不是使用者所期望的順序,為了使查詢結果的順序滿足使用者的要求,可以使用關鍵字 ORDER BY 對記錄進行排序,其語法形式如下:
SELECT field1, field2, field3, …, fieldn FROM tablename ORDER BY fieldm [ASC|DESC]
在上述語句中
引數 tablename 表示所要進行排序的表名,
引數 fieldn 表示表中的欄位名字,
引數 fieldm 表示按照該欄位進行排序;ASC 表示按升序進行排序;DESC 表示按降序進行排序。預設的情況下按 ASC 進行排序。
注意:如果存在一條記錄欄位的值為空值(NULL),那麼按升序排序時,含空值的記錄將最先顯示,可以理解為空值是該欄位的最小值;按降序排列時,欄位為空值的記錄將最後顯示。
(1)執行 SQL 語句 SELECT ,查詢表 grade 中所有的資料記錄,按照語文成績(欄位 chinese)升序排序,具體SQL語句如下:
SELECT id,name,chinese FROM class ORDER BY chinese ASC;
1 mysql> create database school; #建立資料庫school 2 mysql> use school; #選擇資料庫school 3 mysql> create table grade(id int UNIQUE AUTO_INCREMENT, name varchar(128) NOT NULL, chinese tinyint unsigned); # 建立成績表 grade 4 mysql> insert into grade values(1, '甲', 87),(2,'乙', 64),(3, '丙', 69),(4,'丁', 79); # 插入多條記錄 5 mysql> SELECT id,name,chinese FROM class ORDER BY chinese ASC; #按升序的方式查詢學員記錄
2.8 簡單分組查詢
MySQL軟體提供了5個統計函式來幫助使用者統計資料,可以使使用者很方便地對記錄進行 統計數、計算和、計算平均數、計算最大值、最小值,而不需要查詢所有資料。
在具體使用統計函式時,都是針對表中所有記錄數或指定特定條件(WHERE子句)的資料記錄進行統計計算。在現實應用中,經常會先把所有資料記錄進行分組,再對這些分組後的資料記錄進行統計計算。
MySQL 通過 SQL 語句 GROUP BY 來實現,分組資料查詢語法如下:
SELECT function()[,filed ]FROM tablename WHERE CONDITION GROUP BY field;
在上述語句中,引數 field 表示某欄位名,通過該欄位對名稱為 tablename 的表的資料記錄進行分組。
注意:在具體進行分組查詢時,分組所依據的欄位上的值一定要具有重複值,否則分組沒有任何意義。
2.8.1 五個統計之一 統計數量
COUNT(*):該種方式可以實現對錶中記錄進行統計,不管表欄位中包含的是 NULL 值還是非 NULL 值。
COUNT(field): 該種方式可以實現對指定欄位的記錄進行統計,在具體統計時將忽略NULL值。
2.8.2 五個統計之二 統計計算平均值
該函式只有一種使用方式。
AVG(field) 使用方式:該種方式可以實現對指定欄位的平均值進行計算,在具體統計時將忽略NULL值。
2.8.3 五個統計之三 統計計算求和
該函式只有一種使用方式。
SUM(field) 使用方式:該種方式可以實現計算指定欄位值之和,在具體統計時將忽略NULL值。
2.8.4 五個統計之四 統計最大值
該函式只有一種使用方式。
MAX(field)使用方式: 該種方式可以實現計算指定欄位值中的最大值, 在具體統計時將忽略NULL值。
2.8.5 五個統計之五 統計最小值
該函式只有一種使用方式。
MIN(field) 使用方式:該種方式可以實現計算指定欄位值中的最小值,在具體統計時將忽略NULL值。
2.9 統計分組查詢
在MySQL中,只實現簡單的分組查詢有時候可能沒有任何實際意義,因為關鍵字 GROUP BY 單獨使用時,預設查詢出每個分組中隨機的一條記錄,具有很大的不確定性,一般建議將分組關鍵字與統計函式一起使用。
如果想顯示每個分組中的欄位,可以通過函式 GROUP_CONCAT() 來實現。該函式可以實現顯示每個分組中的指定欄位,函式的具體語法形式如下:
SELECT GROUP_CONCAT(field) FROM tablename WHERE CONDITION GROUP BY field;
在上述語句中會顯示每個陣列中的欄位值。
執行SQL語句GROUP_CONCAT(),顯示每個分組,具體SQL語句如下:
1 mysql> create database school; #建立資料庫 school 2 mysql> use school; #選擇資料庫 school 3 mysql> create table grade(id int UNIQUE AUTO_INCREMENT, name varchar(128) NOT NULL, math tinyint unsigned, class_id int NOT NULL); #建立成績表 grade 4 mysql> insert into grade values(1, '甲', 80, 1),(2,'乙', 72, 2),(3, '丙', 54, 2),(4,'丁', 1); #插入多條記錄 5 mysql> SELECT GROUP_CONCAT(name) name, sum(math) FROM grade GROUP BY class_id; #按class_id 進行分組,統計數學總分並顯示每個分組中的姓名
=========================================================================================================================