1. order by (排序)
? ?通常使用一個字段作為參考標準,進行排序。
? ?語法:order by 【字段】 asc|desc;(升序、降序)
? ?tip : 校對規則 決定 排序關系。
? ? ? ? ? 允許多字段排序(先按第一個字段排序,當出現不能區分的時候,按第二個字段進行排序,依此類推)。
【舉個栗子】 對于下表,輸入select * from tb_name; 時,會按照輸入順序依次顯示表中的數據:
? ? ? ? ?
? ? ? ?當需要對表中數據按照字段 stu_score 進行降序排列時,在輸入語句后加上order by stu_score desc .
? ? ? ??
? ? ? ?如果不注明升序、降序,默認使用升序:
? ? ? ?
? ? ? 若使用多字段排序,eg. 先按stu_score進行排序,若分數相同,再按照開課時間ord_begin進行排序,語句為:
? ? ? ?select * from tb_name order by stu_score desc , date_begin , asc;
tip : order by是對檢索出來的信息進行排序,因此需要寫在where語句后。
? ? ? 如果是ord,則應該使用對分組字段進行排序的group by語法。
2. limit(限制獲得的記錄數量)
? ?limit 發生在排序、檢索等ord之后,所以 limit 出現在最后。
? ?對于下面的數據表,若限制只顯示其中的1個數據,則輸出結果為右圖:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?即會按照最初數據輸入的順序,取第一組數據進行輸出。
? ?也可以在進行完排序后,限制只輸出前3名:
? ? ? ? ??
? ?語法:limit 偏移量 總記錄數;
? ? ? ? ? ?偏移量:截取的開始點。 ? ? ?總記錄數:截取的長度。
? ? ? ? ? 若不寫偏移量,默認從0開始。
3. distinct(去除重復記錄)(與ord相對應)
? ? 當在表exam_stu中,顯示字段stu_score中的所有數據時,結果如下:
? ??
? ?若想去除其中的重復記錄,可使用一下語句,于是兩個95分便只剩下了一個:
? ??
? ?重復記錄的標準是按照ord的字段來確定的,當語句為select distinct * 時,只有當所有字段都一樣時,才認為兩條數據重復;
? ?當語句是 select distinct stu_score時,當兩條數據的stu_score相同時,認為二者重復;
? ?當語句是select distinct stu_score,stu_name時,必須分數和名字一樣,才認為二者重復。
? ? 將多條 select 語句合并到一起,稱為聯合操作。
? ? 使用 union 關鍵字,聯合兩個 select 語句即可。
【舉個栗子】要在表中查詢給php0228班和php0331班上課天數最多的兩個老師,語句為
? ? ? ? ? ? ? ? select torder_name,days from teacher_ord where class_name=’php0228′ order by days desc limit 1;
? ? ? ? ? ? ? ??select teacher_name,days from teacher_class where class_name=’php0331′ order by days desc limit 1;
? ? ? ? ? ? ?這兩個分開的語句的確可以查找出想要的結果,但是若要做聯合查詢呢?
? ? ? ? ? ? 語句是 :(語句1)union(語句2);
? ? ? ? ? ? ? ? ? ? ? ? ? 但這種寫法會將重復的記錄ord,若想保留所有記錄,哪怕重復,可用一下格式:
? ? ? ? ? ? ? ? ? ? ? ? (語句1)union all (語句2);?
tip:在使用union的情況下,排序有幾點需要注意。
? ? ?子語句的排序:
? ? ? ?① 將子語句包裹在子括號內;
? ? ? ?② 子語句的order by只有在配合limit使用時,才生效。原因是:union會對沒有limit的字句的order by優化(忽略)。
若相對union的結果進行排序,使用如下語句:
? ? ?(語句1)union(語句2)order by days ;
注意: ① 多個 select 語句的檢索到的字段數必須一致;更嚴格的是,ord上也應該要求一致(但是ord內部會做ord處理,要 ? ? ? ? ? ? ?求是能轉換成功)。