首先创造三个表:
学生表
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面试题,多方法全方位完美解答等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)