当前位置:网站首页>关于SQL的SELECT查询语句的一般格式的描述2021-05-19

关于SQL的SELECT查询语句的一般格式的描述2021-05-19

2022-08-09 09:29:00 我一时想不起

目录

正文之前的闲话

关于查询语句

查询语句的语法

 写几个例子


正文之前的闲话

前几天在问答区看到有道友问怎么把多个查询语句的查询结果横向合并为一个查询结果。所以想写一下SQL语句的SELECT有关语法的学习心得供各位想简单了解SQL的同仁参考。我的学习的教材主要还是王珊老师写的数据库系统概论(第四版),以及多年工作的“毒打”所积累的不多的经验(经验主要来自Oracle DBMS,以下书写的SQL语句示例有可能少部分是Oracle的“方言”)。

关于查询语句

SQL(标准化查询语言)我就不多介绍了,这里我将其定位为关系型数据库(SQLsever、MySQL、Oracle、PostgreSQL等)的操纵语言。在一个数据库系统中涉及到的SQL语句中,个人认为SELECT查询语句应该是使用的最频繁的的语句了。利用SELECT语句可以查询出各种数据列表.

查询语句的语法

为了阅读方便,下面用小写字母来写SQL语句。SELECT语句的一般格式(这里的格式参考了书中的写法):

--以下是SQL92标准的伪码
select 
  [all|distinct]
  <目标列的表达式1> [别名],
  <目标列的表达式2> [别名]...
  from <表名或视图名> [别名],<表名或视图名> [别名]...
  [where<条件表达式>]
  [group by <列名> [having <条件表达式>]]
  [order by <列名> [asc|desc]];

--以下是SQL99标准的伪码
select 
  [all|distinct]
  <目标列的表达式1> [别名],
  <目标列的表达式2> [别名]...
  from <表名或视图名> [别名], [join] <表名或视图名> [别名] on [连接条件]...
  [where<条件表达式>]
  [group by <列名> [having <条件表达式>]]
  [order by <列名> [asc|desc]];

解释:

 [all|distinct]:

描述查询结果是否去除重复的记录。
  <目标列的表达式1> [别名],:

此处表达式可以是*、表名.*、count(*)、表名.字段名、函数(表名.字段名)、表名.字段名[运算符号]表名.字段名、也可以是另一个具有的单行返回值的查询语句
 <表名或视图名> [别名]:

此处可以是表名、视图名、或者直接是另外一个查询语句(相当于是视图)。在SQL99标准中,[join]表示是连接查询的查询符号,一般有inner join、 left join、 right join、full join 等,[on]后面跟连接条件,连接条件可以是等值表达式(a=b)、不等值表达式(a>b)、表名.字段名[运算符号]表名.字段名(a-b>1)、in、exists、like等等,多个条件用 and 或者 or 连接起来。简言之,这里的表达式和where条件的写法差不多。SQL92中直接用逗号隔开多个表名,连接条件写在where字符之后。
  [where<条件表达式>]

此处的写法和上述的[on]后的表达式写法类似,不同的地方是执行顺序不同,一个查询DBMS先执行from子句,后执行where子句。这个决定了哪些条件写在on后,哪些写在where后。从使用经验上来说,on后不要写模糊的条件,这样会导致查询结果集出现意想不到的情况、一般表现为匹配不到想要的结果且返回行数巨大。
  [group by <列名> [having <条件表达式>]]

group by 子句部分,用于书写一个或多个字段从而对前面的语句的查询结果进行分组,having是对分组结果进行筛选。从经验上说,having后尽量只写分组结果的筛选条件,不写可以写在where子句后的条件。
  [order by <列名> [asc|desc]];

order by 部分,对前面的查询结果进行排序。这个写法一般比较单一。稍微复杂点的形式可以是:order by a asc,b desc 表示先以a为依据排正序,然后不改变a的排序的情况下,对前面的结果再以b排倒序。

 写几个例子

--以下都是oracle中可以执行的语句,其他平台不一定可以执行

--无条件查询conversion表或视图的全部字段列表
select * from conversion;

--查询requst 表中符合id='20200617'的age和name列表
select age,name from requst where id='20200617';

--查询v$sql视图中module以‘K’开头的并且sql_text包含select的列表,并以LAST_ACTIVE_TIME排倒序
select * from v$sql where module like'K%' and sql_text like '%select%' order  by LAST_ACTIVE_TIME desc

--查询rlb lb表和ssbd sbd的id和uuid都相等、且度和lb.id='20200618'的lb.sxh的计数与sbd.tc的计数的差值
select count(lb.sxh)-count(sbd.tc)
 from  rlb lb left join ssbd sbd
 on lb.id=rpad(sbd.id,'20',' ') and lb.uuid=rpad(sbd.uuid,'40',' ')
 where lb.id='20200618'

--上一个查询语句的符合SQL92的写法,尽量少用SQL92的写法,但是要能看懂
select count(lb.sxh)-count(sbd.tc)
 from  rlb lb , ssbd sbd
 where lb.id=rpad(sbd.id,'20',' ')(+) and lb.uuid=rpad(sbd.uuid,'40',' ')(+)
 and lb.id='20200618'

--将两个不同的返回单行数据的查询语句的结果“横向拼接”
select (select sum(je) from mx where id='06140002')-(select sum(je) from requst where  id='06140002') from dual;

--以表达式为分组依据的的分组语句,in后适合跟少量数组的表达式,一定场合下可以替代or语句。
select to_char(jysj,'yyyy-mm-dd') jysj,sum(jyjg) zje 
from jy
where to_char(jysj,'yyyy-mm-dd') in ('2020-08-25','2020-08-24','2020-08-21','2020-08-20') group by to_char(jysj,'yyyy-mm-dd');

--查询request表符合id大于1000的记录中id重复的记录
select id from request where id > 1000 group by id having count(*)>1;

通过例子,我们可以了解到只要掌握了SELECT语句的一般格式和SQL常用表达式,就可以自行在SELECT语句各个部位套用相关语句,从而最大限度的实现自己想要的查询结果。当然,还需要了解查询语句的执行过程,从而了解SQL的性能是否合适,尽量不写消耗资源太大的查询语句。如果是开发应用程序用到的的SELECT语句,建议还是尽量简洁、不使用过于复杂的表达式来查询数据,这样一是便于维护,二是把数据表达式的工作交给应用程序,这样可以减轻数据库服务端的压力。

原网站

版权声明
本文为[我一时想不起]所创,转载请带上原文链接,感谢
https://blog.csdn.net/wzw114/article/details/117048877