Mysql操作

  • 关于学生信息的基本操作 

创建表student

学生表:student。表结构如下:

字段名

数据类型

长度

约束

描述

sno

char

9

非空,主键

学生ID

sname

char

4

非空

姓名

ssex

char

2

性别

sage

smallint

年龄

sdept

char

20

所在系

请用DDL语言,完成该表的创建。

CREATE TABLE student
(sno CHAR(9) NOT NULL PRIMARY KEY COMMENT '学生ID',
sname CHAR(4) NOT NULL COMMENT '姓名',
ssex CHAR(2) COMMENT '性别',
sage SMALLINT COMMENT '年龄',
sdept CHAR(20) COMMENT '所在系'
);

创建表course

课程表:course,表结构如下:

字段名

数据类型

长度

约束

描述

cno

char

4

非空,主键

课程ID

cname

char

40

非空

课程名

cpno

char

4

先行课(参照自身,cno)

ccredit

smallint

学分

请用DDL语言,完成该表的创建。

CREATE TABLE course
(cno CHAR(4) NOT NULL PRIMARY KEY COMMENT '课程ID',
cname CHAR(40) NOT NULL COMMENT '课程名',
cpno CHAR(4) COMMENT '先行课(参照自身,cno)',
ccredit SMALLINT COMMENT '学分',
FOREIGN KEY (cpno) REFERENCES course(cno)
);

创建表sc

学生选课表:sc,表结构如下:

字段名

数据类型

长度

约束

描述

sno

char

9

非空

学生ID(参照student,sno)

cno

char

4

非空

课程ID(参照course,cno)

grade

smallint

默认为null

成绩

备注:

该表的主键是sno,cno

请根据各个表的结构,完成sc表的创建。

CREATE TABLE sc
(sno CHAR(9) NOT NULL COMMENT '学生ID(参照student,sno)',
cno CHAR(4) NOT NULL COMMENT '课程ID(参照course,cno)',
grade SMALLINT NULL COMMENT '成绩',
PRIMARY KEY(sno,cno),
FOREIGN KEY (sno) REFERENCES student(sno),
FOREIGN KEY (cno) REFERENCES course(cno)
);

查询表sc——计算1号课程的学生平均成绩。 

SELECT AVG(grade)
FROM sc
WHERE cno='1';

查询表student——查询所有年龄在20岁以下的学生姓名及其年龄。

SELECT sname,sage
FROM student
WHERE sage<20;

查询表student——查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别。

SELECT sname,ssex
FROM student
WHERE sdept in ('CS','MA','IS');

查询表student——查询年龄不在20~23岁之间的学生姓名、系别和年龄

SELECT sname,sdept,sage
FROM student
WHERE sage NOT BETWEEN 20 AND 23;

查询表sc——查询选修了课程的学生学号。(要求去掉重复)

SELECT DISTINCT sno
FROM sc;

查询表student——查询计算机科学系(CS)全体学生的名单。

SELECT sname
FROM student
WHERE sdept='CS';

查询表student——查询全体学生的姓名、学号、所在系。

SELECT sname,sno,sdept
FROM student;

查询表student——查全体学生的姓名及其出生年份

SELECT sname '姓名',2022-sage '出生年份'
FROM student;

查询表sc—— 查询选修了3门以上课程的学生学号。

SELECT sno
FROM sc
GROUP BY sno
HAVING COUNT(*)>3;

查询表sc——查询考试成绩有不及格的学生的学号

SELECT DISTINCT sno
FROM sc
WHERE grade<60;

查询表student——查询名字中第2个字为"阳"字的学生的姓名和学号。

SELECT sname,sno
FROM student
WHERE sname LIKE '_阳%';

查询表course——查询以"DB_"开头课程的详细情况。

SELECT *
FROM course
WHERE cname LIKE 'DB\_%';

查询表sc——查询选修了课程的学生人数。

SELECT COUNT(DISTINCT sno)
FROM sc;

查询表sc——查询学生201215121选修课程的总学分数。

SELECT SUM(ccredit)
FROM course,sc
WHERE course.cno=sc.cno AND sc.sno='201215121';

查询表sc——查询选修1号课程的学生最高分数。

SELECT MAX(grade)
FROM sc
WHERE cno='1';

查询表sc——查询缺少成绩的学生的学号和相应的课程号。

SELECT sno,cno
FROM sc
WHERE grade IS NULL;

查询表course——查询以"DB_"开头,且倒数第3个字符为 i的课程的详细情况。

SELECT *
FROM course
WHERE cname LIKE 'DB\_%i__';

查询表student——查询计算机系(即CS)年龄在20岁以下的学生姓名。

SELECT sname
FROM student
WHERE sdept='CS' AND sage<20;

查询表student——查询姓"欧阳"且全名为三个汉字的学生的姓名。

SELECT sname
FROM student
WHERE sname LIKE '欧阳_';

查询表student——查询所有不姓刘学生的姓名、学号和性别

SELECT sname,sno,ssex
FROM student
WHERE sname NOT LIKE '刘%';

查询表sc——查询平均成绩大于等于90分的学生学号和平均成绩

SELECT sno,AVG(grade)
FROM sc
GROUP BY sno
HAVING AVG(grade)>=90;

 查询没有选修1号课程的学生姓名。

SELECT sname
FROM student
WHERE NOT EXISTS(
SELECT *
FROM sc
WHERE sno=student.sno AND cno='1'); 

查询所有选修了1号课程的学生姓名

SELECT sname
FROM student
WHERE EXISTS(
SELECT *
FROM sc
WHERE sno=student.sno AND cno='1');

查询非计算机科学系中比计算机科学系所有学生年龄都小的学生姓名及年龄。

SELECT sname,sage
FROM student
WHERE sage< ALL(
SELECT sage
FROM student
WHERE sdept='CS')
AND sdept!='CS';

查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄

SELECT sname,sage
FROM student
WHERE sage< ANY(
SELECT sage
FROM student
WHERE sdept='CS')
AND sdept!='CS';

找出每个学生超过他选修课程平均成绩的课程号。

SELECT sno,cno
FROM sc a
WHERE grade>(
SELECT AVG( grade)
FROM sc b
WHERE a.sno=b.sno
);

查询选修了课程名为“信息系统”的学生学号和姓名

SELECT student.sno,student.sname
FROM student,sc,course
WHERE student.sno=sc.sno AND sc.cno=course.cno AND course.cname='信息系统';

查询与“刘晨”在同一个系学习的学生(学号,姓名,系)

SELECT sno,sname,sdept
FROM student a
WHERE sdept IN(
SELECT sdept
FROM student b
WHERE b.sname='刘晨');

查询选修了全部课程的学生姓名

SELECT sname
FROM student
WHERE NOT EXISTS(
SELECT*
FROM course
WHERE NOT EXISTS(
SELECT*
FROM sc
WHERE sno=student.sno AND cno=course.cno));

查询每个学生及其选修课程的情况,保留学生学号,姓名,课程号,成绩

SELECT student.sno,student.sname,sc.cno,sc.grade
FROM student,sc,course
WHERE student.sno=sc.sno AND sc.cno=course.cno;

查询选修了1号课程的学生及其选修课程的情况,保留学生学号,姓名,课程名,成绩

SELECT student.sno,student.sname,course.cname,sc.grade
FROM student,sc,course
WHERE student.sno=sc.sno AND sc.cno=course.cno AND sc.cno='1';

查询每个学生及其选修课程的情况,保留学生学号,姓名,课程号,课程名,成绩

SELECT student.sno,student.sname,course.cno,course.cname,sc.grade
FROM student,sc,course
WHERE student.sno=sc.sno AND sc.cno=course.cno;

查询每一门课的间接先修课(即先修课的先修课)

SELECT a.cno,b.cpno
FROM course a,course b
WHERE a.cpno=b.cno;

查询至少选修了学生201215122选修的全部课程的学生号码。

解题思路:

用逻辑蕴涵表达:查询学号为x的学生,对所有的课程y,只要201215122学生选修了课程y,则x也选修了y。

形式化表示:

       用P表示谓词 “学生201215122选修了课程y”

       用q表示谓词 “学生x选修了课程y”

       则上述查询为:

等价变换:

    Mysql操作_第1张图片

SELECT DISTINCT Sno
       FROM SC SCX
       WHERE NOT EXISTS
                     (SELECT *
                      FROM SC SCY
                      WHERE SCY.Sno = ' 201215122 '  AND
                                    NOT EXISTS
                                    (SELECT *
                                     FROM SC SCZ
                                     WHERE SCZ.Sno=SCX.Sno AND
                                                   SCZ.Cno=SCY.Cno));

你可能感兴趣的:(数据分析,数据库)