MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。由于其社区版的性能卓越,搭配 PHP 和 Apache 可组成良好的开发环境。
使用子查询
查询:任何SQL语句都是查询。但此术语一般指SELECT语句。SQL还允许创建子查询,即嵌套在其他查询中的查询。
一、利用子查询进行过滤
例如:列出订购物品TNT2的所有客户
步骤:(1)检索包含物品TNT2的所有订单的编号。
(2)检索具有前一步骤列出的订单编号的所有客户的ID。
(3)检索前一步骤返回的所有客户ID的客户信息。
SELECT order_num FROM orderitems WHERE prod_id='TNT2';
此语句的输出如下图所示:
SELECT cust_id FROM orders WHERE order_num IN (20005,20007);
此语句的输出如下图所示:
现在,把第一个查询(返回订单号的那一个)变为子查询组合两个查询,如下所示:
SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id='TNT2');
此语句的输出如下图所示:
现在得到了订购物品TNT2的所有客户的ID。下一步是检索这些客户ID的客户信息。检索两列的SQL语句为:
如下所示:
SELECT cust_name,cust_contact FROM customers WHERE cust_id IN (10001,10004);
此语句的输出如下图所示:
最终的查询语句如下所示:
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'));
此语句的输出如下图所示:
二、作为计算字段使用子查询
使用子查询的另一方法是创建计算字段。例如:显示customers表中每个客户的订单总数。订单与相应的客户ID存储在orders表中。
步骤:(1)在customers表中检索客户列表。
(2)对于检索出来的每个客户,统计其在orders表中的订单数目。
为了对每个客户执行COUNT()计算,应该将COUNT()作为一个子查询。代码如下:
SELECT cust_name,cust_state, (SELECT COUNT(*) FROM orders WHERE orders.cust_id=customers.cust_id) AS orders FROM customers ORDER BY cust_name;
此语句的输出如下图所示:
联结表
如果数据存储在多个表中,怎样用单条SELECT语句检索出数据?
使用联结。简单地说,联结是一种机制,用来在一条SELECT语句中关联表,因此称为联结。使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行。
一、创建联结
SELECT vend_name,prod_name,prod_price FROM vendors,products WHERE vendors.vend_id=products.vend_id ORDER BY vend_name,prod_name;
此语句的输出如下图所示:
SELECT语句与前面的语句一样指定要检索的列。这里,最大的差别是所指定的两个列(prod_name和prod_price)在一个表中,而另一个列(vend_name)在另一个表中。这条语句的FROM子句列出了两个表,分别是vendors和products。它们就是这条SELECT语句联结的两个表的名字。这两个表用WHERE子句正确联结,WHERE子句指示MySQL匹配vendors表中的vend_id和products表中的vend_id。
二、内部联结(重要)
目前为止所用的联结称为等值联结,它基于两个表之间的相等测试。这种联结也称为内部联结。下面的SELECT语句返回与前面例子完全相同的数据:
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;
此语句的输出如下图所示:
此语句中的SELECT与前面的SELECT语句相同,但FROM子句不同。这里,两个表之间的关系是FROM子句的组成部分,以 INNER JOIN 指定。在使用这种语法时,联结条件用特定的ON子句而不是WHERE子句给出。传递给ON的实际条件与传递给WHERE的相同。
三、联结多个表
SQL对于一条SELECT语句中可以联结的表的数目没有限制。创建联结的基本规则也相同。首先列出所有表,然后定义表之间的关系。例如:
SELECT prod_name,vend_name,prod_price,quantity FROM orderitems,vendors ,products WHERE products.vend_id=vendors.vend_id AND orderitems.prod_id=products.prod_id AND order_num=20005;
此语句的输出如下图所示: