文章目录

  • 31. 获取select
  • 32. 将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分
  • 33. 创建一个actor表,包含如下列信息
  • 34. 批量插入数据
  • 35. 批量插入数据,如果数据已经存在,请忽略,不使用replace操作
  • 36. 创建一个actor_name表,将actor表中的所有first_name以及last_name导入改表
  • 37. 对first_name创建唯一索引uniq_idx_firstname,对last_name创建普通索引idx_lastname
  • 38. 针对actor表创建视图actor_name_view
  • 39. 针对上面的salaries表emp_no字段创建索引idx_emp_no,查询emp_no为10005,
  • 40. 在last_update后面新增加一列名字为create_date
  • 41. 构造一个触发器audit_log,在向employees表中插入一条数据的时候,触发插入相关的数据到audit中
  • 42. 删除emp_no重复的记录,只保留最小的id对应的记录。
  • 43. 将所有to_date为9999-01-01的全部更新为NULL
  • 44. 将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005,其他数据保持不变,使用replace实现
  • 45. 将titles_test表名修改为titles_2017
  • 46. 在audit表上创建外键约束,其emp_no对应employees_test表的主键id
  • 47. 如何获取emp_v和employees有相同的数据no
  • 48. 将所有获取奖金的员工当前的薪水增加10%
  • 49.针对库中的所有表生成select count(*)对应的SQL语句
  • 50. 将employees表中的所有员工的last_name和first_name通过(')连接起来。
  • 51. 查找字符串'10,A,B'
  • 52. 获取Employees中的first_name,查询按照first_name最后两个字母,按照升序进行排列
  • 53. 按照dept_no进行汇总,属于同一个部门的emp_no按照逗号进行连接,结果给出dept_no以及连接出的结果employees
  • 54. 查找排除当前最大、最小salary之后的员工的平均工资avg_salary
  • 55. 分页查询employees表,每5行一页,返回第2页的数据
  • 56. 获取所有员工的emp_no
  • 57. 使用含有关键字exists查找未分配具体部门的员工的所有信息
  • 58. 获取employees中的行数据,且这些行也存在于emp_v中
  • 59. 获取有奖金的员工相关信息
  • 60. 统计salary的累计和running_total
  • 61. 对于employees表中,给出奇数行的first_name
  • 参考

31. 获取select

本题考查查看执行计划的关键词——explain(只用于交互式分析和排除故障)

explain select * from employees

32. 将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分

Mysql 数据库可以使用CONCAT或者CONCAT_WS两种函数进行拼接,但是SQLLite得使用**||**进行拼接.

SELECT last_name||" "||first_name AS Name FROM employees

33. 创建一个actor表,包含如下列信息

本题关键点是actor_id的主键设置与last_update的默认获取系统时间:
1、在actor_id字段末尾加上PRIMARY KEY是将该字段设置为主键,或者在表的最后一行加上PRIMARY KEY(actor_id)
2、在last_update末尾加上DEFAULT是为该字段设置默认值,且默认值为(datetime(‘now’,‘localtime’)),即获得系统时间,注意最外层的括号不可省略.

create table actor(actor_id smallint(5) not null,first_name varchar(45) not null,last_name varchar(45) not null,last_update  timestamp not null default (datetime('now','localtime')), primary key (actor_id))

34. 批量插入数据

思路:

运用insert into 表名 (列名1,列名2,列名3…)values (values1,values2,…),(values1,values2,…)…;

1.当给所有列插入数据时,加粗的列名可以省略不写

2.每条数据用逗号分隔,从而实现批量插入

insert into actor values('1', 'PENELOPE','GUINESS','2006-02-15 12:34:33'),
('2','NICK','WAHLBERG','2006-02-15 12:34:33');

35. 批量插入数据,如果数据已经存在,请忽略,不使用replace操作

思路:

SQLite如果不存在则插入,如果存在则忽略

INSERT OR IGNORE INTO tablename VALUES(…);

如果不存在则插入,如果存在则替换

INSERT OR REPLACE INTO tablename VALUES(…);

这里指的存在表示的是unique属性的列值存在的情况下,unique表示键值唯一

mysql 去掉or

insert or ignore into actor values(3,"ED","CHASE","2006-02-15 12:34:33");

36. 创建一个actor_name表,将actor表中的所有first_name以及last_name导入改表

思路:

1.先按题目要求创建一个表actor_name;

2.然后从actor中选出first_name和last_name插入actor_name中。

create table actor_name (
first_name varchar(45) not null,
last_name varchar(45) not null);
insert into actor_name select first_name,last_name from actor;

更加简单的一种方法,直接将查询结果导入:

create table actor_name as
select first_name,last_name from actor;

37. 对first_name创建唯一索引uniq_idx_firstname,对last_name创建普通索引idx_lastname

create unique index uniq_idx_firstname on actor(first_name);
create index idx_lastname on actor(last_name)

38. 针对actor表创建视图actor_name_view

直接在视图名的后面用小括号创建视图中的字段名

create view actor_name_view (first_name_v, last_name_v) as
select first_name, last_name from actor

39. 针对上面的salaries表emp_no字段创建索引idx_emp_no,查询emp_no为10005,

SQLite中,使用 indexed by 语句进行强制索引查询

select * from salaries indexed by idx_emp_no where emp_no=10005;

MySQL中,使用 force index(indexname)语句进行强制索引查询

select * from salaries force index idx_emp_no where emp_no = 10005;

40. 在last_update后面新增加一列名字为create_date

用 alter table … add … 语句可以向已存在的表插入新字段,并且能够与创建表时一样,在字段名和数据类型后加入not null、default等限定

alter table actor add create_date datetime not null default '0000-00-00 00:00:00';c

41. 构造一个触发器audit_log,在向employees表中插入一条数据的时候,触发插入相关的数据到audit中

1.创建触发器使用语句:create trigger trigname;

2.指定触发器触发的事件在执行某操作之前还是之后,使用语句:before/after [insert/update/add] on tablename

3.触发器触发的事件写在begin和end之间;

4.触发器中可以通过new获得触发事件之后对应的tablename的相关列的值,old获得触发事件之前的对应的tablename的相关列的值

create trigger audit_log after insert on employees_test
begin
insert into audit values(new.id,new.name);
end;

42. 删除emp_no重复的记录,只保留最小的id对应的记录。

先找出每个emp_no中最小的id,若id不在最小id集合中则删除该记录。

delete from titles_test where id not in (select min(id) from titles_test group by emp_no)

43. 将所有to_date为9999-01-01的全部更新为NULL

update titles_test set from_date = '2001-01-01', to_date = null
where to_date = '9999-01-01'

44. 将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005,其他数据保持不变,使用replace实现

运用replace(x,y,z)函数。其中x是要处理的字符串,y是x中将要被替换的字符串,z是用来替换y的字符串,最终返回替换后的字符串。以下语句用 update和replace 配合完成,用replace函数替换后的新值复制给 id=5 的 emp_no。replace的参数为整型时也可通过。

UPDATE titles_test SET emp_no = REPLACE(emp_no,10001,10005) WHERE id = 5

45. 将titles_test表名修改为titles_2017

alter table titles_test rename to titles_2017

Mysql中:

rename table titles_test to titles_2017

牛客网中只有第一个代码可以通过。

46. 在audit表上创建外键约束,其emp_no对应employees_test表的主键id

由于SQLite中不能通过 alter table … add foreign key … references … 语句来对已创建好的字段创建外键,因此只能先删除表,再重新建表的过程中创建外键.

drop table audit;
create table audit(EMP_no INT NOT NULL,create_date datetime NOT NULL,foreign key(EMP_no) references employees_test(ID));

mysql中可以这样写:

alter table audit add foreign key(EMP_no) references employees_test(ID)

47. 如何获取emp_v和employees有相同的数据no

方法一:先找出emp_v中的emp_no,然后作为集合,判断employees中的emp_no是否在这个集合中,若在则取出记录。

select * from employees where emp_no in (select emp_no from emp_v)

方法二:用 intersect 关键字求 employees 和 emp_v 的交集

select * from employees intersect select * from emp_v

48. 将所有获取奖金的员工当前的薪水增加10%

update salaries set salary = salary*1.1 where emp_no in (select emp_no from emp_bonus)

49.针对库中的所有表生成select count(*)对应的SQL语句

select "select count(*) from " || name || ";" as cnts
from sqlite_master where type = 'table';

50. 将employees表中的所有员工的last_name和first_name通过(’)连接起来。

select last_name||"'"||first_name as name from employees

51. 查找字符串’10,A,B’

由于 SQLite 中没有直接统计字符串中子串出现次数的函数,因此本题用length()函数与replace()函数的结合灵活地解决了统计子串出现次数的问题,属于技巧题,即先用replace函数将原串中出现的子串用空串替换,再用原串长度减去替换后字符串的长度,最后除以子串的长度(本题中此步可省略,若子串长度大于1则不可省)

select length("10,A,B")-length(replace("10,A,B",",","")) as cnt

52. 获取Employees中的first_name,查询按照first_name最后两个字母,按照升序进行排列

substr(X,Y,Z) 或 substr(X,Y) 函数的使用。其中X是要截取的字符串。Y是字符串的起始位置(注意第一个字符的位置为1,而不为0),Y取值范围是±(1~length(X)),当Y等于length(X)时,则截取最后一个字符;当Y等于负整数-n时,则从倒数第n个字符处截取。Z是要截取字符串的长度,取值范围是正整数,若Z省略,则从Y处一直截取到字符串末尾;若Z大于剩下的字符串长度,也是截取到字符串末尾为止。

需要截取的字符串长度为n:

select first_name from employees order by substr(first_name,length(first_name)-1)

53. 按照dept_no进行汇总,属于同一个部门的emp_no按照逗号进行连接,结果给出dept_no以及连接出的结果employees

聚合函数group_concat(X,Y),其中X是要连接的字段,Y是连接时用的符号,可省略,默认为逗号。此函数必须与 GROUP BY 配合使用。此题以 dept_no 作为分组,将每个分组中不同的emp_no用逗号连接起来(即可省略Y)。

select dept_no,group_concat(emp_no)as employees from dept_emp group by dept_no

54. 查找排除当前最大、最小salary之后的员工的平均工资avg_salary

感觉这道题的逻辑有问题,下面的运行可以通过,但是子查询中没有加上to_date = '9999-01-01’的限制,这样一来,子查询找那个查到的最大最小salary是整个表的,而不是当前的。但是如果子查询中加上了to_date的限制,运行不通过。

select avg(salary) as avg_salary from salaries
where salary not in (select max(salary) from salaries)
and salary not in (select min(salary) from salaries)
and to_date = '9999-01-01'

55. 分页查询employees表,每5行一页,返回第2页的数据

根据题意,每行5页,返回第2页的数据,即返回第6~10条记录。

select * from employees limit 5,5

56. 获取所有员工的emp_no

先将employees和dept_emp内连接找到每个员工所对应的部门,然后左连接emp_bonus找出每个员工的奖金类型btype和得到的实间recevied。

select e.emp_no,d.dept_no,eb.btype,eb.recevied from employees as e inner join dept_emp as d on e.emp_no=d.emp_no
left join emp_bonus as eb on d.emp_no = eb.emp_no

57. 使用含有关键字exists查找未分配具体部门的员工的所有信息

在 employees 中挑选出令(SELECT emp_no FROM dept_emp WHERE emp_no = employees.emp_no)不成立的记录.

select * from employees where not exists (select emp_no from dept_emp where emp_no = employees.emp_no)

58. 获取employees中的行数据,且这些行也存在于emp_v中

视图 emp_v 的记录是从 employees 中导出的,因此要判断两者中相等的数据,只需要判断emp_no相等即可。

select em.* from employees as em, emp_v as ev where em.emp_no = ev.emp_no

59. 获取有奖金的员工相关信息

可以奖金可以通过btype*salary/10.0得到。注意要除以10.0,如果除以10的话,结果的小数位会被舍去。

select e.emp_no,e.first_name,e.last_name,eb.btype,s.salary,(eb.btype*s.salary/10.0) as bonus from
employees e inner join emp_bonus eb on e.emp_no=eb.emp_no
inner join salaries s on eb.emp_no=s.emp_no and s.to_date='9999-01-01'

60. 统计salary的累计和running_total

观察可知running_total是小于或等于当前emp_no工资的总和

select s.emp_no,s.salary,
(select sum(ns.salary) from salaries ns where ns.emp_no <=s.emp_no and ns.to_date='9999-01-01')
as running_total
from salaries s
where s.to_date='9999-01-01'

61. 对于employees表中,给出奇数行的first_name

select e1.first_name from employees e1
where(select count(*) from employees e2 where e1.first_name>=e2.first_name)%2=1;

参考

参考 weixin_43160613

牛客——数据库实战(31~61)相关推荐

  1. 【牛客sql实战2】查找入职员工时间排名倒数第三的员工所有信息

    题目描述 查找入职员工时间排名倒数第三的员工所有信息,为了减轻入门难度,目前所有的数据里员工入职的日期都不是同一天 CREATE TABLE `employees` ( `emp_no` int(11 ...

  2. 牛客数据库SQL实战 51-60(substr切割字符串、group_concat组拼接、limit_offset分页、exists条件成立判断、case分支、表的复用)

    文章目录 51* 获取Employees中的first_name 51.1 题目描述 51.2 题解 substr 52* 按照dept_no进行汇总 52.1 题目描述 52.2 题解 group_ ...

  3. [牛客数据库SQL实战] 11~20题及个人解答

    目录 11. 获取所有员工当前的manager,如果当前的manager是自己的话结果不显示,当前表示to_date='9999-01-01'. 12. 获取所有部门中当前员工薪水最高的相关信息,给出 ...

  4. 牛客 数据库SQL实战 将titles_test表名修改为titles_2017

    题目描述:\color{blue}题目描述:题目描述: 将titles_test表名修改为titles_2017. CREATE TABLE IF NOT EXISTS titles_test ( i ...

  5. 牛客 数据库SQL实战 将所有获取奖金的员工当前的薪水增加10%

    题目描述:\color{blue}题目描述:题目描述: 将所有获取奖金的员工当前的薪水增加10%. create table emp_bonus( emp_no int not null, recev ...

  6. 牛客 数据库SQL实战 获取员工其当前的薪水比其manager当前薪水还高的相关信息

    题目描述:\color{blue}题目描述:题目描述: 获取员工其当前的薪水比其manager当前薪水还高的相关信息,当前表示to_date='9999-01-01', 结果第一列给出员工的emp_n ...

  7. 牛客SQL实战—数据分析必备技能

    1.查找最晚入职员工的所有信息 CREATE TABLE `employees` ( `emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, `f ...

  8. 【sql】牛客网练习题 (共 61 题)

    [1]查找最晚入职员工的所有信息 CREATE TABLE `employees` ( `emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, ` ...

  9. 牛客网实战项目详细到每一步(更新中)

    一技术架构 Spring Boot Spring Spring MVC MyBatics Redis Kafka Elasticsearch重点的提高性能的技术 Spring Security, Sp ...

  10. E 排队(排列组合)[牛客小*白月赛61]

    题面如下: 思路 or 题解: 对于一个长度为 nnn 的 排列组合 如果存在一对 逆序对 (x,y)(x, y)(x,y) xxx 在 yyy 的前面有 n∗(n−1)2\frac{n * (n - ...

最新文章

  1. netbean创建jsf项目
  2. Codeforces 755B. PolandBall and Game 贪心
  3. BZOJ1787: [Ahoi2008]Meet 紧急集合
  4. 产品经理学习---人性七宗罪:打造完美产品的金钥匙
  5. 深入理解Java虚拟机:虚拟机类加载机制
  6. cocos2d-x之物理世界(创建物理世界)
  7. 移远ec20模式与切换
  8. 【OpenCV】 300行写出全能扫描王
  9. (1)电源管理-S3C2440芯片电源管理模块解析
  10. 折线图-面积图-K线图
  11. 中国本地化汽车“软件战争”打响
  12. 虚幻4地形怎么增加层_虚幻周报20200910 | 教师节快乐!
  13. HttpProxy网络请求代理
  14. matlab中巴特沃斯滤波器的使用
  15. 【146期】面试官问:说一说 RabbitMQ 的几种工作模式和优化建议?
  16. 波特、码元与比特的关系
  17. 微信小程序 实现客服功能 和 ICON标签
  18. Some selectors are not allowed in component wxss, including tag name selectors, ID selectors,and...
  19. Kotlin的访问权限管理
  20. 最爱张爱玲 :在这个世界上,总有一个人是等着你的!

热门文章

  1. XNA 三维入门讲解
  2. 【luogu P2764 最小路径覆盖问题】 模板
  3. IOS之Objective-C学习 工厂模式
  4. Blue Jeans - POJ 3080(多串的共同子串)
  5. xml、xhtml、html、dhtml的区别
  6. org.springframework.stereotype
  7. varchar,char,varchar2,mybatis查询无返回
  8. APP推广运营经验总结
  9. CISCO3560 VLAN配置实例
  10. STL:STL各种容器的使用时机详解