Sql語句
一般順序GHOL : group by,having ,order by,limit
如果是分組,應該使用對分組字段進行排序的group by語法
Limit start ,length
去除重復記錄默認為all
Select distinct 字段 from
Select distinct * from 沒用(所有字段組合不相同才認為不相同,用在這裡基本沒用),記錄值完全一樣時取其一個
Union查詢
把兩個select 結果union起來
( select 語句1)union(select 語句2)
選出英語最高分和數學最高分的學生的id,name ,class
注意加括號
有重復記錄時的合並
按english由高到低和由低到高的結果合並
在符合語句中 order by功能受影響,需加上limit
子語句的排序
1.將子語句包裹在子括號內
2.子語句的 order by
中有order by配合Limit使用時才生效。
原因是:union在做子語句時,會對沒有limit的order by優化(忽略)
所有結果排序
只需要在最後一個select語句後增加相應排序即可。
子語句括號非必須最後一個排序默認針對所有結果。
Union檢索的字段必須個數一樣(否者出錯),數據類型也一樣(發生類型轉換) 列名由第一個select檢索列名來定
子查詢
語句內部的查詢語句
表中數據
查出英語成績最高的學生的信息
不用子查詢:
但有2個學生英語成績最高且一致,這個時候在不知道表裡數據的情況下就不能使用這種查詢方法
思路:先找出英語成績最大的那個值,再找出哪些學生的英語成績與這個最大的值相等。這樣一步一步進行查詢。
只檢索一個字段時可以作為一個值使用,必須只檢索一個字段
子查詢分類
不同的分類會有不同的使用方式
分類標准:
子查詢出現的位置
子查詢的返回值形式
返回值分類:
單一值,單列,多列,多行多列(表)
出現位置:
Where 型,where 後
From型 from後
Exists型
使用:
標量的:獲得一個值後用關系運算符進行運算(> >=,< <= = <> )
列子查詢(只是1列):獲得一列通常是對個行的一列值(一個集合)
使用in,not in運算符
查出班級為php101中所有學生的信息
集合操作符還有
Any(集合) 集合中的任意一個
=any(集合) 等於集合中的任意一個即可
等同於in
=All(集合) 集合中的所有元素
!=all(集合) 不等於集合中的所有元素等同於Not in
!=any(集合) 不等於集合中的任意一個元素成立即可,即為只要不等於其中的一個元素即為成立的。
注意:這種語法不該出現在實際開發中
Some(集合) 集合中的一些
語法上與any一樣
總結:
=any 等同於in
!=all 等同於 not in
Some 和any同義
All,any ,some可以使用除了=,!=之外運算符,比in強大
返回一行
在參與比較時,使用括號可以構建一行
(field1,field2,…)
表中數據
現在要查詢出和賀8在同樣的班級且與他math成績一樣的同學的信息
子查詢
返回一個表
如果用在from子句內,要求要是一個表
現在是查詢結果,必須給這個查詢結果起別名
表中數據
查詢php103班 english不及格的學生信息
必須有別名
Exists
如果子查詢可以返回數據則返回真,否者返回假
有以下2表
A表
B表
在a中查詢出id在 b中有的記錄
先獲取a表的第一行記錄,在子查詢中判斷a表的id與b表的id比較
連接查詢
Join
每個實體,一個表
一個業務邏輯,使用多個實體的數據
多張表應該在一起使用,將多個表的記錄連接起來
Teacher表
Teacher_class1表
查出代課老師的代課信息
笛卡爾(交叉)連接
內連接處理
在連接時,是可以省略連接條件的。意味著,所有的左表數據,都要與右表的記錄做一個連接
共存在m*n個連接
稱之為交叉連接或笛卡爾集
此時可以使用 cross join代替inner join
Mysql中cross join與inner join相同
Inner join是默認的連接方式(inner 省略)
等效的
也可使用
表示笛卡爾積
結果雖然一樣
On數據連接條件
Where數據過濾條件
但 where是先連接成笛卡爾積
然後做篩選,而on 是在連接時就判斷
上表是連接條件2個
下表是
過濾條件2個
下表連接過濾各一個
Using:要求負責連接的兩個實體之間字段名稱一致。
查詢條件與外連接通用 外連接不能用where作為連接條件。
注意:
無論是連接條件還是連接查詢多字段列表,都沒必要一定要寫表名.字段語法,是否寫取決於是否發生沖突。建議寫上。
別名
表應該別名,保證簡潔清晰。
列別名
外連接:
分類
左外連接
右外連接
全外連接(暫不支持)
左連接
在連接時,如果出現左邊表,數據連接不到右邊表的情況,則左表的數據在最終結果內保留。而如果出現右表的數據連接不到左標的情況,右表數據被丟棄。
由於內連接沒有左右連接之分,left outer join中outer可以省略。
在外連接中不可以用where做連接條件可用on ,using
表別名可以用在連接條件裡,但字段別名不可以。
表起別名後,在篩選或者連接條件裡必須用別名,原名不能用了
左表teacher裡的數據孫武連接不上也保留。
全外連接左外與右外 union(取並集)
內連接是左外右外交集
Using會去掉結果中重復字段,並放在列首
外連接不能使用沒有條件的連接(不像內連接那樣形成笛卡爾積)
自然連接
通過mysql自己判斷完成連接過程。不需要指定連接條件,mysql會使用多表內相同的字段作為連接條件。
表one數據
Two表數據
自然連接也有內外之分
內:natural join
外:左外natural left join ,右外 natural right join