基本的SQL SELECT语句

了解Oracle数据库的基本概念之后,现在开始介绍Oracle第一部分的内容,也即最简单的一部分内容,即增删改查的SQL语句。本文主要讲解Oracle基本的查询语句。
我们说过本机和虚拟机之间是能够进行通信的,所以以后有关Oracle系列的学习是基于在本机上访问虚拟机上的数据库。首先我在本机上以管理员的身份运行命令行窗口,然后输入命令sqlplus scott/[email protected]:1521/orcl,以scott用户的身份登录虚拟机上的orcl数据库,接着输入show user命令显示当前用户名
这里写图片描述
然后我们再来输入selecct * from tab;查看一下当前用户下的表有哪些?
基本的SQL SELECT语句_第1张图片
接着输入desc emp;命令看一下员工表(emp表)的结构:
基本的SQL SELECT语句_第2张图片
了解到这些最基本的信息之后,我们再来看最基本的查询语句。

  • 查询所有员工的信息

    select * from emp;

    可以发现在员工表里面一共有14条记录,但是大家注意到没有,查询出来的结果的排版格式不是特别好看,我们可以来调一下。先设置行宽,首先输入show linesize命令查看一下行的宽度是多少?
    这里写图片描述
    80表示的是一行上可以显示80个字符,空格也算,现在我们改一下,改成150:

    set linesize 150

    设置好行宽之后,我们也可以设置列的宽度,即每一列有多宽:

    col ename for a8
    • col:column,即列。
    • ename:列名,大小写不敏感。
    • for:format,即格式。
    • a8:意思是说姓名这个列的宽度是8个字符。
    col sal for 9999
    • 9999:用9来代表1位数字,既然有4位数字,那就是4个9了。

    上面的行宽和列宽设置好之后,我们来执行select * from emp;这条SQL语句,我们大可不必这么麻烦,可以仅输入/来达到同样的效果。
    基本的SQL SELECT语句_第3张图片
    可以看到查询出来的这个结果就更好看一些了。
    我们刚才写的*号代表的是所有的列,我们也可以通过列名来查询。

    select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp;

    效果如下:
    基本的SQL SELECT语句_第4张图片
    那这里就会产生一个问题,既然刚才写那个*号和写列的名字得到的结果是一样的,那么我们是使用列名的方式好昵?还是使用这种*号的方式好?这里涉及到SQL语句的优化原则(即我们写一个SQL语句,到底怎么写会比较好?)这个问题实际上就涉及到了数据库的调优优化问题了。这里我们就可以来说SQL语句的第一个优化原则了:

    • 查询的时候尽量使用列名。如:select ename,sal from emp;
      尽量使用列名的方式代替*号,也即说列名方式好,为什么昵?*号代表的是所有的列,针对不同的表,它所代表的列是不同的,如果你写的是*号,它就针对这张表去判断解析这个*号到底代表的是哪些列,而这个解析的过程是需要耗费时间的,所以它就比列名方式慢,列名的方式不需要去解析,直接去查就可以。
  • 查询某些具体的列
    除了查询所有的列,我们也可以查询某些具体的列,比如说查询员工信息,我只是查员工号,员工姓名和员工薪水。

    select empno,ename,sal from emp;

    这里假设上面的sql语句将from写成了form,这里就引发这样的一个问题,相信也是我们最经常遇到的一个问题——当我们写一条sql语句的时候,如果我们写错了(在命令行上),那我们怎么去改这条sql语句?这里我就告诉大家两个办法,首先我告诉大家一个麻烦点的方式,一会再来告诉大家一个简单点的方式。麻烦点的方式可以使用**c(change)命令
    基本的SQL SELECT语句_第5张图片
    基本的SQL SELECT语句_第6张图片
    现在我们来查询员工信息,只查员工号,员工姓名,员工薪水和年薪(月薪*12)。

    select empno,ename,sal,sal*12 from emp;

    接下来我们再来查询员工信息,只查员工号,员工姓名,员工薪水,年薪(月薪*12),奖金和年收入(年薪+奖金)。

    select empno,ename,sal,sal*12,comm,sal*12+comm from emp;

    可发现查询结果并不正确。
    基本的SQL SELECT语句_第7张图片
    这里就引出了SQL中的null值问题,这个问题非常重要,因为如果你不注意这个问题,就可能得不到正确的结果,这里我们先讲前面的两点,在讲之前,那么null值到底是什么昵?null值是无效的,未指定的,未知的或不可预知的值,null值不是空格或者0

    • 包含null的表达式都为null
      这就很好地解释了没有奖金的员工为什么没有年收入。奖金为null,实际上是代表奖金为0,所以我们需要把奖金为null变为奖金为0,这需要用到Oracle滤空的函数,也即:
      nvl(a,b):当a的值为null时,返回b;如果a的值不为null时,返回a本身。
      nvl2():以后会讲到。
      所以要想能正确查询出员工号,员工姓名,员工薪水,年薪(月薪*12),奖金和年收入(年薪+奖金),应该要使用下面的select语句:

      select empno,ename,sal,sal*12,comm,sal*12+nvl(comm,0) from emp;
    • 在Oracle数据库的SQL语句当中,null永远!=null
      举个例子,如若要查询奖金为null的员工,像下面这样写是不对的:

      select * from emp where comm=null;

      正确的写法应该是:

      select * from emp where comm is null;

      所以我们在一条sql语句当中要判断一个值等不等于null,不能使用=和!=,应该使用is或者is not。

    当我们sql语句的列的名字如果比较复杂的话,可以给该列取个别名。例如以下select语句:

    select empno,ename,sal,sal*12,comm,sal*12+comm from emp;

    我们想要为列加上别名,那就需要改这条sql语句,在命令行窗口中,我们可以使用c命令来改,同时我告诉大家一个更简单的方法,直接敲ed(edit),紧接着直接回车,它就把上条sql语句放到我们系统默认的编辑器里面,然后进行修改即可,对于Windows来说,默认的编辑器就是记事本,对于Linus来说,默认的编辑器就是vi。
    给列取别名一共有3种模式,如下:

    select empno as "员工号",ename "姓名",sal 月薪,sal*12,comm,sal*12+comm from emp;

    现在我们再来讲一个关键字——distinct,其作用是去掉重复的记录。简单的例子我就不举了,在这里,我们看这样一条sql语句:

    select distinct deptno,job from emp;

    问题:distinct是作用于deptno列还是job列,这两个列都有重复的值?
    答:distinct作用于后面所有的列,不是第一列,只要这些列组合起来是不一样的,那就是不一样的。
    接下来,我们就来讲一下连接符,就是”||”。讲之前,回顾一下mysql中的concat函数。
    基本的SQL SELECT语句_第8张图片
    发现报错了,这是因为mysql中的这种写法没有遵循一个标准(SQL99),在这个标准中定义了select语句当中必须要有后面的from。很显然Oracle是遵循了这项标准的,所以select语句当中必须要有后面的from,那这样的话,from后面适合写什么昵?这时就引出了伪表的概念,在Oracle中,当我们做一个操作,而这个操作跟任何表都没有关系的时候,Oracle提供了一张表给我们,这张表就叫dual,dual表是Oracle中非常非常非常特殊的一张表,它存在的意义仅仅是为了满足这条select语句的要求,它只是一个占位的作用,所以这个表在Oracle里面有一个专有的名词叫伪表。既然有伪表的概念,肯定就有伪列的概念,这个我们以后再讲。
    基本的SQL SELECT语句_第9张图片
    我们再来举一个例子,比如说我要查询员工信息,查的是xxx的薪水是xxx。
    基本的SQL SELECT语句_第10张图片
    然后就引出了一个问题:到底什么叫字符串昵?在Oracle数据库里面,表示字符串和表示日期的方式是一样的,日期和字符串只能在单引号中出现,而”“表示列的别名。

你可能感兴趣的:(Oracle基础学习)