sql练习笔记
1.distinct去重
(1)使用distinct关键字进行去重,可以在聚合函数里用distinct。
(2)使用group by,想对谁去重就按谁分组
2.查询结果限制行数——limit
LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。
LIMIT n1,n2 接受一个或两个数字参数:
-
如果只给定一个参数,它表示返回最大的记录行数目,即返回前几行记录。
-
如果给定两个参数,第一个参数指定第一个返回记录行的偏移量(记录的下标),第二个参数指定返回记录行的最大数目。如果第二个参数是-1,表示从指定的起始行到表的最后一行。
3.分组过滤having
where后面不能跟聚合函数,而having后面可以跟聚合函数。
group by在前,having在后,但having先执行。(就像select在前where在后,where先执行一样,都要先根据条件进行筛选)
在select后重命名的字段在这个sql中都能用。
【tips】聚合函数有:AVG()、SUM()、MAX()、MIN()、COUNT()。
4.连接查询
(1)内连接 join
查询两表都有的数据。
★内连接对重复记录的处理:比如说下面 user_profile 表和 question_practice_detail 表进行内连接,在 question_practice_detail 表中有 device_id 相同的记录,内连接后的表应该是什么样的呢?多条相同device_id的记录是都在还是只有一个?
【结果】从内连接后的表可以看出,相同记录会都在。
(2)左/右外连接 left/right join
两表交集+其中一表全部数据。
5.or、union和union all的区别
or是连接两个判断条件,意思是"或",而union和union all是对两个结果集求并集。
or和union都会自动去重,union all不去重,即所有的结果全部显示。
6.★if函数
语法:IF(expr1,expr2,expr3)
解释:expr1 的值为 TRUE,则返回值为 expr2;expr1 的值为FALSE,则返回值为 expr3。其中,expr1是判断条件,expr2和expr3是符合expr1的自定义的返回结果。
举例:
一般用来将查询数据根据条件转换成中文。
7.★case函数
case有点类似switch语句,可以用来进行多个条件的选择。
用法:
-
普通case语句:
-
搜索case语句:
【tips】注意要以end结尾!
8.day()、month()、year()函数
对于一个date类型的字段,可以用day(字段名)、month(字段名)、year(字段名)来分别获取该字段的日、月、年。
9.date_add函数
DATE_ADD() 函数可以向日期添加指定的时间间隔。
语法:DATE_ADD(字段名,INTERVAL expr type)
- INTERVAL:英语中"间隔"的意思,固定用法;
- expr:我们指定的间隔的时间,单位是type;
-
type:时间单位类型,可以是如下类型:
举例:

10.字符串截取——substring_index
11.★窗口函数
当我们需要组内排序或者获取每组的topN的时候,就要用到窗口函数了。
【tips】注意!min和max是全局获取最值,用于组内获取最值时,id和最值记录往往是不对应的,所以对于组内获取最值不能简单的min+group by!