为什么要学习国产数据库
数据库已成为现代软件生态的基石之一,遗憾的是,国产数据库的技术水平与国外一流水平相对还有一定的差距。同是国家数据库在关键领域的应用普及度相对较低,应用研发人员规模较小,大力推动和普及国产数据库的应用是当务之急。
一. 达梦数据库的发展现状
国内自主研发关系型数据库的企业,单位基本上都是发源于上世纪90年代的,而且都是以大学,科研机构为主。到今天,形成四大数据库厂商:
1. 达梦:由华中理工冯玉才教授创办,完全自主研发。以Oracle为参照,追赶对象。
2. 人大金仓:由人民大学王珊教授创办,自主研发。普通的关系型数据库。
3. 神舟通用:神舟集团与南大通用合作研发的关系型数据库。更多地用于数据分析领域。
4. 南大通用:南开大学的背景,2010年左右自主研发的,基于列式储存的,面向数据分析,数据仓库的数据库系统。
二. 达梦数据库的发展历程
1. 1980年用于xxxx弹数据处理的小型操作系统研发完成,获xx部科学技术奖。
2. 1988年我国第一个自主版权的国产数据库管理系统原型CRDS诞生。
3. 1997年中国电力财务公司华中分公司财务应用系统首次使用国产数据库DM2。随后,在全国76家分子公司上线使用。
4. 2000年我国第一个数据库公司——武汉华工达梦数据库有限公司成立。DM3诞生,在安全领域得到广泛应用,并在国产数据库行业连续七年测评第一。
5. 2004年研发团队7个月完成两年半的研发工作推出DM4,性能远超国内基于开源技术的国产数据库,并在国家测试中继续保持第一。
6. 2006年DM5在安全可靠及产品化方面得到完善,荣获第十届软博会金奖。达梦公司适应市场需求,调整发展战略,进军大数据市场,达梦开发的中国首个大数据应用——三峡库区地质灾害预警指挥系统上线。
7. 2009年DM6与国际主流数据库产品兼容性得到大幅提升,在政府,重要敏感行业等对安全特性要求更高的行业领域得到广泛应用。
8. 2012年新一代达梦数据库管理系统DM7发布。支持大规模并行计算,海量数据处理技术,是理想的企业及数据管理服务平台。
9. 2013年达梦大数据平台升级发布,提供从大数据存储,交换,管理,到分析和呈现的一体化大数据管理服务。首个基于DM7的海外项目在泰国教育部成功上线运用。
10. 2014年河北政法云成功上线,达梦公司在大数据领域的研究成果得到进一步应用。
11. 2016年达梦大数据平台以在公安,政务,信用,司法,审计,住建,国土,应急等30多个领域得到广泛应用。上海浦东新区政务数据中心成功上线,达梦助力智慧政务。
12. 2019年新一代达梦数据库管理系统DM8发布。多样化架构充分满足不同场景需求,支持超大规模并发事务处理和事务-分析混合型业务处理,动态分配计算资源。达梦公司完成了亿元融资。
13. 2020年“利剑出鞘,智启未来-2020达梦创新产品发布会”在北京盛大召开。同时发布达梦数据共享集群,达梦启云数据库,达梦图数据库,达梦新一代分布式数据库四款产品。达梦公司主办的“信创人才 万人培养计划”暨2020首届达梦数据库精英挑战赛圆满举办。
三. 达梦数据库的特点
1. 通用性
达梦数据库管理系统兼容多种硬件体系,可运行于X86,X64,SPARC,POWER等硬件体系上。DM各种平台上的数据存储结构和消息通信结构完全一致,使得DM各种组件在不同的硬件平台上具有一致的使用特性。
达梦数据库管理系统产品实现了平台无关性,支持windows系列,各版本Linus(2.4及2.4以上内核)、Unix、Kylin、AIX,Solaris等各种主流操作系统。达梦数据库的服务器,接口程序和管理工具均可在32位/64位版本操作系统上使用。
2. 高性能
支持列存储、数据压缩、物化视图等面向联机事务分析场景的优化选项;
通过表级行存储、列存储选项技术,在同一产品中提供对联机事务和联机分析处理业务场景的支持;
3. 高可用
可配置数据守护系统(主备),自动快速故障恢复,具有强大的容灾处理能力。
4. 跨平台
跨平台,支持主流软硬件体系(支持windows、Linus、中标麒麟、银河麒麟等操作系统),支持主流标准接口。
5. 高可扩展
支持拓展软件包和多种工具,实现海量数据分析处理、数据共(DSC)和无共享数据库集群(MPP)等扩展功能。
四. DM8版本介绍
达梦数据库的操作(SQL语句)
一 使用SQL语句插入数据
语句:insert into 表名(字段名1,字段名2.....)values(值1,值2......)
格式1:(简化格式)
insert into 表名 values(值1,值2......)
insert into library00.tbl_bookinfo(bookid,bookname,publishdate,bookversion,woridcount,pagecount,publisher,classid)values('TP312BA/52','7-5357-1050-6','计算机应用基础','甘宪甫','1992-08-01','第二版','320000,''212,'湖南科学技术出版社','T');
格式2:(基本格式)
insert into 表名(字段名1,字段名2.....) values(值1,值2......)
insert into library00.tbl_bookinfo(bookid,isbn,bookname,author,publishdate,bookversion,woridcount,pagecount,publisher,classid)values('TP312BA/52','7-5357-1050-6','计算机应用基础','甘宪甫','1992-08-01','第二版','320000,''212,'湖南科学技术出版社','T');
只知道一行中的部分数据
基本格式--指定部分列属性
insert into library00.tbl_bookinfo(bookid,isbn,bookname,author,classid)values('O241/13','7-313-00072-3','计算方法','钱焕延','T');
二 使用SQL语句更新数据
语句:update 表名 set 字段名1=值1(字段名2=值2,.......)where条件表达式
三 使用SQL语句删除数据
语句:delect from 表名 where条件表达式
表的基本查询
一 .使用SQL语句查询
1.基本查询
完整语句:select 【distinct】*|{字段名1,字段名2,........} from 表名【where条件表达式1】 【group by 字段名】【having条件表达式2】【order by字段名【asc|desc】】【limit 【offset,】记录数】 ;
最基本的SQL查询语句
语法:select *|{字段名1,字段名2,........} from 表名
2. 条件查询
完整语句:select 【distinct】*|{字段名1,字段名2,........} from 表名【where条件表达式1】 【group by 字段名】【having条件表达式2】【order by字段名【asc|desc】】【limit 【offset,】记录数】 ;
比较条件的使用
比较条件的组合使用
BETWEEN关键字
IN 关键字
3. 高级查询
完整语句:select 【distinct】*|{字段名1,字段名2,........} from 表名【where条件表达式1】【 group by 字段名】【having条件表达式2】【order by字段名【asc|desc】】【limit 【offset,】记录数】;
DISTINCT关键字
ORDER BY子句
LIMIT 子句
聚合函数的使用范围
4. 分组查询
完整语句:select 【distinct】*|{字段名1,字段名2,........} from 表名【where条件表达式1】【 group by 字段名】【having条件表达式2】【order by字段名【asc|desc】】【limit 【offset,】记录数】;
GROUP BY 子句
HAVING 子句
多表连接练习题
任务1:创建一个模式STUMANAGER
create schema stumanager authorization sysdba;
任务2:在该数据库中创建学生表、课程表、教师表、成绩表如下所示
--1.学生表
student(sid,sname,sage,ssex)
--sid学生编号,sname 学生姓名,sage 出生年月,ssex 学生性别
--2.课程表 course(cid,cname,tid)
--cid --课程编号,cname 课程名称,tid 教师编号
--3.教师表
teacher(tid,tname)
--tid教师编号,tname 教师姓名
--4.成绩表
SC(sid,cid,score)
--sid 学生编号cid课程编号,score 分数
任务3:创建测试数据如下所示
#学生表 student
create table stumanager.student(
sid varchar(10) primary key,
sname nvarchar(10) not null,
sage date not null,
ssex varchar(10) not null) ;
insert into stumanager.student values('01' , '赵雷' , '1990-01-01' , '男');
insert into stumanager.student values('02' , '钱电' , '1990-12-21' , '男');
insert into stumanager.student values('03' , '孙风' , '1990-05-20' , '男');
insert into stumanager.student values('04' , '李云' , '1990-08-06' , '男');
insert into stumanager.student values('05' , '周梅' , '1991-12-01' , '女');
insert into stumanager.student values('06' , '吴兰' , '1992-03-01' , '女');
insert into stumanager.student values('07' , '郑竹' , '1989-07-01' , '女');
insert into stumanager.student values('08' , '王菊' , '1990-01-20' , '女');
#科目表 course
create table stumanager.course(
cid varchar(10) primary key,
cname nvarchar(10) not null,
tid varchar(10) not null) ;
insert into stumanager.course values('01' , '语文' , '02');
insert into stumanager.course values('02' , '数学' , '01');
insert into stumanager.course values('03' , '英语' , '03');
#教师表 Teacher
create table stumanager.teacher(
tid varchar(10) primary key,
tname nvarchar(10) not null) ;
insert into stumanager.teacher values('01' , '张三');
insert into stumanager.teacher values('02' , '李四');
insert into stumanager.teacher values('03' , '王五');
#成绩表 sc
create table stumanager.sc(
sid varchar(10),
cid varchar(10),
grade decimal(18,1));
insert into stumanager.sc values('01' , '01' , 80);
insert into stumanager.sc values('01' , '02' , 90);
insert into stumanager.sc values('01' , '03' , 99);
insert into stumanager.sc values('02' , '01' , 70);
insert into stumanager.sc values('02' , '02' , 60);
insert into stumanager.sc values('02' , '03' , 80);
insert into stumanager.sc values('03' , '01' , 80);
insert into stumanager.sc values('03' , '02' , 80);
insert into stumanager.sc values('03' , '03' , 80);
insert into stumanager.sc values('04' , '01' , 50);
insert into stumanager.sc values('04' , '02' , 30);
insert into stumanager.sc values('04' , '03' , 20);
insert into stumanager.sc values('05' , '01' , 76);
insert into stumanager.sc values('05' , '02' , 87);
insert into stumanager.sc values('06' , '01' , 31);
insert into stumanager.sc values('06' , '03' , 34);
insert into stumanager.sc values('07' , '02' , 89);
insert into stumanager.sc values('07' , '03' , 98);
insert into stumanager.sc values('08' , '01' , 94);
insert into stumanager.sc values('08' , '02' , 90);
commit;
练习题目
-1.学生表
student(sid,sname,sage,ssex) --sid学生编号,sname 学生姓名,sage 出生年月,ssex 学生性别
--2.课程表
course(cid,cname,tid) --cid --课程编号,cname 课程名称,tid 教师编号
--3.教师表
teacher(tid,tname) --tid教师编号,tname 教师姓名
--4.成绩表 SC(sid,cid,grade) --sid 学生编号cid课程编号,score 分数
2. 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
select a.sid,a.sname,b.avggrade from stumanager.student a inner join (
select sid,avg(grade) as avggrade from stumanager.sc group by sid having avg(grade)>60) as b
on b.sid = a.sid;
3. 查询在 SC 表存在成绩的学生信息
select stumanager.student.* from stumanager.student inner join stumanager.SC on stumanager.student.sid=stumanager.SC.sid;
-- 查询在 SC 表不存在成绩的学生信息
-- select stumanager.student.*,stumanager.sc.* from stumanager.student left join stumanager.SC on stumanager.student.sid=stumanager.SC.sid
where stumanager.sc.sid is null;
4. 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )
--考点: 按学生学号分组,统计课程门数,总数 group by sid ,count(*), sum(grade)
-- 考点:联合查询,student,sc
select a.sid,a.sname,b.number,b.total from stumanager.student as a left join
(select sid ,count(*) as number ,sum(grade) as total from stumanager.sc group by sid ) as b
on b.sid = a.sid;
4.1 查有成绩的学生信息
5. 查询「李」姓老师的数量
6. 查询学过「张三」老师授课的同学的信息
7. 查询没有学全所有课程的同学的信息
8. 查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息
9. 查询和" 01 "号的同学学习的课程完全相同的其他同学的信息
10. 查询没学过"张三"老师讲授的任一门课程的学生姓名
11.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
12.检索" 01 "课程分数小于 60,按分数降序排列的学生信息
13.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
14.查询各科成绩最高分、最低分和平均分:以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
15.按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺 15.1 按各科成绩进行排序,并显示排名, Score 重复时合并名次
16.查询学生的总成绩,并进行排名,总分重复时保留名次空缺 16.1 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺
17.统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比
18.查询各科成绩前三名的记录
19.查询每门课程被选修的学生数
20.查询出只选修两门课程的学生学号和姓名
21.查询男生、女生人数
22.查询名字中含有「风」字的学生信息
23.查询同名同性学生名单,并统计同名人数
24.查询 1990 年出生的学生名单
25.查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
26.查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩
27.查询课程名称为「数学」,且分数低于 60 的学生姓名和分数
28.查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)
29.查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数
30.查询不及格的课程
31.查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名
32.求每门课程的学生人数
33.成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
34.成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
35.查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
36.查询每门功成绩最好的前两名
37.统计每门课程的学生选修人数(超过 5 人的课程才统计)。
38.检索至少选修两门课程的学生学号
39.查询选修了全部课程的学生信息
40.查询各学生的年龄,只按年份来算
41.按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一
42.查询本周过生日的学生
43.查询下周过生日的学生
44.查询本月过生日的学生
45.查询下月过生日的学生
答案:
2.查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
SELECT sname,a.sid,a.averagegrade
FROM
(
SELECT sid,AVG(grade) AS averagegrade
FROM stumanager.sc
GROUP BY sid having AVG(grade)>6
) AS a
inner join stumanager.student as b
on b.sid=a.sid;
3.查询在 SC 表存在成绩的学生信息
SELECT sid,sname
FROM stumanager.student
WHERE sid IN (
SELECT sid FROM stumanager.sc
);
4.查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )
SELECT s.sid,s.sname,count(s.sid) as sumcid,sum(sc.grade) as sumtid
from stumanager.student as s
inner join stumanager.course as c
on s.sid=s.sid
inner join stumanager.sc as sc
on c.cid=sc.cid
group by s.sid,s.sname;
5.查询「李」姓老师的数量
SELECT COUNT(*) sumtid
FROM stumanager.teacher
WHERE tname LIKE '李%';
6.查询学过「张三」老师授课的同学的信息
SELECT s.sid, s.sname
FROM stumanager.student as s
INNER JOIN stumanager.course as c ON s.sid = s.sid
INNER JOIN stumanager.teacher as t ON c.tid = t.tid
WHERE t.tname = '张三';
7.查询没有学全所有课程的同学的信息
SELECT s.sid, s.sname
FROM stumanager.student as s
LEFT JOIN stumanager.course as c ON s.sid = s.sname
GROUP BY s.sid, s.sname
HAVING COUNT(DISTINCT c.cid) < (SELECT COUNT(*) FROM stumanager.course);
8.查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息
select sid,sname
from stumanager.student
where sid in(
select distinct s2.sid
from stumanager.student as s1,stumanager.student as s2,stumanager.course as c1,stumanager.course as c2
where s1.sid='01'
and s1.sid=s1.sid
and c1.cid=c2.cid
and c2.cid=s1.sid
and s2.sid<>'01');
9.查询和" 01 "号的同学学习的课程完全相同的其他同学的信息
SELECT s.sid, s.sname
FROM stumanager.student as s
WHERE s.sid <> '01' AND s.sid IN (
SELECT sid
FROM stumanager.course as sc
WHERE sc.cid IN (
SELECT sc1.cid
FROM stumanager.course as sc1
WHERE sc1.cid = '01'
)
GROUP BY sid
HAVING COUNT(DISTINCT sc.cid) = (
SELECT COUNT(DISTINCT cid)
FROM stumanager.course as sc2
WHERE sc2.cid = '01'
)
);
10.查询没学过"张三"老师讲授的任一门课程的学生姓名
select sname
from stumanager.student where sid not in(
select sid from stumanager.course where cid in(
select cid from stumanager.teacher
where tid='张三'));
11.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
select s.sid,s.sname ,avg(sc.grade) as averagegrade
from stumanager.student as s
inner join stumanager.sc as sc on s.sid=sc.sid
where sc.grade<60
group by s.sid,s.sname
having count(distinct sc.cid)>=2;
12.检索" 01 "课程分数小于 60,按分数降序排列的学生信息
SELECT s.sid, s.sname, sc.grade
FROM stumanager.student as s
INNER JOIN stumanager.sc as sc ON s.sid = sc.sid
WHERE sc.cid = '01' AND sc.grade < 60
ORDER BY sc.grade DESC;
13.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
SELECT s.sid, s.sname, c.cname, sc.grade, AVG(sc.grade) AS averagegrade
FROM stumanager.student as s
INNER JOIN stumanager.sc as sc ON s.sid = sc.sid
INNER JOIN stumanager.course as c ON sc.cid = c.cid
GROUP BY s.sid, s.sname, c.cname, sc.grade
ORDER BY averagegrade DESC;
14.查询各科成绩最高分、最低分和平均分:以如下形式显示:
课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率及格为>=60,
中等为:70-80,优良为:80-90,优秀为:>=90 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
SELECT
c.cid,
c.cname,
MAX(sc.grade) AS maxgrade,
MIN(sc.grade) AS mingrade,
AVG(sc.grade) AS averagegrade,
SUM(CASE WHEN sc.grade >= 60 THEN 1 ELSE 0 END) / COUNT(*) * 100 AS 及格率,
SUM(CASE WHEN sc.grade >= 70 AND sc.grade < 80 THEN 1 ELSE 0 END) / COUNT(*) * 100 AS 中等率,
SUM(CASE WHEN sc.grade >= 80 AND sc.grade < 90 THEN 1 ELSE 0 END) / COUNT(*) * 100 AS 优良率,
SUM(CASE WHEN sc.grade >= 90 THEN 1 ELSE 0 END) / COUNT(*) * 100 AS 优秀率,
COUNT(*) AS 选修人数
FROM stumanager.course as c
LEFT JOIN stumanager.sc as sc ON c.cid = sc.cid
GROUP BY c.cid, c.cname
ORDER BY 选修人数 DESC, c.cid ASC;
15.按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺 15.1 按各科成绩进行排序,并显示排名, Score 重复时合并名次
select grade,rank() over (order by grade desc) as ranking from stumanager.sc;
select grade,dense_rank() over (order by grade desc) as ranking from stumanager.sc;
16.查询学生的总成绩,并进行排名,总分重复时保留名次空缺 16.1 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺
select sid,sum(grade) as totalgrade,rank() over(order by sum(grade) desc) as ranking
from stumanager.sc group by sid;
select sid,sum(grade) as totalgrade,dense_rank() over(order by sum(grade) desc) as ranking
from stumanager.sc group by sid;
17.统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比
select
cid,
cname,
sum(case when grade between 85 and 100 then 1 else 0 end) as [100-85],
sum(case when grade between 70 and 84 then 1 else 0 end) as [85-70],
sum(case when grade between 60 and 69 then 1 else 0 end) as [70-60],
sum(case when grade between 0 and 59 then 1 else 0 end) as [60-0],
(count(*)*100.0)/sum(count(*)) over () as percentage
from
stumanager.course
group by
cid,
cname;
18.查询各科成绩前三名的记录
select * from stumanager.sc as t1
where 3 <=(select count(distinct t2.grade)
from stumanager.sc as t2
where t1.sid = t2.sid and t1.grade >= t2.grade)
order by sid,grade desc;
19.查询每门课程被选修的学生数
SELECT cid, cname, COUNT(*) AS 学生数
FROM stumanager.course
GROUP BY cid, cname;
20.查询出只选修两门课程的学生学号和姓名
SELECT sid, sname
FROM stumanager.student
WHERE sid IN (
SELECT sid
FROM stumanager.course
GROUP BY sid
HAVING COUNT(DISTINCT cid) = 2
);
21.查询男生、女生人数
SELECT ssex, COUNT(*) AS 人数
FROM stumanager.student
GROUP BY ssex;
22.查询名字中含有「风」字的学生信息
SELECT *
FROM stumanager.student
WHERE sname LIKE '%风%';
23.查询同名同性学生名单,并统计同名人数
SELECT sname, ssex, COUNT(*) AS count
FROM stumanager.student
GROUP BY sname, ssex
HAVING COUNT(*) > 1;
24.查询 1990 年出生的学生名单
SELECT sname, sage
FROM stumanager.student
WHERE YEAR(sage) = 1990;
25.查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
SELECT cid, AVG(grade) AS averagegrade
FROM stumanager.sc
GROUP BY cid
ORDER BY averagegrade DESC, cid ASC;
26.查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩
SELECT student.sid, student.sname, AVG(sc.grade) AS averagegrade
FROM stumanager.student
INNER JOIN stumanager.sc ON student.sid = sc.sid
GROUP BY student.sid, student.sname
HAVING AVG(sc.grade) >= 85;
27.查询课程名称为「数学」,且分数低于 60 的学生姓名和分数
select sname,grade from stumanager.student as s
join stumanager.sc as c on s.sid=c.sid
where c.grade < 60;
28.查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)
SELECT s.sname, c.cname, b.grade
FROM stumanager.student as s
LEFT JOIN stumanager.sc as b ON s.sid = b.sid
LEFT JOIN stumanager.course as c ON b.cid = b.cid;
29.查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数
SELECT student.sname, course.cname, sc.grade
FROM stumanager.sc
INNER JOIN stumanager.student ON student.sid = student.sid
INNER JOIN stumanager.course ON sc.cid = sc.cid
WHERE sc.grade > 70;
30.查询不及格的课程
SELECT cname,grade
FROM stumanager.sc,stumanager.course
WHERE grade < 60;
31.查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名
SELECT student.sid,student.sname
FROM stumanager.sc,stumanager.student
WHERE sc.cid = '01' AND sc.grade >= 80;
32.求每门课程的学生人数
SELECT cid, COUNT(*) AS 学生人数
FROM stumanager.sc
GROUP BY cid;
33.成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
SELECT student.sid, student.sname, sc.grade
FROM stumanager.student
INNER JOIN stumanager.sc ON student.sid = sc.sid
INNER JOIN stumanager.course ON sc.cid = course.cid
WHERE course.tid = '张三'
ORDER BY sc.grade DESC
LIMIT 1;
34.成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
SELECT *
FROM stumanager.course,stumanager.sc
WHERE cname IN (
SELECT cname
FROM stumanager.course
WHERE tid = '张三'
)
ORDER BY grade DESC
LIMIT 1;
35.查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
SELECT sid, cid,sc.grade
FROM stumanager.sc
WHERE (sid,sc.grade) IN (
SELECT sid,sc.grade
FROM stumanager.sc
GROUP BY sid,sc.grade
HAVING COUNT(DISTINCT cid) > 1
);
36.查询每门功成绩最好的前两名
SELECT cname, MAX(grade) AS highestgrade
FROM stumanager.sc,stumanager.course
GROUP BY cname
HAVING COUNT(*) >= 2
ORDER BY cname;
37.统计每门课程的学生选修人数(超过 5 人的课程才统计)。
SELECT cname, COUNT(*) AS student_count
FROM stumanager.course
GROUP BY cname
HAVING COUNT(*) > 5;
38.检索至少选修两门课程的学生学号
SELECT sid
FROM stumanager.sc
GROUP BY sid
HAVING COUNT(DISTINCT cid) >= 2;
39.查询选修了全部课程的学生信息
SELECT student.*
FROM stumanager.student
WHERE student.sid IN (
SELECT sid
FROM stumanager.course
GROUP BY sid
HAVING COUNT(DISTINCT cid) = (
SELECT COUNT(DISTINCT cid)
FROM stumanager.course
)
);
40.查询各学生的年龄,只按年份来算
SELECT sid, YEAR(CURDATE()) - YEAR(sage) AS sage
FROM stumanager.student;
41.按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一
select
sname,
sage,
where month(current_date) < month(sage)
or (month(current_date) = month(sage) and day(curret_date) < day(sage))
then year(current_date) - year(sage) - 1
else year(current_date) - year(sage)
end as sage
from stumanager.student;
42.查询本周过生日的学生
SELECT *
FROM stumanager.student
WHERE sid IN (
SELECT sid
FROM stumanager.student
WHERE WEEKOFYEAR(sage) = WEEKOFYEAR(CURDATE())
)
43.查询下周过生日的学生
select*from stumanager.student
where date_format(sage, '%u')=
(select date_format(now(),'%u'))
44.查询本月过生日的学生
SELECT * FROM stumanager.student
WHERE MONTH(sage) = MONTH(CURRENT_DATE())
45.查询下月过生日的学生
SELECT * FROM stumanager.student
WHERE MONTH(sage) = month(now())+1;