sql语句 面试题

sql语句 面试题,第1张

首先创造三个表:

学生表

create table student

{

student_id varchar2(10) not null,

student_name varchar2(50) null

};

课程表

create table course

{

course_id varchar(10) not null,

course_name varchar(100) null

};

分数表

create table score

{

student_id varchar2(10) not null,

course_id varchar2(10) not null,

course_score number(3,1) null

};

答案1:

SELECT ststudent_id,ststudent_name,recourse_num

FROM student st,

(SELECT scstudent_id,count(scstudent_id) course_num

FROM score sc

WHERE sccourse_score > 60 or sccourse_score = 60

GROUP BY scstudent_id ) re

WHERE ststudent_id = restudent_id;

答案2:

SELECT ststudent_id,ststudent_name

FROM student st,

(SELECT scstudent_id

FROM course co,score sc

WHERE cocourse_id = sccourse_id AND course_name = '语文'

GROUP BY scstudent_id) re

WHERE ststudent_id = restudent_id AND ststudent_name LIKE '张%';

答案3:

SELECT ststudent_id,ststudent_name

FROM student st,

(SELECT scstudent_id

FROM course co,score sc

WHERE cocourse_id = sccourse_id AND cocourse_name = '语文' AND cocourse_name = '音乐'

GROUP BY scstudent_id) re

WHERE ststudent_id = restudent_id;

后三道题有点麻烦,有时间再给你解答,以上都是用Oracle专用的SQL语句查询结果集的。

1、忍不住想说一句,因为第一题中的字段类型是 日期型,而各种数据库 *** 作日期型数据有不同的方法,没有一种共通的方法,所以脱离了数据库而言没有一种共通的sql。

2、select ID,NAME,ADDRESS,PHONE,LOGDATE from T

where ID in( select ID from T group by NAME having count()>1)

order by NAME;

3、delete from T where ID not in

(select min(id) from T group by name);

4、update T

set TADDRESS=(select EADDRESS from E where ENAME=TNAME),

TPHONE=(select EPHONE from E where ENAME=TNAME);

5、这个不同的数据库也有不同的处理方法,不能脱离数据库谈了。

如:SqlServer或者access可以使用 top

oracle可以使用 rownum 等

---

以上,希望对你有所帮助。

1 审题(需要用到的SQL语句)

“衣服、裤子、帽子、鞋子这些类别”:进行分组    group by 

“点击量最高”:复合函数  Max()

“降序排列”:排序关键字 order by       降序  desc

需要显示出来的字段:productID,productName,最高 clickNum

2  SQL语句分解

方法1:

首先,�查询出点击量最高的parentID,并将查询结果取别名为b表

select parentid, max(clicknum) clicknum   FROM productinfo GROUP BY parentid 

查询结果如图:b 表

查询出表中的productid, productname, clicknum相关数据,取别名为a表:

ELECT productid, productname, clicknum FROM productinfo as  a ;

从a、b表中查找parentid & clicknum 都相等的数据:

SELECT aproductid, aproductname, aclicknum FROM productinfo a, b WHERE aparentid = bparentid AND aclicknum = bclicknum;

具体SQL图& SQL语句如下:

方法1 SQL如下

方法2 SQL如下:

新建表a1:   select    from productinfo  a1

找出productinfo表中 parentid与a表中相等,clicknum比a表中大的数据:

select 1 from productinfo where a1parentid = parentid and a1clicknum < clicknum  查找出来的结果相当于又新建了一张表,即下面的 c 表。

为方便理解,将两表放一起(数据都是一样的):

得到的结果如下,相当于又一个新表,为方便理解起名为 c 表:

从productinfo表中找c表中没有的数据:

select    from productinfo  a where not exists  c

方法3 SQL如下:

当新增一条特殊记录

insert into productInfo (productID, productName, parentID, clickNum) values (10,'女士鞋子1',10,30);

再次查询

select  from productinfo where clicknum in (select max(clickNum) from productinfo group by parentid) order by clicknum desc;

结果

使用in贪婪匹配,再次查询

这样就去除了 parentID的 Max clickNum与另一种parentID 非 Max clickNum相同的特殊情况

select LESSON_NAME as '科目',

max(case when sequence = 1 then NameGrade else null end) as '第一名(姓名+分数)',

max(case when sequence = 2 then NameGrade else null end) as '第二名(姓名+分数)',

max(case when sequence = 3 then NameGrade else null end) as '第三名(姓名+分数)'

(

select LESSON_NAME,STU_NAME+','+convert(varchar,GRADE) as NameGrade,sequence

(select bLESSON_NAME,cSTU_NAME,aGRADE,row_number() over(order by aGRADE Desc, cSTU_NAME asc) as sequence from score a

inner join lession b on (aLESSION_ID = bLESSION_ID)

inner join student c on (aSTU_ID = cSTU_ID) ) d

where sequence < 4

) e

group by LESSON_NAME

order by case(when LESSON_NAME = '语文' then 1,

when LESSON_NAME = '数学' then 2,

when LESSON_NAME = '英语' then 3,

when LESSON_NAME = '物理' then 4,

when LESSON_NAME = '化学' then 5,

else 9999 end)

大概就是这个样子,没执行,你自己再调试下 。

如果两个人相同分数,根据名字顺序排列

才两张表,随便写写就出来了 你是没见过该死的bom 那才伤脑筋

--先建立测试用例:

create table users(Id Int,Name varchar(20),regDate date);

alter table users add constraint users_pk primary key(Id);

create table UploadInfo(Id Int,UserId Int,FileName varchar(20),foreign key(UserId) references users(Id));

insert into users values(1,'A',sysdate-1);

insert into users values(2,'B',sysdate-2);

insert into users values(3,'C',sysdate-3);

insert into users values(4,'D',sysdate-4);

insert into users values(5,'E',sysdate-5);

selectfrom users;

--随机插入上传数据的存储过程

create or replace procedure InsertUploadInfoData is

i int:=0;

begin

for i in 1100 loop

insert into UploadInfo values(i,trunc(DBMS_RANDOMvalue(1,5)),'FileName '||trunc(DBMS_RANDOMvalue(1,1000)));

end loop;

commit;

end ;

begin

InsertUploadInfoData;

end;

selectfrom UploadInfo;

--开始了

--第一题

select UserUploadRecordId,UserUploadRecordUploadCount

from

(

select usersId,count(UploadInfoId) as UploadCount from users

inner join UploadInfo on usersId=UploadInfoUserId --内联结

where usersregDate>=sysdate-3 and usersregDate<=sysdate --三天内

group by usersId

order by UploadCount desc

) UserUploadRecord

where rownum=1 --取第一条记录

;

--创建用户名重复的测试用例

insert into users values(6,'A',sysdate-4);

--由于有外键约束,所以需先删除子表记录

delete from UploadInfo where UploadInfoUserid

in

(

select usersid from users where (usersname,usersregdate) in

(

select usersname,max(usersregdate) from users group by usersname having count(usersid)>1 --取重复用户名的最大注册时间

)

)

--再删除父表,做法差不多

delete from users where (usersname,usersregdate) in

(

select usersname,max(usersregdate) from users group by usersname having count(usersid)>1

)

————————————————————

建表语法 测试用例都写给你了 还说运行不了?直接复制进去就行了

SQL(结构化查询语言)是一种设计用于检索和 *** 作数据的数据库。它是美国国家标准协会(ANSI)的标准。此语言用于执行选择,更新,删除和插入等数据任务。

表是在具有列和行的模型中设计的数据集合。在表中,指定了列数,称为字段,但未定义行数,称为记录。

数据库是有序形式的一组信息,用于访问,存储和检索数据。

DBMS是一个控制数据维护和使用的程序。它被认为是管理数据的文件管理器。有四种类型的DBMS:

最有用的DBMS是Relational DBMS。它为数据提供了一个关系运算符。

SQL命令分为以下类型:

它包含来自一个或多个表的行和列,可以定义为虚拟表。它消耗的内存较少。

句法:

Join用于从相关的行和列中检索数据。它在两个或多个表之间工作,并且它从两个表返回至少一个匹配。

连接类型是:

数据库查询是数据库表中的数据请求。查询可以是选择查询或任何其他类型的查询。

子查询是查询的一部分。外部查询已知主查询,内部查询识别子查询。始终首先执行子查询,并将结果传递给主查询。

Autoincrement是一个关键字,用于在表中插入新记录时生成数字。

它可用于设置表中数据类型的限制。在创建或更新表语句时,可以使用约束。一些限制是:

SQL中有不同类型的键:

规范化是一种设计技术,它以减少数据依赖性的方式排列表。它将表分成小模块并按关系链接。

非规范化是一种优化方法,我们将多余的数据增加到表中,并在规范化后应用。

存储过程是一组SQL语句,用作访问数据库的函数。为了减少网络流量并提高性能,我们使用存储过程。

句法:

索引用于加速查询的性能。它可以更快地从表中检索数据。可以在一组列上创建索引。

聚簇索引 - 它有助于轻松检索数据,并且只有一个聚簇索引与一个表一起分配。它会更改记录在数据库中的保存方式。

非聚集索引 - 与聚簇索引相比,非聚簇索引很慢。并且在非集群索引的情况下,该表可以具有多个索引。它为表创建一个对象,该表是搜索后指向表的一个点。

触发器 被 用来执行对表中的特定动作,诸如插入,更新或删除 。它是一种 存储过程 。动作和事件是触发器的主要组成部分。执行Action时,事件响应该 *** 作而出现。

通常,这些属性称为ACID。它们有助于数据库事务。

A tomicity -在一个事务中连接两个或更多个单独的数据块,或者所有的块都致力于,或者一个都不。

C onsistency - 事务或者生成新的有效数据状态,或者如果发生任何失望,则在事务启动之前将所有数据返回到其状态。

I solation - 正在进行且尚未提交的事务必须继续与任何其他 *** 作隔离。

D urability -在此 *** 作中,系统保存提交的数据,每当事件发生故障和系统启动后,所有的数据是可用的正确的位置。

SQL语句分为几类:

它被定义为通过为查询提供条件来设置结果集的限制。他们从整个记录中过滤掉一些行。

一些SQL CLAUSES是WHERE和HAVING。

它是一个返回单个值的数学函数。

SQL中的聚合函数是:

为了 *** 作字符串,我们使用String Function。其中一些是:

排序规则 是一 组规则,用于确定数据如何通过比较进行排序 。例如使用一组规则存储的字符数据,这些规则定义了正确字符的序列以及类型,重音和区分大小写。

在系统内存中执行SQL语句时,会创建一个临时工作区,称为Cursor。在select语句中,游标存储了信息。游标可以使用多行,但一次只能处理一行。这组行称为活动集。

游标有两种类型:

SQL服务器是Microsoft关系数据库管理系统(RDBMS)的一种类型或示例。它在IT氛围中提供广泛的事务处理和商业智能。

运算符是一个保留字,主要用于SQL语句的WHERE子句中以进行 *** 作。

空值是没有值的字段。它与Zero不同。假设有一个表,并且在表中有一个字段,可以在不添加值的情况下将记录插入字段,然后该字段将以NULL值保存。

空白是我们提供的价值。

零只是一个数字。

数据仓库被称为来自多个信息源的中央数据中心。这些数据可用于在线处理和挖掘。

在表中,应该只有一个PRIMARY KEY,但在另一种情况下,UNIQUE KEY可以是任意数量的。

PRIMARY KEYS不允许NULL值,但UNIQUE KEY允许NULL值。

--1查询全部学生的姓名和所学的课程名称及成绩

select sSname,oCname,cGrade from Student s,enrolls c,Courses o where sSno=cSno and cCno=oCno

--2找出所有学生的平均成绩和所学课程门数

select Sno,avg(grade) as '平均成绩',count() as '所学课程门数' from enrolls group by Sno;

--3找出各课程的平均成绩,按课程号分组,且只选择学生超过3人的课程的成绩

select enrollsCno,cname,avg(grade) as '平均成绩' from enrolls,Courses where enrollscno=Coursescno group by enrollsCno,cname having count()>=3;

--4找出选修了全部课程的学生的姓名

select Sname from student where sno in(select sno from enrolls group by Sno having count(sno)=(select count(cno) from Courses))

以上就是关于sql语句 面试题全部的内容,包括:sql语句 面试题、sql面试题、一道很有技术含量的SQL面试题,多方法全方位完美解答等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9537210.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存