MySQL的(@i:=@i+1)用处及用法
如:SELECT (@i:=@i+1),t.* FROM table_name t,(SELECT @i:=0) AS j
(@i:=@i+1)代表定义一个变量,每次叠加1;
(SELECT @i:=0) AS j 代表建立一个临时表,j是随便取的表名,但别名一定要的。
select student.sname,sum(sc.score),@i :=@i+1 as rank from (select @i := 0) as j,
student,sc
where student.sid = sc.sid
group by student.sname order by sum(sc.score) desc
+-------+---------------+------+
| sname | sum(sc.score) | rank |
+-------+---------------+------+
| 赵雷 | 269.0 | 1 |
| 孙风 | 240.0 | 3 |
| 钱电 | 210.0 | 2 |
| 周梅 | 163.0 | 5 |
| 李云 | 100.0 | 4 |
| 郑竹 | 89.0 | 7 |
| 吴兰 | 65.0 | 6 |
+-------+---------------+------+
7 rows in set (0.01 sec)
MySQL中union和order by同时使用的实现方法。
1、如果直接用如下sql语句是会报错:Incorrect usage of UNION and ORDER BY。
SELECT * FROM t1 WHERE username LIKE 'l%' ORDER BY score ASC
UNION
SELECT * FROM t1 WHERE username LIKE '%m%' ORDER BY score ASC
因为union在没有括号的情况下只能使用一个order by,所以报错,这个语句有2种修改方法。如下:
(1)可以将前面一个order by去掉,改成如下:
SELECT * FROM t1 WHERE username LIKE 'l%'
UNION
SELECT * FROM t1 WHERE username LIKE '%m%' ORDER BY score ASC
该sql的意思就是先union,然后对整个结果集进行order by。如此一来第一条select语句就无法order by 排序
(2)可以通过两个查询分别加括号的方式,改成如下:
(SELECT * FROM t1 WHERE username LIKE 'l%' ORDER BY sroce ASC)
UNION
(SELECT * FROM t1 WHERE username LIKE '%m%' ORDER BY score ASC)
这种方式的目的是为了让两个结果集先分别order by,然后再对两个结果集进行union。如果order by 无效,可改成如下格式:
SELECT * FROM
(SELECT * FROM t1 WHERE username LIKE 'l%' ORDER BY score ASC) t3
UNION
SELECT * FROM
(SELECT * FROM t1 WHERE username LIKE '%m%' ORDER BY score ASC) t4
也就是说,order by不能直接出现在union的子句中,但是可以出现在子句的子句中。
2、union 和 union all 的区别
union会过滤掉两个结果集中重复的行,而union all不会过滤掉重复行。
3、union 和 order by 共存的办法
SELECT * FROM
(SELECT * FROM t1 WHERE username LIKE 'l%' ) as t3
UNION
SELECT * FROM
(SELECT * FROM t1 WHERE username LIKE '%m%' ) as t4 ORDER BY score ASC
将 ORDER BY 放置在 union 之后
MySQL 不支持使用 LIMIT 子句的 IN/ALL/ANY/SOME 子查询
意味着下列查询不能正确的执行
select * from my_table where id in (select id from my_table limit 10)
解决方案:再查询一次 把他变成子句的嵌套,把这个子句作为t
select * from my_table where id in (select t.id from (select * from my_table limit 10)as t)
##Unknown column in 'where clause'
错误如题:Unknown column in ‘XXX’ 'where clause'
排查
1,查表名是否有错
2,如果sql是在代码里拼接的,检查凭借变量的时候,是否在变量两边加上了单引号
3,检查sql里要查的列,所对应的条件里的字符串,不是检查它对不对,要检查包含它的引号是不是中文的,是的话改掉(这个是我遇到的)
4,如果是子查询,查一下包含子查询语句的括弧,是不是中文的,是的话,改掉。
我错的地方在于
#47.查询本周过生日的学生
select student.sname ,weekofyear(CURDATE()) as b,
weekofyear(date_sub(student.sage,INTERVAL year(student.sage) year)) as a
from student where
a = b;
这里就要注意在这种地方引用表名作为变量要加引号 改成 'a' = 'b'就对了