查询作为SQL语言中作重要的组成部分,其作用也是巨大的。一个完整的select语句由select … from …
组成。而这个基础的语句可以扩充为:
Select … From … Where … (Group by) … Having(where) … Order by…
下面举个最简单的例子:
得到的查询结果:
可以将通配符*
换成student表中你需要的字段,如SNO,SNAME,从而得到自己想要的结果。可有时候我们需要的数据不仅仅来源于一张表,这个时候就要进行连表查询。而表格的连接方式又分为很多种:
- 等值连接(也称为内连接,以两边中相同的字段作为连接条件
- 非等值连接(范围筛选连接条件)
- 外连接(使用外连接来查询不满足连接条件的数据)
- 自连接(本表与本表存在相关联的字段)
- 叉集(笛卡尔积)
- 自然连接(以两个表中具有相同名字的列为条件创建等值连接。)
在表格的连接过程中可能会出现很多问题,首先就是笛卡尔积
。笛卡尔积的形成是由于在连表的时候未写连接条件,而导致两表的数据进行一对多随意连接,造成大量甚至是巨量的数据冗余,从而对数据库带来极大的负担。所以在进行连表时一定要注意连接条件的使用,尽量避免笛卡尔积的出现。
连表时可以使用where
来建立连接条件:
也可以使用on
来建立连接条件:
有些表名冗长难写,这个时候就可以使用别名来简化查询。在不同表中具有相同列名的列可以用表的别名
加以区分。使用表名前缀可以提高执行效率。
有时候我们需要的数据不满足表的连接条件,就得不到想要的结果,例如上面查询的结果为:
有四名同学的信息,可我们又想查询到所有学生,就算没有成绩也可以,这个时候就需要用到外连接,外连接同样针对where
和on
各有各的写法:
Oracle SQL语法(where):
SQL 1999语法(on):
外连接的表格会查询出该表的所有数据,就算不满足连接条件也会查询出来,而不满足的其他表的列值为空。这个时候得到的查询结果为:
Oracle SQL语法与SQL 1999语法都是可用的,不必过分纠结两者的区别,灵活运用也可以提高查询效率。
为了满足更复杂的要求,在写查询语句的时候可以运用子查询
来满足需求,并且简化查询。在查询语句中如果有子查询的存在,那么SQL语句会先执行子查询,再执行外查询,这也印证了“子查询的结果作为外查询的条件”
。
如题:查询张三所在班级的所有学生信息。那我们需要先查询出“张三”所在的班级:
然后再根据班级来查询该班的学生信息:
这样要写两个查询语句才能得到结果,但是我们可以发现,第一个查询语句的结果,就是第二个查询语句的条件,那么我们就可以使用子查询
来简化它:
这样写得到的结果与前面分两个查询语句写是相同的。
除了连表以外,还有一个需就是函数的使用。函数可以根据函数本身的功能来对数据进行操作,也可以对数据的类型进行转换。而函数之间也是可以嵌套使用的,就相当于外查询嵌套子查询,内部的函数结果作为外部函数的参数。
最后得到的结果就是将first_name和last_name转换成大写后拼接起来:
函数的使用中还需要注意的就是分组函数,分组函数能处理多条数据并且返回一个值,需要使用group by子句
进行分组以及having子句
进行筛选。
当我们在最终的查询结果出来之后,就可以对其进行排序的操作,这个时候就引入了一个新的语法——ROWNUM(伪列)
。顾名思义,伪列就是一个虚拟的列,它可以为当前数据进行标号,效果如下:
有伪列之后就可以通过为例进行数据的筛选和排序,但有一点要注意的是,由于Oracle的执行顺序中order by 子句是最后执行的,而伪列是在select 子句中执行,所以在使用伪列的同时又使用了order by 子句,那么伪列原本的顺序将会被打乱
,这个时候再使用where 子句对伪列进行数据筛选的时候得到的结果就是错误的:
所以我们在使用伪列的过程中一定要注意Oracle的执行顺序,上面的问题可以使用子查询来解决为:
那么得到的结果就是正确的:
Oracle SQL语句的执行顺序为:
1. from 语句
2. where/on 语句(连接条件)
3. where
4. group by 语句
5. having 语句
6. select 语句
7. union、minus、intersect等
8. order by