数据库相关

子句

where 子句

在这里插入图片描述

  1. in
  2. <
  3. between
    数据库中模糊查询命令like有两个通配符”%”和”_”,其中:

%匹配0或多个字符
_匹配任意1个字符(必须有一个)

子查询

即嵌套在其他查询中的查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值
注意:MySQL 的早期版本不支持子查询,对子查询的支持是从4.1 版本引入的。

利用子查询进行过滤

看一个例子:
SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id = ‘RGAN01’);

在SELECT 语句中,子查询总是从内向外处理。在处理上面的SELECT 语句时,DBMS 实际上执行了两个操作。

  1. 首先,它执行下面的查询:
    SELECT order_num FROM orderitems WHERE prod_id=‘RGAN01’
    此查询返回两个订单号:20007 和20008。然后,这两个值以IN 操作
    符要求的逗号分隔的格式传递给外部查询的WHERE 子句。
  2. 外部查询变成:
    SELECT cust_id FROM orders WHERE order_num IN (20007,20008)
    可以看到,输出是正确的,与前面硬编码WHERE 子句所返回的值相同。

作为计算字段使用子查询

使用子查询的另一方法是创建计算字段。假如需要显示Customers 表中每个顾客的订单总数。订单与相应的顾客ID 存储在Orders 表中。
执行这个操作,要遵循下面的步骤:
(1) 从Customers 表中检索顾客列表;
(2) 对于检索出的每个顾客,统计其在Orders 表中的订单数目。

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 语句对Customers 表中每个顾客返回三列:cust_name、cust_state 和orders。orders 是一个计算字段,它是由圆括号中的子查询建立的。该子查询对检索出的每个顾客执行一次。在此例中,该子查询执行了5 次,因为检索出了5 个顾客。

完全限定列名

WHERE Orders.cust_id = Customers.cust_id
用一个句点分隔表名和列名,在有可能混淆列名时必须使用这种语法。
好的做法是,如果在SELECT 语句中操作多个表,就应使用完全限定列名来避免歧义。

联结表

SQL 最强大的功能之一就是能在数据查询的执行中联结(join)表。联结
是利用SQL 的SELECT 能执行的最重要的操作,很好地理解联结及其语
法是学习SQL 的极为重要的部分。

联结

关系表

关键是,相同的数据出现多次决不是一件好事,这是关系数据库设计的
基础。关系表的设计就是要把信息分解成多个表,一类数据一个表。各
表通过某些共同的值互相关联(所以才叫关系数据库)。

将供应商信息与产品信息分开存储的理由是:
 同一供应商生产的每个产品,其供应商信息都是相同的,对每个产品
重复此信息既浪费时间又浪费存储空间;
 如果供应商信息发生变化,例如供应商迁址或电话号码变动,只需修
改一次即可;
 如果有重复数据(即每种产品都存储供应商信息),则很难保证每次
输入该数据的方式都相同。不一致的数据在报表中就很难利用。

关系数据库的可伸缩性远比非关系数据库要好。
可伸缩(scale):
能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序
称为可伸缩性好(scale well)。

为什么使用联结

简单说,联结是一种机制,用来在一条SELECT 语句中关联表,因此称为联结。使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行。

例子:
SELECT vend_name, prod_name, prod_price
FROM Vendors, Products
WHERE Vendors.vend_id = Products.vend_id;

创建联结

Where 子句的重要性

在联结两个表时,实际要做的是将第一个表中的每一行与第二个表中的每一行配对。WHERE 子句作为过条件,只包含那些匹配给定条件(这里是联结条件)的行。

笛卡儿积(cartesian product)
由没有联结条件的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。返回笛卡儿积的联结,也称叉联结(cross join)

内联结

目前为止使用的联结称为等值联结(equijoin),它基于两个表之间的相
等测试。这种联结也称为内联结(inner join)。其实,可以对这种联结使
用稍微不同的语法,明确指定联结的类型。下面的SELECT 语句返回与
前面例子完全相同的数据:
例子:SELECT vend_name, prod_name, prod_price
FROM Vendors INNER JOIN Products
ON Vendors.vend_id = Products.vend_id;

里,两个表之间的关系是以INNER JOIN 指定的部分FROM 子句。在使用
这种语法时,联结条件用特定的ON 子句而不是WHERE 子句给出。传递
给ON 的实际条件与传递给WHERE 的相同。

联结多个表

例子:
SELECT prod_name, vend_name, prod_price, quantity
FROM OrderItems, Products, Vendors
WHERE Products.vend_id = Vendors.vend_id
AND OrderItems.prod_id = Products.prod_id
AND order_num = 20007;

这里的FROM 子句列出三个表,WHERE 子句定义这两个联
结条件,而第三个联结条件用来过滤出订单20007 中的物品。

注意:性能考虑
DBMS 在运行时关联指定的每个表,以处理联结。这种处理可能非常
耗费资源,因此应该注意,不要联结不必要的表。联结的表越多,性
能下降越厉害。

创建高级联结

使用表别名

目的:

  1. 缩短SQL 语句;
  2. 允许在一条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 = ‘RGAN01’;

ustomers AS C 使用C作为Customers 的别名,如此等等。这样,就可以使用省略的C 而不用全名Customers。在这个例子中,表别名只用于WHERE 子句。其实它不仅能用于WHERE 子句,还可以用于SELECT 的列表、ORDER BY 子句以及其他语句部分。
需要注意,表别名只在查询执行中使用。与列别名不一样,表别名不返回到客户端。

使用不同类型的联结

自联结(self-join)、自然联结(natural join)和外联结(outer join)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值