关系数据库SQL数据查询(一)

简介: 关系数据库SQL数据查询

数据查询

一、单表查询

1.查询仅涉及一个表,选择表中的若干列

[例1]  查询全体学生的学号与姓名。
  SELECT Sno,Sname
  FROM Student; 
[例2]  查询全体学生的姓名、学号、所在系。
  SELECT Sname,Sno,Sdept
  FROM Student;

查询全部列

  • 选出所有属性列:
  • 在SELECT关键字后面列出所有列名
  • 将<目标列表达式>指定为 *
[例3]  查询全体学生的详细记录
  SELECT  Sno,Sname,Ssex,Sage,Sdept 
  FROM Student; 
  SELECT  *
  FROM Student; 

查询经过计算的值

  • SELECT子句的<目标列表达式>不仅可以为表中的属性列,也可以是表达式
[例4]  查全体学生的姓名及其出生年份。
 SELECT Sname,2014-Sage          /*假设当时为2014年*/
 FROM Student;
 输出结果:
             Sname   2014-Sage
                李勇         1994
                刘晨         1995
                王敏         1996
                张立         1995 

使用列别名改变查询结果的列标题:

SELECT Sname NAME,'Year of Birth:'  BIRTH,
         2014-Sage  BIRTHDAY,LOWER(Sdept)  DEPARTMENT
    FROM Student;
  输出结果:
      NAME      BIRTH         BIRTHDAY   DEPARTMENT
       李勇    Year of Birth:    1994             cs
       刘晨    Year of Birth:    1995             cs
       王敏    Year of Birth:    1996             ma
       张立    Year of Birth:    1995             is

2.选择表中的若干元组

消除取值重复的行

如果没有指定DISTINCT关键词,则缺省为ALL

[例5]  查询选修了课程的学生学号。
      SELECT Sno   FROM SC;
    等价于:
    SELECT ALL  Sno  FROM SC;
    执行上面的SELECT语句后,结果为: 
                Sno
            201215121
            201215121
            201215121
            201215122
            201215122

指定DISTINCT关键词,去掉表中重复的行

SELECT DISTINCT Sno
      FROM SC; 
      执行结果:
                Sno
            201215121
            201215122

常用的查询条件:

1. 比较大小:

[例6] 查询计算机科学系全体学生的名单。
      SELECT Sname
      FROM     Student
      WHERE  Sdept=‘CS’; 
  [例7]查询所有年龄在20岁以下的学生姓名及其年龄。
       SELECT Sname,Sage 
       FROM     Student    
       WHERE  Sage < 20;
  [例8]查询考试成绩有不及格的学生的学号。
      SELECT DISTINCT Sn
      FROM  SC
      WHERE Grade<60; 

2. 确定范围:

谓词: BETWEEN … AND …

NOT BETWEEN … AND …

[例9] 查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄
       SELECT Sname, Sdept, Sage
  FROM     Student
  WHERE   Sage BETWEEN 20 AND 23; 
  [例10]  查询年龄不在20~23岁之间的学生姓名、系别和年龄
           SELECT Sname, Sdept, Sage
           FROM    Student
           WHERE Sage NOT BETWEEN 20 AND 23; 

3. 确定集合:

谓词:IN <值表>, NOT IN <值表>

[例11]查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别。
    SELECT Sname, Ssex
    FROM  Student
    WHERE Sdept IN ('CS','MA’,'IS' );
  [例12]查询既不是计算机科学系、数学系,也不是信息系的学生的姓名和性别。
    SELECT Sname, Ssex
    FROM Student
          WHERE Sdept NOT IN ('IS','MA’,'CS' );
  1. 字符匹配:
  • 谓词: [NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]
  • <匹配串>可以是一个完整的字符串,也可以含有通配符%和 _
  • % (百分号) 代表任意长度(长度可以为0)的字符串
  • 例如a%b表示以a开头,以b结尾的任意长度的字符串
    _ (下横线) 代表任意单个字符。
  • 例如a_b表示以a开头,以b结尾的长度为3的任意字符串
匹配串为固定字符串
 [例13]  查询学号为201215121的学生的详细情况。
       SELECT *    
      FROM  Student  
      WHERE  Sno LIKE ‘201215121';
 等价于: 
        SELECT  * 
       FROM  Student 
       WHERE Sno = ' 201215121 ';
 匹配串为含通配符的字符串
 [例14]  查询所有姓刘学生的姓名、学号和性别。
        SELECT Sname, Sno, Ssex
       FROM Student
       WHERE  Sname LIKE '刘%';
 [例15]  查询姓"欧阳"且全名为三个汉字的学生的姓名。
        SELECT Sname
       FROM   Student
       WHERE  Sname LIKE '欧阳__';

使用换码字符将通配符转义为普通字符

[例16]  查询DB_Design课程的课程号和学分。
        SELECT Cno,Ccredit
        FROM     Course
        WHERE  Cname LIKE 'DB\_Design' ESCAPE '\ ' ;
  [例17]  查询以"DB_"开头,且倒数第3个字符为 i的课程的详细情况。
        SELECT  *
        FROM    Course
        WHERE  Cname LIKE  'DB\_%i_ _' ESCAPE '\ ' ;
    ESCAPE '\' 表示“ \” 为换码字符

5. 涉及空值的查询:

谓词: IS NULL 或 IS NOT NULL

  • “IS” 不能用 “=” 代替
[例18]  某些学生选修课程后没有参加考试,所以有选课记录,但没 有考试成绩。查询缺少成绩的学生的学号和相应的课程号。
    SELECT Sno,Cno
       FROM    SC
       WHERE  Grade IS NULL
 [例19]  查所有有成绩的学生学号和课程号。
       SELECT Sno,Cno
       FROM     SC
       WHERE  Grade IS NOT NULL;

6.多重条件查询

  • 逻辑运算符:AND和 OR来连接多个查询条件
    AND的优先级高于OR
  • 可以用括号改变优先级

[例20] 查询计算机系年龄在20岁以下的学生姓名。

SELECT Sname
FROM Student
WHERE Sdept= ‘CS’ AND Sage<20;

3.ORDER BY子句

ORDER BY子句

可以按一个或多个属性列排序

升序:ASC;降序:DESC;缺省值为升序

对于空值,排序时显示的次序由具体系统实现来决定

[例21]查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。
         SELECT Sno, Grade
         FROM    SC
         WHERE  Cno= ' 3 '
         ORDER BY Grade DESC;
 [例22]查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
         SELECT  *
         FROM  Student
         ORDER BY Sdept, Sage DESC;  

4.聚集函数统计元组个数

COUNT(*)

  1. 统计一列中值的个数
    COUNT([DISTINCT|ALL] <列名>)
  2. 计算一列值的总和(此列必须为数值型)
    SUM([DISTINCT|ALL] <列名>)
  3. 计算一列值的平均值(此列必须为数值型)
    AVG([DISTINCT|ALL] <列名>)
  4. 求一列中的最大值和最小值
    MAX([DISTINCT|ALL] <列名>)
    MIN([DISTINCT|ALL] <列名>)
[例23]  查询学生总人数。
      SELECT COUNT(*)
      FROM  Student; 
      [例24]  查询选修了课程的学生人数。
      SELECT COUNT(DISTINCT Sno)
      FROM SC;
      [例25]  计算1号课程的学生平均成绩。
           SELECT AVG(Grade)
           FROM    SC
           WHERE Cno= ' 1 ';
  [例26]  查询选修1号课程的学生最高分数。
    SELECT MAX(Grade)
    FROM SC
    WHERE Cno='1';
   [例27 ] 查询学生201215012选修课程的总学分数。
          SELECT SUM(Ccredit)
               FROM  SC,Course
               WHERE Sno='201215012' AND SC.Cno=Course.Cno; 

5.GROUP BY子句

GROUP BY子句分组:

细化聚集函数的作用对象

  • 如果未对查询结果分组,聚集函数将作用于整个查询结果
  • 对查询结果分组后,聚集函数将分别作用于每个组
  • 按指定的一列或多列值分组,值相等的为一组
[例28]  求各个课程号及相应的选课人数。
      SELECT Cno,COUNT(Sno)
      FROM    SC
      GROUP BY Cno; 
      查询结果可能为:
          Cno     COUNT(Sno)
      1             22
         2             34
            3             44
       4             33
              5             48

HAVING短语与WHERE子句的区别:

  • 作用对象不同
  • WHERE子句作用于基表或视图,从中选择满足条件的元组
  • HAVING短语作用于组,从中选择满足条件的组。


相关实践学习
MySQL数据库快速部署实践
本场景主要介绍如何在一台配置了CentOS 7.7版本的ECS实例(云服务器)上安装mysql,执行mysql的常用操作,学习基本的SQL语句。
目录
相关文章
|
8月前
|
SQL 机器学习/深度学习 人工智能
从“写SQL”到“聊数据”:NL2SQL如何用自然语言解锁数据库?
本文系统性地阐述了自然语言转SQL(NL2SQL) 技术如何让非技术背景的业务分析师实现数据自助查询,从而提升数据驱动决策的效率与准确性。
从“写SQL”到“聊数据”:NL2SQL如何用自然语言解锁数据库?
|
7月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1268 152
|
7月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
944 156
|
10月前
|
SQL 关系型数据库 MySQL
Go语言数据库编程:使用 `database/sql` 与 MySQL/PostgreSQL
Go语言通过`database/sql`标准库提供统一数据库操作接口,支持MySQL、PostgreSQL等多种数据库。本文介绍了驱动安装、连接数据库、基本增删改查操作、预处理语句、事务处理及错误管理等内容,涵盖实际开发中常用的技巧与注意事项,适合快速掌握Go语言数据库编程基础。
1286 213
|
7月前
|
SQL 人工智能 Linux
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
635 5
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
|
6月前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
354 6
|
7月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
7月前
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
508 8
|
8月前
|
SQL 人工智能 Java
用 LangChain4j+Ollama 打造 Text-to-SQL AI Agent,数据库想问就问
本文介绍了如何利用AI技术简化SQL查询操作,让不懂技术的用户也能轻松从数据库中获取信息。通过本地部署PostgreSQL数据库和Ollama模型,结合Java代码,实现将自然语言问题自动转换为SQL查询,并将结果以易懂的方式呈现。整个流程简单直观,适合初学者动手实践,同时也展示了AI在数据查询中的潜力与局限。
1099 8
|
8月前
|
SQL 人工智能 Linux
SQL Server 2025 RC0 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC0 发布 - 从本地到云端的 AI 就绪企业数据库
378 5
下一篇
开通oss服务