二、数据查询
—————————————————————————————————————————————————————————————————————————————
数据查询的基本结构为:
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表示行存在即可输出,具体的值不重要。
—————————————————————————————————————————————————————————————————————————————