oracle数据库:select基本语法【简单查询】

这里介绍一下select基本结构和简单查询

1,select结构

select 字段名 from 表名  条件

用文字描述就是通过什么条件在哪个表里面查询哪个字段的信息。
在进行查询操作之前,先看看提前准备的数据表:

在这里插入图片描述
这个数据来源于:点我获取上表数据
我使用的客户端是PLSQL,没有客户端的直接用cmd界面操作也行,只是看不到可视化界面而已,实际效果不影响,在PLSQL里面:
文件-->新建-->SQL窗口打开命令行界面

在这里插入图片描述

2,简单查询:

2.1,查询所有信息:

select * from student;
*表示查询所有信息,sql语句以结尾,不写容易报错
在这里插入图片描述

2.2,查询表中某个字段的信息,比如age

select age from student;

PLSQL运行的时候要选中某一行sql代码运行,不然会直接运行整个sql界面的语法。
在这里插入图片描述
如上图所示,查询结果只显示age的,表中age是大写的,因为oracle数据库语法不区分大小写,且默认是大写的,不过要注意的是,数据是区分大小写的。

2.3,查询表中多个字段的数据:

select name,math from student;

查询结果如下图所示,查询多个字段的时候,字段之间用英文逗号隔开,并且查询结果是根据字段的前后顺序展示的,比如这里name在前,math在后,那么查询的结果也是这个顺序,可以根据这个规律自行调整查询结果的字段显示顺序。
在这里插入图片描述

3,去重、别名和排序

3.1 去重

目标:查询所有的数学成绩【重复的成绩只显示一个】:

select math from student;

结果如下图所示:
在这里插入图片描述
可以发现查询的结果之中出现了重复的数据,要去掉这些重复的数据,需要用到关键字distinct,语法:select distinct math from student;,结果如下图所示:
在这里插入图片描述

可以看到查询的数据中并没有重复的数据了。当然,如果多个字段去重,必须多个字段全部相同才能去重。select distinct math,english from student;,这里查询英语和数学成绩并且去重:
在这里插入图片描述
这里可以看到查询到了所有的数据,虽然单个math或者english有相同的成绩,但是math+english不是完全一样的,可以看出去重是针对一条数据记录完全相同才会生效。

3.2、 起别名

方法1:直接在字段后面接别名的名称
例子,查询name和math字段,并且给字段起别名为姓名,数学成绩:
select name 姓名,math 数学成绩 from student;,可以看到下图所示结果,查询的数据名称变成了我们设置的名称
在这里插入图片描述
方法2:使用as关键字,然后接别名名称
语法:select name as 姓名,math as 数学成绩 from student;,结果如下图所示:
在这里插入图片描述
可以看到跟刚才效果一样,这两种都可以实现,第一种更简单而已。

3.3,排序

例子:查询所有内容并且按照年龄字段从高到低排序:select * from student order by age desc;,其中desc表示降序排序,升序排序的关键字为ascorder by 后面接排序的标准,这里以年龄为排序的标准。结果如下图所示:
在这里插入图片描述
可以看到年龄是降序排序的,升序排序只需要把desc关键字换成asc即可。
在这里插入图片描述
可以发现相同年龄的,数学成绩并不一样,可以在这个基础上,根据数学成绩再次排序

select * from student order by age asc,math desc;

这句sql的意思是查询表中所有内容,其中以age为排序标准进行升序排序,如果age相同的时候,以math成绩进行降序排序,结果如下图所示:
在这里插入图片描述
这里要注意,只有第一个字段相同的时候,才会执行第二个字段。如果排序关键字没有写,则默认是asc升序排序。

4、伪列和虚表

4.1 伪列和表达式

说明:查询不存在的列就是伪列,当需要的结果不能直接从表中得到,需要经过计算来展示则可以使用伪列+表达式来实现
来看一个例子

select name,math,1 from student;

这句语法里面要查询字段名字为1的内容,实际上表里面并没有这个字段。
在这里插入图片描述
如上图所示,表里面并没有1这个字段,但是查询的时候自动拼接在了结果集后面,这种在原表里面并不存在的列,就叫做伪列。
接下来做一个例子,查询学生的姓名,年龄,以及平均分,(math+english)/2 当成平均分,因为表中没有平均分这个字段,所以需要用伪列来实现这个。

select name,age,(math+english)/2 平均分 from student;

这里增加一行伪列,并且给伪列起了别名叫做平均分,结果如下图所示
在这里插入图片描述
如果不起别名,默认伪列名为字段的样子,这里就是(math+english)/2,并且是英文大写的样式,这里不展示。

4.2,null处理

在进行数据处理的时候,比如加法,如果有一方为null,则结果是null,按照正常逻辑来想,加法如果一方为空,应该默认它的值是0,比如88+null=88,这是我们希望的。因为我的数据都设置了not null,就不展示具体图,只记录一下处理方法:nvl():处理null值的方法,可以传两个参数。
例如nvl(math,res),表示如果math成绩不是空,就返回math原本的值,如果为null值,就返回res这个值,比如把res设置为0

在这里插入图片描述
上图是网上找的一个例子图片。
在进行升序或者降序排序的时候,也会遇到null的问题,比如进行降序排序的时候,如果有null值,null值会在最上面,然后再进行降序排序,比如下图【网图例子】

在这里插入图片描述
但是我们就想让null值在最下面,怎么办呢?
可以使用nulls first / nulls last来实现控制

在这里插入图片描述
顾名思义,nulls first就是null值排在前面,nulls last就是排在后面。

4.3,字符串拼接

这里进行拼接的内容可以是数字或者字符,拼接符号为:||
例子:查询学生的姓名,姓名后面拼接一个a,这个起别名叫做a名字

select name,name||'a' a名字 from student;

这个a名字列其实是一个伪列,结果如下图所示:
在这里插入图片描述
这里有个小的注意点,sql里面字符要用单引号,双引号会报错。
当然还能进行其他的拼接,这里不一 个个展示了,有必要说一下如果拼接的对象有一方是null值,则自动变成一个空的内容,比如name||null结果是name,如下图【网图例子】

在这里插入图片描述

4.4,虚表:

oracle里面有一个虚表叫做dual,是用来构成select的语法规则,oracle保证dual里面永远只有一条记录。该表只有一行一列,它和其他表一样,可以执行插入、更新、删除操作,还可以执行drop操作,但是千万别随便drop表,否则会使系统不能用,起不了数据库【这是只能重新安装】。dual主要用来选择系统变量或者是求一个表达式的值。如果我们不需要从具体的表来取得表中的数据,而是单纯的得到一些我们想要的信息,并且要通过select来完成时,就要借助一个对象,这个对象就是dual

select * from dual;

结果如下图所示:
在这里插入图片描述
我们还能借助虚表来计算一些数值,比如计算999*666

select 999*666 from dual;

结果如下所示:
在这里插入图片描述
但是如果我们查询dual表中的数据,会发现里面的值并没有改变:
在这里插入图片描述
简单查询小总结:
查询表中所有记录: select * from 表名;
查询某些字段的记录:select 字段1,字段2... from 表名;
去重: distinct
别名:字段 别名字段 as 别名
伪列:表达式,例如(math+english)/2
排序:order by desc,默认为order by asc
null处理:nvl(exp,res)
字符串拼接:name||age
nulls:nulls firstnulls last

语法解析顺序:

select  ...  from ... order by 
  1. 首先找到from后面这张表,知道要从哪里找数据
  2. 然后执行select,知道要从表里面找哪些数据
  3. 然后才是order by,对结果集进行排序。

根据这个原理,最后来看一个例子:

select name,age,(math+english)/2 平均分 from student order by (math+english)/2 desc;

这个语法是查询平均分并且按照降序排序
在这里插入图片描述
上图是结果,思考一下,如果先执行了from studentselect ... 语句,那么是不是别名已经生效了,这时候order by后面是不是可以接别名:

select name,age,(math+english)/2 平均分 from student order by 平均分 desc;

看看结果:
在这里插入图片描述
如上图所示,确实可以这样操作,而是也验证了sql语句的执行顺序。

Guess you like

Origin blog.csdn.net/will__be/article/details/117439648