SQL server将值变为空函数 sql将空值用0表示_sql replace替换多个字符


  1. 分页查询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()。

这里首先对这部分题目进行一定的总结,也就是不仅记得刷题,还要刷出感觉。这种感觉主要指刷完后,有个大概的知识体系,以后刷的话知道走那条路。我们由上到下进行总结:

  1. 使用create进行创建表,使用insert into + values()插入数据;更改表明alter + rename to进行表明的更改。
  2. 基本操作,最多的应该是查询,select + from,配合where, group by,order by + asc,desc,having,limit;删除操作delete + from;改值,update + set,replace into + select。
  3. 函数,这部分应该单独拿出来,用到的比如length(), substr(),count()一般配合group by使用,group_concat()进行不同列里字段的拼接,|| 也可以。

题目网址:

https://www.nowcoder.com/ta/sql