【跟着例子学MySQL】窥探数据本质 -- Select语句基础

文章目录

  • 前言
  • 上期回顾
  • 探索数据的窗口 -- Select语句
    • Select基础用法
    • 无表Select语句
  • 计算的基石 -- 运算符
    • 比较运算符
    • 字符串模式匹配
    • 算术运算符
  • 条件的灵魂 -- 逻辑运算
    • 逻辑运算符
    • IN, NOT IN
    • BETWEEN, NOT BETWEEN
    • IS NULL, IS NOT NULL
  • 排列有序 -- ORDER BY子句
  • 节流阀 -- LIMIT 子句
  • 换个好听的名字 - AS关键字
  • 团结就是力量 -- CONCAT()函数
  • 未完待续


前言

在这里插入图片描述
举例子,是最简单有效的学习方法。本系列文章以一个贯穿始终的场景,结合多个实例讲解MySQL的基本用法。

为什么要写这个系列?

  • 模仿是最好的老师,实践是检验成果的方法。
  • 本系列以实操样例和应用场景为核心,将MySQL基本用法贯穿其中,达到学以致用的效果。

为什么要学习MySQL?

  • MySQL是最常用的数据库之一,具有简单易用的特点,适合初学者学习
  • 数据库的基本用法有相通之处,学会MySQL可以为学习其他数据库打下良好基础

跟别的入门教材有什么不同?

  • 以一个贯穿始终的应用场景为主线,渐进地讲解用法
  • 难度适中,既有基础方法,也有值得注意的关键细节

本系列文章不包含哪些内容?

该系列文章的目标是,将最核心的知识,以最直接的方式,呈现给初学者。因此不包含:

  • MySQL安装方法
  • MySQL系统管理方法,例如备份、恢复、导入导出等
  • 高级主题,例如数据库监控、数据库调优和SQL优化

上期回顾

上篇文章👉《【跟着例子学MySQL】构建新世界 – 创建样例库》中介绍了如何创建数据库并插入数据。

今天接着讲如何查询这些数据。


探索数据的窗口 – Select语句

Select基础用法

使用SELECT语句查询数据库中的数据是最常见、最重要,也是最复杂的任务。SELECT的语法如下:

-- 列出指定列中的所有行
SELECT column1Name, column2Name, ... FROM tableName

-- 列出所有列中的所有行,*是通配符,代表所有列
SELECT * FROM tableName

-- 在WHERE子句中过滤出满足指定条件的行
SELECT column1Name, column2Name,... FROM tableName WHERE criteria
SELECT * FROM tableName WHERE criteria

例如:

-- 列出name和price列的所有行
mysql> SELECT name, price FROM products;

+-----------+-------+
| name      | price |
+-----------+-------+
| Pen Red   | 1.23  |
| Pen Blue  | 1.25  |
| Pen Black | 1.25  |
| Pencil 2B | 0.48  |
| Pencil 2H | 0.49  |
+-----------+-------+
5 rows in set (0.00 sec)

-- 列出所有列的所有行
mysql> SELECT * FROM products;
+-----------+-------------+-----------+----------+-------+
| productID | productCode | name      | quantity | price |
+-----------+-------------+-----------+----------+-------+
| 1001      | PEN         | Pen Red   | 5000     | 1.23  |
| 1002      | PEN         | Pen Blue  | 8000     | 1.25  |
| 1003      | PEN         | Pen Black | 2000     | 1.25  |
| 1004      | PEC         | Pencil 2B | 10000    | 0.48  |
| 1005      | PEC         | Pencil 2H | 8000     | 0.49  |
+-----------+-------------+-----------+----------+-------+
5 rows in set (0.00 sec)

无表Select语句

SELECT语句中不一定非要包含表,你也可以执行不带表的SELECT语句。例如,计算一个表达式或执行一个内置函数。

mysql> SELECT 1+1;
+-----+
| 1+1 |
+-----+
| 2 |
+-----+
1 row in set (0.00 sec)

mysql> SELECT NOW();
+---------------------+
| NOW() |
+---------------------+
| 2012-10-24 22:13:29 |
+---------------------+
1 row in set (0.00 sec)

// 返回多个列
mysql> SELECT 1+1, NOW();
+-----+---------------------+
| 1+1 | NOW()               |
+-----+---------------------+
| 2   | 2012-10-24 22:16:34 |
+-----+---------------------+
1 row in set (0.00 sec)

计算的基石 – 运算符

比较运算符

对于数值类型(INT、DECIMAL、FLOAT),可以使用比较运算符:“=”、“<>”或“!=”(不等于)、“>”、“<”、“>=”、“<=”来比较两个数字。例如,price > 1.0,quantity <= 500。

mysql> SELECT name, price FROM products WHERE price < 1.0;
+-----------+-------+
| name      | price |
+-----------+-------+
| Pencil 2B | 0.48  |
| Pencil 2H | 0.49  |
+-----------+-------+
2 rows in set (0.00 sec)

mysql> SELECT name, quantity FROM products WHERE quantity <= 2000;
+-----------+----------+
| name      | quantity |
+-----------+----------+
| Pen Black | 2000     |
+-----------+----------+
1 row in set (0.00 sec)

❗ 注意:FLOAT 不能通过 “=” 做等值判断,因为 FLOAT 并不精确。

对于字符串,你还可以使用“=”、“<>”、“>”、“<”、“>=”、“<=”来比较两个字符串,字符串的顺序取决于所选的排序规则。例如:

mysql> SELECT name, price FROM products WHERE productCode = 'PEN';
-- String values are quoted
+-----------+-------+
| name      | price |
+-----------+-------+
| Pen Red   | 1.23  |
| Pen Blue  | 1.25  |
| Pen Black | 1.25  |
+-----------+-------+
3 rows in set (0.00 sec)

字符串模式匹配

对于字符串,除了使用“=‘和“<>’”等操作符进行完全匹配之外,我们还可以使用LIKENOT LIKE操作符执行模式匹配。

通配符“_”匹配任何单个字符,“%”匹配任意数量的字符(包括零)。例如:

  • “abc%”匹配以“abc”开头的字符串;
  • “%xyz”匹配以“xyz”结尾的字符串;
  • “%aaa%”匹配包含“aaa”的字符串;
  • ‘___’匹配恰好包含三个字符的字符串;
  • ‘a_b%‘匹配以“a”开头的字符串,后面跟着任何单个字符,再后面跟着“b”,最后跟着0个或多个字符。
-- name列以PENCIL开头
mysql> SELECT name, price FROM products WHERE name LIKE 'PENCIL%';
+-----------+-------+
| name      | price |
+-----------+-------+
| Pencil 2B | 0.48  |
| Pencil 2H | 0.49  |
+-----------+-------+

-- name列以P开头, 后面跟着任意两个字符,再后边是空格, 再后是0或多个字符
mysql> SELECT name, price FROM products WHERE name LIKE 'P__ %';
+-----------+-------+
| name      | price |
+-----------+-------+
| Pen Red   | 1.23  |
| Pen Blue  | 1.25  |
| Pen Black | 1.25  |
+-----------+-------+

❗ 注意:MySQL还支持通过"REGEXE"操作符进行正则表达式匹配。

算术运算符

你可以使用算术运算符对数值列执行算术运算,包括: +(加),-(减), *(乘), /(除)和 %(模)。

条件的灵魂 – 逻辑运算

逻辑运算符

你可以使用布尔运算符ANDOR来组合多个条件,也可以使用运算符NOT反转条件。例如:

mysql> SELECT * FROM products WHERE quantity >= 5000 AND name LIKE 'Pen %';
+-----------+-------------+----------+----------+-------+
| productID | productCode | name     | quantity | price |
+-----------+-------------+----------+----------+-------+
| 1001      | PEN         | Pen Red  | 5000     | 1.23  |
| 1002      | PEN         | Pen Blue | 8000     | 1.25  |
+-----------+-------------+----------+----------+-------+

mysql> SELECT * FROM products WHERE quantity >= 5000 AND price < 1.24 AND name LIKE 'Pen %';
+-----------+-------------+---------+----------+-------+
| productID | productCode | name    | quantity | price |
+-----------+-------------+---------+----------+-------+
| 1001      | PEN         | Pen Red | 5000     | 1.23  |
+-----------+-------------+---------+----------+-------+

mysql> SELECT * FROM products WHERE NOT (quantity >= 5000 AND name LIKE 'Pen %');
+-----------+-------------+-----------+----------+-------+
| productID | productCode | name      | quantity | price |
+-----------+-------------+-----------+----------+-------+
| 1003      | PEN         | Pen Black | 2000     | 1.25  |
| 1004      | PEC         | Pencil 2B | 10000    | 0.48  |
| 1005      | PEC         | Pencil 2H | 8000     | 0.49  |
+-----------+-------------+-----------+----------+-------+

IN, NOT IN

你可以使用INNOT IN运算符从集合的成员中进行选择。这比等效的“AND-OR”表达式更容易也更清晰。

mysql> SELECT * FROM products WHERE name IN ('Pen Red', 'Pen Black');
+-----------+-------------+-----------+----------+-------+
| productID | productCode | name      | quantity | price |
+-----------+-------------+-----------+----------+-------+
| 1001      | PEN         | Pen Red   | 5000     | 1.23  |
| 1003      | PEN         | Pen Black | 2000     | 1.25  |
+-----------+-------------+-----------+----------+-------+

BETWEEN, NOT BETWEEN

要检查该值是否在一个范围内,你可以使用BETWEEN ... AND ...运算符。同样,这比等效的"AND-OR"表达更容易也更清晰。

mysql> SELECT * FROM products
       WHERE (price BETWEEN 1.0 AND 2.0) AND (quantity BETWEEN 1000 AND 2000);
+-----------+-------------+-----------+----------+-------+
| productID | productCode | name      | quantity | price |
+-----------+-------------+-----------+----------+-------+
| 1003      | PEN         | Pen Black | 2000     | 1.25  |
+-----------+-------------+-----------+----------+-------+

IS NULL, IS NOT NULL

NULL是一个特殊值,表示“无值”、“缺失值”或“未知值”。你可以通过IS NULLIS NOT NULL检查列是否包含NULL。例如:

mysql> SELECT * FROM products WHERE productCode IS NULL;
Empty set (0.00 sec)

一个非常常见的错误是:使用比较运算符(=或<>)来检查NULL 。例如:

 SELECT * FROM products WHERE productCode = NULL;
-- 这是一个常见的错误。NULL不能比较。

排列有序 – ORDER BY子句

你可以使用ORDER BY子句对已筛选的行进行排序,语法如下:

SELECT ... FROM tableName
WHERE criteria
ORDER BY columnA ASC|DESC, columnB ASC|DESC, ...

已筛选的行将根据 columnA 中的值进行排序,可按升序(ASC,默认)或降序(DESC)排序。如果 columnA 中的几行具有相同的值,则它将按 columnB 进行排序,以此类推。例如:

-- 按price降序排序
mysql> SELECT * FROM products WHERE name LIKE 'Pen %' ORDER BY price DESC;
+-----------+-------------+-----------+----------+-------+
| productID | productCode | name      | quantity | price |
+-----------+-------------+-----------+----------+-------+
| 1002      | PEN         | Pen Blue  | 8000     | 1.25  |
| 1003      | PEN         | Pen Black | 2000     | 1.25  |
| 1001      | PEN         | Pen Red   | 5000     | 1.23  |
+-----------+-------------+-----------+----------+-------+

-- 按price降序排序,然后按quantity升序(默认)排序
mysql> SELECT * FROM products WHERE name LIKE 'Pen %' ORDER BY price DESC, quantity;
+-----------+-------------+-----------+----------+-------+
| productID | productCode | name      | quantity | price |
+-----------+-------------+-----------+----------+-------+
| 1003      | PEN         | Pen Black | 2000     | 1.25  |
| 1002      | PEN         | Pen Blue  | 8000     | 1.25  |
| 1001      | PEN         | Pen Red   | 5000     | 1.23  |
+-----------+-------------+-----------+----------+-------+

你也可以通过RAND()函数返回乱序结果,例如:

mysql> SELECT * FROM products ORDER BY RAND();

节流阀 – LIMIT 子句

对大型数据库的SELECT查询可能会产生大量结果。你可以使用LIMIT子句来限制显示的行数,例如:

-- 显示price最便宜的两行
mysql> SELECT * FROM products ORDER BY price LIMIT 2;
+-----------+-------------+-----------+----------+-------+
| productID | productCode | name      | quantity | price |
+-----------+-------------+-----------+----------+-------+
| 1004      | PEC         | Pencil 2B | 10000    | 0.48  |
| 1005      | PEC         | Pencil 2H | 8000     | 0.49  |
+-----------+-------------+-----------+----------+-------+

要继续查看后续记录,可以在LIMIT子句中指定要跳过的行数和要继续显示的行数,如下所示:

-- 跳过前两行,继续显示第三行
mysql> SELECT * FROM products ORDER BY price LIMIT 2, 1;
+-----------+-------------+---------+----------+-------+
| productID | productCode | name    | quantity | price |
+-----------+-------------+---------+----------+-------+
| 1001      | PEN         | Pen Red | 5000     | 1.23  |
+-----------+-------------+---------+----------+-------+

换个好听的名字 - AS关键字

你可以使用关键字AS为标识符(如列名和表名)定义别名,它可以被引用,并显示在最终结果中。例如:

mysql> SELECT productID AS ID, productCode AS Code,
              name AS Description, price AS `Unit Price` 
       FROM products
       ORDER BY ID; --使用别名ID作为引用
+------+------+-------------+------------+
| ID   | Code | Description | Unit Price |
+------+------+-------------+------------+
| 1001 | PEN  | Pen Red     | 1.23       |
| 1002 | PEN  | Pen Blue    | 1.25       |
| 1003 | PEN  | Pen Black   | 1.25       |
| 1004 | PEC  | Pencil 2B   | 0.48       |
| 1005 | PEC  | Pencil 2H   | 0.49       |
+------+------+-------------+------------+

❗ 注意:标识符“Unit Price”包含空格,必须用反引号包围。

团结就是力量 – CONCAT()函数

你还可以使用函数CONCAT()将几列连接为一列。例如:

mysql> SELECT CONCAT(productCode, ' - ', name) AS `Product Description`,   price FROM products;
+---------------------+-------+
| Product Description | price |
+---------------------+-------+
| PEN - Pen Red       | 1.23  |
| PEN - Pen Blue      | 1.25  |
| PEN - Pen Black     | 1.25  |
| PEC - Pencil 2B     | 0.48  |
| PEC - Pencil 2H     | 0.49  |
+---------------------+-------+

未完待续

这篇我们讲了SELECT语句的基本用法,下一篇我们继续讲如何利用SELECT语句生成报表。


如果喜欢这篇文章,请不要忘记关注🧡、点赞👍和收藏📔哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/620512.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字水印 | Python 基于离散小波变换 DWT 的图像水印嵌入(上)

&#x1f34d;原文&#xff1a; 基于 dwt (离散小波变换) 实现彩色图像水印嵌入部分_1.0 &#x1f34d;写在前面&#xff1a; 本文在原文的基础上进行了代码补全。 正文 本文的内容主要为&#xff1a;水印图像经过 A r n o l d \mathsf{Arnold} Arnold 置乱算法后&#xff0…

参加了深圳线下组织的商业沙龙,收获颇丰

能参加本次商业沙龙也本是一连串的事情导致的&#xff0c;听我慢慢道来&#xff1a; 大概在4.13之前无意收到忘了谁发的短信了&#xff0c;说有个啥AI的报告会&#xff0c;然后我就报名了&#xff1a; 会上大佬还是挺多的&#xff0c;来了好多各界的老板和政府的领导&#xff…

配置 IDEA 识别自定义规则的 Dockerfile 文件

目录 配置所在位置解决方案其他 配置所在位置 打开 IntelliJ IDEA&#xff0c;然后转到顶部菜单中的 “File” > “Settings”&#xff08;Windows/Linux&#xff09;或 “IntelliJ IDEA” > “Preferences”&#xff08;macOS&#xff09;。 在弹出的设置窗口中&#x…

10分钟了解Flink SQL使用

Flink 是一个流处理和批处理统一的大数据框架&#xff0c;专门为高吞吐量和低延迟而设计。开发者可以使用SQL进行流批统一处理&#xff0c;大大简化了数据处理的复杂性。本文将介绍Flink SQL的基本原理、使用方法、流批统一&#xff0c;并通过几个例子进行实践。 1、Flink SQL基…

AI论文写作生成器-AI自动生成论文-10分钟/万字论文

在当今这个高速发展的信息时代&#xff0c;科技的进步无疑给我们的工作、学习乃至生活带来了翻天覆地的变化。学术研究领域也不例外&#xff0c;近期一款新型的论文自动写作神器诞生了&#xff0c;它凭借人工智能技术的优势&#xff0c;为学者和研究人员撰写学术论文提供了极大…

c++opencv Project3 - License Plate Detector

俄罗斯车牌识别案例&#xff1a;实时识别车牌&#xff0c;并且读取到指定文件夹中。 惯例先展示结果图&#xff1a; 对于摄像头读取图片进行车牌匹配&#xff0c;原理和人脸识别其实是一致的。 利用训练好的模型进行匹配即可。可参考&#xff1a; 对视频实现人脸识别-CSDN博…

综合模型及应用(图论学习总结部分内容)

文章目录 前言六、综合模型及应用(以题目总结为主)分层图思想(包括拆点建图) e g 1 : 通信线路 eg1:通信线路 eg1:通信线路​​​[A-Telephone Lines](https://ac.nowcoder.com/acm/contest/1055/A)(蓝书例题) e g 2 : 小雨坐地铁 eg2:小雨坐地铁 eg2:小雨坐地铁​ [1012-小雨坐…

六甲基二硅烷用途广泛 可以工业副产物为原料进行生产

六甲基二硅烷用途广泛 可以工业副产物为原料进行生产 六甲基二硅烷&#xff0c;化学式为C6H18Si2&#xff0c;外观为无色透明液体状&#xff0c;不溶于水&#xff0c;可溶于乙醚、乙二醇、丙酮、苯、二甲苯、二甲醚等多种有机溶剂&#xff0c;有刺激性&#xff0c;有高度易燃性…

Agilent MSO9404A、Keysight MSO9404A示波器,4 GHz,4 通道,20 GSa/s

Agilent MSO9404A、Keysight MSO9404A、HP MSO9404A 示波器&#xff0c;4 GHz&#xff0c;4 通道&#xff0c;20 GSa/s Keysight MSO9404A 示波器配备 15 英寸 XGA 显示屏&#xff0c;封装深度仅为 9 英寸&#xff08;23 厘米&#xff09;&#xff0c;重量仅为 26 磅&#xff…

传统鞋业如何转型?3D数字化技术让鞋业品牌焕发新机!

数字经济时代&#xff0c;3D数字化技术在各行业都得到广泛应用&#xff0c;这其中&#xff0c;传统的鞋服行业的发展也受到了3D数字化技术的影响&#xff0c;产生了深刻的变化&#xff0c;越来越多的鞋企品牌开始尝试3D数字化营销。 比如&#xff0c;时尚运动品牌VANS就在官网上…

【Obsidian】视频笔记插件Media Extended的强大功能

我将开设一个专栏&#xff0c;介绍当下最好用的笔记软件Obsidian的使用经验和技巧。欢迎持续关注。 摘要&#xff1a;本文将首先向您介绍一款功能强大的笔记软件Obsidian&#xff0c;然后为您详细解析Obsidian的一款实用插件——Media Extended&#xff0c;帮助您更好地利用Obs…

【2024年5月备考新增】】 考前篇(1)《官方平台 - 考生模拟练习平台操作指南》

1 登录 登录中国计算机技术职业资格网(https://www.ruankao.org.cn),点击服务园地的【模拟练习】。 温馨提示:实名认证通过且注册成功的考生方可登录模拟练习。 2 下载模拟作答系统 温馨提示: 点击“下载”按钮,下载对应的模拟作答系统。未报名成功的考生不允许下载…

JPA@Entry报错Could not determine recommended JdbcType for Java type

问题很明显&#xff0c;无法自动决定类型&#xff0c;那就手动告诉该字段。 一、直接上解决方案 如果是一对一的关系用 OneToOne 如果是一对多的关系用 OneToMany 如果是多对一的关系用 ManyToOne 二、另一个无空构造函数的问题 使用注解后&#xff0c;注解报错找不到空的…

mac定时任务、自启动任务

https://quail.ink/mynotes/p/mac-startup-configuration-detailed-explanation <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.d…

Visual Studio 中.net8.0(以前叫NET Core)框架和.net framewok 框架有什么区别?

更新vs到2022版本后&#xff0c;新建项目时就多出不少选项&#xff0c;这里来给大家分享下.net8.0&#xff08;以前叫NET Core&#xff09;框架和.net framewok的区别 如下图&#xff0c;不带后缀的就是使用.net8.0。 .net framewok框架选项&#xff1a; 正文开始&#xff1a;…

Ci24R1 (SOP8)2.4GHz无线收发一体、双向系统的智能家居芯片

Ci24R1 &#xff08;SOP8&#xff09;工作范围在2.4GHzISM频段&#xff0c;专为低系统应用成本的无线场合设计&#xff0c;集成嵌入式ARQ基带协议引擎的无线收发器芯片。它的工作频率范围为2400MHz-2525MHz&#xff0c;共有126个1MHz带宽的信道。 Ci24R1 &#xff08;SOP8&…

ThreadLocal 源码详解

概述 ThreadLocal是一个java提供的本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射&#xff0c;各个线程之间的变量互不干扰&#xff0c;在高并发场景下&#xff0c;可以实现无状态的调用&#xff0c;特别适用于各个线程依赖不通的变量值完成操作…

外卖点餐小程序平台源码系统 自由切换 轻松管理 附带源码代码包以及系统搭建教程

系统概述 外卖点餐小程序平台源码系统是一款集点餐、支付、配送、评价等功能于一体的综合性平台。该系统采用先进的互联网技术&#xff0c;支持多种支付方式&#xff0c;包括微信支付、支付宝等&#xff0c;同时支持多平台使用&#xff0c;包括微信小程序、支付宝小程序等。商…

游戏找不到steam_api64.dll如何解决,介绍5种简单有效的方法

面对“找不到steam_api64.dll&#xff0c;无法继续执行代码”的问题&#xff0c;许多游戏玩家或软件使用者可能会感到手足无措。这个错误提示意味着你的计算机系统在尝试运行某个游戏或应用程序时&#xff0c;无法定位到一个至关重要的动态链接库文件——steam_api64.dll&#…

大模型与AIGC应用相关问题 模型大型

最近经常被问&#xff0c;你看“万亿的模型都出来了&#xff0c;你们训练的千亿模型是不是落伍了&#xff1f;”我想说&#xff1a;“虽然都叫超大模型&#xff0c;但是类型是不一样的&#xff0c;虽说每一类模型训出来都不容易&#xff0c;不过澄清一下概念还是必要的”。 大…