暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DQL数据库表的查询

Hello 帅帅 2021-02-05
578

DQL:查询表中的记录

案例数据库:学生,课程,选课(选自数据库系统概论第五版)

学生


课程


选课


语法

    select
    字段列表
    from
    表名列表
    where
    条件列表
    group by
    分组字段
    having
    分组之后的条件
    order by
    排序
    limit
    分页限定

    基础查询

    1. 多个字段的查询

       select 字段名1,字段名2... from 表名;

      1. 去除重复:

         select distinct 字段名1,字段名2... from 表名;

        1. 计算列

        • 一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)

        • ifnull(表达式1,表达式2):null参与的运算,计算结果都为null

        • 表达式1:哪个字段需要判断是否为null

          • 如果该字段为null后的替换值。

        1. 起别名:

         as:as也可以省略

        例:

           # 查询全体学生的学号与姓名。
          SELECT Sno, Sname
          FROM Student;

          # 查询共有多少专业
          SELECT distinct Sdept
          FROM Student;

          # 给查询的列起别名
          SELECT Sname 姓名
          FROM Student;

          条件查询

          1. where子句后跟条件

          2. 运算符

          查询条件谓词
          比较= , > , < , >= , <= , != , <>(不等于) , !> ,!<
          确定范围between…and
          确定集合in
          字符匹配like(占位符:_单个字符,%多个字符)
          空值is null
          多重条件(逻辑运算)and&& , or|| , not!

          例:

             # 查询所有年龄在20岁以下的学生姓名及其年龄。
            SELECT Sname, Sage
            FROM Student
            WHERE Sage < 20;

            # 查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、
            SELECT Sname, Sdept, Sage
            FROM Student
            WHERE Sage BETWEEN 20 AND 23;

            # 查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别。
            SELECT Sname, Ssex
            FROM Student
            WHERE Sdept IN ('CS', 'MA', 'IS');

            # 查询名字中第二个字为"阳"的学生的姓名和学号。
            SELECT Sname, Sno
            FROM Student
            WHERE Sname LIKE '阳%';

            # 查询缺少成绩的学生的学号和相应的课程号。
            SELECT Sno, Cno
            FROM SC
            WHERE Grade IS NULL;

            排序查询

            语法:order by 子句

            order by 排序字段1 排序方式1 , 排序字段2 排序方式2...

            排序方式:

            • ASC:升序,默认的。

            • DESC:降序。

            例:

               # 选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列
              SELECT Sno, Grade
              FROM SC
              WHERE Cno = '3'
              ORDER BY Grade DESC;

              # 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
              SELECT*
              FROM Student
              ORDER BY Sdept, Sage DESC;

              聚合函数

              将一列数据作为一个整体,进行纵向的计算。

              1. count:计算个数

                1. 一般选择非空的列:主键

                2. count(*)

              2. max:计算最大值

              3. min:计算最小值

              4. sum:计算和

              5. avg:计算平均值

              • 注意:聚合函数的计算,排除null值。

              解决方案:

              1. 选择不包含非空的列进行计算

              2. IFNULL函数

              例:

                 # 查询学生总人数。
                SELECT COUNT(*)
                FROM student;

                # 查询选修了课程的学生人数。
                SELECT COUNT(DISTINCT Sno)
                FROM SC;

                # 计算选修1号课程的学生平均成绩,
                SELECT AVG(Grade)
                FROM SC
                WHERE Cno = '1';

                # 查询选修1号课程的学生最高分数。
                SELECT MAX(Grade)
                FROM SC
                WHERE Cno = '1';

                # 查询学生201215121选修课程的总学分数。
                SELECT SUM(Ccredit)
                FROM SC,
                Course
                WHERE Sno = '201215121'
                AND SC.Cno = Course.Cno;

                分组查询

                语法:group by 分组字段;

                注意:

                1. 分组之后查询的字段:分组字段、聚合函数

                2. where 和 having 的区别?

                  1. where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来

                  2. where 后不可以跟聚合函数,having可以进行聚合函数的判断。

                例:

                   # 求各个课程号及相应的选课人数
                  SELECT Cno, COUNT(Sno)
                  FROM SC
                  GROUP BY Cno;

                  # 询选修了2门以上课程的学生学号。
                  SELECT Sno
                  FROM SC
                  GROUP BY Sno
                  HAVING COUNT(*) > 2;

                  # 查询平均成绩大于等于80分的学生学号和平均成绩
                  SELECT Sno, AVG(Grade)
                  FROM SC
                  GROUP BY Sno
                  HAVING AVG(Grade) >= 80;

                  分页查询

                  1. 语法:limit 开始的索引,每页查询的条数;

                  2. 公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数

                  -- 每页显示3条记录

                     # 从0开始查,查询3条记录
                    SELECT * FROM student LIMIT 0,3; -- 第1页
                    SELECT * FROM student LIMIT 3,3; -- 第2页
                    SELECT * FROM student LIMIT 6,3; -- 第3页

                    1. limit 是一个MySQL"方言"


                    文章转载自Hello 帅帅,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                    评论