个人对刷题后的记录和整理。随机更新。
(主要运行环境:sqlite3、POLARDB-MySQL)
推荐在线刷题网站:牛客sql实战
(个人目前接触的刷题网主要是leetcode和牛客,由于牛客在线提交时,若语句没有错误,它会提供题目中的建表语句和表中数据,所以在刷题时,可以复制建表语句和插入数据的语句到私人的数据库中,在自己的库中完成sql的编写。这让我们提交自己的语句时,能先一步进行检查、更清晰的看见错误的地方。
)
1、分页查询employees表,每5行一页,返回第2页的数据。
select * from employees limit 5,5;
select * from employees limit 5 offset 5;
select * from employees limit(2-1)*5,5;
解决方式:
limit x,n :从第x条数据开始,取n条数据。第一条数据序号为0
limit x offset n :从第x条数据开始,取n条数据。第一条数据序号为0
limit(2-1)*5,5 :这条语句主要是为了体现limit的分页思想,*5表示每页5条数据,2-1代表跳过第一页,然后取第二页的5条数据,即整个第二页的数据
2、子串排序,获取Employees中的first_name,查询按照first_name最后两个字母,按照升序进行排列
SELECT first_name from employees ORDER BY substr( first_name,-2);
SELECT first_name from employees ORDER BY substring( first_name,-2);
SELECT first_name from employees ORDER BY substr( first_name,length( first_name)-1, 2);
select first_name from employees order by right(first_name,2);
解决方式:【主要是提取字段中的字符】
substr( str,-n) 和 substring( str,-n) :从末尾处,取字符串str的n个字符
substr( str,n) 和 substring( str,n) :取字符串str的前n个字符
substr( str,x, n) :从字符串str中下标为x的字符开始(包含下标为x的字符),取n个字符。字符串下标从1开始。
right(str,n) :从字符串的右边开始,取n个字符。同理 left(str,n)从左边开始,取n个字符
length(str) :获取str的长度,即字符个数
3、添加序列号,学生成绩排名,表名grade,列id,score。按成绩排名。
select id,score,(@i:=@i+1) as rank from grade,(select @i:=0) b order by score desc;
4、修改表名,将titles_test表名修改为titles_2017
alter table employees rename to employees_007;
5、获取第二薪资,表名salaries,列:emp_no、salary。(尝试不使用order by完成)
1、按薪资倒序排序,取第二条数据。(但若有多条相同薪资,则有错误)
select * from salaries order by salary desc limit 1,1;
2、子查询:对salary薪资进行去重并倒序,获取第二条数据(即第二薪资)。主语句:获取薪资等于第二薪资的salaries表中所有数据。
select * from salaries where salary =
(select distinct salary from salaries order by salary desc limit 1,1)
3、不使用order by。
select id,max(salary) as salary from salaries
where salary < (select max(salary) from salaries)
[这里使用了两次求最大值,子查询:获取salaries中最大薪资;主语句:在小于最大薪资的数据中求最大薪资]