Oracle数据查询与高级查询(内连接、外连接、交叉连接)

基本查询

查询语句是使用最频繁的数据库访问语句,

select语句查询执行步骤

select 列名1,列名2,... from 表名1,表名2...

###为列设置别名
默认情况下,在显示数据时,各列的标题就是列的名称,在select语句中可以定义列的别名,这样在显示数据时,列的标题就是这个别名,在整个SQL语句中都可以使用这个别名。使用别名的select语句格式

select 列1 [as] 别名 1 ,列2 [as] 别名 2 ...

利用distinct获得唯一性记录

有时需要提高检索效率,不需要查询重复的数据,重复数据是指在select语句中涉及所有列值完全相同的行。在Oracle中提供了关键字distiinct来实现查询获得唯一性的记录。

select distinct 列名1,... from 表名

使用distinct关键字后,就能够从返回的结果集汇总删除重复的行,使返回的结果更简洁。

返回查询的部分结果

在Oracle中提供了关键字rownum,让用户指定返回一定数量的数据。当查询到的数据量非常大,且没有必要对所有的数据进行浏览时,使用rownum关键字查询可以大大减少查询花费的时间。
查询结果是320条,现在用rownum关键字查询前10条记录

select customer_id as 顾客编号,cust_first_name 顾客姓名 from customersnew
select customer_id as 顾客编号,cust_first_name 顾客姓名 where rownum < 11;

简单条件查询

在前面所列举的查询中,由于没限制条件,所以查询结果包含表中的所有行。如果只查询到自己希望得到的,那么可以通过where子句指定条件。where子句的作用是通过指定条件,使得select语句仅仅查询符合条件的行。

where子句

where子句指定的条件是一个关系表达式,如果关系表达式的结果为真,则条件成立,否则条件不成立。关系表达式用于比较两个表达式的大小,或者进行模糊匹配,或者将一个表达式的值与一个集合中的元素进行匹配。

select 列名1,列名2,... where 条件

在查询中使用比较表达式

比较表达式可以是常量、变量和列表达式的任意组合,在where子句中可以使用的比较运算符包括:=、!=、>、>=、<、<=。表达式的使用比较简单。

select customer_id,cust_first_name,city,credit_limit from customersnew where credit_limit >= 500000;
select customer_id,cust_first_name,account-mgr-id from customersnew where account_mgr_id != 149;

使用简单逻辑表达式

** 1.and运算符

select customer_id,credit_limit from customersnew where city='Bangalore' and credit_limit >= 500000;

** 2.or运算符**

select customer_id,credit_limit from customersnew where city='Bangalore' or credit_limit >= 500000;

3.not运算符

select customer_id,credit_limit from customersnew where not account_mgr_id = 149;

指定数据范围

1、使用between查询

select customer_id,credit_limit from customersnew where credit_limit between 20000 and 250000;
select customer_id,credit_limit from customersnew where credit_limit not between 20000 and 250000;

2、使用in查询

select customer_id,credit_limit from customersnew where customer_id in(101,102,103);

有关null值判断

select customer_id,credit_limit from customersnew where credit_limit not nls language='us' or nls_language is null;

like进行模糊查询

select 列名1,列名2,,,,from 表名 where 表达式 like 条件;

order by子句

数据显示的顺序是不可预知的,如果需要检索到的结果集进行排序,此时就要借助order by子句。order by子句对查询到的数据按照指定列的大小排序。如果指定了多个排序列,则首先按照第一个排序列排序。如果这个列的值相同,则再按第二个排序列继续排序。排序方式包括asc和desc,分别表示升序和降序排序。二者可选其一,默认的排序方式是升序排序。如果定义了多个排序列,可分为每个排序列单独指定排序方式。

select * from 表名 order by 列名(desc)
select customer_id,cust_first_name from customersnew order by customer_id;

group by子句

有时需要对查询数据进行分组统计,在Oracle中提供了group by子句来实现其功能。group by语句经常和聚集分组函数一起使用,常用的分组函数如下:
COUNT MIN MAX SUM AVG

select 组名1,组名2,... from 表名 group by 组名;

having子句

select 组名1,组名2,...from 表名  group by 组名 having 组限制条件;
select sales_rep_id,sum(order_total) from orders group by sales_rep_id having sum(order_total)>150000;

**having子句必须使用分组函数,可以是select 语句中已经出现的分组函数,也可以是没有出现的函数,虽然having子句和where子句都是用来设置条件的,但是where子句设置的条件是在查询时起作用的,它决定查询是什么样的数据,如果要进行统计,这样的条件在统计之前就已经起作用了。而having子句设置的条件只有在进行统计后才起作用,它决定了对于统计产生的数据,那些需要显示给用户。
在数据库查询中,Oracle先执行group by子句,然后才进行排序操作,分组是将数据表的所有记录以某列或者某些列为标准划分为一组。

高级查询

实际的数据库操作中,往往需要同时从来自两个或两个以上的表中查询相关数据,连接就是满足这些需求的技术。主要介绍子查询、联合语句、单表关联语句以及多表查询的相关使用

连接简介

很多情况下,需要查询的数据往往涉及多个表,这是需要对多个表进行连接查询。通过连接,可以根据各个表之间的逻辑关系从两个或多个表中检索数据。如,既要查询订单信息,又要查询订单所在城市的信息,这就涉及orders和customersnew两个表。

连接的定义

多表连接实际上就是实现如何使用一个表中的数据来选择另一个表中的行,而连接则主要通过以下方法定义两个表在查询中的概念了关系。
指定每个表中要用于连接的列,典型的连接条件是在一个表中指定外键,在另一个表中指定与其关联的键。
**指定比较各列的值要使用逻辑运算符(=、<>)
在select语句中实现多表连接并不是一个物理存在的实体。换句话说,他在数据表中并不在,他只是由数据库系统在需要时创建的,只在查询、检索数据期间有效。

连接的类型

连接体现在where子句中指定的条件上,在条件中指定两个表通过哪些列进行连接。一般进行连接查询的两个表是通过主键和外键进行关联的,所以最简单的条件是一个表的键与另一个表的主键相等。在SQL中,表的连接类型主要有以下几种:
内连接:内连接是一种常用的多表查询,其中inner可以省略,只使用join关键字表示内连接。使用内连接查询多个表时,在from子句中需要定义一个on子句。内部连接包括同等连接和自然连接。
外连接:使用内连接时,只有在两个表中匹配的行才能在结果集中出现,外连接可以只限制一个表,而对另一个表不加限制。外连接分为左外连接、右外连接和全外连接。因为内连接没有左右之分,所以又称左连接和右连接。左连接是对连接条件中左边的表不加限制;右连接对右边的表不加限制;全外连接对两个表都不加限制,两个表中的行都会出现在结果集中。
交叉连接:即没有where子句的交叉连接时涉及的表的笛卡尔积。

简单的多表查询

表的连接实现最简单的方法就是在select语句的from子句中,罗列要连接的表即可。进一步实现复杂的多表连接,则需要在from子句中使用join(inner join、outer join、cross join等)关键词
** 1.如何实现多表查询**
若要实现多表查询,可以在from子句中通过join关键字连接需要查询的表。简单的多表查询则可以不使用join关键字,而直接列出所要连接的表,利用逗号把from子句后的表名隔开。

select product_id,product_information.category_id,category_name from product_information,categories;

2、指定连接条件
直接使用from子句连接表时,返回的是两个表的记录的笛卡尔积,这种实际应用中意义不大。通常需要连接的两个表的记录的笛卡尔积,在实际应用中,通常需要连接两个表的记录满足一定的关系。

select product_id,product_information.category_id,category_name from product_information,categories where product_information,categories where product_information.category_id = categories.category_id;

3、使用别名作为表名的简写

select product_id,p.category_id,catogory_name from product_information p,categories ca where p.categories_id = ca.category_id;

4、自连接
在查询信息时,有时需要将表与其自身进行连接,即自连接,这时需要为表定义别名。

select c1.customer_id,c1.cust_first_name,c1.credit_limit
from customersnew c1,customersnew c2
where c2.customer_id = 839 and c1.credit_limit > c2.credit_limit 
order by c1.credit.limit;

在查询中需要连接的表是customersnew,但分别去了不同的别名,这样就可以在where子句中只用c2查询编号为839的顾客信息。使用子查询的方式也可以实现该示例。

表的连接查询

为了在关系型数据库中实现多表之间的联系,我们引入了连接查询,连接用于指定多数据源(表、视图)之间如何组合,以形成最终的数据源。前面介绍的表的连接是通过from子句列出要连接的表,结合使用where子句列出连接条件来实现。

自然连接

自然连接是将两个数据源中具有相同名称的列进行连接。在自然连接中,用户不需要指定进行连接的列,系统会自动完成这一任务。连接后,相同的列只保留一个。
自然连接是一种比较特殊的等值连接,可以指定查询结果包含那些列,但不能人为指定那些列被匹配。自然连接有一个限制条件,即连接的各表之间必须具有相同名称的列,并且不能为该列指定限定词。

select * from 表1 natural join 表2;

自然连接实际上自动指定了搜寻条件。这里包含两方面内容,首先,自然连接列必须同名,另外,所有的同名列都将作为搜寻条件。自然连接与笛卡尔积的区别在于,无论何时,笛卡尔积都将获得两个数据表中所有记录的两两组合。当两个数据表中存在同名列时,Oracle同名列作为搜寻条件,但是当两个表不存在同名列时,Oracle不会添加任何搜寻条件,其效果相当于笛卡尔积。例如,表countries与表categories不存在同名列,这两个表进行自然连接获得的结果集与笛卡尔积相同。

select p.product-id,category_id,ca.category_name 
from product_information p 
natural join categories ca;
select * from countries natural join categories;

countries表中包含25行记录,而表categories表中包含22行记录,这两个表笛卡尔积的结果是550条。

内连接

内连接也称为简单连接,他会把两个或多个表进行连接,最后只能查询匹配的记录,不匹配的记录无法查询出来。

select 语句 from 表1 inner join 表2 on 连接条件
select ord.order_id,cu.city,cu.phone_number
from orders ord inner join customersnew cu 
on ord.customer_id = cu.customer_id;

另外,内连接运算inner join中的inner关键字可以省略,语句如下:

select p.product-id,ca.category_id,ca.category_name
from product-information p 
join categories ca
on p.category_id = ca.category_id;

默认情况下,Oracle的连接为内连接,在这里,我们使用join来代替inner join可以实现相同的效果,而且写法更简洁。

外连接

外连接分为左外连接,右外连接,全外连接。使用左外连接查询时,返回的结果不仅仅是符合连接条件的行记录,还包含了左边表中的全部记录,右外连接与左外连接相反。全外连接返回匹配成功的所有记录,还包括了左、右表中未匹配成功的记录。
1、左外连接
左外连接又称为左向外连接,如果左表的某行记录表中没有匹配项,则返回结果中,右表的所有选择列表均为空,左外连接使用语法

select 语句 from 表1 left join 表2 on 连接条件

2、右外连接
右外连接又称为右向外连接,与左外连接相反,将右边表中所有数据与左表进行匹配,返回的结果显示出了匹配成功的记录

select 语句 from 表1 right join 表2 on 连接条件
select p.product_id,category_id,ca.category_name
from product_information p
right join categories ca

其中,right join将表product_information与表categories进行关联,基础表未运算符右侧的categories
3、全外连接
返回所有匹配成功的记录,并返回左表未匹配成功的记录,也返回游标未匹配成功的记录。

select 语句 from 表1 full join 表2 on 连接条件
select p.product_id,category_id,ca.category_name from product_information p full join categories ca

全外连接是一个左连接和右连接的组合,如果连个数据源使用了全外连接,那么将首先进行一次左连接,然后进行一次右连接,最后删除其中的重复记录,即得到完全连接。
在Oracle中,提供了外连接的加你了写法,即在where条件中将附属数据源的列使用(+)进行标识,从而省略left join/right join 以及on关键字。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章