SQL学习,刷题

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

SELECT first_name FROM employees ORDER BY substr(first_name,-2)

查找字符串中逗号出现的次数
mysql中查找字符串中某个符号或字符出现的次数
例:查找字符串’10,A,B’ 中逗号’,'出现的次数?
用到的函数:
length(s)函数: s是字符串, 返回的是所求的字符串s的长度。
replace(a,b,c): 在字符串a中,将a中出现的b,替换成c。再把这个替换之后的串的结果返回。

select id,length(string)-length(replace(string,",","")) from strings;

将titles_test表名修改为titles_2017

RENAME TABLE titles_test to titles_2017;

ALTER TABLE titles_test RENAME TO titles_2017;

#两个方法在mysql控制台中都可以成功,而在牛客中只有第二个可以ac

MySQL 和 SqlLite都支持的用法:
alter table tname_old rename to tname_new
另外,还有一种低效的方法:先创建表,再删除表:
create table tname_new as select *from tname_old;
drop table tname_old;

注,在MySQL中,可以这样使用rename:

reanme table tname_old to tname_new

TM小哥和FH小妹在牛客大学若干年后成立了牛客SQL班,班的每个人的综合成绩用A,B,C,D,E表示,90分以上都是A,8090分都是B,7080分为C,60~70为D,E为60分以下
假设每个名次最多1个人,比如有2个A,那么必定有1个A是第1名,有1个A是第2名(综合成绩同分也会按照某一门的成绩分先后)。
每次SQL考试完之后,老师会将班级成绩表展示给同学看。
现在有班级成绩表(class_grade)如下
在这里插入图片描述
第1行表示成绩为A的学生有2个

最后1行表示成绩为B的学生有2个

请你写出一个SQL查询,如果一个学生知道了自己综合成绩以后,最差是排第几名? 结果按照grade升序排序,以上例子查询如下:
在这里插入图片描述
解析:
第1行表示,学生成绩为A的知道自己最差为第2名
第2行表示,学生成绩为B的知道自己最差为第4名
第3行表示,学生成绩为C的知道自己最差为第6名
第4行表示,学生成绩为D的知道自己最差为第7名

首先:窗口函数如果没有分区的话默认是全局排序,因此最后就不需要再次排序了;
其次:窗口函数OVER()中完整的句式有三部分:分区、排序、数据行子句;这三部分都是可选的,我们最常见的就是partition by 和 order by两部分,第三部分通常都省略了,而这省略部分的默认句式为rows between unbounded preceding and current row (表示挑选的数据行为从当前窗口的第一行到当前行),刚好符合本题需要对当前数据以及之前的所有数据进行累加。所以完整的写法应该是:

select grade, sum(number) over(order by grade) as t_rank from class_grade;

将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005,其他数据保持不变,使用replace实现,直接使用update会报错。
本题运用 REPLACE 有两种解法

方法一:全字段更新替换。由于 REPLACE 的新记录中 id=5,与表中的主键 id=5 冲突,故会替换掉表中 id=5
的记录,否则会插入一条新记录(例如新插入的记录 id = 10)。并且要将所有字段的值写出,否则将置为空。可参考:

REPLACE INTO titles_test VALUES (5, 10005, 'Senior Engineer', '1986-06-26', '9999-01-01')

方法二:运用REPLACE(X,Y,Z)函数。其中X是要处理的字符串,Y是X中将要被替换的字符串,Z是用来替换Y的字符串,最终返回替换后的字符串。以下语句用
UPDATE和REPLACE 配合完成,用REPLACE函数替换后的新值复制给 id=5 的
emp_no。REPLACE的参数为整型时也可通过。可参考:

将所有to_date为9999-01-01的全部更新为NULL,且 from_date更新为2001-01-01。
CREATE TABLE IF NOT EXISTS titles_test (
id int(11) not null primary key,
emp_no int(11) NOT NULL,
title varchar(50) NOT NULL,
from_date date NOT NULL,
to_date date DEFAULT NULL);

insert into titles_test values (‘1’, ‘10001’, ‘Senior Engineer’, ‘1986-06-26’, ‘9999-01-01’),
(‘2’, ‘10002’, ‘Staff’, ‘1996-08-03’, ‘9999-01-01’),
(‘3’, ‘10003’, ‘Senior Engineer’, ‘1995-12-03’, ‘9999-01-01’),
(‘4’, ‘10004’, ‘Senior Engineer’, ‘1995-12-03’, ‘9999-01-01’),
(‘5’, ‘10001’, ‘Senior Engineer’, ‘1986-06-26’, ‘9999-01-01’),
(‘6’, ‘10002’, ‘Staff’, ‘1996-08-03’, ‘9999-01-01’),
(‘7’, ‘10003’, ‘Senior Engineer’, ‘1995-12-03’, ‘9999-01-01’);

更新后的值:
在这里插入图片描述
用 UPDATE 语句更新若干列的最基本用法,详细可参考:
http://www.w3school.com.cn/sql/sql_update.asp
https://www.w3schools.com/sql/sql_update.asp
另外要注意若干列 to_date = NULL 和 from_date = ‘2001-01-01’ 之间只能用逗号连接,切勿用
AND 连接。

UPDATE titles_test SET to_date = NULL, from_date = '2001-01-01' 
WHERE to_date = '9999-01-01';

id为用户主键id,number代表积分情况,让你写一个sql查询,积分表里面出现三次以及三次以上的积分,查询结果如下在这里插入图片描述

select NUMBER from grade GROUP by number having count(number) >=3 

请你找出所有员工具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示,以上例子输出如下在这里插入图片描述
此题应注意以下两点:

1、相同薪水显示一次,则使用SELECT DISTINCT可去除重复值
2、要求逆序排列,则在最后应使用ORDER BY
salary DESC

SELECT distinct salary FROM salaries ORDER by salary desc

针对actor表创建视图actor_name_view,只包含first_name以及last_name两列,并对这两列重新命名,first_name为first_name_v,last_name修改为last_name_v:
视图(View)只不过是通过相关的名称存储在数据库中的一个 SQLite 语句。视图(View)实际上是一个以预定义的 SQLite 查询形式存在的表的组合。

视图(View)可以包含一个表的所有行或从一个或多个表选定行。视图(View)可以从一个或多个表创建,这取决于要创建视图的 SQLite 查询。、

视图(View)是一种虚表,允许用户实现以下几点:

用户或用户组查找结构数据的方式更自然或直观。

限制数据访问,用户只能看到有限的数据,而不是完整的表。

汇总各种表中的数据,用于生成报告。

SQLite 视图是只读的,因此可能无法在视图上执行 DELETE、INSERT 或 UPDATE 语句。但是可以在视图上创建一个触发器,当尝试 DELETE、INSERT 或 UPDATE 视图时触发,需要做的动作在触发器内容中定义。

CREATE VIEW actor_name_view (first_name_v, last_name_v) AS
SELECT first_name, last_name FROM actor 
create view actor_name_view as
select first_name as first_name_v, last_name as last_name_v from actor

创建视图 用AS:


CREATE [TEMP | TEMPORARY] VIEW view_name AS
SELECT column1, column2..... FROM table_name
WHERE [condition];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值