zoukankan      html  css  js  c++  java
  • 【SQL必知必会笔记(2)】检索数据、排序检索数据

    上个笔记中介绍了一些关于数据库、SQL的基础知识,并且创建我们后续练习所需的数据库、表以及表之间的关系,从本文开始进入我们的正题:SQL语句的练习。



    正如上个笔记中所说,SQL语句是由简单的英语单词构成。这些单词称为关键字,每个SQL语句都是由一个或多个关键字构成的。

    • 关键字(keyword):作为SQL组成部分的保留字。关键字不能用作表或列的名字。书中附录E列出了某些经常使用的保留字。

    注意:SQL是一种语言,而不是一个应用程序。具体如何写SQL语句并显示语句输出,是随不同应用程序而变化的。


    1.检索数据(SELECT语句)

    SELECT语句:

    • SELECT语句大概是SQL语句中最经常使用的语句,它的用途是:从一个或多个表中检索一个或多个数据列。

    • 为了使用SELECT检索数据,必须至少给出两条信息:

      想选择什么;
      从什么地方选择;
      

    1.1 检索列

    1.1.1 检索单个列,语句:

    SELECT 列名
    FROM 表;
    

    分析:

    • 该语句将返回表中该列的所有行

    注意:

    • SQL语句不区分大小写,因此SELECT和select是相同的。
    • 不过要注意,虽然SQL是不区分大小写的,但是表名、列名和值可能有所不同。(要根据具体DBMS及其配置来看)
    • 在处理SQL语句时,其中所有空格都被忽略。所以SQL语句可以写成长长的一行,也可以分写在多行。不过,多数SQL开发人员认为,将SQL语句分成多行更容易阅读和理解。

    1.1.2 检索多个列,语句:

    SELECT 列名1,列名2,列名3
    FROM 表;
    

    注意:

    • 列名之间用逗号隔开;
    • 最后一个列名后不加逗号
      1.2.3 检索所有列,语句:
    SELECT *
    FROM 表;
    

    分析:

    • *为通配符;
    • 在这里使用 *通配符,结果返回表中所有列。列的顺序一般是列在表定义中出现的物理顺序,但并不总是如此。

    注意:

    • 谨慎使用 *通配符。除非你确实需要表中的每一列,否则最好别使用 *通配符。
    • 使用 *通配符有一个大优点:能检索出列名未知的列。

    1.2 检索不同的值(DISTINCT)

    语句:

    SELECT DISTINCT 列名
    FROM 表;
    

    分析:

    • 在列名前加上DISTINCT关键字,则指示DBMS只返回该列不同(具有唯一性)的行

    注意:

    • 如果使用DISTINCT关键字,它必须直接放在第一个列名的前面;
    • 不能部分使用DISTINCT关键字。它作用于所有的列,不仅仅是跟在其后面那一列。也就是说,该关键字后面有多个列的话,则返回该列组合具有唯一性的行。

    1.3 限制结果(LIMIT、OFFSET)(DBMS:MySQL)

    • 语句1:
    SELECT 列名
    FROM 表
    LIMIT 5;
    
    • 语句2:
    SELECT 列名
    FROM 表
    LIMIT 5 OFFSET 2;
    
    • 语句3:
    SELECT 列名
    FROM 表
    LIMIT 5,2;
    

    分析:

    • 语句1返回:从第1行开始,最多5行的数据;

    • 语句2返回:从第3行开始,最多5行的数据;

      OFFSET后面的数字表示:从哪开始;
      LIMIT后面的数字表示:检索的行数;
      
    • 语句3:语句2的简化版,逗号之前的值对应OFFSET,之后的值对应LIMIT;

    注意:

    • 并非所有的SQL实现都一样。非常基本的语句往往是容易移植的,但较复杂的语句就不同了。要视具体的DBMS而定。

    1.4 使用注释(–、#、/* */)

    • 行内注释:
    形式1:
    SELECT 列名  -- 这是一条注释
    FROM 表;
    
    形式2:
    # 这是一条注释
    SELECT 列名
    FROM 表;
    
    • 多行注释:
    /* SELECT prod_name, vend_id  
    FROM Products; */  
    SELECT prod_name  
    FROM 
    Products; 
    

    分析:

    • 在行内注释中,形式2很少得到支持。但是MySQL中是支持的。

    • 多行注释中,

      注释从 /* 开始,到 */ 结束,/* 和 */之间的任何内容都是注释。
      这种方式常用于给代码加注释。
      

    2.排序检索数据(ORDER BY子句)

    本小节将介绍如何使用SELECT语句的ORDER BY子句,根据需要排序检索出的数据。

    通过SELECT检索出的数据,如果不排序,数据一般将以它在底层表中出现的顺序显示,这有可能是数据最初添加到表中的顺序。但是,如果数据随后进行过更新或删除,就不一定了。因此,关系数据库设计理论认为,如果不明确规定排序顺序,则不应假定检索出的数据的顺序有任何意义

    子句(clause):

    • SQL语句由子句构成,有些子句是必需的,有些则是可选的。一个子句通常由一个关键字加上所提供的数据组成。
    • 子句的例子有前面看到的,SELECT语句的FROM子句。

    2.1 按列名排序数据

    为了明确地排序用SELECT语句检索出的数据,可使用ORDER BY子句。ORDER BY子句取一个或多个列的名字,据此对输出进行排序。

    • 单个列名排序,语句:
    SELECT 列名
    FROM 表
    ORDER BY 列名;
    
    • 多个列名排序,语句:
    SELECT 列名1,列名2,列名3
    FROM 表
    ORDER BY 列名1,列名2;
    

    提示:

    • 通过非选择列进行排序。用非检索的列排序数据是完全合法的。
    • 多个列名排序时,首先按列名1,然后按列名2排序。也就是说,只有多个行具有相同的列名1的值时,才继续按照列名2进行排序。如果列名1中所有的值都是唯一的,则不会继续按列名2排序。

    注意:

    • ORDER BY子句的位置。应保证它是SELECT语句中最后一条子句,否则会出错。

    2.2 按列位置排序

    除了能用列名指出排序顺序外,ORDER BY还支持按相对列位置进行排序。

    语句:

    SELECT 列名1,列名2,列名3
    FROM 表
    ORDER BY 2,3;
    

    提示:

    • 按列位置排序时,无法使用非检索列进行排序。
    • 若有必要,可以混合使用实际列名和相对列位置。

    2.3 指定排序方向

    利用DESC(降序)、ASC(升序、默认)

    • 单个列排序,语句:
    SELECT 列名1,列名2,列名3
    FROM 表
    ORDER BY 列名1 DESC;
    
    • 多个列排序,语句:
    SELECT 列名1,列名2,列名3
    FROM 表
    ORDER BY 列名1 DESC, 列名2;
    

    分析:

    • DESC关键字之应用到直接位于其前面的列名。
    • 若想在多个列上进行降序排序,必须对每一列指定DESC关键字。

    提示:

    • 区分大小写与排序顺序。在字典排序顺序中,A与a相同,大多数DBMS也默认这种顺序。

    参考资料:
    1.《SQL必知必会》Ben Forta。

  • 相关阅读:
    大数据概述
    递归下降语法分析
    消除左递归c语言文法
    自动转换机
    简单的C语言文法
    实验报告一 词法分析程序
    组合数据类型练习
    Python绘制五星红旗
    熟悉常用Linux操作
    大数据概述
  • 原文地址:https://www.cnblogs.com/siplifyit/p/12109212.html
Copyright © 2011-2022 走看看