《SQL学习指南》C3-C4

C3 简单查询

3.1 查询机制

在这里插入图片描述
当输入完密码后,服务器一旦通过了对应户名和密码的验证,则为用户建立一个数据库连接,该连接从应用程序发出请求后一直保持,直到连接被断开

MySQL服务器会给每个连接一个标识符,它会在登录时显示
Your MySQL connection id is 121
在发生异常情况时,该信息可能会给数据库管理员带来帮助,比如手动结束运行了几个小时的有问题查询

在服务器验证完用户名和密码后,并且创建连接后,用户就可以执行查询了,每当有查询被发送到服务器,服务器在执行该语句前都会进行检查:

1,用户是否有权限执行该语句
2,用户是否有权限访问目标数据
3,语句的语法是否正确

当查询语句通过这3个检测后,就会被传递给查询优化器,它负责为查询找到最有效率的执行方式,优化器通常会做诸如确认FROM子句后面各表的连接顺序,或是可以使用哪些索引之类的工作,然后会选择一个执行方案,以供服务器执行查询,服务器查询结束后就会返回一个结果集,结果集本质上就是一种包含行和列的表

3.2 SELECT 子句

SELECT子句是SELECT语句的第一个组成部分,但在实际在数据库服务中,SELECT子句是最后被评估的,为了确定结果集最后包含哪些列之前,先要知道结果集可能包含哪些列
在这里插入图片描述
对于这个简单的查询,服务器通过FROM子句先确定了可能存在的列,再通过SELECT子句找到需要的列,即SELECT子句用于在所有可能的列中,选择查询结果集要包含哪些列

也可以在SELECT子句中添加:

1,字符,如数字或字符串
2,表达式,如amount * -1
3,调用内建函数,如ROUND(amount,2)
4,用户自定义的函数调用

在这里插入图片描述
如果只是需要执行一个内建函数或对简单的表达式求值可以完全忽略FROM子句,如:
在这里插入图片描述
上述查询只是调用了3个内建函数,并没有从任何表中获取数据,因此不需要使用FROM子句

也可以通过AS关键字为列指定别名,AS可以忽略:
在这里插入图片描述
还可以通过DISTINCT关键字去除重复的行:
在这里插入图片描述
在这里插入图片描述
注:
要产生无重复的结果集需要首先对数据排序,这对于大的结果集来说是相当耗时的,因此不要为了确保重复行而随意地使用DISTINCT,而是应该先了解所使用地数据是否可能包含重复行,减少对DISTINCT的不必要使用

3.3 FROM 子句

FROM子句定义了查询中所使用的表,以及连接这些表的方式

表的类型有3种:

1,永久表,即使用create table语句创建的表
2,临时表,子查询所返回的表
3,虚拟表,使用create view子句创建的表

临时表
即子查询所返回的表,子查询指的是包含在另一个查询中的查询,子查询可以出现在SELECT语句内的各个部分,并且在圆括号内,在FROM字句内,子查询的作用是根据其它查询子句产生临时表
在这里插入图片描述
示例中,先通过子查询在表employee中查询了5个列产生一个临时表并取别名为e,再通过外层的SELECT语句在e中查询3个列

视图
视图是存储在数据字典中的查询,它像一张表,但实际上并不拥有任何数据
在这里插入图片描述
当视图被创建后,并没有产生任何数据,服务器只是简单地保留该查询以供使用,创建视图可能需要对用户隐藏列,简化数据库设计等等

FROM子句中的多表连接
如果FROM子句中出现了多个表,那么要求同时包含各表之间的连接条件
在这里插入图片描述
上述示例在FROM子句中连接两个表的连接条件由FROM子句中的on子句指定
在当单个查询中连接多个表时,
需要在SELECT, WHERE, GROPU BY, HAVING, HAVING
等子句中指明是哪张表

3.4 WHERE子句

WHERE子句用于在结果集中过滤掉不需要的行
在这里插入图片描述
在需要时WHERE子句也可以同时包括更多的条件,它们之间使用操作符and, or或not分隔
在这里插入图片描述

3.5 GROUP BY子句,HAVING子句

前面的查询都是直接从数据库中提取数据,并没有对数据加工,可以在让服务器在返回结果集之前对数据进行一下提炼,可以使用GROUP BY子句,它用于根据列值对数据进行分组,通过HAVING子句对数据进行过滤

在这里插入图片描述

3.6 ORDER BY子句

通常情况下,查询的结果集返回的行并不以特定的顺序排列,如果需要对它们排序,则可以使用ORDER BY子句,ORDER BY子句用于对结果集中的原始列数据或是根据列数据计算的表达式结果进行排序
在这里插入图片描述
在这里插入图片描述
默认使用ORDER BY进行升序排序,可以通过关键字ASC和DESC指定是升序还是降序
在这里插入图片描述
根据表达式排序
在这里插入图片描述
上述示例通过RIGHT()函数,取得fed_id的最后3位,对此进行升序排序

根据数字占位符排序
也可以根据查询返回的第2个和第5个列排序
在这里插入图片描述
ORDER BY后出现多个值/表达式时,根据出现的先后顺序决定排序顺序

C4 使用WHERE子句过滤

4.1 条件评估

WHERE子句可能包含1个或多个条件,多个条件之间从AND或OR分隔

使用AND连接的WHERE子句:
在这里插入图片描述
使用OR连接的WHERE子句:
在这里插入图片描述

4.1.1 条件间使用圆括号

如果WHERE子句包含了3个或更多条件,且同时使用了and和or操作符,需要在多个条件之间用圆括号来表明意图,以提高句子的可读性

在这里插入图片描述
WHERE子句中包含的条件越多,服务器需要评估的中间结果就越多

4.1.2 减少not操作符的使用

对比两条语句:
在这里插入图片描述
在这里插入图片描述
这两条语句的含义和结果都是相同的,对于服务器来说是一样的,但对于开发者来说,使用not增加了条件评估的难度,所以尽量避免not操作符的使用

4.2 条件类型

有许多种方式来过滤不需要的字符串,如通过指定特定值,值集合,需要包含或排除的值的范围,以及对于字符串数据时,使用各种模式搜索技术来查找部分匹配

4.2.1 相等条件

相等条件:将一个表达式等同于另一个表达式
在这里插入图片描述
不等条件:判断两个表达式不相等
在这里插入图片描述

4.2.2 范围条件

在这里插入图片描述
当需要同时限制范围的上限和下限时,可以选择BETWEEN操作符,使用BETWEEN操作符规定的上下限是被包含在范围内的

在这里插入图片描述

字符串范围:除了使用日期或数字,也可以使用字符串作为搜索范围的条件
在这里插入图片描述

4.2.3 成员条件

某些情况下,不是需要限制表达式为特定值或某个范围的值,而是一个有限的集合,如在表中找出列值为特定值的所有行
在这里插入图片描述
有时需要检查一个表达式在表达式集合中是否存在,但有时还要检查它是否不存在
在这里插入图片描述

4.2.4 匹配条件

如果想要找到以T开头的姓式的员工,可以使用内建函数截取lname的第一个字母
在这里插入图片描述
尽管内建函数left()很好的发挥了作用,但它没有较好的灵活性,因此使用通配符构建搜索表达式是更好的做法

通配符
_ 代表一个未知字符
% 任意数目的字符(包括0)

在这里插入图片描述
上述采用通配符的搜索方式是:第一个位置随意,第二个位置必须是字符a,字符e必须出现在a之后最少一次

4.3 关键字NULL

使用NULL的场合:

1,为客户创建行时,他的消费金额未定义
2,为某个还未添加到数据库的产品创建账户
3,物品属性信息的不明确
...

使用NULL时,需要注意:

1,表达式可以为NULL,但不能等于NULL
2,两个NULL值彼此不能判断为相等

检查数据是否被赋值,可以使用NOT NULL
在这里插入图片描述
当使用不熟悉的数据库时,最好先确定表中哪些列可以允许为NULL,以便在过滤条件中采取适当的措施保证不会漏掉所需要的数据

猜你喜欢

转载自blog.csdn.net/weixin_43541094/article/details/113458389