MySQL中Select查询语句的高级用法分享
作者:蜀山剑客李沐白 发布时间:2024-01-18 11:33:33
MySQL是一个开源的关系型数据库管理系统,支持多种操作语言,其中最基础、最常用的命令之一就是SELECT语句。在本篇文章中,这里将详细介绍MySQL SELECT语句的各个方面,从最基本的查询语句,到更高级的技巧和功能。
一、基本语法
SELECT语句用于从表格中检索数据。其基本语法如下:
SELECT column1, column2, ..., columnN
FROM table_name;
在这个语法中,column1, column2, ..., columnN代表要检索的列名,可以是一个或多个(使用逗号分隔)。FROM后面跟着的是要检索的表格名称。
例如,假设我们有一个名为"customers"的表格,其中包含"id", "name"和"email"三列数据,我们想检索所有客户的id和name,那么我们可以使用以下语句:
SELECT id, name
FROM customers;
这将返回一个结果集,其中包含所有客户的id和name。
二、条件查询
除了检索整个表格外,SELECT语句还可以根据特定条件过滤数据,只返回满足条件的行。条件查询可以通过加入WHERE子句来实现。WHERE子句后面跟着的是一个或多个条件,用于指定需要检索的行。例如,我们可以使用以下语句来检索所有名字为“John”的客户:
SELECT id, name
FROM customers
WHERE name = 'John';
该语句将返回一个结果集,其中包含所有名字为“John”的客户的id和name。
除了"="运算符外,WHERE子句还支持以下比较运算符:
运算符 | 描述 |
---|---|
= | 等于 |
<> | 不等于 |
大于 | |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
在WHERE子句中,我们也可以使用AND、OR和NOT这些逻辑运算符来组合多个条件。例如,我们可以使用以下语句来检索所有名字为“John”且邮箱以“gmail.com”结尾的客户:
SELECT id, name, email
FROM customers
WHERE name = 'John' AND email LIKE '%@gmail.com';
该语句将返回一个结果集,其中包含所有满足以上两个条件的客户的id、name和email。
三、通配符查询
使用通配符可以帮助我们更灵活地进行数据检索。通配符可以匹配任意字符或一组字符。在MySQL中,我们可以使用如下两种通配符:
%:代表零个或多个字符
_:代表单个字符
例如,我们可以使用以下语句来检索所有名字以“J”开头的客户:
SELECT id, name
FROM customers
WHERE name LIKE 'J%';
该语句将返回一个结果集,其中包含所有名字以“J”开头的客户的id和name。
我们还可以在LIKE子句中使用_通配符。例如,以下语句将检索所有名字为“John”的客户:
SELECT id, name
FROM customers
WHERE name LIKE 'John';
但是,如果我们想检索所有名字为3个字符、首字母为“J”且第三个字母为“n”的客户,我们可以使用以下语句:
SELECT id, name
FROM customers
WHERE name LIKE 'J_n';
该语句将返回一个结果集,其中包含所有满足以上条件的客户的id和name。
四、排序查询
在MySQL中,我们可以通过在SELECT语句中添加ORDER BY子句来对结果集进行排序。ORDER BY子句后面跟着要排序的列名,以及排序方式(ASC表示升序排列,DESC表示降序排列)。例如,以下语句将检索所有客户的id和name,并按照name升序排列:
SELECT id, name
FROM customers
ORDER BY name ASC;
我们也可以同时按照多个列进行排序,只需要在ORDER BY子句中添加多个列名即可。例如,以下语句将检索所有客户的id、name和email,并先按照name升序排列,然后按照email降序排列:
SELECT id, name, email
FROM customers
ORDER BY name ASC, email DESC;
五、限制查询结果
有时候我们只需要检索结果集的前几行或特定范围内的数据。在MySQL中,我们可以使用LIMIT子句来限制结果集的大小。例如,以下语句将检索所有客户的id和name,但只返回前10条记录:
SELECT id, name
FROM customers
LIMIT 10;
我们也可以使用OFFSET子句来指定结果集的起始位置。例如,以下语句将检索所有客户的id和name,但从第20条记录开始,只返回10条记录:
SELECT id, name
FROM customers
LIMIT 10 OFFSET 20;
注意,在MySQL中,LIMIT子句和OFFSET子句的顺序是固定的,先写LIMIT再写OFFSET。
六、聚合函数
除了基本的SELECT语句外,MySQL还提供了一些聚合函数,用于对数据进行统计和汇总。以下是一些常用的聚合函数:
函数 | 描述 |
---|---|
COUNT() | 统计查询结果的行数 |
SUM() | 计算指定列的总和 |
AVG() | 计算指定列的平均值 |
MAX() | 找出指定列的最大值 |
MIN() | 找出指定列的最小值 |
例如,以下语句将统计customers表格中所有客户的数量:
SELECT COUNT(*)
FROM customers;
我们也可以使用聚合函数对满足特定条件的数据进行统计。例如,以下语句将计算名字以“J”开头的客户的数量:
SELECT COUNT(*)
FROM customers
WHERE name LIKE 'J%';
七、分组和过滤
有时候我们需要对数据进行分组统计,或者通过分组来过滤数据。在MySQL中,我们可以使用GROUP BY子句实现分组操作。GROUP BY子句后面跟着要分组的列名,例如:
SELECT gender, COUNT(*)
FROM customers
GROUP BY gender;
该语句将按照gender列进行分组,并统计每组中的客户数量。
我们也可以使用HAVING子句在分组后过滤数据。HAVING子句与WHERE子句类似,只不过它作用于分组后的结果集。例如,以下语句将找出名字以“J”开头的客户中,订阅了两个或更多服务的客户:
SELECT name, COUNT(*) as num_subscriptions
FROM customers
JOIN subscriptions ON customers.id = subscriptions.customer_id
WHERE name LIKE 'J%'
GROUP BY customers.id
HAVING num_subscriptions >= 2;
该语句将按照名字以“J”开头的客户进行分组,并统计每个客户订阅的服务数量。然后,它使用HAVING子句过滤掉订阅服务少于2个的客户。
八、联结多张表格
在实际的应用中,我们经常需要从多张表格中检索数据。在MySQL中,我们可以使用JOIN操作将多张表格联结起来。以下是一些常见的JOIN操作:
1.INNER JOIN
INNER JOIN返回两个表格中满足连接条件的行。例如,以下语句将检索每个客户的名字和购买的产品名称:
SELECT customers.name, products.name
FROM customers
JOIN orders ON customers.id = orders.customer_id
JOIN products ON orders.product_id = products.id;
这个查询将内联接customers、orders和products三张表格。它通过customers表格中的id和orders表格中的customer_id建立链接,并通过orders表格中的product_id和products表格中的id建立链接。
2.LEFT JOIN
LEFT JOIN返回左表格中所有行以及右表格中满足连接条件的行。如果右表格中没有匹配的行,则返回NULL值。例如,以下语句将检索每个客户的名字以及他们最近的订单日期:
SELECT customers.name, MAX(orders.order_date)
FROM customers
LEFT JOIN orders ON customers.id = orders.customer_id
GROUP BY customers.id;
这个查询将左联接customers和right,通过customers表格中的id和orders表格中的customer_id建立链接。它使用GROUP BY子句按照客户ID进行分组,并计算每个客户最近的订单日期。如果某个客户没有订单,则返回NULL值。
3.RIGHT JOIN
RIGHT JOIN返回右表格中所有行以及左表格中满足连接条件的行。如果左表格中没有匹配的行,则返回NULL值。例如,以下语句将检索每个产品的名称以及购买该产品的客户数量:
SELECT products.name, COUNT(customers.id)
FROM customers
RIGHT JOIN orders ON customers.id = orders.customer_id
RIGHT JOIN products ON orders.product_id = products.id
GROUP BY products.id;
这个查询将右联接orders和products,通过orders表格中的product_id和products表格中的id建立链接。它使用GROUP BY子句按照产品ID进行分组,并计算每个产品的购买客户数量。如果某个产品没有被任何客户购买,则返回NULL值。
4.FULL OUTER JOIN
FULL OUTER JOIN返回左表格和右表格中所有行,如果左表格或右表格中没有匹配的行,则返回NULL值。MySQL不支持FULL OUTER JOIN操作,但我们可以通过UNION操作模拟它。例如,以下语句将返回customers和orders表格中所有的行:
SELECT customers.*, orders.*
FROM customers
LEFT JOIN orders ON customers.id = orders.customer_id
UNION
SELECT customers.*, orders.*
FROM customers
RIGHT JOIN orders ON customers.id = orders.customer_id
WHERE customers.id IS NULL;
这个查询将先进行一个LEFT JOIN操作,然后再进行一个RIGHT JOIN操作。它使用UNION操作将两张表格中的结果合并在一起,并使用WHERE子句过滤掉左表格和右表格中都存在的行。
九、使用子查询
子查询是一种在SELECT语句中嵌套另一个SELECT语句的技术。它允许我们使用查询结果作为其他查询的输入。以下是一些常用的子查询:
用于过滤数据
我们可以使用子查询来过滤需要的数据。例如,以下语句将找出价格高于平均价格的所有产品:
SELECT name, price
FROM products
WHERE price > (
SELECT AVG(price)
FROM products
);
这个查询使用子查询来计算产品价格的平均值,然后将其作为WHERE子句的输入,过滤掉价格低于平均价格的产品。
用于比较数据
我们也可以使用子查询来比较数据。例如,以下语句将找出销售总额最高的客户:
SELECT name, (
SELECT SUM(price * quantity)
FROM orders
WHERE orders.customer_id = customers.id
) as total_sales
FROM customers
ORDER BY total_sales DESC
LIMIT 1;
这个查询使用子查询来计算每个客户的销售总额,并将其作为SELECT子句的一部分输出。然后,它使用ORDER BY子句按照销售总额进行降序排列,并使用LIMIT子句只返回最高的销售总额。
用于创建派生表格
我们还可以使用子查询来创建派生表格。例如,以下语句将创建一个包含每个产品历史订单数量的表格:
SELECT products.*, (
SELECT COUNT(*)
FROM orders
WHERE orders.product_id = products.id
) as order_count
FROM products;
这个查询使用子查询来计算每个产品的历史订单数量,并将其作为新的列添加到products表格中。
用于插入和更新数据
最后,我们可以使用子查询来插入和更新数据。例如,以下语句将向orders表格中插入一个新的订单,并自动设置订单编号:
INSERT INTO orders (customer_id, product_id, price, quantity)
VALUES (1, 2, (
SELECT price
FROM products
WHERE id = 2
), 5);
这个查询使用子查询来获取产品价格,并将其作为INSERT子句的一部分插入到新的订单中。
来源:https://juejin.cn/post/7235906062309834808
猜你喜欢
- 虽说Oracle的动态SQL语句使用起来确实很方便,但是其拼装过程却太麻烦。尤其在拼装语句中涉及到date类型字段时,拼装时要加to_cha
- 准备下载安装Python3官网下载即可,选择合适的版本:https://www.python.org/downloads/安装一直下一步即可
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "h
- 1.plt.pie()饼图 常常用来显示 整体中各部分所占的比例,在python-matplotlib库中通过plt.pie()方法来实现。
- SQLite Delete详解SQLite 的 DELETE 查询用于删除表中已有的记录。可以使用带有 WHERE 子句的 DELETE 查
- Vue3 ref获取DOM元素<div ref="divBox">Hello</div>impo
- vue 页面卡死,点击无反应我在结合element做表单的时候,进入编辑页时,点击切换不生效,但是value值已改变,就是view视图层无反
- 下面通过实例代码给大家分享Python切片操作去除字符串首尾的空格的方法,具体内容如下所示:#利用切片操作,实现一个trim()函数,去除字
- * 惯,请先看测试页面:event-test.html 结论:在非IE浏览器,同一元素同一事件类型的处理函数是先进先出的。只有IE下,是先进
- 以 s := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}为例0. 建议:做slice截取时建议用两个参数,尤其是
- 什么是LSTM1、LSTM的结构我们可以看出,在n时刻,LSTM的输入有三个:当前时刻网络的输入值Xt;上一时刻LSTM的输出值ht-1;上
- 前言SPA项目中,首屏加载速度都是老生常谈的问题了,首屏时间直接反应了用户多久能看到页面的主要内容,这决定了用户体验,本文聊一聊如何采集首屏
- 目录互斥机制写流程读流程恢复流程在Hadoop2.X之前,Namenode是HDFS集群中可能发生单点故障的节点,每个HDFS集群只有一个n
- 本文实例为大家分享了python实现图像拼接的具体代码,供大家参考,具体内容如下一、效果 二、代码1、单张图片拼接# 图片拼接fr
- 1.使用测量工具,量化性能才能改进性能,常用的timeit和memory_profiler,此外还有profile、cProfile、hot
- PyCharm 中在使用Turtle(海龟)库绘图体系时,代码明明是正确可以运行的,但是没有提示 ,代码出现黄色标记以及红色波浪线 ,经验不
- 前言作为一个数据分析师,应该信奉一句话——“一图胜千言”。不过这里要说的并不是数据可视化,而是一款全民向的产品形态——表情包!!!!表情包不
- 首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参
- 在python中,总的来说有三种大的模式打开文件,分别是:a, w, r当以a模式打开时,只能写文件,而且是在文件末尾添加内容。当以a+模式
- RESTful API在Web项目开发中广泛使用,本文针对Go语言如何一步步实现RESTful JSON API进行讲解, 另外也会涉及到R