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。
二. 子查询
包括以下内容:
- “子查询”的定义
- 表别名
- 要点
- 语法
- 定义
“子查询”(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);
三. 联结
包含以下内容:
- 关系型数据库基础
- 外键介绍
- 联结的定义、应用
- 联结类型
- 各种联结的语法
- 关系型数据库基础
首先,我们要知道当大量数据在一起时,会出现以下情况:
- 不能只检索特定的数据,浪费性能。
- 产生大量重复的数据,浪费存储。
- 数据不易维护,无法便捷的修改某类数据。
然后,“关系型数据库”的主张,是将数据根据某些共同的特征,分解在不同的表中。通过表与表之间的共同点,建立联系,以保证数据的完整性、一致性。它的优点如下:
- 检索数据具有针对性,提升效率。
- 减少重复数据,优化存储。
- 解耦数据之间的强联系,易于维护。
- 建立清晰的数据层次模型。
- 外键
外键(foreign key):用于对外建立表的引用关系的字段的别名。
例子:
表B的一个字段引用表A的主键值。通过该字段,表B对表A产生了约束。此时,该字段就是表B的“外键”。
要点:
- 外键约束,是为了保证数据的完整性。
- 外键约束,是数据库自身强制的,因此它是可靠的。
- 外键约束,不等同于人为的建立表的公共字段,人为建立的约束,往往由应用程序控制,一旦应用程序出现漏洞,那么这种约束就显的不够可靠。
- 联结的定义
“联结”是一种机制,允许在一条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.左外联结和右外联结本质上是一样的。
四. 复合查询
包括以下内容:
- 定义
- 要点
- 语法
- 定义
“复合查询”(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