mysql-联结
一、联结
联结是利用SQL的select能执行的最重要的操作。
1、关系表:假如有一个包含产品目录的数据库表,其中每个类别的物品占一行。对于每种物品要求存储的信息包括产品描述和价格,以及生产该产品的供应商信息。
现在假如有由同一供应商生产的多种物品,那么在何处存储供应商信息(如供应商名、地址、联系方式等)。
由于相同数据出现多次违背了范式设计原则,因此在这个例子中,可以建立两个表,一个存储供应商信息vendors,另一个存储产品信息products。产品信息表中除了存储供应商ID外不存储其他供应商信息。因此vendors表的主键又叫做products的外键。他将vendors与products关联。
2、外键(foreign key):外键为某个表中的一列,它包含另一个表中的主键值,定义了两个表之间的关系。
二、创建联结
联结是一种机制,用来在一条select语句中关联表,因此称为联结。使用特殊的语法,可以联结多个表返回一组输出。
select vend_name,prod_name,prod_price from vendors,products where vendos.vend_id=products.vend_id order by vend_name,prod_name;
为了匹配两个列以vender.vend_id和products.vend_id指定,需要使用完全限定名,防止引起歧义。
笛卡尔积:由没有联结条件的表关系返回的结果为笛卡尔积。检索出的行数目将是第一个表中的行数乘以第二个表中的行数。
select vend_name,prod_name,prod_price from vendors,products order by vend_name,prod_name;
三、内部联结
等值联结:它基于两个表之间的相等测试。可以使用:
inner join on:
select vend_name,prod_name,prod_price from vendors inner join products on vendors.vend_id = products.vend_id;
以上语句以inner join指定,在使用这种语法时,联结条件用特定的on子句而不是where子句给出。传递给on实际条件与传递给where相同。
inner join on性能比where好。
四、联结多个表
SQL对一条select语句中可以联结的数目没有限制。创建联结基本规则也相同。首先列出所有表,然后定义表之间的关系。
select prod_name,vend_name,prod_price,quantity from orderitems,products,vendors where products.vend_id=vendor.vend_id and orderitems.prod_id = products.prod_id and order_num=20005;
联结的表越多,性能下降的越厉害。
我们在之前使用的子查询其实也可以使用联结语句。如下:
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';
而子查询中可以这样写:select cust_name,cust_contact form 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 as c,orders as o,orderitems as oi where c.cust_id = o.cust=id and oi.order_num=o.cust_id and oi.order_num=o.order_num and prod_id ='TNT2';
六、使用不同类型的联结:
我们在前面使用了内部联结和等值联结,其实还有更复杂的联结
1、自联结:假如你发现某物品(ID为DTNTR)存在问题,因此想知道该物品的供应商生产的其他物品是否也存在这些问题,因此,你需要先查到生产ID为DTNTR的物品供应商,然后找出这个供应商生产的其他物品。自连接的速度非常好:
select prod_id,prod_name from products where vend_id=(select vend_id form products where prod_id ='DTNTR');
也可以使用别名:
select p1.prod_id,p1.prod_name from products as p1, products as p2 where p1.vend_id=p2.vend_id and p2.prod_id='DTNTR';
2、外部连接
许多连接将一个表中的行与另一个表中的行向关联,但有时候会需要包含没有关联行的那些行。
外链接不包含在相关表中没有关联行的行,这种类型的联结称为外部联结,例如:
1、对每个客户下了多少订单进行计数,包括那些至今尚未下订单的客户。
2、列出所有产品以及订购数目,包括没有人订购的产品
3、计算平均销售规模,包括那些至今尚未下订单的客户。
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 form customers right outer join orders on (orders.cust_id=customers.cust_id);
七、使用带聚集函数的联结
聚集函数也可以与联结一起使用。
如果要检索所有客户及每个客户所下的订单数:
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;
聚集函数也可以分方便的与其他联结一起使用。
select customers.cust_name,customers.cust_id,count(orders.order_num) as num_ord from customers left outer orders on customers.cust_id = orders.cust_id group by customers.cust_id ;
外部联结,把没下订单的客户也查出来了。
mysql-联结的更多相关文章
- MySQL联结查询和组合查询
联结查询 1.关系表 主键:一列或一组列,能够唯一区分表中的每一行,用来表示一个特定的行 外键:为某个表中的一列,包含另一个表的主键,定义量表的关系. 2.创建联结 规定要连接的表和他们如何关联即可 ...
- MySQL联结表
联结 SQL最强大的功能之中的一个就是能在数据检索查询的运行中联结表.而联结表是基于关系表. 理解关系表例如以下,假如由同一供应商生产的多种物品.在数据库中须要存储产品信息,而在产品信息的这一行不存储 ...
- Mysql 联结表
- MySQL联结查询和子查询
2018-2-24 16:18:12 星期六 今天需要统计一个运营活动的数据, 涉及三个表, 分组比较多 活动描述: 每个人可以领取多张卡片, 好友也可以赠送其卡片, 20或40张卡片可以兑换一个奖 ...
- MySQL的联结(Join)语法
MySQL的联结(Join)语法 1.内联结.外联结.左联结.右联结的含义及区别: 在讲MySQL的Join语法前还是先回顾一下联结的语法,呵呵,其实连我自己都忘得差不多了,那就大家一起温习吧(如 ...
- MySQL中基本的多表连接查询教程
一.多表连接类型1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用',' 如: SELECT * FROM table1 CROSS JOIN ...
- MySQL Left Join,Right Join
魂屁,东西发这里了关于Left Join,Right Join的 在讲MySQL的Join语法前还是先回顾一下联结的语法,呵呵,其实连我自己都忘得差不多了,那就大家一起温习吧(如果内容有错误或有疑问, ...
- 实例讲解MySQL联合查询
好了终于贴完了MySQL联合查询的内容了,加上上一篇一共2篇,都是我转载的,实例讲解MySQL联合查询.那下面就具体讲讲简单的JOIN的用法了.首先我们假设有2个表A和B,他们的表结构和字段分别为: ...
- MySQL的left on 【zt】
MySQL的left on [zt] (2008-11-03 17:27:30) 转载▼ 标签: it 分类: 学习笔记 MySQL多表连接查询Left Join,Right Join php开源嘛 ...
- Mysql - 使用入门
本文是学习 Mysql必知必会 后的笔记 学习之前需要创建一个数据库,然后导入下面两个mysql脚本 create database db1 charset utf8; ############### ...
随机推荐
- STM32 抢占优先级和响应优先级
一.抢占优先级和响应优先级 STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号 越小,表明它的优先级别越高. 抢占,是指打断其他中断的属性,即因为具有这个属性会出现嵌套中 ...
- 利用Python对文件进行批量重命名
最近几天工作的内容是对40个项目进行考核,每个项目都需要一个考核评分表,已经有了项目的列表. 如果用常规的方法,需要复制40个文件,并逐个修改,不光工作量大,也容易出错,后期修改也不方便. 于是想到了 ...
- NYOJ 915 +-字符串【贪心】
+-字符串 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描写叙述 Shiva得到了两个仅仅有加号和减号的字符串,字串长度同样.Shiva一次能够把一个加号和它相邻的减号交换 ...
- C++中的字节对齐
本博客(http://blog.csdn.net/livelylittlefish)贴出作者(三二一.小鱼)相关研究.学习内容所做的笔记,欢迎广大朋友指正! 字节对齐 1. 基本概念字节对齐:计算机存 ...
- BZOJ 3569 询问删除指定的k条边后图是否连通 线性基
思路: 这题思路好鬼畜啊-- 绝对是神思路 //By SiriusRen #include <cstdio> #include <algorithm> using namesp ...
- SSRS参数不能默认全选的解决方法
解决方法选自<SQL Server 2008 R2 Reporting Services 报表服务>一书,亲测有效. 注意:参数默认值如果是字符串需要类型转换 =CStr("AL ...
- javax.validation注解使用
@Pattern(regexp = "^[0-9]*$",message = "完成比例(进度)必须是数字")
- 对比学习用 Keras 搭建 CNN RNN 等常用神经网络
Keras 是一个兼容 Theano 和 Tensorflow 的神经网络高级包, 用他来组件一个神经网络更加快速, 几条语句就搞定了. 而且广泛的兼容性能使 Keras 在 Windows 和 Ma ...
- Sublime Text 3 注册码 激活码 版本号 Build 3143
—– BEGIN LICENSE —– TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA ...
- ActiveMQ学习笔记(17)----Message高级特性(一)
1. Messaage Properties ActiveMQ支持很多消息属性,具体可以参考 http://activemq.apache.org/activemq-message-propertie ...