基本

select * from A left/right/inner join B on A.aid = B.bid//没有where条件限制

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行

心得:左、右连接都是以各自的边为基准,左表(右表)的数据全部显示出来,然后右表(左表)数据中不足的地方用null补齐。内连接则不以谁为准,只是返回符合条件的数据。当然,如果后面有where条件的限制则以where后面为准。

涉及分组(group by)

select a.mobile,COUNT(b.id) as ff from user a left JOIN space_post b on a.id = b.id_user GROUP BY a.id HAVING ff > 0//分组后对聚合函数得出的结果再次筛选
  • where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚组函数,使用where条件过滤出特定的行。
  • having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件过滤出特定的组,也可以使用多个分组标准进行分组。
SELECT b.name as '班级名字',count(sex = 1 or NULL) as 'man',count(sex = 2 or null) as 'woman' from a LEFT JOIN b on a.classid = b.classid GROUP BY b.name//分组后对同一列中的不同情况分开计数

心得:一般情况下,group by会和聚合函数一起使用。

if条件的用法

IF( expr1 , expr2 , expr3 )//条件表达式
  • expr1 的值为 TRUE,则返回值为 expr2 
  • expr2 的值为FALSE,则返回值为 expr3
//新增数据时,使得某一字段自增(如下为不同空间的发帖数的自增)
INSERT INTO space_post (id_user,id_space,content,number,dt_create)
VALUES
(1,1,'aaa',
IF(
(SELECT sp.number FROM space_post sp WHERE sp.id_user = 1 AND sp.id_space = 1 ORDER BY sp.number DESC LIMIT 1),
(SELECT sp1.number FROM space_post sp1 WHERE sp1.id_user = 1 AND sp1.id_space = 1 ORDER BY sp1.number DESC LIMIT 1),0
) + 1,
NOW());
//上方sql语句,if部分的简化
INSERT INTO space_post (id_user,id_space,ids_image,content,number,dt_create)
VALUES
(
$id_user,$id_space,'$ids_image','$content', IF((SELECT @num := sp.number FROM space_post sp WHERE sp.id_space = $id_space ORDER BY sp.number DESC LIMIT 1),@num,0) + 1,
NOW());

心得:简化的sql中使用了自定义变量的赋值:=(用于传递外部参数为语句中变量赋值),自定义变量的使用@

posted on 2018-01-26 14:27  初见初心  阅读(273)  评论(0编辑  收藏  举报