当前位置: 首页 > news >正文

子查询与内联结分别应该怎么写?

使用子查询

子查询

⚠️版本要求:MySQL4.1引入了对子查询的支持,所以要想使用本章描述的mysql必须使用4.1更高的版本。

利用子查询进行过滤

例:列出订购物品TNT2的所有客户的客户信息。

SELECT cust_name , cust_contact
FROM customers
WHERE cust_id IN (SELECT cust_id
                  FROM orders
                  WHERE order_num IN (SELECT order_num 
                                        FROM orderitems
                                        WHERE prod_id = 'TNT2') );
复制代码

虽然子查询一般与IN操作符结合使用,但也可以用于测试等于(=),不等于(<>)

作为计算字段使用子查询

例:显示customers表中每个客户的订单总数

SELECT cust_name,
        cust_state,
        (SELECT COUNT(*)
        FROM orders
        WHERE orders.cust_id = customers.cust_id) AS orders
FROM customers
ORDER BY cust_name;
复制代码

联结表

联结

SQL强大的功能之一就是可以在数据检索查询的执行中联结。

关系表

我们设计两个表,一个供应商表,一个商品表,供应商表的主键标识就是商品表的外键。

这样关系数据可以有效的存储和方便的处理,他的可伸缩性是要远远好于非关系数据库。

可伸缩性

能够不断适应增加的工作量而不失败,设计良好的数据库或应用程序称之为可伸缩性好。

为什么使用联结

就像上面说的,你把数据分解到多个数据表这是有代价的,如果你想要的数据在多个数据表中你要怎么办呢?

🗯答案就是使用联结。

创建联结

SELECT vend_name ,prod_name,prod_price
FROM vendors,products
WHERE vendors.vend_id = products.vend_id
ORDER BY vend_name,prod_name;
复制代码

🐼这里要完全限定列名,不然MySQL可处理不了这种充满二义性的WHERE语句。

WHERE子句的重要性

在联结两个表的时候。实际是将第一个表的每一行,与第二个表的每一行配对,WHERE子句作为过滤条件,他只包含哪些匹配给定条件的行。没有WHERE子句,返回的信息将是特别特别多的呀。

笛卡尔积

由于没有连接条件的表关系返回的结果为笛卡尔积。检索出的行的数目

内部联结

目前为止的所有连接都是等值连接,他是基于两个表之间的相等测试。这种连接称为内部联结。其实,这种连接是原有另外一种写法 的。(这种写法可以明确指定连接的类型)

SELECT vend_name ,prod_name ,prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id;
复制代码

连接多个表

SELECT prod_name ,vend_name ,prod_price ,quantity
FROM  orderitems ,products, vendors
WHERE products.vend_id = vendors.vend_id
      AND orderitems.prod_id = products.prod_id
      AND order_num = 20005;
复制代码

🌂mysql处理联结表是特别浪费性能的,所以我们要仔细,不要联结不必要的表。联结的表越多,性能的下降越厉害。

我们可以把之前的一个SELECT拿出来搞一个一题多解。

SELECT cust_name , cust_contact
FROM customers
WHERE cust_id IN (SELECT cust_id
                  FROM orders
                  WHERE order_num IN (SELECT order_num 
                                        FROM orderitems
                                        WHERE prod_id = 'TNT2') );
复制代码

我们试试联结的方法

SELECT cust_name , cust_contact
FROM customers , orders, orderitems
WHERE customers.cust_id = orders.cust_id
        AND orderitems.order_num = orders.order_num
        AND prod_id = 'TNT2';
复制代码

相关文章:

  • Shell编程之第一讲——基础知识认识
  • Java-基于SSM的校园点餐管理系统
  • WLAN与WiFi各是什么意思有什么区别
  • Linux基础-常见问题 xrandr屏幕操作命令详解
  • Jenkins部署springboot项目至远程服务器
  • 商业化广告--体系学习-- 2 -- 行业蓝图篇 -- 广告产品与商业模式
  • 教程,如何给公众号文章或菜单添加附件?
  • 计算机毕业设计springboot+vue基本微信小程序的外卖点餐平台系统
  • 数学建模学习(99):多目标寻优 非支配排序遗传算法NSGA III
  • 做这么多年程序员了,才把ELK和springboot的日志解决方案弄明白
  • [bug总结]: Feign调用GET请求找不到请求体实体类
  • SpringCloud源码分析 (Eureka-Server-处理客户端删除状态请求) (六)
  • 微信小程序开发01 双线程模型:为什么小程序不用浏览器的线程模型?
  • 用Python破解WiFi密码,只需要1行代码,太刺激了
  • Linux基础学习笔记(十三)——文件的格式化处理
  • (三)从jvm层面了解线程的启动和停止
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JS笔记四:作用域、变量(函数)提升
  • Nacos系列:Nacos的Java SDK使用
  • node 版本过低
  • Python3爬取英雄联盟英雄皮肤大图
  • React 快速上手 - 07 前端路由 react-router
  • STAR法则
  • vuex 学习笔记 01
  • 工作手记之html2canvas使用概述
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 如何胜任知名企业的商业数据分析师?
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 译米田引理
  • HanLP分词命名实体提取详解
  • kubernetes资源对象--ingress
  • Nginx实现动静分离
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​ssh免密码登录设置及问题总结
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (C语言)球球大作战
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (分布式缓存)Redis哨兵
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • ./configure,make,make install的作用
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .Net FrameWork总结
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .Net Web窗口页属性
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .net反编译的九款神器
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • @requestBody写与不写的情况
  • [2669]2-2 Time类的定义