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

MySQL学习笔记十四

第十六章创建高级联结

16.1使用表别名

输入:

SELECT CONCAT(vend_name,'(',RTRIM(vend_country),')') AS vend_title
FROM vendors
ORDER BY vend_name;

输出:

输入:

SELECT cust_name, cust_contact
FROM customers AS c, orders AS o, orderitems AS oi
WHERE c.cust_id = o.cust_id
AND oi.order_num = o.order_num
AND prod_id = 'TNT2';

输出:

说明:别名除了用于列名和计算字段外,SQL还允许给表名起别名,这样做一是可以缩短SQL语句,二是可以允许在单条SELECT语句中多次使用相同的表。表别名只在查询执行中使用。

16.2使用不同类型的联结

16.2.1自联结

输入:

SELECT prod_id, prod_name
FROM products
WHERE vend_id = (SELECT vend_id
								 FROM products
								 WHERE prod_id = 'DTNTR');

输出:

说明:使用表别名的原因之一就是能在单条SELECT语句中不止一次的引用相同的表。上面的例子就是想要查找与商品ID为DTNTR的商品同一个供应商的其他产品。这里是借助子查询解决了问题,首先找到该商品对应的供货商ID,再将其作为过滤条件筛选该供应商的其他产品。

输入:

SELECT p1.prod_id, p1.prod_name
FROM products p1, products p2
WHERE p1.vend_id = p2.vend_id
AND p2.prod_id = 'DTNTR';

输出:

说明:这里的逻辑其实就是自己和自己对账,但是只要产品ID为DTNTR的对应行,由于是对P2中的行进行的筛选,选择的列名应该是P1中的。如果写成P2的,会发生如下所示的结果。

输入:

SELECT p2.prod_id, p2.prod_name
FROM products p1, products p2
WHERE p1.vend_id = p2.vend_id
AND p2.prod_id = 'DTNTR';

输出:

说明:这个结果的出现是因为已经要求了P2中的商品ID是DTNTR,P1中所有行对应的P2中的行都是该商品代码的,P1中有几条记录就筛选出了几条。

16.2.2自然联结

输入:

SELECT c.*, o.order_num, o.order_date,
			oi.prod_id, oi.quantity, oi.item_price
FROM customers AS c, orders AS o, orderitems AS oi
WHERE c.cust_id = o.cust_id
AND oi.order_num = o.order_num
AND prod_id = 'FB';

输出:

说明:输出图没有截全。无论何时对表进行联结,应该至少有一个列出现在不止一个表中(被联结的列)。标准的联结返回所有的数据,甚至相同的列多次出现。自然联结排除多次出现,使每个列只返回一次。自然联结只能选择那些唯一的列,这一般是通过对表使用通配符(SELECT *),对所有其他表的列使用明确的子集来完成的。迄今为止建立的每个内部联结都是自然联结,不是自然联结的内部联结可能永远都不会用到。

16.2.3外部联结

输入:

SELECT customers.cust_id, orders.order_num
FROM customers INNER JOIN orders
ON customers.cust_id = orders.cust_id;

输出:

输入:

SELECT customers.cust_id, orders.order_num
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id = orders.cust_id;

输出:

输入:

SELECT customers.cust_id, orders.order_num
FROM customers RIGHT OUTER JOIN orders
ON customers.cust_id = orders.cust_id;

输出:

说明:外部联结是指联结包含了那些在相关表中没有关联的行。使用OUTER JOIN时,必须使用RIGHT和LEFT关键字指定包含其所有行的表(RIGHT指出OUTER JOIN右边的表,右边的表是依据,所有行都被保存,哪怕是左边的表匹配不上的也要保存。LEFT指出OUTER JOIN左边的表,左边的表是依据,所有行都被保存。),两种联结可以通过颠倒FROM或WHERE子句中的表的顺序相互转换。

16.3使用带聚集函数的联结

输入:

SELECT customers.cust_name,
			 customers.cust_id,
			 COUNT(orders.order_num) AS num_ord
FROM customers INNER JOIN orders
ON customers.cust_id = orders.cust_id
GROUP BY customers.cust_id;

输出:

说明:聚集函数用来汇总数据,也可以与联结一起使用。上面的例子是将两个表进行联结之后再按照cust_id进行分组。

输入:

SELECT customers.cust_name,
			 customers.cust_id,
			 COUNT(orders.order_num) AS num_ord
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id = orders.cust_id
GROUP BY customers.cust_id;

输出:

16.4使用联结和联结条件

  • 注意所使用的联结的类型,一般使用内部联结,但使用外部联结也是有效的。
  • 保证使用正确的联结条件。
  • 总是应该提供联结条件,否则会得出笛卡尔积。
  • 一个联结中可以包含多个表,甚至对于每个联结可以采用不同的联结类型,但在一起测试它们之前,分别测试每个联结会使故障排除更加简单。
http://www.dtcms.com/a/122501.html

相关文章:

  • 安徽京准:NTP网络时钟服务器功能及同步模式的介绍
  • oracle将varchar2 转为clob类型存储。 oracle不支持直接使用sql,将 varchar2 到clob的类型转换,需要下面操作
  • Java + WebAssembly 2025:如何用Rust优化高性能Web应用?
  • proteus OLED12864仿真
  • centos 安装python3.9.9
  • Jupyter Lab 无法启动 Kernel 问题排查与解决总结
  • 山东大学软件学院项目创新实训开发日志(8)之数据库建表
  • 从响应式编程到未来架构革命:解锁高并发时代的底层思维范式
  • MySQL日期时间类型详解:DATE、TIME和DATETIME的用法与区别
  • 【Ansible自动化运维】二、Playbook 深入探究:构建复杂自动化流程
  • idea插件:AICommit,智能生成Git提交信息
  • 停车场管理系统带万字文档基于Springboot+Vue的前后端分离停车场管理系统Springboot项目java项目java课程设计java毕业设计
  • Open Scene Graph 3D到2D坐标转换
  • 【数据库原理及安全实验】实验二 数据库的语句操作
  • 【软件测试】自动化测试框架Pytest + Selenium的使用
  • Ubuntu 24.04启用root账户
  • Hi168云平台部署Ansible学习环境
  • Mysql(继续更新)
  • linux入门三:Linux 编辑器
  • 查看手机在线状态,保障设备安全运行
  • js chrome 插件,下载微博视频
  • 树和图论【详细整理,简单易懂!】(C++实现 蓝桥杯速查)
  • Python | 第十三章 | 多态 | 魔术方法 | 静态方法 | 抽象类
  • c++day7
  • 基于 SpringBoot 的民宿管理平台系统
  • 用PHPExcel 封装的导出方法,支持导出无限列
  • DNS常见问题:什么是主机记录和记录值?(国科云)
  • 【Android】Android 获取当前前台应用包名与自动化控制全流程实践笔记(适配 Android 10+)
  • 网络安全防护技术
  • Python与DeepSeek应用:解锁AI开发新姿势