关于SQL的SELECT查询语句的⼀般格式的描述2021-05-19⽬录
正⽂之前的闲话
前⼏天在问答区看到有道友问怎么把多个查询语句的查询结果横向合并为⼀个查询结果。所以想写⼀下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的计数与的计数的差值
select count(lb.sxh)-)
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)-)
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');select语句查询日期
--查询request表符合id⼤于1000的记录中id重复的记录
select id from request where id > 1000 group by id having count(*)>1;
通过例⼦,我们可以了解到只要掌握了SELECT语句的⼀般格式和SQL常⽤表达式,就可以⾃⾏在SELECT语句各个部位套⽤相关语句,从⽽最⼤限度的实现⾃⼰想要的查询结果。当然,还需要了解查询语句的执⾏过程,从⽽了解SQL的性能是否合适,尽量不写消耗资源太⼤的查询语句。如果是开发应⽤程序⽤到的的SELECT语句,建议还是尽量简洁、不使⽤过于复杂的表达式来查询数据,这样⼀是便于维护,⼆是把数据表达式的⼯作交给应⽤程序,这样可以减轻数据库服务端的压⼒。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。