聯合查詢
聯合查詢:將多次查詢(多條select 語句),在記錄上進行拼接(字段不會增加)
基本語法
多條select語句構成:每一條select語句獲取的字段數必須嚴格一致(但是字段類型無關)
select 語句1
Union [union 選項]
select 語句2
Union 選項:與select 選項一樣有兩個
All:保留所有(不管重復)
Distinct:去重(整個重復):默認的
聯合查詢只要求字段一樣,跟數據類型 無關
聯合查詢意義
聯合查詢的意義分為兩種:
1.查詢同一張表,但是需求不同:如查詢學生信息,男生身高升序,女生身高降序。
2.多表查詢:多張表的結構是完全一樣的,保存的數據(結構)也是一樣的。
order by 使用
在聯合查詢中:order by 不能直接使用,需要對查詢語句使用括號才行
若要order by 生效:必須搭配limit:limit使用限定的最大數即可
子查詢
子查詢:sub query,查詢是在某個查詢結果之上進行的(一條select 語句內部包含了另外一條select語句)
子查詢分類
子查詢有兩種分類方式:按位置分類;按結果分類
按位置分類:子查詢(select 語句) 在外部查詢(select語句)中出現的位置
from 子查詢:子查詢跟在from之后
where子查詢:子查詢出現where條件中
exists子查詢:子查詢出現在exists里面
按結果分類:根據子查詢得到的數據進行分類(理論上講任何一個查詢得到的結果都可以理解為二維表)
標量子查詢:子查詢得到的結果是一行一列
列子查詢:子查詢得到的結果是一列多行
行子查詢:子查詢得到的結果是多列一行(多行多列)
上面幾個出現的位置都是在where之后
表子查詢:子查詢得到的結果是多行多列(出現的位置是在from之后)
標量子查詢
需求:知道班級名字為PHP0710,想獲取該班的所有學生
1.確定數據源:獲取所有的學生
select * from my_student where c_id=?;
2.獲取班級ID:可以通過班級名字確定
select id from my_class where name='PHP0810'; -- id一定只有一個值(一行一列)
標量子查詢實現
列子查詢
需求:查詢所有在讀班級的學生(班級中存在的班級)
1. 確定數據源:學生
select * from my_student where c_id in(?);
2.確定有效班級的 ID:所有班級id
select id from my_class;
列子查詢實現
列子查詢返回的結果會比較:一列多行,需要使用in 作為條件匹配:其實在mysql中還有幾個類似的條件:all ,some ,any
行子查詢
行子查詢:返回的結果可以是多行多列(一行多列)
需求:要求查詢整個學生中,年齡最大且身高是最高的學生
1.確定數據源
select * from my_student where age=? and height =?;
2.確定最大的年齡和最高的身高
select max(age),max(height) from my_student;
行子查詢:需要構造行元素,
表子查詢
表子查詢:子查詢返回的結果是多行多列的二維表:子查詢返回的結果是當做二維表來使用
需求:找出每個班最高的一個學生
1.確定數據源,先將學生按照身高進行降序排序
selelct * from my_student order by height desc;
2.從每個班選出第一個學生
selelct * from my_student group by c_id; -- 每個班選出第一個學生
表子查詢:from子查詢:得到的結果作為from的數據源
Exists 子查詢
Exists: 是否存在的意思,exists子查詢就是用來判斷某些條件是否滿足(跨表),exists是接在where之后 exists返回的結果只有0和1
需求:查詢所有的學生:前提條件是班級存在
1.確定數據源
select * from my_student where ?;
2.確定條件是否滿足
Exists(select * from my_class); -- 是否成立
exists子查詢