十3、使用子查询app
1、子查询:嵌套在其余查询中的查询。ide
子查询老是从内向外处理。函数
一、利用子查询进行过滤。测试
例如:订单存储在两个表中其中orderitems表中存储各订单的物品。Orders表不存储客户信息,只存储客户的ID。Customers存储客户的信息。spa
先在要列出订购物品TNT2的全部客户。orm
SELECT cust_name, cust_contactxml
FROM customers排序
WHERE cut_id IN (SELECT cust_idip
FROM ordersci
WHERE order_num IN (SELECT order_num
FROM orderitems
WHERE prod_id = ‘TNT2’));
二、做为计算字段使用子查询
十4、联结表
一、联结
联结的做用:联结是一种机制,用来在一条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 vend_name, prod_name, prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id;
在这里,两个表之间的关系是FROM子句的组成部分,以INNER JOIN指定。在使用这种语法时,联结条件用特定的ON子句而不是WHERE子句给出
联结多个表
SQL对一条SELECT语句中能够联结的表的数目没有限制。首先列出全部表,而后定义表之间的关系,WHERE后跟多个关系时,用AND链接。
例如:SELECT prod_name, vend_name, prod_price, quantity
FROM orderitems, products, vnedors
WHERE products.vend_id = vendors.vend_id
AND orderitems.prod_id = products.prod_id
AND order_num = 20005;
十5、建立高级联结
一、使用表别名
别名除了用于列名和计算字段外,SQL还容许给表名起别名。这样作有两大理由:
--缩短SQL语句
--容许在单条SELECT语句中屡次使用相同的表
例如: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’;
注意:表别名只在查询执行中使用。与列别名不同,表别名不返回到客户机。
二、使用不一样类型的联结
迄今为止咱们使用的为内部联结或等值联结的简单联结。如今看其余三种联结,它们分别是自联结、天然联结和外部联结
(1)、自联结
使用表别名的主要缘由之一是能在单条SELECT语句中不止一次引用相同的表。
例如:假如发现某物品(其ID为DTNTR)存在问题,所以想知道生产该物品的供应商生产的其余物品是否也存在问题。此查询要求首先招待生产ID为DTNTR的物品的供应商,而后找出这个供应商生产的其余物品。
方法一:使用子查询
SELECT prod_id, prod_name
FROM products
WHERE vend_id = (SELECT vend_id
FROM products
WHERE prod_id = ‘DTNTR’);
方法2、使用自联结
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)、天然联结
天然联结排除屡次出现,使每一个列只返回一次。
迄今为止,咱们创建的每一个内部联结都是天然联结。
(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语句使用了关键字OUTER JOIN来指定联结的类型。可是,与内部联结关联两个表中的行不一样的是,外部联结还包括没有关联行的行。在使用OUTER JOIN语法时,必须使用RIGHT或LEFT关键字指定其包括其全部行的表(RIGHT指出的是OUTER JOIN右边的表,而LEFT指出的是OUTER JOIN左边的表)
三、使用带汇集函数的联结
若是要检索全部客户及每一个客户所下的订单数,下面使用了COUNT()函数的代码可完场工做。
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语句使用INNER JOIN将customers和orders表互相关联。
四、使用联结和联结条件
十6、组合查询
本章讲述如何利用UNION操做符将多条SELECT语句组合成一个结果集
1、组合查询
MySQL容许执行多个查询(多条SELECT语句),并将结果做为单个查询集返回。这些组合查询一般称为并或复合查询
须要使用组合查询的两种状况:
2、建立组合查询
可用UNION操做符来组合数条SQL查询。
UNION的使用很简单。所须要作的只是给出每条SELECT语句,在各条语句之间放上关键字UNION
例如:假设须要价格小于等于5的全部物品的一个列表,并且还想包括供应商1001和1002生产的全部物品(不考虑价格)
SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5
UNION
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001,1002);
UNION规则:
包含或取消重复的行
使用UNION自动去除重复的行,若是要返回全部的行(包括重复的行)可以使用UNION ALL
对组合查询结果排序
在用UNION组合查询时,只能使用一条ORDER BY子句,它必须出如今最后一条SELECT语句以后。