MySQL中的数据查询
文章目錄
- 1 簡單查詢
- 1.1 查詢所有字段數據
- 1.2 查詢指定字段數據
- 1.3 DISTINCT查詢
- 1.4 IN查詢
- 1.5 BETWEEN AND查詢
- 1.6 LIKE模糊查詢
- 1.7 對查詢結果排序
- 1.8 簡單分組查詢
- 1.9 統計分組查詢
- 2 聯合查詢
- 2.1 內連接查詢
- 2.2 外連接查詢
- 2.3 合并查詢數據記錄
- 2.4 子查詢
1 簡單查詢
在MySQL中可以通過SQL語句來實現基本數據查詢,SQL語句可以通過如下多種使用:查詢所有字段數據、查詢指定字段數據、避免重復數據查詢、對結果進行排序和分組等查詢。
數據庫中可能包含數量龐大的表,表中可能包含無數的記錄,如果沒有兩把刷子要獲得所需的數據并非易事。在MySQL中,可以使用SELECT語句來查詢數據,根據查詢條件的不同,數據庫系統會找到不同的數據,通過SELECT語句可以很方便地獲取所需的信息。
在MySQL中,SELECT語句的基本語法形式如下:
SELECT field1 field2 … fieldnFROM tablename[WHERE CONDITION1][GROUP BY fieldm [HAVING CONDITION2]][ORDER BY fieldn [ASC|DESC]];其中,filed1~fieldn參數表示需要查詢的字段名;tablename參數表示表的名稱;CONDITION1參數表示查詢條件;fieldm參數表示按該字段中的數據進行分組;CONDITION2參數表示滿足該表達式的數據才能輸出;fieldn參數指按該字段中數據進行排序。排序方式由ASC和DESC兩個參數指出;ASC參數表示按升序的順序進行排序,是默認參數;DESC參數表示按降序的順序進行排序。
1.1 查詢所有字段數據
查詢所有字段是指查詢表中所有字段的數據,這種方式可以將表中所有字段的數據都查詢出來。MySQL有兩種方式可以查詢表中的所有字段。
1. 列出表的所有字段。
通過SQL語句SELECT列出表的所有字段,具體語法形式如下:
其中,filed1~fieldn參數表示需要查詢的字段名;tablename參數表示表的名稱。
2. “*”符號表示所有字段。
查詢所有字段數據,除了使用上面的方式外,還可以通過符號“*”來實現,具體語法形式如下:
其中,符號“”表示所有字段名;tablename參數表示表的名稱。與上一種方式相比,“”符號方式的優勢比較明顯,即可用該符號代替表中的所有字段,但是這種方式不夠靈活,只能按照表中字段的固定順序顯示,不能隨便改變字段的順序。
1.2 查詢指定字段數據
查詢指定字段數據,只需修改關鍵字SELECT后的字段列表為指定字段即可。
SELECT field1,field2,…,fieldn FROM tablename;例如,從班級表中查詢班主任字段,SQL語句如下所示。
SELECT teacher FROM class;如果關鍵字SELECT后面的字段不包含在所查詢的表中,那么MySQL會報錯。
mysql> create database school; #創建數據庫school mysql> use school; #選擇數據庫school mysql> create table class(id int UNIQUE AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64)); #創建表class,指定id 字段自增長 mysql> insert into class(id, name, teacher) values(1, '一班', 'Martin'),(2,'二班', 'Rock'),(3, '三班', 'Janny'),(4,'四班', 'Janny'); # 插入多條記錄 mysql> select teacher from class ; #查詢class表中的teacher 域1.3 DISTINCT查詢
當在MySQL中執行簡單數據查詢時,有時會顯示出重復數據。為了實現查詢不重復數據,MySQL提供了DISTINCT功能,SQL語法如下:
SELECT DISTINCT field1,field2,…,fieldn FROM tablename;在上述語句中,關鍵字DISTINCT去除重復的數據。下面將通過一個具體的示例來說明如何實現查詢不重復數據。
執行SQL語句SELECT,在數據庫school中查詢班級表 class 中teacher字段的數據。具體步驟如下:
mysql> create database school; #創建數據庫school mysql> use school; #選擇數據庫school mysql> create table class(id int UNIQUE AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64)); #創建表class,指定id 字段自增長 mysql> insert into class(id, name, teacher) values(1, '一班', 'Martin'),(2,'二班', 'Rock'),(3, '三班', 'Janny'),(4,'四班', 'Janny'); # 插入多條記錄 mysql> select teacher from class ; #查詢class表中的teacher 域,包含重復記錄 mysql> select distinct teacher from class ; #查詢class表中的teacher 域,去重1.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的值在集合中,就滿足查詢條件,該記錄會被查詢出來,否則不會被查詢出來。
mysql> create database school; #創建數據庫school mysql> use school; #選擇數據庫school mysql> create table class(id int UNIQUE AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64)); #創建表class,指定id 字段自增長 mysql> insert into class(id, name, teacher) values(1, '一班', 'Martin'),(2,'二班', 'Rock'),(3, '三班', 'Janny'),(4,'四班', 'Janny'); # 插入多條記錄 mysql> select * from class where teacher in ('Martin','Rock') ; #查詢class表中的teacher 域是martin 和Rock 的記錄使用NOT IN可以反向查詢非集合中的數據:
SELECT field1,field2,…,fieldn FROM tablename WHERE filedm NOT IN(value1,value2,value3,…,valuen);集合查詢的注意: 集合中慎用 NULL。
在具體使用關鍵字IN時,查詢的集合中如果存在NULL,則不會影響查詢,NULL 存不存在的效果都一樣;但如果使用關鍵字NOT IN,查詢的集合中如果存在NULL,則不會查詢到任何的結果。
1.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,表示的是一個范圍間的判斷過程,只針對數字類型。
1.符合范圍的數據記錄查詢。
通過關鍵字BETWEEN和AND設置查詢范圍,以實現查詢語文成績(字段Chinese)在80和90之間的學生,具體SQL如下:
2. 不符合范圍的數據記錄查詢。
通過關鍵字NOT設置反向查詢非查詢范圍的條件,具體SQL語句如下:
上面語句等同于:
select name,chinese from grade where chinese <85 or chinese >90;1.6 LIKE模糊查詢
當我們只想用字符串中間的一部分特征查找含有特征字串的信息時,MySQL提供了關鍵字LIKE來實現模糊查詢,需要使用通配符,具體語法形式如下:
SELECT field1,field2,…,fieldn FROM tablename WHERE fieldm LIKE value;在上述語句中,參數tablename表示表名,參數fieldn表示表中的字段名字,通過關鍵字LIKE來判斷字段field的值是否與value字符串匹配,如果相匹配,則滿足查詢條件,該記錄就會被查詢出來;否則就不會被查詢出來。
在MySQL中,字符串必須加上單引號(’’)和雙引號(″″)。由于關鍵字LIKE可以實現模糊查詢,因此該關鍵字后面的字符串參數除了可以使用完整的字符串外,還可以包含通配符。LIKE關鍵字支持的通配符如下表所示。
1.查找某個字段含有‘三’字的記錄:
SELECT * FROM class WHERE teacher LIKE ‘%三%’;注意: 將會把teacher字段為“三爺”,“張三”,“張貓三”、“三腳貓”,“唐三藏”等等含“三”的記錄全找出來。
2.查找teacher字段中既有“三”又有“貓”的記錄,請使用and條件
SELECT * FROM class WHERE teacher LIKE ‘%三%’ AND teacher LIKE ‘%貓%’;3.查詢teacher字段中既有“三”又有“貓”的記錄,同時“貓”在“三”之后的記錄
SELECT * FROM class WHERE teacher LIKE ‘%三%貓%’;注意: 雖然能搜索出“三腳貓”,但不能搜索出符合條件的“張貓三”。
4.只找出“唐三藏”這樣teacher為三個字且中間一個字是“三”的;
SELECT * FROM [user] WHERE u_name LIKE ‘_三_’;注意:_表示任意單個字符。匹配單個任意字符,它常用來限制表達式的字符長度語句:(可以代表一個中文 字符)
5.只找出“三腳貓”這樣teacher為三個字且第一個字是“三”的;
SELECT * FROM class WHERE teacher LIKE ‘三__’;下面看更多的示例:
1. 帶有“%”通配符的查詢:
(1)查詢字段teacher中以字母Ma開頭的數據記錄,具體SQL語句如下:
SELECT teacher FROM class WHERE teacher LIKE 'Ma%';(2)MySQL不區別大小寫,上述SQL語句可以修改如下:
SELECT * FROM class WHERE teacher LIKE 'MA%';(3)如果想查詢不是以字母Ma開頭的全部老師,可以執行邏輯非運算符(NOT),具體SQL語句如下:
SELECT teacher FROM class WHERE teacher NOT LIKE 'ma%'; mysql> create database school; #創建數據庫school mysql> use school; #選擇數據庫school mysql> create table class(id int UNIQUE AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64)); #創建表class,指定id 字段自增長 mysql> insert into class(id, name, teacher) values(1, '一班', 'Martin'),(2,'二班', 'Rock'),(3, '三班', 'Janny'),(4,'四班', 'Janny'); # 插入多條記錄 mysql> SELECT teacher FROM class WHERE teacher LIKE '%Ma%'; #查詢class表中的teacher 域,包含重復記錄 mysql> SELECT name FROM class WHERE name NOT LIKE 'ma%';2. 帶有“_”通配符的查詢。
(1)查詢字段teacher中第二個字母為A的數據記錄,具體SQL語句如下:
(2)如果想查詢第二個字母不是A的全部老師,可以執行邏輯非運算符(NOT),具體SQL語句如下:
SELECT * FROM class WHERE NOT teacher LIKE '_A%';(3)如果想查詢第二個字母不是A的全部老師,也可以用以下SQL語句查詢:
SELECT * FROM class WHERE teacher NOT LIKE '_A%';3.使用LIKE關鍵字查詢其他類型數據。
(1)執行SQL語句SELECT,查詢grade表字段english帶有數字9的全部學生,具體SQL語句如下:
(2)對于LIKE關鍵字,如果匹配“%%”,就表示查詢所有數據記錄。
SELECT name FROM grade WHERE name LIKE '%%'; mysql> create database school; #創建數據庫school mysql> use school; #選擇數據庫school mysql> create table grade(id int UNIQUE AUTO_INCREMENT, name varchar(128) NOT NULL, math tinyint unsigned, chinese tinyint unsigned, english tinyint unsigned, create_date date); #創建成績表 grade mysql> insert into grade values(1, '甲', 80, 87, 91,'2020-02-03'),(2,'乙', 72, 64, 89,'2020-05-01'),(3, '丙', 54, 69, 87,'2020-04-21'),(4,'丁', 78, 79, 89, '2020-06-04'); # 插入多條記錄 mysql> select * from grade where english like '9_' ; #查詢英語成績是90 - 99 的記錄1.7 對查詢結果排序
在MySQL中,從表中查詢出的數據可能是無序的,或者其排列順序不是用戶所期望的順序,為了使查詢結果的順序滿足用戶的要求,可以使用關鍵字ORDER BY對記錄進行排序,其語法形式如下:
SELECT field1, field2, field3, …, fieldn FROM tablename ORDER BY fieldm [ASC|DESC]在上述語句中,參數tablename表示所要進行排序的表名,參數fieldn表示表中的字段名字,參數fieldm表示按照該字段進行排序;ASC表示按升序進行排序;DESC表示按降序進行排序。默認的情況下按ASC進行排序。
注意:如果存在一條記錄字段的值為空值(NULL),那么按升序排序時,含空值的記錄將最先顯示,可以理解為空值是該字段的最小值;按降序排列時,字段為空值的記錄將最后顯示。
執行SQL語句SELECT,查詢表grade中所有的數據記錄,按照語文成績(字段chinese)升序排序,具體SQL語句如下:
SELECT id,name,chinese FROM class ORDER BY chinese ASC; mysql> create database school; #創建數據庫school mysql> use school; #選擇數據庫school mysql> create table grade(id int UNIQUE AUTO_INCREMENT, name varchar(128) NOT NULL, math tinyint unsigned, chinese tinyint unsigned, english tinyint unsigned, create_date date); #創建成績表 grade mysql> insert into grade values(1, '甲', 80, 87, 91,'2020-02-03'),(2,'乙', 72, 64, 89,'2020-05-01'),(3, '丙', 54, 69, 87,'2020-04-21'),(4,'丁', 78, 79, 89, '2020-06-04'); # 插入多條記錄 mysql> SELECT id,name,chinese FROM class ORDER BY chinese ASC; #按升序的方式查詢學員記錄1.8 簡單分組查詢
MySQL軟件提供了5個統計函數來幫助用戶統計數據,可以使用戶很方便地對記錄進行統計數、計算和、計算平均數、計算最大值和最小值,而不需要查詢所有數據。
在具體使用統計函數時,都是針對表中所有記錄數或指定特定條件(WHERE子句)的數據記錄進行統計計算。在現實應用中,經常會先把所有數據記錄進行分組,再對這些分組后的數據記錄進行統計計算。
MySQL通過SQL語句GROUP BY來實現,分組數據查詢語法如下:
SELECT function()[,filed ] FROM tablename WHERE CONDITION GROUP BY field;在上述語句中,參數field表示某字段名,通過該字段對名稱為tablename的表的數據記錄進行分組。
注意:在具體進行分組查詢時,分組所依據的字段上的值一定要具有重復值,否則分組沒有任何意義。
五個統計函數簡介:
1.統計數量。
COUNT(*):該種方式可以實現對表中記錄進行統計,不管表字段中包含的是NULL值還是非NULL值。
COUNT(field):該種方式可以實現對指定字段的記錄進行統計,在具體統計時將忽略NULL值。
2. 統計計算平均值。
該函數只有一種使用方式。
AVG(field)使用方式:該種方式可以實現對指定字段的平均值進行計算,在具體統計時將忽略NULL值。
3. 統計計算求和。
該函數只有一種使用方式。
SUM(field)使用方式:該種方式可以實現計算指定字段值之和,在具體統計時將忽略NULL值。
4. 統計最大值。
該函數只有一種使用方式。
MAX(field)使用方式:該種方式可以實現計算指定字段值中的最大值,在具體統計時將忽略NULL值。
5. 統計最小值。
該函數只有一種使用方式。
MIN(field)使用方式:該種方式可以實現計算指定字段值中的最小值,在具體統計時將忽略NULL值。
1.9 統計分組查詢
在MySQL中,只實現簡單的分組查詢有時候可能沒有任何實際意義,因為關鍵字GROUP BY單獨使用時,默認查詢出每個分組中隨機的一條記錄,具有很大的不確定性,一般建議將分組關鍵字與統計函數一起使用。
如果想顯示每個分組中的字段,可以通過函數GROUP_CONCAT()來實現。該函數可以實現顯示每個分組中的指定字段,函數的具體語法形式如下:
在上述語句中會顯示每個數組中的字段值。
示例:使用GROUP_CONCAT()對班級進行統計分組,并顯示每組中學生的姓名。
執行SQL語句GROUP_CONCAT(),顯示每個分組,具體SQL語句如下:
2 聯合查詢
2.1 內連接查詢
在實際開發中,我們會聯合多個表來實現查詢,比如把班級表和學生表聯合起來就同時可以看到班級、老師和學員的信息,一個班級表:
一個班級對應著多個學生,以下是與之對應的學生表”:
將兩個表中ID 相同的記錄關聯起來組成一個新的“列表”,這就是聯合查詢:
這種只有2張表匹配的行才能顯示的連接方式在Mysql 中稱之為內連接: INNER JOIN。
在MySQL中內連接數據查詢通過“INNER JOIN…ON”語句來實現,語法形式如下所示。
SELECT field1,field2,…,fieldn FROM tablename1 INNER JOIN tablename2 [INNER JOIN tablenamen] ON CONDITION其中,參數fieldn表示要查詢的字段名,來源于所連接的表tablename1和tablename2,關鍵字INNER JOIN表示表進行內連接,參數CONDITION表示進行匹配的條件。
舉例如下:
mysql> create database school; #創建數據庫school mysql> use school; #選擇數據庫school mysql> CREATE TABLE class ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(128) DEFAULT NULL, `teacher` varchar(64) DEFAULT NULL, UNIQUE KEY `id` (`id`) ); #創建班級表 class mysql> insert into class values(101, '萌新一班', 'Martin'),(102, '萌新二班', 'Rock'),(103, '萌新三班', 'Janny'); #創建成績表 grade mysql> CREATE TABLE `student` ( `id` int NOT NULL AUTO_INCREMENT UNIQUE, `name` varchar(64) DEFAULT NULL, `class_id` int DEFAULT NULL, `sex` enum('F','M') DEFAULT NULL ); mysql> insert into student values(1,'小花',101,'M'),(2,'小紅',102, 'F'),(3,'小軍',102,'F'),(4,'小白',101,'F'); #插入多條記錄 mysql> select * from class inner join student on class.id = student.class_id; #查詢class 表和student 表中班級字段相同的記錄并進行內連接 mysql> select * from class as a inner join student as b where a.id = b.class_id; #同上,使用別名查詢當表名特別長時,直接使用表名很不方便,或者在實現自連接操作時,直接使用表名無法區別表。為了解決這一類問題,MySQL提供了一種機制來為表取別名,具體語法如下:
SELECT field1, field2, ...,fieldn [AS] otherfieldn FROM tablename1 [AS] othertablename1, ...,Tablenamen [AS] othertablenamen ... where othertablename1.fieldx = othertablenamen.fieldx ... ;其中,參數tablename為表原來的名字,參數othertablename為新表名,之所以要為表設置新的名字,是為了讓SQL語句代碼更加直觀、更加人性化和實現更加復雜的功能。
自連接:
內連接查詢中存在一種特殊的等值連接——自連接。所謂自連接,就是指表與其自身進行連接。
如:查詢學生 ”小紅 ”所在班級的其他學生,SQL語句如下:
mysql> use school; #選擇數據庫school mysql> select t1.id, t1.name, t1.class_id from student t1 inner join student t2 on t1.class_id = t2.class_id and t2.name= '小紅'; #查詢學生 ”小紅 ”所在班級的其他學生等值連接:
內連接查詢中的等值連接就是在關鍵字ON后的匹配條件中通過等于關系運算符(=)來實現等值條件。
mysql> select * from class as a inner join student as b where a.id = b.class_id;不等值連接:
內連接查詢中的不等連接就是在關鍵字ON后的匹配條件中通過除了等于關系運算符來實現不等條件外,還可以使用關系運算符,包含“>”“>=”“<”“<=”和“!=”等運算符號。
2.2 外連接查詢
當我們在查詢數據時,要求返回所操作表中至少一個表的所有數據記錄,通過SQL語句“OUTER JOIN…ON”來實現。外連接數據查詢語法形式如下:
SELECT field1,field2,…,fieldnFROM tablename1 LEFT|RIGHT [OUTER] JOIN tablename2ON CONDITION在上述語句中,參數fieldn表示所要查詢的字段名字,來源于所連接的表tablename1和tablename2,關鍵字OUTER JOIN表示表進行外連接,參數CONDITION表示進行匹配的條件。
外連接查詢可以分為以下二類:
左外連接:
外連接查詢中的左外連接,就是指新關系中執行匹配條件時,以關鍵字LEFT JOIN左邊的表為參考表。左連接的結果包括LEFT OUTER字句中指定的左表的所有行,而不僅僅是連接列所匹配的行,如果左表的某行在右表中沒有匹配行,則在相關聯的結果行中,右表的所有選擇列表均為空值。
例如:查詢所有學生的學號、姓名、班級編號、性別、班級名、班主任信息,具體SQL語句如下:
mysql> use school; #選擇數據庫school mysql> select * from student as a left join class as b on a.class_id = b.id; #左連接查詢所有學生對應的班級信息 mysql> select * from class as a left join student as b on a.id = b.class_id; #左連接查詢所有班級的學員信息
(左連接查詢一 所有學員對應的班級信息)
(左連接查詢二 所有班級對應的學員信息)
右外連接:
外連接查詢中的右外連接在新關系中執行匹配條件時,以關鍵字RIGHT JOIN右邊的表為參考表,如果右表的某行在左表中沒有匹配行,左表將返回空值。
例如:查詢所有班級的所有學生信息。具體SQL語句如下:
mysql> use school; #選擇數據庫school mysql> select * from student as a right join class as b on a.class_id = b.id; #右連接查詢所有班級對應的學員信息 mysql> select * from class as a right join student as b on a.id = b.class_id; #右連接查詢所有學員對應的班級信息2.3 合并查詢數據記錄
在MySQL中通過關鍵字UNION來實現合并操作,即可以通過其將多個SELECT語句的查詢結果合并在一起,組成新的關系。在MySQL軟件中,合并查詢數據記錄可通過SQL語句UNION來實現(字段數量必須相等),具體語法形式如下:
SELECT field1,field2,…,fieldn FROM tablename1UNION | UNION ALLSELECT field1,field2,…,fieldn FROM tablename2UNION | UNION ALL SELECT field1,field2,…,fieldn ;注意: 多個選擇語句select 的列數相同就可以合并,union和union all的主要區別是union all是把結果集直接合并在一起,而union 是將union all后的結果再執行一次distinct,去除重復的記錄后的結果。
mysql> use school; #選擇數據庫school mysql> select teacher from class union all select name from student; #查詢班級表所有老師和學生表中所有學生姓名 mysql> select teacher as people from class union all select name as people from student; #同上,使用別名查詢 mysql> select teacher,id from class union all select name,class_id from student; #查詢班級表所有(老師、班級ID)和學生表中所有學生(姓名、班級ID)2.4 子查詢
所謂子查詢,是指在一個查詢中嵌套了其他的若干查詢,即在一個SELECT查詢語句的WHERE或FROM子句中包含另一個SELECT查詢語句。在查詢語句中,外層SELECT查詢語句稱為主查詢,WHERE子句中的SELECT查詢語句被稱為子查詢,也被稱為嵌套查詢。
通過子查詢可以實現多表查詢,該查詢語句中可能包含IN、ANY、ALL和EXISTS等關鍵字,除此之外還可能包含比較運算符。理論上,子查詢可以出現在查詢語句的任意位置,但是在實際開發中子查詢經常出現在WHERE和FROM子句中。
帶比較運算符的子查詢:
子查詢可以使用比較運算符。這些比較運算符包括=、!=、>、>=、<、<=和<>等。其中,<>與!=是等價的。比較運算符在子查詢中使用得非常廣泛,如查詢分數、年齡、價格和收入等。
例如:查詢student 表中“小花”所在班級班主任的名字。SQL語句如下:
mysql> use school; #選擇數據庫school mysql> select teacher from class where id = (select class_id from student where name='小花'); #查詢“小花”所在班級班主任的姓名注意:使用比較運算符時,select 子句獲得的記錄數不能大于1條!!!
帶關鍵字IN的子查詢:
一個查詢語句的條件可能落在另一個SELECT語句的查詢結果中,這時可以使用IN關鍵字,SQL示例如下:
NOT IN的用法與IN相同。
例如:查詢student 表中“小花”所在班級班主任的名字。SQL語句如下:
mysql> use school; #選擇數據庫school mysql> select teacher from class where id in (select class_id from student where name='小花'); #查詢student 表中“小花”所在班級班主任的名字 mysql> select teacher from class where id in (select class_id from student where name like '小%'); #查詢姓名以“小”字開頭的學生所在班級班主任的姓名帶關鍵字EXISTS的子查詢:
關鍵字EXISTS表示存在,后面的參數是一個任意的子查詢,系統對子查詢進行運算以判斷它是否返回行;如果至少返回一行,那么EXISTS的結果為true,此時外層語句將進行查詢;如果子查詢沒有返回任何行,那么EXISTS返回的結果是false,此時外層語句將不進行查詢。
例如:如果102班存在學生記錄,就查詢102班的班級信息的記錄。SQL示例語句如下:
帶關鍵字ANY的子查詢:
關鍵字ANY表示滿足其中任一條件。使用關鍵ANY時,只要滿足內層查詢語句返回的結果中的任何一個就可以通過該條件來執行外層查詢語句。例如,需要查詢哪些學生可以獲取獎學金,那么首先要有一張獎學金表,從表中查詢出各種獎學金要求的最低分,只要一個同學的乘積大于等于不同獎學金最低分的任何一個,這個同學就可以獲得獎學金。關鍵字ANY通常和比較運算符一起使用。例如,“>ANY”表示大于任何一個值,“=ANY”表示等于任何一個值。
例如:查詢數據庫school的表student中哪些學生可以獲得獎學金。學生的成績達到其中任何一項獎學金規定的分數即可,SQL語句示例如下:
mysql> use school; #選擇數據庫school mysql> create table scholarship (score int, level varchar(64)); mysql> insert into scholarship values(240, '二等獎'),(257,'一等獎'); mysql> select st.id, st.name, st.math+st.chinese+st.english total from grade st where (math+chinese+english) >= ANY (select score from scholarship); #查詢能獲得獎學金的學院記錄帶關鍵字ALL的子查詢:
關鍵字ALL表示滿足所有條件。使用關鍵字ALL時,只有滿足內層查詢語句返回的所有結果才可以執行外層查詢語句。例如,需要查詢哪些同學能夠獲得一等獎學金,首先要從獎學金表中查詢出各種獎學金要求的最低分。因為一等獎學金要求的分數最高,只有當成績高于所有獎學金最低分時,這個同學才可能獲得一等獎學金。關鍵字ALL也經常與比較運算符一起使用。例如,“>ALL”表示大于所有值,“<ALL”表示小于所有值。
例如:查詢數據庫school的表student中哪些學生可以獲得一等獎學金,即學生的總成績要達到一等獎學金規定的分數,而一等獎學金是最高獎學金。SQL語句示例如下:
mysql> use school; #選擇數據庫school mysql> select st.id, st.name, st.math+st.chinese+st.english total from grade st where (math+chinese+english) >= ALL (select score from scholarship); #查詢能獲得一等獎學金的同學記錄 mysql> select st.id, st.name, st.math+st.chinese+st.english total from grade st where (math+chinese+english) < ALL (select score from scholarship); #查詢不能獲得獎學金的同學記錄參考資料:
總結
以上是生活随笔為你收集整理的MySQL中的数据查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 进口车导航涉嫌损害国家主权的是哪一款车
- 下一篇: MySQL中的视图操作