Hello

前言

查询既是数据库的基础,也是数据库的重点。绝大部分人上网,都是在查数据。因此,请耐心学习。

一.基础查询

关键词:SELECT FROM

  • 直接查询
// 直接查询(即不带过滤条件)
SELECT field FROM tb; // 单字段查询
SELECT field1, field2... FROM tb; // 多字段查询
SELECT * FROM tb; // 全表查询
SELECT field1, field2... FROM tb1, tb2 WHERE condition; // 多表联合查询

注意事项:
1.没有指定排序的查询结果,不能假定它的顺序具有意义。
2.通配符(*)查询会降低性能。
3.多表联合查询一定要带WHERE条件,否则会产生“笛卡尔积”。

  • 去重查询

关键词:DISTINCT

SELECT DISTINCT field FROM tb;

注意事项:
1.去重会应用到所有的检索列。对于多列的去重,先将同一行的字段值相加,再进行比较去重。

  • 限制结果

关键词:LIMIT

SELECT field FROM tb LIMIT 1, 5; // 返回从第2行开始的5行
// 等同于
SELECT field FROM tb LIMIT 5 OFFSET 1; // MySQL5开始支持

  • 查询结果排序

关键词:ORDER BY

SELECT field FROM tb ORDER BY field; // 单列排序
SELECT field1, field2 FROM tb ORDER BY field1, field3; // 多列排序

注意事项:
1.ORDER BY必须在SQL语句的最后(因为它针对的是查询结果)。
2.排序优先级,根据ORDER BY后面字段的位置,从高到低。
3.可以用非检索列,对查询结果进行排序(建议实践,好理解)。
4.默认排序是升序(关键词ASC,仅供了解)。

  • 查询结果降序

关键词:DESC

SELECT field FROM tb ORDER BY field DESC;

注意事项:
1.DESC只应用到直接在其前面的列,多列降序需指定多个DESC。

二. 子查询

包括以下内容:

  1. “子查询”的定义
  2. 表别名
  3. 要点
  4. 语法
  • 定义

“子查询”(subquery):嵌套在其他查询中的查询。

  • 表别名

在多表联合查询时,表之间的关系靠某个共同的字段维护。在比较这个共同的字段时,需要指定所属的表,否则DBMS无法得知从哪个表获取该字段,而产生错误。

SELECT T1.field2, T2.field3
FROM tb1 AS T1, tb2 AS T2
WHERE T1.field = T2.field;
要点:
1.表别名开头使用大写。
  • 要点

1.含有子查询的语句,SQL执行顺序从内向外。
2.子查询与普通查询的语法相同。
3.嵌套过多的子查询,影响性能,SQL语句也难以维护。

  • 语法
SELECT field FROM tb1 WHERE field 
	IN(SELECT field1 FROM  tb2);

三. 联结

包含以下内容:

  1. 关系型数据库基础
  2. 外键介绍
  3. 联结的定义、应用
  4. 联结类型
  5. 各种联结的语法
  • 关系型数据库基础

首先,我们要知道当大量数据在一起时,会出现以下情况:

  1. 不能只检索特定的数据,浪费性能。
  2. 产生大量重复的数据,浪费存储。
  3. 数据不易维护,无法便捷的修改某类数据。

然后,“关系型数据库”的主张,是将数据根据某些共同的特征,分解在不同的表中。通过表与表之间的共同点,建立联系,以保证数据的完整性、一致性。它的优点如下:

  1. 检索数据具有针对性,提升效率。
  2. 减少重复数据,优化存储。
  3. 解耦数据之间的强联系,易于维护。
  4. 建立清晰的数据层次模型。
  • 外键

外键(foreign key):用于对外建立表的引用关系的字段的别名。
例子:
表B的一个字段引用表A的主键值。通过该字段,表B对表A产生了约束。此时,该字段就是表B的“外键”。
要点:

  1. 外键约束,是为了保证数据的完整性。
  2. 外键约束,是数据库自身强制的,因此它是可靠的。
  3. 外键约束,不等同于人为的建立表的公共字段,人为建立的约束,往往由应用程序控制,一旦应用程序出现漏洞,那么这种约束就显的不够可靠。
  • 联结的定义

联结”是一种机制,允许在一条SELECT语句中关联表。

  • 笛卡尔积

“笛卡尔积”:没有联结条件的表关系返回的结果,等于表行数的乘积。

  • 联结的类型

1.等值联结
2.自联结
3.外联结

  • 等值联结

基于两表之间的相等测试。

SELECT field2, field3 FROM tb1 INNER JOIN tb2 ON tb1.field1 = tb2.field1;
// 等同于
SELECT field2, field3 FROM tb1, tb2 WHERE tb1.field1 = tb2.field1;

要点:
1.ANSI SQL规范首选INNER JOIN语法。
  • 自联结

通常联结用于检索多表,而“自联结”用于检索一张表。常用于以下情形:
1.存在一个或多个未知条件,并以该条件去匹配同表中的数据。

SELECT T1.field1, T1.field3 
FROM tb1 AS T1 INNER JOIN tb1 AS T2 
ON T2.field1 = xxx AND T1.field2 = T2.field2;
要点:
1.自联结中,表和列都要使用限定名。
  • 外联结

外联结”:联结的检索结果,包含了没有关联行的行。

// 左外联结-结果包括左表的所有行,右表未关联的行,以默认值或NULL填充,取决于字段的设置。
SELECT tb1.*, tb2.field
FROM tb1 LEFT OUTER JOIN tb2
ON condition;

// 右外联结-与左外联结相反
SELECT tb1.*, tb2.field
FROM tb1 RIGHT OUTER JOIN tb2
ON condition;

要点:
1.外联结的行数 = 主表的行数 + 从表的重复行数
2.左外联结和右外联结本质上是一样的。

四. 复合查询

包括以下内容:

  1. 定义
  2. 要点
  3. 语法
  • 定义

“复合查询”(compound query),又称作“并查询”(union query):将多个SELECT查询合并,以单个查询结果集返回。

  • 要点

1.应用场景——适用于复杂的并行条件查询。
2.检索规则——UNION中的每个查询,必须包含相同的列、表达式、聚集函数。
3.数量限制——不限制,但过多的查询合并影响查询效率。
4.结果行为——查询结果集默认去重,可以使用UNION ALL改变默认行为。

  • 语法
// 去重
SELECT * FROM tb WHERE condition1
UNION
SELECT * FROM tb WHERE condition2
UNION
SELECT * FROM tb WHERE condition3
...;

// 不去重
SELECT * FROM tb WHERE condition1
UNION
SELECT * FROM tb WHERE condition2
UNION ALL
SELECT * FROM tb WHERE condition3 // 该条查询结果,会被完整的返回
...;

Bye