数据查询

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

```