这里介绍一下select基本结构和简单查询
1, select
结构
select
select 字段名 from 表名 条件
用文字描述就是通过什么条件在哪个表里面查询哪个字段的信息。
在进行查询操作之前,先看看提前准备的数据表:
这个数据来源于:点我获取上表数据
我使用的客户端是
PLSQL
,没有客户端的直接用
cmd
界面操作也行,只是看不到可视化界面而已,实际效果不影响,在
PLSQL
里面:
文件-->新建-->SQL窗口
打开命令行界面
2,简单查询:
2.1,查询所有信息:
select * from student;
*
表示查询所有信息,
sql
语句以
;
结尾,不写容易报错
2.2,查询表中某个字段的信息,比如 age
:
age
在
PLSQL
运行的时候要选中某一行sql代码运行,不然会直接运行整个
sql
界面的语法。
如上图所示,查询结果只显示
age
的,表中
age
是大写的,因为
oracle
数据库语法不区分大小写,且默认是大写的,不过要注意的是,数据是区分大小写的。
2.3,查询表中多个字段的数据:
查询结果如下图所示,查询多个字段的时候,字段之间用英文逗号隔开,并且查询结果是根据字段的前后顺序展示的,比如这里
name
在前,
math
在后,那么查询的结果也是这个顺序,可以根据这个规律自行调整查询结果的字段显示顺序。
3,去重、别名和排序
3.1 去重
目标:查询所有的数学成绩【重复的成绩只显示一个】:
结果如下图所示:
可以发现查询的结果之中出现了重复的数据,要去掉这些重复的数据,需要用到关键字
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
表示降序排序,升序排序的关键字为
asc
,
order by
后面接排序的标准,这里以年龄为排序的标准。结果如下图所示:
可以看到年龄是降序排序的,升序排序只需要把
desc
关键字换成
asc
即可。
可以发现相同年龄的,数学成绩并不一样,可以在这个基础上,根据数学成绩再次排序:
这句
sql
的意思是查询表中所有内容,其中以
age
为排序标准进行升序排序,如果
age
相同的时候,以
math
成绩进行降序排序,结果如下图所示:
这里要注意,只有第一个字段相同的时候,才会执行第二个字段。如果排序关键字没有写,则默认是
asc
升序排序。
4、伪列和虚表
4.1 伪列和表达式
说明:查询不存在的列就是伪列,当需要的结果不能直接从表中得到,需要经过计算来展示则可以使用
伪列+表达式
来实现
来看一个例子:
这句语法里面要查询字段名字为
1
的内容,实际上表里面并没有这个字段。
如上图所示,表里面并没有
1
这个字段,但是查询的时候自动拼接在了结果集后面,这种在原表里面并不存在的列,就叫做伪列。
接下来做一个例子,查询学生的姓名,年龄,以及平均分,
(math+english)/2
当成平均分,因为表中没有平均分这个字段,所以需要用伪列来实现这个。
这里增加一行伪列,并且给伪列起了别名叫做
平均分
,结果如下图所示
如果不起别名,默认伪列名为字段的样子,这里就是(math+english)/2,并且是英文大写的样式,这里不展示。
4.2,null处理
在进行数据处理的时候,比如加法,如果有一方为
null
,则结果是
null
,按照正常逻辑来想,加法如果一方为空,应该默认它的值是
,比如
88+null=88
,这是我们希望的。因为我的数据都设置了
not null
,就不展示具体图,只记录一下处理方法:
nvl():处理null值的方法,可以传两个参数。
例如
nvl(math,res)
,表示如果
math
成绩不是空,就返回
math
原本的值,如果为
null
值,就返回
res
这个值,比如把
res
设置为
。
上图是网上找的一个例子图片。
在进行升序或者降序排序的时候,也会遇到
null
的问题,比如进行降序排序的时候,如果有
null
值,
null
值会在最上面,然后再进行降序排序,比如下图【网图例子】
但是我们就想让
null
值在最下面,怎么办呢?
可以使用
nulls first
/
nulls last
来实现控制
顾名思义,
nulls first
就是
null
值排在前面,
nulls last
就是排在后面。
4.3,字符串拼接
这里进行拼接的内容可以是数字或者字符,拼接符号为:
||
例子:查询学生的姓名,姓名后面拼接一个
a
,这个起别名叫做
a名字
:
这个
a名字
列其实是一个伪列,结果如下图所示:
这里有个小的注意点,
sql
里面字符要用单引号,双引号会报错。
当然还能进行其他的拼接,这里不一 个个展示了,有必要说一下如果拼接的对象有一方是
null
值,则自动变成一个空的内容,比如
name||null
结果是
name
,如下图【网图例子】
4.4,虚表:
oracle
里面有一个虚表叫做
dual
,是用来构成
select
的语法规则,
oracle
保证
dual
里面永远只有一条记录。该表只有一行一列,它和其他表一样,可以执行插入、更新、删除操作,还可以执行
drop
操作,但是千万别随便
drop
表,否则会使系统不能用,起不了数据库【这是只能重新安装】。
dual
主要用来选择系统变量或者是求一个表达式的值。如果我们不需要从具体的表来取得表中的数据,而是单纯的得到一些我们想要的信息,并且要通过
select
来完成时,就要借助一个对象,这个对象就是
dual
。
结果如下图所示:
我们还能借助虚表来计算一些数值,比如计算
999*666
:
结果如下所示:
但是如果我们查询
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 first
,
nulls last
语法解析顺序:
- 首先找到
后面这张表,知道要从哪里找数据from
- 然后执行
,知道要从表里面找哪些数据select
- 然后才是
,对结果集进行排序。order by
根据这个原理,最后来看一个例子:
这个语法是查询平均分并且按照降序排序
上图是结果,思考一下,如果先执行了
from student
和
select ...
语句,那么是不是别名已经生效了,这时候
order by
后面是不是可以接别名:
看看结果:
如上图所示,确实可以这样操作,而是也验证了
sql
语句的执行顺序。