二、数据查询

 

—————————————————————————————————————————————————————————————————————————————

数据查询的基本结构为:

select<列名或算术运算> from<表名>
 where <查询条件>
group by<分组条件>
having<查询条件>
order by<排序字段>
;

2.1 简单查询(select     from子句)

(1)“*”代表所有列

(2)基本语法:select <列名1><列名N> from <表1><表N>;不同列或表用逗号分隔,可以通过列名的顺序更改查询输出的顺序。

(3)算术表达式:列数据类型为数字或日期时候,列名中可以使用算术表达式(+-*/),可以是列与列之间,或列与数字之间的算术运算。

(4)列别名或表别名:设置字段(表)别名格方式为直接在原列名(原表名)后面指定新列名:select <旧列名或其算术表达式><新列名> from <旧表名><新表名>;注意:如果为表设定了别名,则在后面的子句中,不可以使用原名;尤其要注意selec是在执行from、where之后执行,因此select后面也必须使用表别名(如果定义了表别名的话)

(5)distinct:修饰列名,表示选择结果中不出现重复值,放置在列名前面

(6)在oracle中,存在伪列rowid,用于储存数据在oracle中的物理地址,用*号是查不出来的,必须明确指出该列名才可以。

 

 

—————————————————————————————————————————————————————————————————————————————

2.2 where子句(格式:select  <列名>   from <表名>    where <条件表达式>

条件表达式常用符号:

序号

运算符

意义

01

=

等于

02

!=或<>

不等于

03

<、>

小于、大于

04

A like B

匹配,“%”代表任意个任意字符字符,“_”代表一个任意字符,通配符值用单引号括起来

05

Not <条件表达式>

非(除了is null以及is not null前面不可以使用not外,其它都可)

06

And、or

与、或,如A>10 adn B<50

07

运算符优先级

与其它语言意义,可以使用括号区分

08

null

1.  一般的,条件表达式判断值为true或false,如果列值为null,判断结果为unknown;

2.  不可以通过“=”来判断某列值是否为null,而应该用is null或is not null来判断

 还有两个三个特殊的比较运算:

<单行运算符>any(条件组):表示符合条件组中的任意一个,输出;

<单行运算符>all(条件组):必须满足条件组中所有数值,才输出;

between<数值1> and<数值2>:输出大于等于数值1,小于等于数值2的,符合条件的行。

—————————————————————————————————————————————————————————————————————————————

2.3 order by 语句(where语句之后)

(1) order by <表达式><asc或desc>

l  Asc表示升序(省略时候,默认为此);desc是降序排列

l  表达式可以是算术表达式,也可以是单个列名,还可以是多个列名(不同列名用逗号隔开,表示先按第一个列排序,再按第二个…,每个列后面可以用desc或asc。

—————————————————————————————————————————————————————————————————————————————

 

2.4 group by子句

(1)select <分组列名1>,<统计函数1><统计函数2> from<表名> group by<分组列名2>

l  分组列名1(select后面的任何列名均需满足)必须是分组列名2的子集,

    分组列名2可以是多个,代表多次分组

    有group by字句的语句,selec后面只能接两种:列名或统计函数

l  统计函数包括count(计数)、min(最小值)、max(最大值)、sum(求和)、avg(平均值)(注意:语句没有group语句也可以使用统计函数)

l  分组列名2前面可以使用rollup(汇总结果在表下方)、cube(汇总结果在表上方)函数,格式为group by rollup(列名)

l  统计函数格式为(以max为例):max(要统计的列名)

l  统计函数的假名和一般列名的假名格式一样

—————————————————————————————————————————————————————————————————————————————

2.5 having子句(having <条件表达式>)

l  Having子句和where子句类似,一般与group by连用

l  如果没有指定group by语句,则having处理的是where语句的输出,并将整个输出成一个组

l  如果where语句也没有,having处理的是from语句,并形成一个组,并将整个输出成一个组

having与where的区别:having可以使用聚合函数,而where不可以,如max、avg等;如 having avg(salary) > 1000,而where不可以

—————————————————————————————————————————————————————————————————————————————

2.6 多表连接查询

(1)简单连接:Select<列名1><列名n>from<表1>,<表n>where<条件表达式>

通过条件表达式,连接表1与表n,并查询出列名1及列名n的值,如果两个表某列名字一样,则必须用“表名.列名”限定要查询的列

(2)join连接

 

类型

解释

内连接(inner join)

1.  格式:select<列名>from<表1>inner join<表2> on<连接条件>where<搜索条件>

2.  Inner可省略

外连接(left join、right join、full join)

以左连接为例:

1.  格式select<列名>from<左表>left join<右表> on<连接条件>where<搜索条件>

2.  含义:列出所有符号连接条件的行,同时列出左表符号搜索条件的行。

自然连接(natural join)

自动连接两个表具有相同名字的列,列的数据类型可以不一样。

自连接

某些表的某一列的值可能是另外一列的值,如经理编号和员工编号

这种情况,同一个表,设置两个别名,即可用内连接、外连接。

 

—————————————————————————————————————————————————————————————————————————————

 

2.7  集合操作(连接多个查询语句)

运算

解释

Union

合并多个运算,并消去重复的行

Union all

合并多个运算,不消去重复的行

Intersect

相交运算

Minus

差运算

 

—————————————————————————————————————————————————————————————————————————————

 

2.8子查询

(1)常用有in、exists、比较运算三个,子查询必须用括号括起来

后面的子查询需要用括号括起来;exists表示行存在即可输出,具体的值不重要。