SQL Select查询原理--查询语句执行原则(基础)

简介: 原文地址:点击打开链接1.单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的);然后根据SELECT的选择列选择相应的列进行返回最终结果。1)简单的单表查询SELECT 字段 FROM 表名 WHERE 条件表达式        那它们是按什么顺序执行呢?分析器会先看语句的第一个词,当它发现第一个词是SELECT关键字的时候,它会跳到FROM关键

原文地址:点击打开链接

1.单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的);然后根据SELECT的选择列选择相应的列进行返回最终结果。

1)简单的单表查询

SELECT 字段 
FROM 表名 
WHERE 条件表达式

        那它们是按什么顺序执行呢?分析器会先看语句的第一个词,当它发现第一个词是SELECT关键字的时候,它会跳到FROM关键字,然后通过FROM关键字找到表名并把表装入内存。接着是找WHERE关键字,如果找不到则返回到SELECT找字段解析,如果找到WHERE,则分析其中的条件,完成后再回到SELECT分析字段。最后形成一张我们要的虚表。
        WHERE关键字后面的是条件表达式。如果学过C语言等编程语言就会知道,条件表达式计算完成后,会有一个返回值,即非0或0,非0即为真(true),0即为假(false)。同理WHERE后面的条件也有一个返回值,真或假,来确定接下来执不执行SELECT

例: 

SELECT * 
FROM STUDENT 
WHERE SNO = '1';

        分析器先找到关键字SELECT,然后跳到FROM关键字将STUDENT表导入内存,并通过指针p1找到第一条记录,接着找到WHERE关键字计算它的条件表达式,如果为真那么把这条记录装到一个虚表当中,p1再指向下一条记录。如果为假那么p1直接指向下一条记录,而不进行其它操作。一直检索完整个表,并把虚表返回给用户。

       再说EXISTS谓词,EXISTS谓词也是条件表达式的一部分。当然它也有一个返回值(true或false)。

例: 

SELECT Sname 
FROM Student 
WHERE EXISTS 
(SELECT * 
FROM SC 
WHERE SC.Sno = Student.Sno AND SC.Cno = '1');

        这是一个SQL语句的嵌套使用,但和上面说的SQL语句的执行过程也是相同的。嵌套的意思也就是说当分析主SQL语句(外面的那个SELECT)到WHERE关键字的时候,又进入了另一个SQL语句中。那么也就是说,分析器先找到表Student并装入内存,一个指针(例如p1)指向Student表中的第一条记录。然后进入WHERE里分析里面的SQL语句,再把SC表装入内存,另一个指针(例如p2)指向SC表中的第一条记录,分析WHERE后面的条件表达式,依次进行分析,最后分析出一个虚表2,也就变成

SELECT Sname 
FROM Student 
WHERE EXISTS 虚表2

        如果虚表为空表,EXISTS 虚表2 也就为false,不返回到SELECT,而p1指向下一条记录。如果虚表2不为空也就是有记录,那么EXISTS 虚表2 为true同,返回到SELECT并把p1指向的记录添加到主SQL语句的虚表1当中。(这也是为什么嵌套的SQL语句SELECT 后面为一般为*的原因,因为它EXISTS返回的只是真或假,字段的名没有意义,用*就行,当然用别的也不会错。 )

        注意,这里虽然嵌套的SQL语句分析完了,但主SQL语句只执行了一遍,也就是说p1指向Student的第一条记录,p1还要再指向Student表的下一条记录并分析,这样又进入了嵌套中的SQL语句,同上面说的一样分析。当p1也到了Student表的结尾,整个SQL语句结束。返回虚表1Sname这一列。

         嵌套就像:

for(int i = 0,i < n, ++i) 
for(int j = 0, j < n, ++j)

2,两表连接查询:对两表求积(笛卡尔积)并用ON条件和连接连接类型进行过滤形成中间表;然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果。

3.多表连接查询:先对第一个和第二个表按照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,直到所有的表都连接上为止,最终形成一个中间的结果表,然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果.

4.不同类型的连接查询什么时候用

查两表关联列相等的数据用内连接。
左表的连接列是右表的子集时用右外连接。
右表的连接列是左表的子集时用左外连接。
左表的连接列和右表的连接列彼此有交集但彼此互不为子集时候用全外。
求差操作的时候用联合查询。
多个表查询的时候,这些不同的连接类型可以写到一块。
ON只进行连接操作,WHERE只过滤中间表的记录


拓展:点击打开链接

目录
相关文章
|
9月前
|
存储 SQL 缓存
SQL优化实战-0002:select查询不建议使用星号(select *),最好指定具体查询字段
SQL优化实战-0002:select查询不建议使用星号(select *),最好指定具体查询字段
195 0
|
SQL 关系型数据库 MySQL
MySQL 数据库使用SQL SELECT语句来查询数据。
MySQL 数据库使用SQL SELECT语句来查询数据。
127 0
|
SQL 关系型数据库 MySQL
软件测试mysql面试题:编写SQL SELECT查询,该查询从Employee_Details表返回名字和姓氏。
软件测试mysql面试题:编写SQL SELECT查询,该查询从Employee_Details表返回名字和姓氏。
82 0
【sql语句基础】——查(select)(合并查询)
【sql语句基础】——查(select)(合并查询)
【sql语句基础】——查(select)(合并查询)
|
SQL 关系型数据库 MySQL
Mysql常用sql语句(3)- select 查询语句基础使用
Mysql常用sql语句(3)- select 查询语句基础使用
119 0
Mysql常用sql语句(3)- select 查询语句基础使用
|
SQL 存储 关系型数据库
SQL索引建立原则和使用
SQL索引建立原则和使用
462 0
|
SQL 关系型数据库 MySQL
SQL优化 MySQL版 - 避免索引失效原则(一)
SQL优化 MySQL版 - 避免索引失效原则(一) 避免索引失效原则(一) 精力有限,剩余的失效原则将会在 《避免索引失效原则(二)》中连载出来,请谅解 作者 : Stanley 罗昊 【转载请注明出处和署名,谢谢!】 避免索引失效的一些原则 我们编写SQL语句后会进行添加一些索引进行优化,但.
3745 0
|
SQL 关系型数据库 MySQL
阿里P8架构师细谈:MySQL数据库的索引原理、与慢SQL优化的5大原则
  MySQL凭借着出色的性能、低廉的成本、丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库。虽然性能出色,但所谓“好马配好鞍”,如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位描述上看到诸如“精通MySQL”、“SQL语句优化”、“了解数据库原理”等要求。
2139 0