select 列名1,列名2,列名3 from 表名1 inner join 表2 on 条件
where 条件 #过滤条件
group by 列名 #分组
order by 列名 #排序,一般以数字列排序
一、order by的坑
1、在使用order by后面如果是中文别名引号引起来的话不能正常执行,去掉引号就能正常执行
疑问点:order by后面如果是中文的也不需要加引号吗?
可以不加引号直接使用
解决:
(1)mysql对于执行顺序比较靠后的语句,如果出错了就不执行,而且不报错。
(2)按照查询出来的字段的别名排序也是可以的,不管别名是中文还是英文,只要不加单引号就行。
补充:having后面跟的中文别名也不用加引号
二、窗口函数row_number(),rank(),dense_rank()
1、在经典45题16题时使用rank() over(order by …)时报错
疑问点:
①rank() over(order by …)的使用位置是否在from之前
②如果要进行排名的字段是统计函数或者其他子查询的字段呢
语句如下:
select *,RANK()over(order by '总分' desc)排名 from(
select SId sum(score) as '总分'
from sc
GROUP BY SId);
三、流程控制函数:
注意点:case函数只返回第一个符合条件的值,剩下的case部分会被忽略
多结合统计函数使用
①多重if,适合区间判断,大于小于
case 函数的使用二(多重if)语法:
case
when 条件1 then 要显示值1
when 条件2 then 要显示值2
else 要显示的值n或语句n
end
②适合等值判断
case函数(switch case效果)语法:
case 要判断的表达式
when 常量1 then 要显示的值1或语句1
when 常量2 then 要显示的值2或语句2
else 要显示的值n或语句n
end
四、日期函数:
*now返回当前系统日期+时间
*curdata返回当前日期,不包含时间
*curtime返回当期时间,不包含日期
*year/month/data:select year (curdata())
*str_to_data:将日期格式字符转换为指定格式日期
*data_format:将日期转化为字符
eg:select str_to_data('1998-3-2','%Y-%m-%d') as data;
timestampdiff函数
datediff()、timestampdiff()和data_format()函数使用
MYSQL中 datediff、timestampdiff函数的使用
语法:
①TIMESTAMPADD(interval,int_expr,datetime_expr)
说明:将整型表达式int_expr 添加到日期或日期时间表达式 datetime_expr中。式中的interval和上文中列举的取值是一样的。
select timestampdiff(DAY,'2018-07-01 09:00:00','2018-07-04 12:00:00');
注意:timestampdiff函数对日期差值的计算方式为datetime2-datetime1的差值。
②datediff函数返回两个日期之间的天数
语法:DATEDIFF(date1,date2)
注意:datediff函数对时间差值的计算方式为date1-date2的差值
时间函数总结:
MySQL的时间差函数(TIMESTAMPDIFF、DATEDIFF)、日期转换计算函数(date_add、day、date_format、str_to_date)
五、exists函数:
select 字段 from table where exists(select...)
MySQL中EXISTS的用法
EXISTS(包括 NOT EXISTS )子句的返回值是一个BOOL值。 EXISTS内部有一个子查询语句(SELECT ... FROM...), 我将其称为EXIST的内查询语句。其内查询语句返回一个结果集。 EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值。
一种通俗的可以理解为:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。