1.GROUP BY 語句
GROUP BY 語句用于結(jié)合合計(jì)函數(shù),根據(jù)一個(gè)或多個(gè)列對結(jié)果集進(jìn)行分組。
SQL GROUP BY 語法
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
2.HAVING 子句
在 SQL 中增加 HAVING 子句原因是谁帕,WHERE 關(guān)鍵字無法與合計(jì)函數(shù)一起使用。
SQL HAVING 語法
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<2000
3.不同的 SQL JOIN
left join == left outer join
,都是取并集
1.我們一般關(guān)聯(lián)查詢的時(shí)候冯袍,習(xí)慣使用left join
匈挖,其實(shí)這種方式是不可取的,
因?yàn)槲覀兤鋵?shí)取交集即可,應(yīng)該使用inner join
注意康愤,不需要使用left
或者right
inner join
,因?yàn)槭遣⒓苎笥覂蛇厸]有權(quán)重。都是平級征冷。
2.如果兩個(gè)或者多個(gè)表都有自己的條件择膝,我們應(yīng)該將條件寫入查詢條件中,越精確越好
在我們繼續(xù)講解實(shí)例之前检激,我們先列出您可以使用的不同的 SQL JOIN 類型:
INNER JOIN:如果表中有至少一個(gè)匹配肴捉,則返回行
LEFT JOIN:即使右表中沒有匹配,也從左表返回所有的行
RIGHT JOIN:即使左表中沒有匹配叔收,也從右表返回所有的行
FULL JOIN:只要其中一個(gè)表中存在匹配齿穗,則返回行
分頁中取數(shù)據(jù)
1,select * from `day_vists` limit 3 offset 2
larvel語句:DB::table('day_vists')->skip(2)->take(3)->get();
參數(shù)---->skip($start)->take($pagenum)
得到的是3,4饺律,5條數(shù)據(jù)窃页。相當(dāng)于跳過兩條,取三條。
這種取發(fā)比較麻煩 需要通過每次傳過來的page來計(jì)算偏移量脖卖。
(2)通過DB類的forPage方法獲取數(shù)據(jù)
select * from `day_vists` limit 3 offset 3
DB::table('day_vists')->forPage(2, 3)->get();
參數(shù)---forPage($nowPage, $pageNum)
得到的是4乒省,5,6條數(shù)據(jù)畦木,相當(dāng)于現(xiàn)在在第二頁作儿,每頁3條數(shù)據(jù)
這種方法比較便捷直接傳一個(gè)當(dāng)前頁和具體每頁多少條數(shù)據(jù)就行了,
分頁類的使用
/*
* 每次分頁請求過來的參數(shù)有
* totalPage //總頁數(shù)
* nowPage 當(dāng)前頁數(shù)
*/
public function index(Request $request)
{
$request = $request->all();
$nowPage = empty($request['nowPage'])?1: $request['nowPage'] ; //當(dāng)前頁是變化的
$pageNum = 2;
$datas = DB::table('day_vists')->forPage($nowPage,$pageNum)->get();
// dd($datas);
$count = \DB::table('day_vists')->count();
$countPage = ceil($count / $pageNum); //總頁數(shù)是固定的
$pages = $this->custompage->getSelfPageView($nowPage, $countPage, '/test', '');
return view('welcome',compact('pages','datas'));
}
3.關(guān)聯(lián)查詢的使用--不同的 JOIN
left join == left outer join
,都是取并集
1.我們一般關(guān)聯(lián)查詢的時(shí)候馋劈,習(xí)慣使用left
,其實(shí)這種方式是不可取的,
因?yàn)槲覀兤鋵?shí)取交集
即可晾嘶,應(yīng)該使用left inner join
2.如果兩個(gè)或者多個(gè)表都有自己的條件妓雾,我們應(yīng)該將條件寫入條件中
INNER JOIN:如果表中有至少一個(gè)匹配,則返回行
LEFT JOIN:即使右表中沒有匹配垒迂,也從左表返回所有的行
RIGHT JOIN:即使左表中沒有匹配械姻,也從右表返回所有的行
FULL JOIN:只要其中一個(gè)表中存在匹配,則返回行
對于多表查詢机断,我們一般會使用關(guān)聯(lián)查詢楷拳,但是那種方式效率低
以下這種方式是,取出數(shù)據(jù)吏奸,然后遍歷一次欢揖,根據(jù)取到的web_id
去找數(shù)據(jù)里面的結(jié)果。然后拼接成一個(gè)新的數(shù)據(jù)即可
public function getAlltestInfo($nowPage,$pageNum)
{
// 取出test_info的數(shù)據(jù)
$datas = DB::table('test_info')->forPage($nowPage,$pageNum)->orderBy('id','desc')->get();
$row = array();
foreach ($datas as $val){
// 將取到的數(shù)據(jù)便利可以的到具體的id 根據(jù)id去相應(yīng)的數(shù)據(jù)表里面查出自己想要的數(shù)據(jù)
$game = DB::table('web_game')->where('id',$val->site_id)->first();
$site = DB::table('web_site')->where('id',$val->site_id)->first();
//或者可以 $game_name = DB::table('web_game')->where('id',$val->site_id)->value('name');
// $val->game_id = $game_name; //把test_info里面的game_id值重新賦值
// 把需要的字段值奋蔚,賦給原數(shù)據(jù)里面一個(gè)新的自定義變量
$val->site_name = $site->name;
$val->game_name = $game->name;
$row[] = $val;
// 此時(shí)的$row 就是原數(shù)組便利后 新添加了兩個(gè)字段的新數(shù)據(jù)
}
return $row;
}
// 關(guān)聯(lián)查詢一般這樣
\DB::table('kehuanli as a')
->leftJoin('kehuanli_type as b','a.type_id','=','b.type_id')
->select('b.type_name','a.title','a.content','a.image')
->orderBy('a.id','desc')
->take(4)
->get();