SQL面试题练习

一、学生表记录如下(学号 姓名 性别 年龄)

0001 xw 男  18

0002 mc 女  16

0003 ww 男  21

0004 xw 男  18

请写出实现如下功能的SQL语句

删除除了学号(自动编号)字段以外,其他字段都相同的冗(rong)余记录

#  创建数据库

create database day0214 charset utf8;

#  切进day0214

use day0214;

# 创建student表
复制代码
create table student(
       id int primary key auto_increment comment "主键自增长",
       serial int not null comment "编号,序号",
       name varchar(30) not null comment "名字,非空",
       sex char(10) comment "性别",
       age int comment "年龄"
);
复制代码


# 为student表插入数据
insert into student (serial,name,sex,age) values (0001, "xw", "男", 18),
(0002, "mc", "女", 16),
(0003, "ww", "男", 21),
(0004, "xw", "男", 18);
 
 

#  删除掉重复的数据, 子查询:

 
delete from student where id not in (select a.id from (select * from student group by name, sex, age) a);
 
 
 

二、数据库有三个表 teacher表, student表, teacher_student关系表, 

   teacher表 teaID  name  age ,

  student 表 stuID  name  age ,

  teacher_student表 teaID stuID

  要求用一条SQL查询出这样的结果:

  1. 显示的字段要有老师 id  age 每个老师所带的学生人数
  2. 只列出老师age为40 以下, 学生age为12以上的记录

# 创建表

复制代码
create table teacher(
  teaid int auto_increment primary key comment "主键自增",
  name varchar(100) comment "老师名称",
  age int comment "年龄"
);


create table student(
  stuid int auto_increment primary key comment "主键自增",
  name varchar(100) comment "学生名称",
  age int comment "年龄"
);

create table teacher_student(
  teaid int comment "老师id",
  stuid int comment "学生id"
);

ALTER TABLE `teacher_student` ADD CONSTRAINT `tea_stu_teaid_fk` FOREIGN KEY (`teaid`) REFERENCES `teacher` (`teaid`);
ALTER TABLE `teacher_student` ADD CONSTRAINT `tea_stu_stuid_fk` FOREIGN KEY (`stuid`) REFERENCES `student` (`stuid`);
复制代码

# 插入数据

复制代码
insert into teacher(teaid, name, age) values(1, "张老师", 30),(2, "李老师", 28),(3, "王老师", 45);
insert into student(stuid, name, age) values(1, "小明", 19),(2, "小红", 20),(3, "小庄", 20),(4, "小兰", 18);
insert into student(stuid, name, age) values(5, "张三", 27),(6, "李四", 27),(7, "王五", 24),(8, "胡六", 12);
insert into student(stuid, name, age) values(9, "周红", 28),(10, "杨明", 27);

insert into teacher_student(teaid, stuid) values(1,1),(1, 2),(1,3),(1,4);
insert into teacher_student(teaid, stuid) values(2,5),(2, 6),(2,7),(2,8);
insert into teacher_student(teaid, stuid) values(3,9),(3, 10);
复制代码
# 1.显示的字段要有老师 id  age 每个老师所带的学生人数
select teacher.teaid, teacher.age, count(teacher_student.stuid) as student_count from teacher
 left join teacher_student on teacher.teaid = teacher_student.teaid
 group by teacher_student.teaid;
# 2.只列出老师age为40 以下, 学生age为12以上的记录
 
复制代码
select teacher.teaid, teacher.name, teacher.age, count(teacher_student.stuid) as student_count from teacher
 left join teacher_student on teacher.teaid = teacher_student.teaid
 left join student on student.stuid = teacher_student.stuid
 where teacher.age<40 and student.age>12
 group by teacher_student.teaid;
复制代码
 
 
 

三、前提: a 部门表  b员工表

a表字段(

id -- 部门编号

departmentName -- 部门名称

)

 

b表字段(

id -- 部门编号

employee -- 员工名称

)

问题: 如何一条SQL语句查询出每个部门共有多少人?

# 创建表

复制代码
create table a(
  id int auto_increment primary key comment "主键自增",
  department_name varchar(100) comment "部门名称"
);

create table b(
  id int auto_increment primary key comment "主键自增",
  aid int comment "部门编号",
  employee varchar(100) comment "员工名称"
);
复制代码

# 插入数据

insert into a(id, department_name) values(1, "技术部"),(2, "产品部"),(3, "运营部门");
insert into b(aid, employee) values(1, "张三"),(1, "李四"),(2, "老王"),(3, "小张"),(3, "小兰"),(3, "小明");

#  查询出每个部门共有多少人

select a.id, a.department_name, count(b.id) as employee_count from a
left join b on a.id=b.aid
group by a.id;

四、有3张表, Student表, SC表和Course表

Student表: 学号(Sno).姓名(Sname).性别(Ssex).年龄(Sage)和系名(Sdept)

Course表:课程号(Cno).课程名(Cname)和学分(Ccredit)

SC表:学号(Sno).课程号(Cno)和成绩(Grade)

请使用SQL语句查询学生姓名及其课程总学分

 # 创建表

复制代码
create table student(
  id int auto_increment primary key comment "主键自增",
  sno varchar(100) unique comment "学号",
  sname varchar(100) comment "姓名",
  ssex varchar(100) comment "性别",
  sage int comment "年龄",
  sdept varchar(100) comment "系名"
);

create table course(
  id int auto_increment primary key comment "主键自增",
  cno varchar(100) unique comment "课程号",
  cname varchar(100) comment "课程名",
  ccredit int comment "学分"
);

create table sc(
  id int auto_increment primary key comment "主键自增",
  sno varchar(100) comment "学号",
  cno varchar(100) comment "课程号",
  grade int comment "成绩"
);
复制代码

 # 插入数据

复制代码
insert into student(sno, sname, ssex, sage, sdept) values("17378100316", "张三", "男", 20, "计算机信息"),
("17378100249", "李四", "男", 20, "计算机信息"),
("17388100002", "王五", "男", 20, "计算机信息");

insert into course(cno, cname, ccredit) values("001", "C语言", 5),("002", "高数", 4),("003", "政治", 3);

insert into sc(sno, cno, grade) values("17378100316", "001", 5), ("17378100316", "002", 4), ("17378100316", "003", 3);
insert into sc(sno, cno, grade) values("17378100249", "001", 5);
insert into sc(sno, cno, grade) values("17388100002", "001", 5), ("17388100002", "002", 4);
复制代码

 # 查询学生姓名及其课程总学分

select student.sname, sum(sc.grade) as sum_grade from student
 left join sc on sc.sno = student.sno
 group by sc.sno;
五. 有3个表 S, C, SC
S(SNO, SNAME) 代表(学号, 姓名)
C(CNO, CNAME, CTEACHER) 代表(课号, 课名, 教师)
SC(SNO, CNO, SCGRADE) 代表(学号, 课号, 成绩)
问题:
1.找出没选过"黎明"老师的所有学生姓名.
2.列出2门以上(含2门)不及格学生姓名及平均成绩.
3.既学过1号课程又学过2号课程所有学生的姓名.

  # 创建表

复制代码
create table s(
  id int auto_increment primary key comment "主键自增",
  sno varchar(100) unique comment "学号",
  sname varchar(100) comment "姓名"
);

create table c(
  id int auto_increment primary key comment "主键自增",
  cno varchar(100) unique comment "课程号",
  cname varchar(100) comment "课名",
  teacher varchar(100) comment "老师"
);

create table sc(
  id int auto_increment primary key comment "主键自增",
  sno varchar(100) comment "学号",
  cno varchar(100) comment "课程号",
  sgrade int comment "成绩"
);
复制代码

 # 插入数据

复制代码
insert into s(sno, sname) values("17378100316", "刘一"),
("17378100249", "陈二"),
("17388100002", "张三"),
("17228100129", "李四"),
("17228100031", "王五");

insert into c(cno, cname, teacher) values("001", "Python基础", "吕老师"),
("002", "Python全站实战开发", "崔老师"),
("003", "Django开发", "黎明"),
("004", "Django博客开发", "赵老师");

insert into sc(sno, cno, sgrade) values("17378100316", "001", 5), ("17378100316", "002", 4), ("17378100316", "003", 3);
insert into sc(sno, cno, sgrade) values("17378100249", "001", 5),("17378100249", "002", 0),("17378100249", "004", 0);
insert into sc(sno, cno, sgrade) values("17388100002", "001", 5), ("17388100002", "004", 4);
insert into sc(sno, cno, sgrade) values("17228100129", "001", 0), ("17228100129", "004", 0);
insert into sc(sno, cno, sgrade) values("17228100031", "001", 0), ("17228100031", "004", 4);
复制代码
# 1.找出没选过"黎明"老师的所有学生姓名.
复制代码
select stu.sname from s as stu where stu.sname not in (
  select s.sname from sc
   left join s on sc.sno = s.sno
   left join c on sc.cno = c.cno
   where c.teacher = "黎明"
   group by s.sname
);
复制代码
# 2.列出2门以上(含2门)不及格学生姓名及平均成绩.
select s.sname, count(sc.sgrade=0 or null) as low_count, avg(sc.sgrade) as avg_sgrade from sc
 left join s on sc.sno = s.sno
 group by s.sname
 having low_count>=2;
# 3.既学过1号课程又学过2号课程所有学生的姓名.
复制代码
select s.sname, count(sc.cno = "001" or null) as count001, count(sc.cno = "002" or null) as count002 from sc
   left join s on sc.sno = s.sno
   where sc.cno = "001" or sc.cno="002"
   group by s.sname
   having count001=1 and count002=1;
复制代码

猜你喜欢

转载自www.cnblogs.com/zhoukanggege1121/p/10837435.html