数据查询
- 在studentsdb数据库中使用SELECT语句进行基本查询。
(1)在student_info表中,查询每个学生的学号、姓名、出生日期信息。
(2)查询student_info表学号为 0002的学生的姓名和家庭住址。SELECT 学号,姓名,出生日期
FROM student_info;
(3)查询student_info表所有出生日期在95年以后的女同学的姓名和出生日期。SELECT 姓名,家庭住址
FROM student_info
WHERE 学号 = 0002;
SELECT 姓名,出生日期
FROM student_info
WHERE 出生日期 > '1995-00-00' AND 性别 = '女';
- 使用select语句进行条件查询。
(1)在grade表中查询分数在70-80范围内的学生的学号、课程编号和分数。
(2)在grade表中查询课程编号为0002的学生的平均成绩。select 学号,课程编号,分数
from grade
where 分数 between 70 and 80;
(3)在grade表中查询选修课程编号为0003的人数和该课程有成绩的人数。select AVG(分数) as 平均成绩
from grade
where 课程编号 = 0002;
(4)查询student_info的姓名和出生日期,查询结果按出生日期从大到小排序。select count(*) as 选修课程0003的人数,count(分数) as 0003有成绩的人数
from grade
where 课程编号 = 0003;
(5)查询所有姓名“张”的学生的学号和姓名。select 姓名,出生日期
from student_info
order by 出生日期 desc; --desc从大到小,asc,从小到大
select 学号,姓名
from student_info
where 姓名 like '张%'; --like '';通配符%和_,%表示0个或任意多个字符,_代表任意一位字符。
- 对student_info表,查询学生的学号、姓名、性别、出生日期及家庭住址,查询结果先按照性别的由小到大排序,性别相同的再按学号由大到小排序。
select 学号,姓名,性别,出生日期,家庭住址
form student_info
order by 性别 ASC 学号 DESC;
- 使用GROUP BY子句查询grade表中各个学生的平均成绩。
select 学号,AVG(分数) as 平均成绩
from grade
group by 学号;
- 使用UNION运算符针student_info表中姓“刘”的学生的学号、姓名与姓“张”的学生的学号、姓名返回在一个表中。
select 学号,姓名
from student_info
where 姓名 like '刘%'
#union操作符可以连接两个以上的SELECT语句结果组合到一个结果集合中。
union--[ALL|DISTINCT] ALL输出所有结果集,包括重复,DISTINCT输出去重结果
select 学号,姓名
from student_info
where 姓名 like '张%';
- 嵌套查询(子查询)
(1)在student_info表中查找与“刘东阳”性别相同的所有学生的姓名、出生日期。
(2)使用IN子查询查找所修课程编号为0002、0005的学生学号、姓名、性别。select 姓名,出生日期
from student_info
where 性别 = (select 性别 from student_info where 姓名 = '刘东阳');
(3)使用ANY子查询查找学号为0001的学生的分数比0002号的学生的最低分数高的课程编号和分数。select 学号,姓名,性别
from student_info
where 学号 in(select 学号 from grade where 课程编号 in(0002,0005));
#--in操作符在where语句中使用,返回集合内有的多个查询值
#--(如上述值符合集合内的0002或0005)返回对应值
(4)使用ALL子查询查找学号为0001的学生的分数比学号为0002的学生的最高成绩还要高的课程编号和分数。select 课程编号,分数
from grade
where 学号 = 0001
and 分数 >ANY (select 分数 from grade where 学号 = 0002 )
#-- ANY操作符,>ANY(语句)大于任意一个语句结果集的值
#--(即大于结果集最小的值)
select 课程编号,分数
from grade
where 学号 = 0001
and 分数 >ALL (select 分数 from grade where 学号 = 0002 );
#-- ALL操作符,>ALL(语句)大于所有语句结果集的值
#--(即大于结果集最大的值)
- 连接查询
(1)查询分数在80-90范围内的学生的学号、姓名、分数。
(2)使用INNER JOIN连接方式查询学习“数据库原理及应用”课程的学生学号、姓名、分数。select student_info.学号,姓名,分数
from grade INNER JOIN student_info
on student_info.学号 = grade.学号
where 分数 between 80 and 90;
#--FROM 表1名 INNER JOIN 表2名 ON 表1名.列名 = 表2名.列名
#--连接查询中的内查询,简单查询。根据两个表的不同列对接,相等的返回查询
(3)查询每个学生所选课程的最高成绩,要求列出学号、姓名、最高成绩。#--清空数据表
truncate table curriculum;
#--先插入数据,因为之前删除过
INSERT INTO curriculum
(课程编号,课程名称,学分)
VALUES
(0001,'计算机应用基础',2),
(0002,'C语言程序设计',2),
(0003,'数据库原理与应用',2),
(0004,'英语',4),
(0005,'高等数学',4);
#--用where找到课程名对应的课程编号
#--通过inner join 内连接对接grade表。curriculum表和student_info表
#--按编号对接对应的数据再对接学号,获取查询后课程名称对应的学号姓名分数
select si.学号,姓名,分数
from student_info as si inner join grade as g
on si.学号 = g.学号 inner join curriculum as c
on g.课程编号 = c.课程编号
where 课程名称 = '数据库原理及应用';
(4)使用左外连接查询每个学生的总成绩,要求列出学号、姓名、总成绩,没有选修课程的学生的总成绩为空。select s.学号,姓名,max(分数) as 最高成绩
from student_info as s,grade as g
where s.学号 = g.学号
group by s.学号;
(5)为grade表添加数据行:学号为0004、课程编号为0006、分数为76。select s.学号,姓名,SUM(分数) AS 总成绩
from student_info as s left outer join grade as g
on s.学号 = g.学号
group by s.学号;
使用右外连接查询所有课程的选修情况,要求列出课程编号、课程名称、选修人数,curriculum表中没有的课程列值为空。 ```sql—为grade表添加数据行:学号为0004、课程编号为0006、分数为76。
insert into grade(学号,课程编号,分数) values(‘0004’,’0006’,’76’);—右外连接查询所有课程的选修情
select g.课程编号,课程名称,count(*) as 选修人数 from curriculum as c right outer join grade as g on c.课程编号 = g.课程编号 group by g.课程编号;
```