SQL 小妙招
SQL 小妙招
IF(a,b,c)
if a == true return
b
else
return c
COALESCE(a,b, …)
if a is not null
return a
else
return b
.....
DISTINCT
去除重复行
CASE WHEN ELSE END
假如,表date
a | b |
---|---|
0 | 100 |
1 | 10 |
2 | 50 |
SELECT
(CASE date.a
WHEN 0 THEN 'a的值为0'
WHEN 1 THEN 'a的值为1'
ELSE '哈哈哈'
END ) a, date.b
FROM date
a | b |
---|---|
a的值为0 | 100 |
a的值为1 | 10 |
哈哈哈 | 50 |
可见,WHEN 后面可以接具体的值。
SELECT date.a,
(CASE date.b
WHEN date.b>50 THEN 'b的值大于50'
WHEN date.b<50 THEN 'b的值小于50'
ELSE 'b的值等于50'
END ) b
FROM date
a | b |
---|---|
0 | b的值大于50 |
1 | b的值小于50 |
2 | b的值等于50 |
CONCAT(a,b)
将多项合在一起
SELECT CONCAT(date.a,date.b) total
FROM date
total |
---|
0100 |
110 |
250 |
GROUP BY a[,b,c····](此处以下称为分组项)
分组。
以分组项为条件,将所有分组项值相同的行放在一起,每组取第一项作为结果。得到的结果是以分组项为主键。在此查询过程中,可以加入 MAX(),MIN(),COUNT(),SUM()等等用于计算的函数。
ORDER BY a[,b,c····](此处以下称为排序项)
排序。
以排序项为条件,进行排序。首先根据排序项a 进行排序。在不影响排序项a的前提下,再根据排序项b进行排序。以此类推。由此可知。根据排序项a排序后,排序项b应该是在,排序项a值相等的行中,内部排序,不可影响排序项a。
LEFT JOIN ON 和 INNER JOIN ON
a LEFT JOIN b ON a.id = b.id and ·····
两个表的左连接,on 后面接条件,最后的结果对于表a 来说,表a中的所有数据都将保留,如果没有符合条件的,将用null 补充。这个时候,问题就来了,我们想约束表b的数据,在后面添加约束条件,是可以达成的,但是对于表a来说,即便规定了表a的某个column的值,但是从最后的结果来看。表a中不符合条件的数据还是将被保留下来,连接表b的column将补null。所以起不到约束的效果。这个时候我们就得将约束表a的条件放到WHERE中。(右连接相反)
a INNER JOIN b ON a.id = b.id and ·····
两个表内连接,on 后面接条件,最后的结果不保证必定有那一个表的所有数据。因为,内连接的两个表都必须符合条件。也就是说,内连接的条件与写在WHERE中的条件等价。
DATE 类型先关操作
date_format(date, ‘?’)获取日期的年、月、日、时、分、秒的数值表达,或者月份的英文缩写表达
具体使用,参考3Wschool相关文档
date_sub(date, interval num day)、date_add(date, interval num hour)
对日期进行加减操作,加一天半,可选择加36小时
持续跟新ing·······