SQL语句怎样返回查询结果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL语句怎样返回查询结果相关的知识,希望对你有一定的参考价值。

C# SQL语句是这样的,“select count(*) from Student”,其中Student是表名,是学生的一些信息,想通过这个语句查询出总共有多少学生,并将结果显示在界面上,怎么做,谢谢

string connString = "server=127.0.0.1;uid=sa;pwd=;database=TJPTTC";   SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = conn.CreateCommand();     
           //sql语句     
           cmd.CommandText = "select count(*) cnt from Student";     
SqlDataReader dr = cmd.ExecuteReader();     
           dr.Read();
          String count = dr["cnt"].toString();   // 这个就是你要的个数
           //关闭连接     
           conn.Close();

参考技术A string connString = "server=127.0.0.1;uid=sa;pwd=;database=TJPTTC"; SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = conn.CreateCommand();
//sql语句
cmd.CommandText = "select count(*) cnt from Student";
SqlDataReader dr = cmd.ExecuteReader();
dr.Read();
String count = dr["cnt"].toString(); // 这个就是你要的个数
//关闭连接
conn.Close();
参考技术B 把语句改成:
select * from Student
参考技术C 你想显示的结果是多少学生还是所有学生的信息?

sql查询语句并不是最先执行SELECT

很多的SQL查询语句都是以SELECT关键字开始的,所以我们很容易会以为SQL查询语句就是最先执行的SELECT。不过,当我尝试跟别人解释什么是窗口函数的时候,针对是否可以对窗口函数返回的结果进行过滤这个问题,最终得出的结论是窗口函数的执行必须在WHERE子句和GROUP BY子句之后,所以不能对窗口函数返回的结果进行再次过滤。于是我又想到了另一个问题:SQL查询的执行顺序究竟是怎样的?

这个问题好像应该很好回答,毕竟自己已经写了成千上万个SQL查询了,其中的一些还很复杂。但事实是,我仍然很难确切地说出它的顺序是怎样的。

SQL查询语句的执行顺序

于是我研究了一下,发现在SQL语句的执行顺序中,SELECT并不是最先执行的,而是在第五个。

上面这张图与SQL查询语句的语义有关,能让你知道一个查询会返回什么,并回答了以下这些问题:

1.可以在GROUP BY之后使用WHERE吗?(不行,WHERE是在GROUP BY之前!)

2.可以对窗口函数返回的结果进行过滤吗?(不行,窗口函数是SELECT语句里,而SELECT是在WHERE和GROUP BY之后)

3.可以基于GROUP BY里的东西进行ORDER BY吗?(可以,ORDER BY基本上是在最后执行的,所以可以基于任何东西进行 ORDER BY)

4.LIMIT是在什么时候执行?(在最后!)

但数据库引擎并不一定严格按照这个顺序执行SQL查询,因为它们为了更快地执行查询,会对执行顺序做出一些优化。也就是说,当涉及查询性能或者与索引有关的东西时,这张图就不适用了。

混合因素:列别名

有很多SQL实现允许你使用这样的语法:

SELECT CONCAT(first_name, \' \', last_name) AS full_name, count(*)
FROM table
GROUP BY full_name

从这个语句来看,好像GROUP BY是在SELECT之后执行的,因为它引用了SELECT中的一个别名。但实际上不一定要这样,数据库引擎可以把查询重写成这样:

SELECT CONCAT(first_name, \' \', last_name) AS full_name, count(*)
FROM table
GROUP BY CONCAT(first_name, \' \', last_name)

这样GROUP BY仍然先执行,另外数据库引擎还会做一系列检查,确保SELECT和GROUP BY中的东西是有效的,所以会在生成执行计划之前对查询做一次整体检查。

数据库可能不按顺序执行查询(优化)

在实际当中,数据库不一定会按照JOIN、WHERE、GROUP BY的顺序来执行查询,因为它们会进行一系列优化,把执行顺序打乱,从而让查询执行得更快,只要不改变查询结果。

下面这个查询说明了为什么需要以不同的顺序执行查询:

SELECT *
FROM owners 
    LEFT JOIN cats
        ON owners.id = cats.owner
WHERE cats.name = \'tommy\'

如果只需要找出名字叫tommy的猫,那就没必要对两张表的所有数据执行左连接,而是应该在连接之前先进行过滤,这样查询会快得多。而且对于这个查询来说,先执行过滤并不会改变查询结果。因此在这里数据库引擎会根据执行效率最优对执行顺序进行优化,生成相对应的执行计划方案。

 

"不要眼眶一红,就觉得人间不值得。"

以上是关于SQL语句怎样返回查询结果的主要内容,如果未能解决你的问题,请参考以下文章

sql语句怎样将查询结果逗号分开

VB中怎样把sql语句的查询结果赋值给一个变量

SQL server 两个查询结果拼接成一个,语句改怎样修改?

SQL 语句在数据库中是怎样执行的

将查询结果集插入数据表的SQL语句怎样写?

sql查询语句并不是最先执行SELECT