第15章 联结表
15.1联结
联结查询(join),是SQL最强大的功能之一。
15.1.1关系表
关系数据库,主键、外键。
15.2创建联结
例:列出每个供应商的产品和价格:select vend_name,prod_name,prod_price from vendors,products where vendors.vend_id=products.vend_id order by vend_name,prod_name;
15.2.1笛卡尔积(叉联结)
上面例子中,where子句作为联结条件,如果不设联结条件,将会出现笛卡尔积。
所有,注意:不要忘了使用,或不正确的使用where联结条件。
笛卡尔积:不设联结条件,查询两个表时,行数为两个表行数相乘,列数为两个表列数相加(如果显示所有列时)。
例:select vend_name,prod_name,prod_price from vendors,products order by vend_name,prod_name;
15.2.2内部联结(inner join)
上面第一个例子中,from 表A,表B where联结条件,也可改为另一种格式,
内联结:表A inner join 表B on 联结条件
例:列出每个供应商的产品和价格:select vend_name,prod_name,prod_price from vendors inner join products on vendors.vend_id=products.vend_id order by vend_name,prod_name;
15.2.3联结多个表
一条select语句中,可以联结的表数目没有限制,但是联结表越多,查询耗费资源越多,性能越下降厉害。
创建联结的规则也相同:列出所有的表,然后定义表间关系。
例:显示订单20005中的所有货品:select prod_name,vend_name,prod_price,quantity from products,orderitems,vendors where products.prod_id=orderitems.prod_id and products.vend_id=vendors.vend_id and order_num=20005;
再看第14章中的例子,可以改写如下:
例:列出订购TNT2货品的所有客户信息:select cust_name,cust_contact from customers,orderitems,orders where customers.cust_id=orders.cust_id and orders.order_num=orderitems.order_num and prod_id='TNT2';
《mysql必知必会》是一本好书,是一本sql语言入门书,豆瓣评分很高。
作者是英国的Ben Forta,世界知名的技术作家,由人民邮电出版社发行,我觉得原作名: MySQL Crash Course,直译为:《MYSQL速成》更具畅销书潜质,只是比较俗吧,呵呵。
书中从介绍简单的数据检索开始,逐步深入一些复杂的内容,包括联结的使用、子查询、正则表达式和基于全文本的搜索、存储过程、游标、触发器、表约束,等等。
前三章是基础概念,讲了SQL和数据库的基本概念,Mysql数据库的概念和使用方法,第四章开始SQL实操练习,这里是本书的一些实操练习笔记,有兴趣的话可以按这个练习几遍,相信对新手会很有帮助,让你不经意间功力大增。