下面的所有例子取自我以前大学的教科书,数据库系统概论。
里面是使用关系代数运算解答的,而我转换成常用T-SQL。
其中例子6和一家朋友面试的大公司的题目差不多,值得新手和
准备面试的人员学习一下。说实话,其实很多大公司的面试题目
难度大多不会超过大学期末考的难度,就看你有没有认真学习了,
对于没有关系的大众来说,努力才是王道的说!
为方便阅读,字段名我使用了中文命名的方式哦。
现在只有6个例题,有空时我再写,谢谢你的阅读!
--建表的sql语句
CREATE TABLE [dbo].[Student] (
[学号] [char] (5) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[姓名] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[性别] [char] (2) COLLATE Chinese_PRC_CI_AS NULL ,
[年龄] [int] NULL ,
[所在系] [char] (4) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[Course] (
[课程号] [char] (3) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[课程名] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[先行课] [char] (3) COLLATE Chinese_PRC_CI_AS NULL ,
[学分] [tinyint] NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[SC] (
[学号] [char] (5) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[课程号] [char] (3) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[成绩] [tinyint] NULL
) ON [PRIMARY]
下面是插入表数据的sql语句:
Insert into sc (学号,课程号,成绩) Values ( '95001','1',92)
Insert into sc (学号,课程号,成绩) Values ( '95001','2',85)
Insert into sc (学号,课程号,成绩) Values ( '95001','3',88)
Insert into sc (学号,课程号,成绩) Values ( '95001','4',23)
Insert into sc (学号,课程号,成绩) Values ( '95001','5',34)
Insert into sc (学号,课程号,成绩) Values ( '95001','6',56)
Insert into sc (学号,课程号,成绩) Values ( '95001','7',86)
Insert into sc (学号,课程号,成绩) Values ( '95002','2',90)
Insert into sc (学号,课程号,成绩) Values ( '95002','3',80)
Insert into sc (学号,课程号,成绩) Values ( '95003','1',50)
Insert into sc (学号,课程号,成绩) Values ( '95003','3',98)
Insert into student (学号,姓名,性别,年龄,所在系) Values ( '95001','李勇','男',20,'CS')
Insert into student (学号,姓名,性别,年龄,所在系) Values ( '95002','刘晨','女',19,'IS')
Insert into student (学号,姓名,性别,年龄,所在系) Values ( '95003','王敏','女',18,'MA')
Insert into student (学号,姓名,性别,年龄,所在系) Values ( '95004','张立','男',21,'IS')
Insert into student (学号,姓名,性别,年龄,所在系) Values ( '95005','林燕芳','女',18,'IS')
Insert into student (学号,姓名,性别,年龄,所在系) Values ( '95006','林燕虹','女',17,'IS')
Insert into course (课程号,课程名,先行课,学分) Values ( '1','数据库','5',4)
Insert into course (课程号,课程名,先行课,学分) Values ( '2','数学',NULL,2)
Insert into course (课程号,课程名,先行课,学分) Values ( '3','信息系统','1',4)
Insert into course (课程号,课程名,先行课,学分) Values ( '4','操作系统','6',3)
Insert into course (课程号,课程名,先行课,学分) Values ( '5','数据结构','6',3)
Insert into course (课程号,课程名,先行课,学分) Values ( '6','数据处理',NULL,2)
Insert into course (课程号,课程名,先行课,学分) Values ( '7','PASCAL语言','6',4)
例1-例3都包含关系运算的除Division
例1:查询至少选秀1号课程和3号课程号的学生号码。
答案
select a.学号 from sc a,sc b where a.学号=b.学号 and a.课程号='1' and b.课程号='3'
例2:查询至少选修了一门直接先行课为5号课程的学生姓名。
答案:
select 姓名 from student where 学号 in( SELECT [学号] FROM [test].[dbo].[SC] where 课程号 in(SELECT 课程号 from Course where 先行课='5'))
例子3:查询选修了全部课程的学生号码和姓名。
declare @t1 int
declare @t2 int
select @t2=count(*) from Course
select @t1=学号 from SC group by 学号 having count(学号)=@t2
--print '@t1='+cast(@t1 as varchar)
Select 学号,姓名 from student where 学号=@t1
例子4:查询信息系年龄最大的三个学生的学号及其年龄,结果按年龄降序排列。
select top 3 学号,年龄 from Student where 所在系='IS' order by 年龄 desc
例子5:查询选修了2号课程的学生名字
select 姓名 from student where 学号 in( select 学号 from sc where 课程号=2)
例子6:查询成绩为90分以上的学生名字和课程名字
select st.姓名,c.课程名 from student st left join sc s on st.学号=s.学号 left join Course c on s.课程号=c.课程号
where st.学号 in (select st.学号 from sc where s.成绩>=90)