zoukankan      html  css  js  c++  java
  • 史上最简单MySQL教程详解(基础篇)之SQL语句(二)

    查询语句——SELECT

    查询语句将是我们在使用数据库的时候使用得最多,最灵活,也是最能体现能力的语句。接下来,我们将介绍几种比较常用的【SELECT】语句的查询方式。其的基础语法为:

    SELECT 列名1,列名2,列名3,...From 表名 WHERE 条件表达式

    例如:我们想查出【user】表中名字为【张三】的人

    mysql> SELECT * FROM user WHERE name =”张三” ;
    +——–+——+——+
    | userId | name | sex |
    +——–+——+——+
    | 1 | 张三 | 0 |
    +——–+——+——+
    1 row in set (0.00 sec)

    注意事项:

    • 推荐使用指定列名的查询方式:
      因为我们测试表中只有三个字段,对于数据库的查询影响不是很大。但是在实际的生产开发环境中,使用【*】来获取所有列的数据的话,那些不需要使用的列将会造成很大的内存浪费,从而进一步的影响SQL语句的执行速度。除了想确认表中所有数据的场合,是不建议使用 【*】的。
    • 对于【WHERE】后面的【=】的理解我在之前的文章中也已经进行了解释,这里再重申一遍,我们应将那个符号理解为【比较运算符】,而不是所谓的【赋值】符号,常用的【比较运算符】有很多,我们将在史上最简单MySQL教程详解(基础篇)之运算符和常用数据库函数(一)中列举出常用的运算符。

    模糊查询(LIKE)

    模糊查询就是以列中数据是否含有指定的字符串为条件的检索。
    例如:我们查询表中【name】包含【张】字为例子

    mysql> SELECT * FROM user WHERE name LIKE “%张%”;
    +——–+——–+——+
    | userId | name | sex |
    +——–+——–+——+
    | 1 | 张三 | 0 |
    | 5 | 小张 | 1 |
    | 6 | 张三丰 | 0 |
    +——–+——–+——+
    3 rows in set (0.00 sec)

    注意事项:

    • 其中【%】叫做通配符。如果是【张%】表示以【张】开头的所有数据,【%张】表示的是以张结尾的所有数据。【%张%】则表示数据中所有含有张字的数据。

    常用的通配符:

    通配符 说明 条件表达式举例
    % 表示零个,一个或多个字符 name LIKE “%a%”
    _ 表示单个字符 name LIKE “李_” (【李某】是符合条件的,但【李某某】就不符合了)
    [] 定义要匹配的字符集和范围 name LIKE ‘[bsp]%’
    [^]或[!] 定义不匹配字符的集合和范围 name LIKE ‘[!bsp]%’ (不以“b”,“s”或“p”开头的所有数据)

    NULL条件

    当我们想要检索某个为空的字段的时候,是不能使用【=】比较运算符的,而是使用【IS】
    例如:我们想要查出【user】表中【name】为【NULL】的字段

    mysql> SELECT * FROM user WHERE name Is null;
    +——–+——+——+
    | userId | name | sex |
    +——–+——+——+
    | 7 | NULL | 0 |
    +——–+——+——+
    1 row in set (0.00 sec)
    mysql> SELECT * FROM user WHERE name = null;
    Empty set (0.00 sec)

    我们可以看出,当我们使用【IS】的时候成功查出数据,但是当我们使用【=】的时候并没与查出数据;

    多个条件表达式的组合(NOT,AND,OR)

    当我们想要符合多个条件的数据时,就需要使用【AND】,【OR】,【NOT】三个运算符号。当然,它们三者之间自然也存在优先级的关系。优先级为:NOT->AND->OR.
    例如:
    我们将查询【user】表中【name】为【李四】,【sex】为【1】的数据。

    mysql> SELECT * FROM user WHERE name =”李四” and sex =1;
    +——–+——+——+
    | userId | name | sex |
    +——–+——+——+
    | 2 | 李四 | 1 |
    +——–+——+——+
    1 row in set (0.00 sec)

    我们就查到了我们预想的数据。

    查询结果排序(ORDER BY)

    我们使用【ORDER BY】语句进行数据的排序。排序总共有【DESC】(降序)和【ASC】(升序)两种。语法如下:

    ORDER BY 字段1,字段2...DESC/ASC

    例如,我们将查询到的数据进行降序:

    mysql> SELECT * FROM user ORDER BY userId DESC;
    +——–+——–+——+
    | userId | name | sex |
    +——–+——–+——+
    | 7 | NULL | 0 |
    | 6 | 张三丰 | 1 |
    | 5 | 小张 | 1 |
    | 4 | 王五 | 0 |
    | 3 | 李四 | 0 |
    | 2 | 李四 | 1 |
    | 1 | 张三 | 0 |
    +——–+——–+——+
    7 rows in set (0.00 sec)

    可以看出,我们这次查出的数据就根据【userId】的大小进行了降序排列;

    注意事项:

    • 当我们需要以多个字段进行排序时,将按照上面的排序表达式的优先顺序进行排序;
    • 如果省略了排序方式。那么默认为【ASC】;

    获取指定数量的数据(LIMIT )

    我们使用【limit】语句来实现获取指定数量的数据。语法如下:

    LIMIT N,M;

    例如,我们对数据排序以后,取出前三条数据:

    mysql> SELECT * FROM user ORDER BY userId DESC LIMIT 2,3;
    +——–+——+——+
    | userId | name | sex |
    +——–+——+——+
    | 5 | 小张 | 1 |
    | 4 | 王五 | 0 |
    | 3 | 李四 | 0 |
    +——–+——+——+
    3 rows in set (0.00 sec)

    【LIMIT N,M】的含义是:从第N条数据开始,取M条数据;那么我们上面运行的含义是:将表中的数据降序排列以后,获取从第二条数据以后的三条数据;

    注意事项:

    • 原则上,【LIMIT】语句是要和【ORDER BY】语句一起使用的,如果没有明确的排序方式,数据会按照随机的顺序取出,可能会得到不同的结果;

    数据分组(GROUP BY)

    当我们想要对查询出来的数据按照某个字段进行分组时,我们就需要使用到【GROUP BY】语句。语法如下:

    GROUP BY 字段名

    例如,我们将查询出来的结果按照【sex】进行分组:

    mysql> SELECT count(userId),sex FROM user GROUP BY sex;
    +—————+——+
    | count(userId) | sex |
    +—————+——+
    | 4 | 0 |
    | 3 | 1 |
    +—————+——+
    2 rows in set (0.00 sec)

    这样我们就将每个性别的人数统计了出来(这里使用了MySQL的【COUNT】函数,后面我们会进行介绍);

    注意事项:

    • 在具有多个分组字段时,和【ORDER BY】语句一样,将根据你编写的SQL语句中的先后顺序进行优先级分组;

    列的别名(AS)

    有时候,我们需要对查询出来的列重新进行命名,这个时候就用到了【AS】命令。
    例如,我们将上面查询到的【sex】数量重新命名为【NUM】:

    mysql> SELECT count(userId) AS NUM ,sex FROM user GROUP BY sex;
    +—–+——+
    | NUM | sex |
    +—–+——+
    | 4 | 0 |
    | 3 | 1 |
    +—–+——+
    2 rows in set (0.00 sec)

    这里,我们就讲完了【SELECT】语句的一些基本查询情况,如果想要学习关于数据的插入/更新/删除的小伙伴可以查看另一篇博文史上最简单MySQL教程详解(基础篇)之SQL语句(一);接下来,我们讲解MySQL的运算符和常用数据库函数(一),为我们的多表查询打下基础。

  • 相关阅读:
    编写高质量代码改善C#程序的157个建议——建议34:为泛型参数设定约束
    编写高质量代码改善C#程序的157个建议——建议33:避免在泛型类型中声明静态成员
    编写高质量代码改善C#程序的157个建议——建议32:总是优先考虑泛型
    编写高质量代码改善C#程序的157个建议——建议31:在LINQ查询中避免不必要的迭代
    编写高质量代码改善C#程序的157个建议——建议30:使用LINQ取代集合中的比较器和迭代器
    编写高质量代码改善C#程序的157个建议——建议29:区别LINQ查询中的IEnumerable<T>和IQueryable<T>
    编写高质量代码改善C#程序的157个建议——建议28:理解延迟求值和主动求值之间的区别
    编写高质量代码改善C#程序的157个建议——建议27:在查询中使用Lambda表达式
    编写高质量代码改善C#程序的157个建议——建议26:使用匿名类型存储LINQ查询结果
    编写高质量代码改善C#程序的157个建议——建议25:谨慎集合属性的可写操作
  • 原文地址:https://www.cnblogs.com/newtol/p/10159108.html
Copyright © 2011-2022 走看看