- 分页查询employees表,每5行一页,返回第2页的数据
select * from employees limit 5,5;
limit 3;单用表示返回多少条记录
limit 3,4; 组合数字,第一个表示多少条记录, 第二个数字表示从第几条记录开始
2. 获取select * from employees对应的执行计划
explain select * from employees
explain模拟优化器执行SQL语句,在5.6以及以后的版本中,除过select,其他比如insert,update和delete均可以使用explain查看执行计划,从而知道mysql是如何处理sql语句,分析查询语句或者表结构的性能瓶颈。
3. 查找字符串'10,A,B' 中逗号','出现的次数cnt。
select (length('10,A,B')-length(replace('10,A,B',',','')))as cnt;
length()函数获得长度,replace(str, old, new),将字符串中的逗号替换掉
4. 将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005,其他数据保持不变,使用replace实现。
replace into titles_test select 5, 10005, title, from_date, to_date
from titles_test where id = 5;
使用replace into,有实际修改值的直接替换掉原来表里的值,没有值的使用表里的默认值
5. 获取Employees中的first_name,查询按照first_name最后两个字母,按照升序进行排列
select first_name from employees
order by substr(first_name,length(first_name)-1) asc;
substr()函数的使用,substr(str, start, end),这里的起始位置为1,结尾位置为length(str),并且都是闭,注意和一些编程语言里的半开半闭以及起始位置为0作区分。
6. 查找所有已经分配部门的员工的last_name和first_name以及dept_no(请注意输出描述里各个列的前后顺序)
select last_name, first_name, dept_no from dept_emp
inner join employees where dept_emp.emp_no=employees.emp_no;
inner join相当于交集会去掉为空的值和left join以及right join进行区分。
7. 将titles_test表名修改为titles_2017
alter table titles_test rename to titles_2017;
修改表明操作,alter关键字配合rename to使用
8. 删除emp_no重复的记录,只保留最小的id对应的记录。
delete from titles_test where id not in
(select min(id) from titles_test group by emp_no);
删除emp_no重复的,首先按emp_no分组找到每一个分组里id最小的,最后使用关键字delete只要id不在那里面的都删除掉。
9. 按照dept_no进行汇总,属于同一个部门的emp_no按照逗号进行连接,结果给出dept_no以及连接出的结果employees
select dept_no, group_concat(emp_no) as employees
from dept_emp group by dept_no;
先按照dept_no进行汇总,也就是按照这个分组;最后使用关键字group_concat()进行组合,记得按照要求改个名字。
10. 从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
select title, count(title) as t from titles
group by title having t > 1;
having关键字的使用,where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。
11. 将所有to_date为9999-01-01的全部更新为NULL,且 from_date更新为2001-01-01。
#方法一使用replace into
replace into titles_test select id, emp_no, title,
'2001-01-01',null from titles_test
where to_date='9999-01-01';
#方法二使用update
update titles_test set to_date=null,
from_date='2001-01-01' where to_date='9999-01-01';
第一种使用还是前面用到过的replace into操作,然后按照表的列名顺序进行替换,替换值有实际值的直接替换掉原来表里的数据,没有的则不替换;第二种使用update直接set指定的列名,进行值得替换。
12. 对于表actor批量插入如下数据,如果数据已经存在,请忽略,不使用replace操作
INSERT or IGNORE INTO actor
VALUES ('3','ED','CHASE','2006-02-15 12:34:33');
这里是在sqlite3里的操作,如果在MySQL则去掉or,使用insert操作,并用ignore 判断是否已经存在,into表名,values()对应列名的具体值。
13. 将employees表中的所有员工的last_name和first_name通过(')连接起来。
#sqlite3里的操作
select last_name || "'" || first_name as 'name'
from employees;
#MySQL里的操作
select concat(last_name, '''', first_name) as name
from employees;
这里sqlite3里使用 || 进行连接,并使用as改个名字。MySQL里直接使用concat()。
这里首先对这部分题目进行一定的总结,也就是不仅记得刷题,还要刷出感觉。这种感觉主要指刷完后,有个大概的知识体系,以后刷的话知道走那条路。我们由上到下进行总结:
- 使用create进行创建表,使用insert into + values()插入数据;更改表明alter + rename to进行表明的更改。
- 基本操作,最多的应该是查询,select + from,配合where, group by,order by + asc,desc,having,limit;删除操作delete + from;改值,update + set,replace into + select。
- 函数,这部分应该单独拿出来,用到的比如length(), substr(),count()一般配合group by使用,group_concat()进行不同列里字段的拼接,|| 也可以。
题目网址: