本章目录
- 数据库关系图
- 检索数据
- 排序数据
- 过滤数据
- 计算字段
- 数据处理函数
- 汇总数据
- 分组数据
- 子查询
- 联结表
- 组合查询
数据库关系图
实际工作中,你会遇到海量数据,多种数据类型以及复杂的数据关系。能否顺利得到你期望的结果,不仅取决于你对SQL的应用是否娴熟,还取决于数据库设计地是否合理、性能如何,更重要的是取决于你对业务的理解。对业务的理解最直接体现在你对数据库各个表之间的关系和每个表存储内容(列)的熟悉程度。因此,有必要在开始查询(检索)之前,一起来跟我熟悉下数据库表之间的相互关系。
上图是样本数据库各个表之间的关系图,它包含以下3个部分的信息:
- 表名
- 列名
- 引用关系
表名和列名一目了然,没有什么可说的。引用关系(联结)是关系型数据库的核心。以上图为例,orders表中,order_num和cust_id分别是表的主键(PK)和外键(FK),可以这样简单来理解,orders表通过cust_id(列或字段)联结了customers表,orderitems表通过order_num联结了orders表。
如果你理解了这点,就没必要对这些概念死记硬背,因为你已经可以根据自己的需求设计一个简化的数据库了。
以下是通过MySQL Workbench导出数据库关系图的图文教程:
检索数据
- SELECT
SELECT
prod_name
FROM
Products;
上述语句利用SELECT从Products表中检索一个名为prod_name的列,结果集如下:
有的同学会问,如果我想同时获得多列数据该怎么办呢?很简单,用英文逗号(,)隔开不同列就行了。
SELECT
prod_id, prod_name, prod_price
FROM
Products;
结果集如下:
SELECT
*
FROM
Products;
结果集如下:
通配符(*)可以帮助我们检索出表中的所有列。但一般情况下我们不会这么做,因为这会降低检索和应用程序的性能。但这么做有一个好处,就是可以检索出名字未知的列。不过通常我们会使用DESCRIBE关键字来处理。
- DISTINCT
DISTINCT关键字指示数据库返回不同的值。这么说可能有点抽象,来看看下面的实例。
SELECT DISTINCT
vend_id
FROM
Products;
结果集如下:
下面这段话对于深入理解DISTINCT关键字非常重要:
DISTINCT关键字作用于所有的列,不仅仅是跟在其后的那一列。例如,你指定SELECT DISTINCT vend_id, prod_price,除非指定的两列完全相同,否则所有的行都会被检索出来。
听起来有点拗口,怎么理解呢?先看这样一个实例
应用DISTINCT关键字前
应用DISTINCT关键字后
仔细对照前后结果的不同,有没有更深刻地理解上面那段话?“除非指定的两列完全相同,否则所有行都会被检索出来”。
这个实例包含了3层信息:
DISTINCT关键字作用于所有列,不仅仅是跟在其后的那一列。
DISTINCT关键字并非是将两列字符串拼接后再去重的,而是分别作用于两列。
DISTINCT关键字作用于多列时,并非是在单列内去重。
当然理解起来稍微有点吃力,不过有个好办法,就是记住当DISTINCT关键字作用于多列时,除非指定的两列完全相同,否则所有的行都会被检索出来。这样你就可以知道在什么情况下应用它会不会得到你想要的结果了。
- LIMIT
当你想指定返回的行数而不是将所有行返回时,你会用到LIMIT关键字(不同的DBMS实现这一目的的语法不尽相同)。
SELECT
prod_name
FROM
Products
LIMIT 5 OFFSET 5;
结果集如下:
LIMIT A OFFSET B是指从B+1行开始,检索不超过A行的数据。也就是说,OFFSET关键字是指定从哪一行开始,LIMIT关键字指定了检索不超过多少行。