实验3数据库查询-学生表(Student)、课程表(Course)、学生选课表(SC)
答案
查询select 彻底删除drop 修改alter 创建creat
--删除数据库
drop database TK --数据库名
查询学生表S中的所有信息
use TK --数据库名
select * --列名
from S --表名
子查询
在SQL语句中,一个select-from-where语句称为一个查询块.
将一个查询块嵌入在另一个查询块的where子句或者Having短语或者from子句的条件中的查询为嵌套查询
()内为子查询,()外为父查询
SQL先执行子查询的内容,求出子查询的值后执行父查询,返回最后的结果
带有in谓词的子查询
SQL 子查询 EXISTS 和 NOT EXISTS
- SELECT … FROM table WHERE EXISTS (subquery)
该语法可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE 或 FALSE)来决定主查询的数据结果是否得以保留。
EXISTS代表存在量词∃。带有EXISTS谓词的子查询只返回“true”或“false”。
--(9) 查询所有选修了004号课程的学生姓名:
--正确做法:
use TK
SELECT * from S
where exists (select Sno from SC where Cno ='004' and SC.Sno=S.Sno);
--错误做法:
use TK
SELECT * from S
where exists (select Sno from SC where Cno ='004');--没有加筛选条件SC.Sno=S.Sno,导致查询结果直接输出表S所有内容
不等于 <>
order by排序
子查询的select语句不能用orderby子句。
orderby子句只能用于对最终查询结果排序。
--输出学习004号课程的成绩前两名的学生的学号和成绩
use TK
SELECT TOP 2 Sno,grade from SC
where CNO ='004'
order by grade desc; --order by排序,默认升序。ASC升序,DESC降序。
--按所在系的系名升序排列,同一系的按年龄降序排列
select * from S
order by Sdept,Sage DESC;
group by分组,count统计函数
--查询统计表S的男女学生的人数。
--count(*)统计该性别的所有人数,as '人数' 给统计结果那列起一个列名
select Ssex as '性别',count(*) as '人数' from S --count统计函数。除count(*)外,统计函数遇到空值时,都跳过空值不处理。
group by Ssex;--group by 分组
有count就有groupby,否则报错
--(22) 查询各系的男女生学生总数, 并按系别,升序排列, 女生排在前:
select Sdept,Ssex,count(*) as '人数'from S
group by Sdept,Ssex --select语句中查询哪列,groupby分组语句就要有对应的列,否则会报错
order by Sdept,Ssex desc;
union并,intersect交,except差
集合运算:当查询结果集有多个且不同时但又希望它们按一定的关系连接在一起组成一组数据,这时可用联合查询(集合运算)实现。
--查询选修了012课程或004课程的学生的学号
use TK
SELECT SNO
FROM SC
WHERE CNO ='012'
union --union并,intersect交,except差
SELECT SNO
FROM SC
WHERE CNO='004'
连接查询
查询学生选课情况时,即要那些有选课信息的学生情况,又要有那些没有选课信息的学生情况,可用左外连接
--内连接inner join
--查询每个学生的情况及其选课情况
use TK
SELECT *
FROM S INNER JOIN SC ON S.Sno=SC.Sno;--S与SC表中同一学号的元组连接起来
--左外连接left join:对连接条件左边的表不加限制
--总结:左连接显示左表全部行。如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。
--查询每个学生的情况及其选课情况(含未选课程的学生信息)
select S.*,Cno,Grade
from S left join SC on S.Sno=SC.Sno;
--右外连接right join:对连接条件左边的表不加限制
--总结:右连接显示右表全部行。如果右表中行在左表中没有匹配行,则结果中左表中的列返回NULL。
select S.*,Cno,Grade
from S right join SC on S.Sno=SC.Sno;
--全外连接full join:对连接条件的两个表都不加限制
select S.*,Cno,Grade
from S full join SC on S.Sno=SC.Sno;
--交叉连接cross join:没有连接条件下的两个表的连接,包含所连接的两个表的所有元组
select S.*,SC.Cno,SC.Grade
from S cross join SC ;
自身连接
--查询与’王刚’在同一个系学习的学生的信息:
use TK
select a.*
from S as a join S as b --为表S设置两个别名
on a.Sdept=b.Sdept and b.Sname='王刚';
聚集函数:max、min、sum(求总和)、avg(求平均值)、count(求总行数)
max、min、sum、avg都是忽略null的,而count(*)统计的行数包括null,count(column)忽略null的行。
特别记忆count 的三种使用方式:
count(*) 对表中行的数目进行统计,不忽略null值
count(column) 忽略null的值。
count(distinct Sno) 忽略重复行
--(14)查询学生总人数:
select count(*) as '学生总人数' from S;
--方法二:
--select count(Sno) as '学生总人数' from S;
--(15)查询选修了课程的学生总数:
select count(distinct Sno) as '选课学生总数' from SC
--方法二:
--select count(Sno) as '选修了课程的学生总数' from S
--where Sno in (select Sno from SC)--推荐方法一
结果:
--(18)查询’计算机系’学生”数据结构”课程的平均成绩:
select avg(Grade)
from S,C,SC
where s.Sno=sc.Sno and C.cno=sc.cno and c.Cname='数据结构' and s.Sdept='CS'
/*方法二:
select avg(Grade) as CS数据结构平均成绩
from SC
where Cno=(select Cno from C where Cname ='数据结构') and Sno in (select Sno from S where Sdept ='CS');
*/
error :
--(19)查询每个学生的课程成绩最高的成绩信息(学号,课程号,成绩):
select *
from SC as a
where Grade = (select max(Grade) from SC as b where b.Sno=a.Sno );
--按学生分组 where b.Sno=a.Sno
distinct去除结果表中的重复行
--(12) 查询至少选修了学生20040002选修的全部课程的学生的学号
select distinct Sno as '学号'
--distinct去掉结果表中的重复行
from SC as a
where exists (select * from SC as b where b.Sno='20040002' and a.Cno=b.Cno)and a.Sno<>'20040002';--去掉结果表中学号为20040002的行
having筛选分组
当完成数据结果的查询和统计后,用Having对结果进行进一步的筛选
--(23) 查询选修了3门课程以上的学生的学号和姓名:
select Sno,Sname
from S
where exists(select Sno from SC where S.Sno=SC.Sno--这句如果没加,结果表会输出表S的所有行group by Sno having count (Cno)>3 --having筛选分组);--子查询,查询选修了3门课程以上的学生的学号
实验3数据库查询-学生表(Student)、课程表(Course)、学生选课表(SC)相关推荐
- Mysql数据库使用:学生选课系统,其中设计到三张表,分别为学生表,课程表,学生和课程对应的关联表。
Mysql数据库使用 练习内容:主要针对学生选课系统而设计,其中设计到三张表,分别为学生表,课程表,学生和课程对应的关联表. 学生表主要用于存储学生信息,包括姓名,性别,地址,电话等信息 课程表主要用 ...
- 有以下三张表,学生表 student 课程表 course 成绩表 result
表结构如下: 学生表 student(学生编号 sid.学生姓名 sname.学生年龄 age) 课程表 course(课程编号 cid.课程名称 cname) 成绩表 result(学生编号 sid ...
- 数据库原理实验 三个关系表 学生表students 课程表course 学生选课表sc
实验数据如下: 在数据库中建立三个关系表Students,Course,SC. 学生表:Student(Sno,Sname,Ssex,Sage,Sdept) 课程表:Course(Cno,Cname, ...
- mysql 创建学生表、课程表、学生选课表
数据库系统概论(第五版)79页提供的三个表,为了我们上机操作容易,下面创建这三个表 学生-课程数据库中包含以下三个表 学生表:Student(Sno,Sname,Ssex,Sage,Sdept) 课程 ...
- Sql Server 行转列学习 根据学生表、课程表、学生成绩表统计每个学生的各科成绩和他的总成绩、平均成绩...
-------************************************************************* -------学习.测试行转列 ------- So ...
- oracle学生选课查询(学生表student、成绩表sc、课程表c)
oracle学生选课查询--学生表student.成绩表sc.课程表c 一.创建学生表,表结构(学号,姓名,年龄,性别,系别,出生地),插入几条记录 二.创建成绩表,表结构(学号,课程号,成绩),插入 ...
- 建立数据库,建立一个“学生”表student。
1.建立数据库,建立一个"学生"表student. 2.设计思想:首先利用create database语句建立一个数据库,再用create table语句按要求建立基本表,再按照 ...
- 常见的SQL面试题(学生表_课程表_成绩表_教师表)
表架构 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师 ...
- sql面试题(学生表_课程表_成绩表_教师表)
原帖链接:http://bbs.csdn.net/topics/280002741 表架构 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课 ...
- SQL经典案例(学生表,课程表,选课表,教师表) 练习
一·创建表 课程表 DROP TABLE IF EXISTS `course`; CREATE TABLE `course` (`CNO` int(10) NOT NULL COMMENT '课程号' ...
最新文章
- CodeForces - 55D Beautiful numbers
- 鸿蒙系统手机还会出吗,华为最强手机即将到来,可能还有华为鸿蒙系统加入!你期待吗?...
- android遍历拼接字符串,写个批处理脚本帮忙干活---遍历amp;字符串处理
- php如何生成订单号,php如何生成不重复订单号
- 查看xxx.a库架构的命令
- 知识管理在客户关系管理中的应用领域
- 献给那些离婚或准备离婚的人
- uwsgi --http :8888 --wsgi-file test.py(无法部署)
- 小红旗图标在excel如何输入_excel数据核对技巧:如何用函数公式标识输入正误...
- vscode代码提示只显示一行_模型秒变API只需一行代码,支持TensorFlow等框架
- 解决只能滑动弹框内容不能滑动弹框底层内容
- 性能强悍的开源关系数据库PostgreSQL
- Spring Boot 日志
- SpringMVC入门(一)Dispatcher
- Excel 通过 CONCATENATE 函数生成SQL
- Linux系统各发行版镜像下载(借阅)
- android 高仿网易,Android项目实战教程之高仿网易云音乐启动页实例代码
- 2021程序员的出路在哪里
- java学习(方法)
- Mac(Big Sur系统)安装tunnelblick(vpn)步骤
热门文章
- 黄埔计算机培训学费要多少,广州黄埔中黄外国语小学2021年学费、收费多少
- Vincent-Starry, Starry Night
- 数学建模:相关性分析学习——皮尔逊(pearson)相关系数与斯皮尔曼(spearman)相关系数
- 阿里巴巴开发规范——OOP 规约
- MFC主流开发库BCGControlBar下载安装教程!
- M.2、SATA3.0、MSATA三种固态硬盘接口区别
- 微博红包/爬虫/支付/核心代码
- Linux write 函数深入了解
- Billu_b0x靶机
- layout_above