數據庫---數據庫查詢的各種子句
基本查詢
orderby子句
形式:
order by 排序字段1 [排序方式], 排序字段2 [排序方式], .....
說明:
對前面取得的數據(含from子句,where子句,group子句,having子句的所有結果)來指定按某個字段的大小進行排列(排序),排序只有2種方式:
正序: ASC(默認值),可以省略
倒序: DESC
如果指定多個字段排序(雖然不常見),則其含義是,在前一個字段排序中相同的那些數據裏,再按後一字段的大小進行指定的排序。
limit子句
形式:
limit [起始行號start], 要取出的行數num
說明:
表示將前面取得的數據並前面排好之後(如果有),對之指定取得“局部連續的若幹條”數據。
起始行號start:第一行的行號為0, 可以省略,則為默認行號(0)。
要取得的行數:如果結果集中從指定的行號開始到最後沒有這麽多行,則就只取到最後。
此子句非常有用——主要用於網頁上最常見的一個需求(現象):分頁。
分頁原理:
分頁的前提:人為指定每頁顯示的條數,$pageSize = 3;
顯示(取得)第1頁數據:select * from 表名 limit 0, $pageSize;
顯示(取得)第2頁數據:select * from 表名 limit 3, $pageSize;
顯示(取得)第3頁數據:select * from 表名 limit 6, $pageSize;
顯示(取得)第$n頁數據:select * from 表名 limit ($n-1)*$pageSize, $pageSize;
連接查詢
連接就是指兩個或2個以上的表(數據源)“連接起來成為一個數據源”。
實際上,兩個表的完全的連接是這樣的一個過程:
左邊的表的每一行,跟右邊的表的每一行,兩兩互相“橫向對接”後所得到的所有數據行的結果。
註意:連接之後,並非形成了一個新的數據表,而只是一種“內存形態”。
語法形式:from 表1 [連接方式] join 表2 [on 連接條件];
例:
select * from course join teacher on course.cno=teacher.cno
select student.sno,course.cname,score.degree from studentjoin score on score.sno=student.sno join course on course.cno=score.cno;
交叉連接:
實際上,交叉連接是將兩個表不設定任何條件的連接結果。
交叉連接通常也被叫做“笛卡爾積”——數學上可能比較多。
語法形式:
from 表1 [cross] join 表2 ; //可見交叉連接只是沒有on條件而已。
cross這個詞也可以省略,還可以使用inner這個詞代替
內連接:相當於連接查詢
語法:
from 表1 [inner] join 表2 on 表1.字段1=表2.字段2;
左[外]連接:
形式:
from 表1 left [outer] join 表2 on 連接條件。
說明:
1,這裏,left是關鍵字。
2,連接條件跟內連接一樣。
3,含義是:內連接的結果基礎上,加上左邊表中所有不符合連接條件的數據,相應本應放右邊表的字段的位置就自動補為“null”值。
右[外]連接:
形式:
from 表1 right [outer] join 表2 on 連接條件。
說明:
1,這裏,right是關鍵字。
2,連接條件跟內連接一樣。
3,含義是:在內連接的結果基礎上,加上右邊表中所有不符合連接條件的數據,相應本應放左邊表的字段的位置就自動補為“null”值。
全[外]連接:
相當於左外查詢和右外查詢的合集。
形式:
from 表1 full [outer] join 表2 on 連接條件;
說明:
1,含義:其實是左右連接的“並集”(消除重復項),即內連接的結果,加上左表中不滿足條件的所有行(右邊對應補null),再加上,右表中不滿足條件的所有行(左邊對應補null)。
2,mysql中其實不認識全[外]連接語法,即mysql這個軟件本身不支持全連接的語法。
3,此概念在其他數據庫有的存在,了解就可以。
常見子查詢及相關關鍵字
子查詢
一個查詢,通常就是一個select語句(即出現一次select關鍵字)
但,如果在一個select查詢語句中,又出現了select查詢語句,此時就稱後者為“子查詢”,前者就是“主查詢”
形式:
selelct 字段或表達式或(子查詢1) [as 別名] from 表名或(子查詢2) where 字段或表達式或(子查詢3) 的條件判斷
使用in子查詢
in的基本語法形式為:
where 操作數 in (值1,值2, ....)
則in子查詢就是:
where 操作數 in ( 列子查詢 );
含義:
表示該操作數(字段值) 等於 該子查詢的其中任意一個只,就算滿足條件。
使用any子查詢
使用形式:
where 操作數 比較運算符 any ( 列子查詢 );
說明:
1操作數通常仍然是字段名
2比較運算符就是常規的〉 〉= < <= = <>
3列子查詢也可以是標量子查詢,都表示“若幹個數據值”
含義:
表示該操作數的值只要跟列子查詢的任意一個值滿足給定的比較運算,就算滿足了條件——就是只要有一個成就成。
特殊情況:
where 操作數 = any ( 列子查詢 );
則其完全相當於:
where 操作數 in ( 列子查詢 );
使用all子查詢
where 操作數 比較運算符 all ( 列子查詢 );
說明:
1操作數通常仍然是字段名
2比較運算符就是常規的〉 〉= < <= = <>
3列子查詢也可以是標量子查詢,都表示“若幹個數據值”
含義:
表示該操作數的值必須跟列子查詢的所有值都滿足給定的比較運算,才算滿足了條件。
使用some的子查詢
some是any的同義詞。一樣用。
使用exists的子查詢
形式:
where exists (子查詢);
含義:
如果該子查詢有結果數據(無論什麽數據,只要大於等於1行),則就是true,否則為false
not exists子查詢:
和exists子查詢相反。
聯合查詢
聯合查詢的關鍵字是: union 對行的擴展,兩張表 字段相同,結果不同
連接查詢的關鍵字是: join 對列的擴展,兩張表左右拼起來
聯合查詢就是將兩個select語句的查詢結果“層疊”到一起成為一個“大結果”。
兩個查詢結果的能夠進行“聯合”的先覺條件是:結果字段數相等。
語法形式:
select 語句1 union [ALL | DISTINCT] select 語句2;
說明:
1,兩個select語句的輸出段(結果字段)一樣數目一樣,應用中通常類型一樣才有意義。
2,結果集中的字段以第一個select語句的字段為準。
3,第一個select語句的字段可以做別名,但如果做別名,則後續的where,group,order等子句應該用該別名。
4,聯合查詢默認是會消除重復項的(DISTINCT),要想不消除,則必須明確些“ALL”。
5,如果要對整個聯合結果進行排序或limit,則應該對各自的select語句加括號:
(select 語句1)
union
(select 語句2)
order by ..... limit ....;
例:
#31、 查詢所有教師和同學的name、sex和birthday. select sname,ssex,sbirthday from student union select tname,tsex,tbirthday from teacher; #32、查詢所有“女”教師和“女”同學的name、sex和birthday. select sname,ssex,sbirthday from student where ssex="女" union select tname,tsex,tbirthday from teacher where tsex="女";
數據庫---數據庫查詢的各種子句