分享高级sql写法

一、
ORDER BY FIELD() 自定义排序逻辑
$sql = "SELECT * from edu_class_node ORDER BY FIELD(title,'牛马','新建商品','我是学生','新建市场','22','哈哈','笔记标题','是')";
$data = Db::query($sql);
MySql 中的排序 ORDER BY 除了可以用 ASC 和 DESC,还可以通过 ORDER BY FIELD(str,str1,...) 自定义字符串/数字来实现排序

二、
case表达式
$sql = "SELECT case when uid > 70 then '高级' when uid > 1 then '中级' else '低级' END FROM edu_class_node";
如果遇到null或者没有在结果集上存在的数据,则返回0,然后根据升序进行排序
$data = Db::query($sql);
case when then else end表达式功能非常强大可以帮助我们解决 if elseif else 这种问题

三、

exists用法

$sql = " SELECT * from edu_class_node e where exists (SELECT * from edu_stu_note p where e.section_id = p.section_id and e.course_id != p.course_id)";

$data = Db::query($sql);

exists 后面是跟着一个子查询语句,它的作用是根据主查询的数据,每一行都放到子查询中做条件验证,根据验证结果(TRUE 或者 FALSE),TRUE的话该行数据就会保留

四、

group_concat(expr)组连接函数

$sql = " SELECT id,uid, GROUP_CONCAT(title ORDER BY course_id desc SEPARATOR '-')from edu_class_node GROUP BY title ORDER BY NULL";

$data = Db::query($sql);

GROUP_CONCAT(expr) 组连接函数可以返回分组后指定字段的字符串连接形式,并且可以指定排序逻辑,以及连接字符串,默认为英文逗号连接 我们这里用的指定分组连接 title 字段并按照 id 排序,设置连接字符串为 -  

五、order by 空值null排序

ORDER BY IF(ISNULL(title), 1, 0)

$sql = "SELECT * FROM edu_class_node ORDER BY IF(ISNULL(class_id), 0, 1),course_id "; $data = Db::query($sql);

ORDER BY 后跟我们要排序的字段名称,字段中存在 null 值时,我们可以通过 ORDER BY IF(ISNULL(class_id), 1, 0) 语法将 null 值转换成0或1,来达到将 null 值放到前面还是后面进行排序的效果

六、

with rollup 分组统计数据的基础上再进行统计汇总
$sql = "SELECT title, SUM(course_id) as total FROM edu_class_node GROUP BY title WITH ROLLUP";

$data = Db::query($sql); GROUP BY title WITH ROLLUP 语句,查询结果最后一列显示了分组统计的汇总结果。但是 title 字段最后显示为 null,我们可以通过 coalesce(val1, val2, ...) 函数,这个函数会返回参数列表中的第一个非空参数

七、

on duplicate key update存在就更新,不存在就插入

$sql = "  INSERT INTO `edu_class_node` (`title`, `content`,`section_id`)VALUES ('title', 'content',16) on duplicate key update title = '标题和内容',content='1111'";
$data = Db::query($sql);
MySql 中通过on duplicate key update语法来实现存在就更新,不存在就插入的逻辑。插入或者更新时,它会根据表中主键索引或者唯一索引进行判断,如果主键索引或者唯一索引有冲突,就会执行on duplicate key update后面的赋值语句

你可能感兴趣的:(sql,数据库)