题目
- 按需求建立数据库和表
==================================
student(sno,sname,sage,ssex) 学生表
sno: 学号;
sname:学生姓名;
sage: 学生年龄;
ssex: 学生性别;
CREATE DATABASE school CHARSET utf8;
USE school
CREATE TABLE student(
sno INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学号',
sname VARCHAR(20) NOT NULL COMMENT '姓名',
sage TINYINT UNSIGNED NOT NULL COMMENT '年龄',
ssex ENUM('f','m') NOT NULL DEFAULT 'm' COMMENT '性别'
)ENGINE=INNODB CHARSET=utf8;
SHOW TABLES;
=================================
course(cno,cname,tno) 课程表
cno: 课程编号;
cname:课程名字;
tno: 教师编号 ;
=================================
CREATE TABLE course(
cno INT NOT NULL PRIMARY KEY COMMENT '课程编号',
cname VARCHAR(20) NOT NULL COMMENT '课程名字',
tno INT NOT NULL COMMENT '教师编号'
)ENGINE=INNODB CHARSET utf8;
============================
sc(sno,cno,score) 成绩表
sno: 学号;
cno: 课程编号;
score:成绩 ;
============================
CREATE TABLE sc (
sno INT NOT NULL COMMENT '学号',
cno INT NOT NULL COMMENT '课程编号',
score INT NOT NULL DEFAULT 0 COMMENT '成绩'
)ENGINE=INNODB CHARSET=utf8;
===================
teacher(tno,tname) 教师表
tno: 教师编号;
tname:教师名字;
====================
CREATE TABLE teacher(
tno INT NOT NULL PRIMARY KEY COMMENT '教师编号',
tname VARCHAR(20) NOT NULL COMMENT '教师名字'
)ENGINE=INNODB CHARSET utf8;
- 按需录入数据
(1)最标准的insert,student表中录入一行数据
INSERT INTO student(sno,sname,sage,ssex)
VALUES (1,'zhang3',18,'m');
(2)最标准的insert,录入多行,生产用法
INSERT INTO student(sno,sname,sage,ssex)
VALUES
(2,'zhang4',18,'m'),
(3,'li4',18,'m'),
(4,'wang5',19,'f');
(3)简化写法,往表中所有列录入数据
INSERT INTO student
VALUES
(5,'zh4',18,'m'),
(6,'zhao4',18,'m'),
(7,'ma6',19,'f');
SELECT * FROM student;
(4)对部分列录入数据
INSERT INTO student(sname,sage,ssex)
VALUES
('oldboy',20,'m'),
('oldgirl',20,'f'),
('oldp',25,'m');
4.教师表中录入三位老师
DESC teacher;
INSERT INTO teacher(tno,tname) VALUES
(101,'oldboy'),
(102,'hesw'),
(103,'oldguo');
5.课程表中录入三门课程
DESC course;
INSERT INTO course(cno,cname,tno)
VALUES
(1001,'linux',101),
(1002,'python',102),
(1003,'mysql',103);
6.成绩表中录入学生成绩
DESC sc;
INSERT INTO sc(sno,cno,score)
VALUES
(1,1001,80),
(1,1002,59),
(2,1002,90),
(2,1003,100),
(3,1001,99),
(3,1003,40),
(4,1001,79),
(4,1002,61),
(4,1003,99),
(5,1003,40),
(6,1001,89),
(6,1003,77),
(7,1001,67),
(7,1003,82),
(8,1001,70),
(9,1003,80),
(10,1003,96);
7.SQL练习题:
- 统计zhang3,学习了几门课
- 查询zhang3,学习的课程名称有哪些?
- 查询oldguo老师教的学生名.
- 查询oldguo所教课程的平均分数
- 查询oldguo所教的不及格的学生姓名
====================================
SHOW TABLES;
SELECT * FROM course ; 课程表
SELECT * FROM sc ; 成绩表
SELECT * FROM student ; 学生表
SELECT * FROM teacher ; 教师表
sno: 学号;
sname:学生姓名;
sage: 学生年龄;
ssex: 学生性别;
cno: 课程编号;
score:成绩 ;
tno: 教师编号;
tname:教师名字;
====================================
答案
- 统计zhang3,学习了几门课
SELECT student.`sname`,COUNT(course.`cname`) AS 课程数量
FROM
student
JOIN sc
ON student.`sno`=sc.`sno`
JOIN course
ON sc.`cno`=course.`cno`
WHERE student.`sname`='zhang3';
- 查询zhang3,学习的课程名称有哪些?
SELECT student.`sname`,GROUP_CONCAT(course.`cname`)
FROM
student
JOIN sc
ON student.`sno`=sc.`sno`
JOIN course
ON sc.`cno`=course.`cno`
WHERE student.`sname`='zhang3';
- 查询oldguo老师教的学生名.
SELECT teacher.`tname`,GROUP_CONCAT(student.`sname`)
FROM
teacher
JOIN course
ON teacher.tno=course.`tno`
JOIN sc
ON sc.`cno`=course.`cno`
JOIN student
ON sc.`sno`=student.`sno`
WHERE teacher.`tname`='oldguo'
- 查询oldguo所教课程的平均分数
SELECT teacher.`tname`,course.`cname`,AVG(sc.`score`)
FROM
teacher
JOIN course
ON teacher.`tno`=course.`tno`
JOIN sc
ON course.`cno`=sc.`cno`
WHERE teacher.`tname`='oldguo'
- 查询oldguo所教的不及格的学生姓名
SELECT teacher.`tname`,student.`sname`,sc.`score`
FROM
teacher
JOIN course
ON teacher.`tno`=course.`tno`
JOIN sc
ON course.`cno`=sc.`cno`
JOIN student
ON sc.`sno`=student.`sno`
WHERE teacher.`tname`='oldguo'
HAVING sc.`score`<60
5.1 查询所有老师所教学生低于平均分的学生信息
SELECT teacher.`tname`,student.`sname`,AVG(sc.`score`),sc.`score`
FROM
teacher
JOIN course
ON teacher.tno=course.`tno`
JOIN sc
ON sc.`cno`=course.`cno`
JOIN student
ON sc.`sno`=student.`sno`
GROUP BY teacher.`tname`
HAVING sc.`score`< AVG(sc.`score`)