您现在的位置是:群英 > 数据库 > MySQL数据库
MySQL逻辑查询是什么意思?SQL语句怎样写?
Admin发表于 2021-11-13 17:39:311055 次浏览

    这篇文章给大家介绍的是MySQL逻辑查询的相关内容,查询是数据中最频繁的操作,也是需要掌握的内容,而查询处理可分为逻辑查询和物理查询,一些朋友可能对MySQL逻辑查询不是很了解,对此本文就给大家讲讲MySQL逻辑查询,感兴趣的朋友接下来跟随小编一起学习一下吧。

    在MySQL中,查询是用于构建DELETE、UPDATE的基础,因为你要删除或者更新他们时,首先就是要查出这些记录,所以SELECT显的尤为重要,对于查询处理,可以分为逻辑查询和物理查询,逻辑查询表示执行SELECT语句时应该产生什么样的结果,而物理查询表示MySQL如何得到这个结果的。

    在SQL语句中,最先处理的就是FROM语句,最后执行的是LIMIT语句,如果把所有的语句都用上,如GROUP BY、ORDER BY,那么大致可以分为10个步骤,如下所示,每个操作都会产生一张虚拟表。

(7) select (8)distinct<select_list>

(1) from <left table>
(3) <join_type> join <right_table>
(2)    on<条件>
(4) where <条件>
(5) group by<字段list>
(6) having<条件>
(9) order by<字段>
(10) limit

    下面通过一个实际例子来分析一下,首先创建两张表,用户和订单。

mysql> create table user (userId int(11),userName varchar(255),city varchar(255), primary key (userId));
Query OK, 0 rows affected, 1 warning (0.05 sec)


mysql> create table orders(orderId int(11) ,userId int(11) ,primary key (orderId));
Query OK, 0 rows affected, 2 warnings (0.05 sec)

    插入数据。

insert user values(1,"张三","内蒙");
insert user values(2,"李四","内蒙");
insert user values(3,"王五","北京");
insert user values(4,"迪迦","西藏");
insert user values(5,"金甲战士","内蒙");

insert orders values(10001,1);
insert orders values(10002,1);
insert orders values(10003,4);
insert orders values(10004,1);
insert orders values(10005,1);
insert orders values(10006,4);
insert orders values(10007,2);

    好,现在来查询一下来自内蒙,且订单数量小于3的用户,SQL如下。

mysql> select userName,count(orders.orderId) as total from user 
left join orders on user.userId = orders.userId 
where city="内蒙" 
group by user.userId 
having count(orders.orderId)<3 
order by total desc;
+--------------+-------+
| userName     | total |
+--------------+-------+
| 李四         |     1 |
| 金甲战士     |     0 |
+--------------+-------+
2 rows in set (0.00 sec)

    有数据有SQL,下面分析一下具体流程。

1. 笛卡尔乘积

    首先要做的是对FROM语句前后的两张表进行笛卡尔乘积,那么什么是笛卡尔乘积?举个例子来说,假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。

    所以,对应上面的数据,最终会产生一张虚拟表VT1,他将包含35行数据,具体数据如下所示。

userId userName city orderId userId
1 张三 内蒙 10001 1
1 张三 内蒙 10002 1
1 张三 内蒙 10003 4
1 张三 内蒙 10005 1
1 张三 内蒙 10006 1
1 张三 内蒙 10005 4
1 张三 内蒙 10007 2
..................



5 金甲战士 内蒙 10001 1
5 金甲战士 内蒙 10002 1

2. ON过滤器

    下一步,通过ON后面的添加过滤掉不需要的数据,在上述SQL中,条件是user.userId = orders.userId ,所以通过上面生成的虚拟表VT1,除去不相关的数据,生成新的虚拟表VT2,最终的结果如下。

+--------+--------------+--------+---------+--------+
| userId | userName     | city   | orderId | userId |
+--------+--------------+--------+---------+--------+
|      1 | 张三         | 内蒙   |   10005 |      1 |
|      1 | 张三         | 内蒙   |   10004 |      1 |
|      1 | 张三         | 内蒙   |   10002 |      1 |
|      1 | 张三         | 内蒙   |   10001 |      1 |
|      2 | 李四         | 内蒙   |   10007 |      2 |
|      3 | 王五         | 北京   |    NULL |   NULL |
|      4 | 迪迦         | 西藏   |   10006 |      4 |
|      4 | 迪迦         | 西藏   |   10003 |      4 |
|      5 | 金甲战士     | 内蒙   |    NULL |   NULL |
+--------+--------------+--------+---------+--------+

3.添加外部行

    这一步只有在连接类型为OUTER JOIN才发生。

    LEFT OUTER JOIN把左表记为保留表,RIGHT OUTER JOIN把右表作为保留表,FULL OUTER JOIN表示都作为保留表,添加外部行的工作就是在上一步的基础上添加保留表中被过滤条件过滤掉的数据,非保留表的数据被赋值NULL。

    最终生成下面的结果,记为虚拟表VT3。

+--------+--------------+--------+---------+--------+
| userId | userName     | city   | orderId | userId |
+--------+--------------+--------+---------+--------+
|      1 | 张三         | 内蒙   |   10005 |      1 |
|      1 | 张三         | 内蒙   |   10004 |      1 |
|      1 | 张三         | 内蒙   |   10002 |      1 |
|      1 | 张三         | 内蒙   |   10001 |      1 |
|      2 | 李四         | 内蒙   |   10007 |      2 |
|      3 | 王五         | 北京   |    NULL |   NULL |
|      4 | 迪迦         | 西藏   |   10006 |      4 |
|      4 | 迪迦         | 西藏   |   10003 |      4 |
|      5 | 金甲战士     | 内蒙   |    NULL |   NULL |
+--------+--------------+--------+---------+--------+

4. WHERE过滤器

    这一步很简单,条件为city="内蒙" ,即只保留下city为内蒙的列,并生成新的虚拟表VT4。最终结果如下。

+--------+--------------+--------+---------+--------+
| userId | userName     | city   | orderId | userId |
+--------+--------------+--------+---------+--------+
|      1 | 张三         | 内蒙   |   10005 |      1 |
|      1 | 张三         | 内蒙   |   10004 |      1 |
|      1 | 张三         | 内蒙   |   10002 |      1 |
|      1 | 张三         | 内蒙   |   10001 |      1 |
|      2 | 李四         | 内蒙   |   10007 |      2 |
|      5 | 金甲战士     | 内蒙   |    NULL |   NULL |
+--------+--------------+--------+---------+--------+

5. GROUP BY 分组

    这步将上一个步骤进行分组,并生成新的虚拟表VT5,结果如下。

+--------+--------------+--------+
| userId | userName     | city   |
+--------+--------------+--------+
|      1 | 张三         | 内蒙   |
|      2 | 李四         | 内蒙   |
|      5 | 金甲战士     | 内蒙   |
+--------+--------------+--------+

6.HAVING筛选

    分完组,我们就可以筛选了,选出count(orders.orderId)<3 的数据即可,最终结果如下。

| userId | userName     | city   | count(orders.orderId) |
+--------+--------------+--------+-----------------------+
|      2 | 李四         | 内蒙   |                     1 |
|      5 | 金甲战士     | 内蒙   |                     0 |
+--------+--------------+--------+-----------------------+

7.处理SELECT列表

    虽然SELECT是查询中最先被指定的部分,但是直到这里才真正进行处理,在这一步,将SELECT中指定的列从上一步产生的虚拟表中选出。

8.应用DISTINCT

    如果查询语句中存在DISTINCT子句,则会创建一张内存临时表,这张内存临时表的表结构和上一步产生的虚拟表一样,不同的是对进行DISTINCT操作的列增加了一个唯一索引,以此来去除重复数据。

    另外对使用了GROUP BY语句的查询,再使用DISTINCT是多余的,因为已经进行了分组,不会移除任何行。

9.排序和LIMIT

    最后就是排序,返回新的虚拟表。结果如下。

+--------------+-------+
| userName     | total |
+--------------+-------+
| 李四         |     1 |
| 金甲战士     |     0 |
+--------------+-------+

    但是在本例子中没有使用到LIMIT,如果使用到了,那么则从选出指定位置开始的指定行数

    关于MySQL逻辑查询就介绍到这,上述示例对大家学习和理解MySQL逻辑查询有一一定的帮助,需要的朋友可以了解看看,希望能对大家有帮助,想要了解更多MySQL数据库的查询操作,大家可以关注其它的相关文章。

文本转载自PHP中文网

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

标签: mysql 逻辑查询
相关信息推荐
2022-08-09 17:55:22 
摘要:区别:1、Oracle的界面有优势,而sap略显不友好;2、财务管理模块上,Oracle不错,而SAP不突出;3、项目和设备管理上,SAP强于Oracle;4、二次开发上,oracle比sap灵活,可以个性化制定等等。
2021-12-11 17:40:28 
摘要:这篇文章给大家分享的是MySQL图形化工具。MySQL图形化工具有很多,包括phpMyAdmin、MySQLDumper、Navicat、MySQL GUI Tools、MySQL ODBC Connector、Workbench、SQLyog等等,下面给大家来简单的介绍一下他们的特点,感兴趣的朋友继续往下看吧。
2021-12-11 17:39:55 
摘要:有一些朋友在使用MySQL时,有遇到MySQL服务无法启动的情况,这时提示信息:mysql服务无法启动,服务没有报告任何错误。那么,这样的情况我们该怎样解决呢?
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部