• 零基础学SQL(七、数据的检索与排序)


     

    目录

     前置建表

    一、数据的检索

    1、SELECT WHERE子句

     2、表与列的别名

    3、比较运算符   等于、不等于、小于、大于、between and

    4、逻辑运算符  AND OR IN NOT

    ​编辑

    5、通配符 Like模糊查询

    6、正则表达式 REGEXP

    二、排序与限制结果

    1、数据排序 ORDER BY 

     2、返回结果限制


    前置建表

    1. CREATE TABLE student (
    2. id int NOT NULL AUTO_INCREMENT COMMENT '主键',
    3. code varchar(255) NOT NULL COMMENT '学号',
    4. name varchar(255) DEFAULT NULL COMMENT '姓名',
    5. sex enum('男','女') DEFAULT NULL COMMENT '性别',
    6. PRIMARY KEY (`id`)
    7. )

    一、数据的检索

    1、SELECT WHERE子句

            前边我们学会了使用SELECT关键字来查询简单的数据,使用where来筛选数据,实际上SELECT语句后边还能接很多查询子句以达到不同的效果,其中查询语句必不可少的就是SELECT关键字,以下语句后续基本都会讲到

     2、表与列的别名

            尽管mysql命令行工具为查询所返回的每个列提供了默认标签,但或许你希望使用自己定义的标签。如果表中的列名定义十分简短并且含义模糊,可以为该列赋予新标签。同样,如果在结果集中包含了根据表达式或内建函数调用产生的列,那么也可以为这些列定义一个标签。通过在select子句中的每个元素后面增加列别名可以实现此目的。表的别命名则可以有效的简化sql语句。 表和列的别命名只需要在后边加上别命名的名称就好,列别命名后边可以加as,当然as是可以省略掉的。

    3、比较运算符   等于、不等于、小于、大于、between and

    mysql支持以下比较运算符

     唯一需要介绍以下的可能就是 between操作符了,当需要同时限制范围的上限和下限时,可以选择使用between操作符联合and构建一个查询条件,而不需要两个单独的限制条件。如查询学号为202202至202204的学生,则可以这么写

            当使用between操作符时,需要注意下面的事项,即必须首先指定范围的下限(在between后面),然后指定范围的上限(在and的后面)。如果错误地指定了它们出现的次序,则会查不到结果,这是因为服务端实际上根据该条件产生了两个使用<=和>=操作符的条件。

    4、逻辑运算符  AND OR IN NOT

            AND 用在 WHERE 子句中的关键字,用来指示检索满足所有给定条件的行。既满足A也满足B,可以理解为数学运算或者其他语言的与(&&)

            上述例子中使用了只包含一个关键字AND 的语句,把两个过滤条件组合在一起。还可以添加多个过滤条件,每添加一条就要使用一个AND
            OR操作符与 AND 操作符不同,它指示 MySQL检索匹配任一条件的行,满足A或者满足B,可以理解为数学运算或者其他语言的或(||)

     

     当然 and 和or可以同时使用,如果同时使用则需要加上括号来明确意图

    IN操作符  WHERE子句中用来指定要匹配值的清单的关键字,功能与 OR 相当。

     NOT操作符  NOT则是取相反的数据 可以组合使用  not in()not null等,当然也可以与 and or一起使用 

    5、通配符 Like模糊查询

    sql中通常使用 like 进行模糊查询,结合% _实现。
    百分号(%)通配符 
    最常使用的通配符是百分号(%)。在搜索串中, % 表示 任何字符出现任意次数。
    1. -- 名字以"小"开头(小xxx)
    2. SELECT a.* from student a where a.name like '小%';
    3. -- 以"张"开头"飞"结尾(张xxx飞)
    4. SELECT a.* from student a where a.name like '张%飞';
    5. -- 以"三"结尾(xxx三)
    6. SELECT a.* from student a where a.name like '%三';
    7. -- 中间包含"三" 的数据(xxx三xxx)
    8. SELECT a.* from student a where a.name like '%三%';
    下划线(_)通配符
    另一个有用的通配符是下划线(_)。下划线的用途与 % 一样,但下划线只匹配单个字符而不是多个字符
             虽然通过这些通配符可以实现模糊查询,但这种功能是有代价的:通配符搜索的处理一般要比前面讨论的其他搜索所花时间更长。这里给出一 些使用通配符要记住的技巧。
    1、不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
    2、在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的。
    3、仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。
    输入

    6、正则表达式 REGEXP

    随着过滤条件的复杂性的增加, WHERE子句本身的复杂性也有必要增加。这也就是正则表达式变得有用的地方。正则表达式是用来匹配文本的特殊的串(字符集合)。如果你想从一个文本文件中提取电话号码,可以使用正则表达式。如果你需要查找名字中间有数字的所有文件,可以使用一个正则表达式。如果你想在一个文本块中找到所有重复的单词,可以使用一个正则表达式。如果你想替换一个页面中的所有URL 为这些URL的实际 HTML 链接,也可以使用一个正则表达式。
    1. -- 基本字符匹配
    2. SELECT * from student where name REGEXP '张';
    3. -- 进行OR匹配
    4. SELECT * from student where name REGEXP '张|小';
    5. -- 匹配几个字符之一
    6. SELECT * from student where name REGEXP '[张 小]三'; ['张'|'小']三
    7. -- 匹配范围
    8. SELECT * from student where code REGEXP '20220[1-4]';
    匹配字符类
    存在找出你自己经常使用的数字、所有字母字符或所有数字字母字符等的匹配。为更方便工作,可以使用预定义的字符集,称为字符类 (character class

    目前为止使用的所有正则表达式都试图匹配单次出现。如果存在一个匹配,该行被检索出来,如果不存在,检索不出任何行。但有时需要对匹配的数目进行更强的控制。例如,你可能需要寻找所有的数,不管数中包含多少数字,或者你可能想寻找一个单词并且还能够适应一个尾随的s (如果存在),等等。

     如 查询学号为8位的学生信息 

      SELECT  * from student   where code REGEXP '[:digit:]{8}';  
     

    二、排序与限制结果

    1、数据排序 ORDER BY 

    为了明确地排序用 SELECT 语句检索出的数据,可使用 ORDER BY 子句。 ORDER BY子句取一个或多个列的名字,据此对输出进行排序。
            在排序时,可以通过关键字asc和 desc指定是升序还是降序。由于默认情况下是升序排序,因此只需要在想要降序排序时加上 desc关键字即可。
    1. -- 根据 code 倒序
    2. SELECT * from student a ORDER BY a.code desc ;

    1. -- 根据 code倒序,再根据name正序
    2. SELECT * from student a ORDER BY a.code desc , a.name ;
    3. -- 根据 code倒序,再根据name正序
    4. SELECT a.code,a.name from student a ORDER BY 1 desc , 2 ;

     2、返回结果限制

    LIMIT 

            SELECT语句返回所有匹配的行,它们可能是指定表中的每个行。为了返回第一行或前几行,可使用LIMIT子句。带一个值的LIMIT总是从第一行开始,给出的数为返回的行数。带两个值的LIMIT可以指定从行号为第一个值的位置开始

    1. -- 根据 code 倒序,取前三条数据
    2. SELECT * from student a ORDER BY a.code desc LIMIT 3 ;
    3. -- 根据 code 倒序,取前三条数据,从第二条开始取两条数据
    4. SELECT * from student a ORDER BY a.code desc LIMIT 1,2;
            检索出来的第一行为行0 而不是行 1 。因此, LIMIT 1, 1 将检索出第二行而不是第一行。
            在行数不够时 LIMIT 中指定要检索的行数为检索的最大行数。如果没有足够的行(例如,给出LIMIT 10, 5 ,但只有 13行),MySQL 将只返回它能返回的那么多行。
            MySQL 5的 LIMIT 语法 LIMIT 3, 4 的含义是从行 4 开始的 3行还是从行3 开始的 4 行?如前所述,它的意思是从行 3 开始的 4行,这容易把人搞糊涂。 由于这个原因,MySQL 5 支持 LIMIT 的另一种替代语法。 LIMIT 4 OFFSET 3 意为从行 3 开始取 4 行,就像 LIMIT 3, 4 一样。
    DISTINCT
    顾名思义,此关键字指示 MySQL只返回不同的值。不能部分使用DISTINCT DISTINCT关键字应用于所有列而不仅是前置它的列。如果给出SELECT DISTINCT field-name-1, field-name-2,除非指定的两个列都不同,否则所有行都将被检索出来。
  • 相关阅读:
    UDP传输rtp数据包丢帧
    JDBC快速入门
    Linux中安装vnStat和vnStati监视网络流量
    Vue rules校验规则详解
    接口测试|超详细面试题【附答案】
    lamp环境搭建(三台主机各司其职)
    IO流的原理以及分类
    【RocketMQ 二十三】RocketMQ应用之消息过滤
    css overflow-x: scroll 滚动不展示/隐藏滚动条 /如何滚动
    (Matlab实现)蚂蚁狮子优化算法在电力系统中的应用
  • 原文地址:https://blog.csdn.net/jungeCSND/article/details/127276321