SELECT查询

函数分为:

单行函数 -- 一条记录进入,一条记录输出

多行函数(分组函数)-- 多条记录进入,按组输出

单行函数:

select id,first_name,nvl(commission,0) from s_emp;

多行函数:

select count(*) from s_emp;

单行函数分为:

字符函数、数字函数、日期函数、转换函数和其他函数

字符函数:

lower--转换成小写字符

upper--转换成大写字符

initcap--首字母大写,其他小写(较少用)

substr --取字符串的一部分(子字符串),第三个参数是子字符串的长度

concat--连接字符串(与||功能重复,不使用)

length--字符串的长度

oracle数据库有一个虚表dual(测试表),只有一个字段,但支持任意类型。

select 1+1 from dual;

select sysdate from dual;

select 'hello' from dual;

select lower('Hello') from dual;

select upper('Hello') from dual;

select initcap('hello') from dual;

select length('Hello') from dual;

select substr('Hello',1,3) from dual;

select substr('Hello',2,3) from dual;

练习:

不使用or实现模糊查询:

从s_emp表中查询所有first_name包含a的员工

显示id first_name salary 信息

select id,first_name,salary from s_emp where lower(first_name) like lower('%a%');

练习:

显示s_emp表中first_name 4个字符以后的内容

select id, substr(first_name,5,length(first_name)-4),first_name from s_emp;

select id, substr(first_name,5),first_name from s_emp;

trim() 可以去掉首尾的空格(针对char)

select length('abc   ') from dual;

select length(trim('abc   ')) from dual;

数字函数:

round--四舍五入

trunc--光舍不入

select round(45.935,0) from dual;

select round(45.935,2) from dual;

select round(45.935,-1) from dual;

select trunc(45.935,0) from dual;

select trunc(45.935,2) from dual;

select trunc(45.935,-1) from dual;

转换函数

日期和字符之间的转换:to_date/to_char

数字和字符之间的转换:to_number/to_char

to_char(数字,‘格式’)

格式中允许:

9 代表一个数字

0 代表一个数字,如果没有的话加0

$ 货币

L 本地货币

. 小数点

, 千分为

select to_char(4853.8823,'$99,999.99') from dual;

select to_char(4853.8823,'L00,000.00000') from dual;

to_number格式和to_char差不多

select to_number('$1,834.45','$99,999.99') from dual;

单行函数可以无限次的嵌套

多表连接 -- 有时候数据不是存在一个表中,需要使用多表连接把数据从多个表中取出

显示 员工ID、first_name、部门名称

select e.id,name,dept_id,d.id from s_emp e,s_dept d where e.dept_id = d.id;

oracle数据库在查询时,首先做一个迪卡尔乘积,就是把所有表的记录总数相乘,得到结果的总数。因此多表连接不能过多,一般4张表就是极限

迪卡尔乘积对于结果来说是没有意义的,需要从迪卡尔乘积中获得有效数据,加上查询条件。有n个表,至少需要n-1个条件(连接条件)

在多表连接时,尽量避免迪卡尔乘积。

在超过3张表的连接时,表和条件的位置有时候会影响性能

练习:

显示员工编号、first_name、部门名称、区域名称 信息从s_emp/s_dept/s_region表中

s_emp表:

Name                Null?           Type

----------------------------------------- -------- ----------------------------

ID                  NOT NULL     NUMBER(7)

LAST_NAME    NOT NULL     VARCHAR2(25)

FIRST_NAME                      VARCHAR2(25)

USERID                              VARCHAR2(8)

START_DATE                      DATE

COMMENTS                         VARCHAR2(255)

MANAGER_ID                     NUMBER(7)

TITLE                                VARCHAR2(25)

DEPT_ID                            NUMBER(7)

SALARY                             NUMBER(11,2)

COMMISSION_PCT               NUMBER(4,2)

s_dept表:

Name                Null?          Type

----------------------------------------- -------- ----------------------------

ID                 NOT   NULL   NUMBER(7)

NAME            NOT NULL     VARCHAR2(25)

REGION_ID                       NUMBER(7)

s_region表:

Name         Null?    Type

----------------------------------------- -------- ----------------------------

ID          NOT NULL NUMBER(7)

NAME     NOT NULL VARCHAR2(50)

select e.id,first_name,d.name,r.name from s_emp e,s_dept d,s_region r

where e.dept_id = d.id and d.region_id = r.id;

SQL plus 工具设置行大小:

set linesize 200

多表连接由4种方式:

等值连接:用‘=’做链接表的条件

非等值连接: 不用‘=’做连接表的条件

外连接:(+)包括空字段

自然连接:自己表连接自己表(单表做多表连接)

90%的多表链接都是等值连接

非等值连接

显示员工的first_name,薪水和薪水等级

salgrade表:

Name   Null?    Type

---------------------------

GRADE       NUMBER

LOSAL       NUMBER

HISAL       NUMBER

select e.first_name,e.salary,s.grade from s_emp e,salgrade s

where e.salary between s.losal and s.hisal;

自连接--表连接自己

select id,first_name,manager_id from s_emp;

显示员工的id,first_name,管理者的first_name

select e.id,e.first_name,e.manager_id,m.first_name from s_emp e,s_emp m

where e.manager_id = m.id;

外链接--包括匹配值 + 空值

select e.id,name,dept_id,d.id from s_emp e,s_dept d

where e.dept_id = d.id(+);

dept_id = id 或 dept_id = NULL 或 dept_id = id 中不存在的

select e.id,name,dept_id,d.id from s_emp e,s_dept d

where d.id(+) = e.dept_id;

(+)不能同时写在 = 两边

select e.first_name,e.salary,s.grade from s_emp e,salgrade s

where e.salary between s.losal(+) and s.hisal(+);

select e.first_name,e.salary,s.grade from s_emp e,salgrade s

where e.salary(+) between s.losal and s.hisal;

slq99对多表连接有新的一套写法,也支持原有写法。sql99多了一个全外连接。

在SQL: 1999中,内连接只返回满足连接条件的数据。

两个表在连接过程中除了返回满足连接条件的行以外还

返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外联接。

两个表在连接过程中除了返回满足连接条件的行以外还

返回两个表中不满足条件的行 ,这种连接称为满 外联接。

多表连接用join,连接条件用on

外连接:

left outer join -- 左外连接

right outer join-- 右外连接

full outer join--全外连接

迪卡尔积:cross join

select e.id,first_name,name from s_emp e cross join s_dept;

两个表的连接:

select e.id,first_name,name from s_emp e join s_dept d

on(e.dept_id = d.id);

select e.id,first_name,name from s_emp e left join s_dept d

on(e.dept_id = d.id);//省略了outer

select e.id,first_name,name from s_emp e right join s_dept d

on(e.dept_id = d.id);

select e.first_name,e.salary,s.grade from s_emp e left join salgrade s

on(e.salary between s.losal and s.hisal);

select e.first_name,e.salary,s.grade from s_emp e right join salgrade s

on(e.salary between s.losal and s.hisal);

select e.first_name,e.salary,s.grade from s_emp e full join salgrade s

on(e.salary between s.losal and s.hisal);

最全面的select语句是:

select 子句

from 子句

[where 子句]

[group by 子句]

[having 子句]

[order by 子句]

常用的分组函数5个:

count--计算总数,包括所有类型

avg--计算平均值,只能用于数值类型

sum--计算总和,只能用于数值类型

max--最大值,包括所有类型类型

min--最小值,包括所有类型

查询员工总数:

select count(*) from s_emp;

显示commission_pct的平均值。

select avg(commission_pct) from s_emp;

分组函数自动忽略空值,因此有时候需要用nvl转换空置。

select avg(nvl(commission_pct,0)) from s_emp;

显示各部门的平均工资(分组,一个部门算一组)

select dept_id,avg(salary) from s_emp group by dept_id;

练习:

显示每个管理者的管理人数

select manager_id,count(*) from s_emp group by manager_id;

select first_name,dept_id,avg(salary) from s_emp  group by dept_id;

first_name 不能输出,因为一组(一个部门)的first_name 有很多个。

使用分组时,select后面只能跟:分组函数或者group by后面出现的字段

select first_name,dept_id,avg(salary) from s_emp  group by dept_id,first_name;

显示41,42两个部门的平均工资

select dept_id,avg(salary) from s_emp where dept_id in(41,42) group by dept_id;

练习:

显示除了41和42所有部门的平均工资

select dept_id,avg(salary) from s_emp where dept_id not in(41,42) group by dept_id;

显示每个管理者的管理人数,要求按照管理者id排序

select manager_id,count(*) from s_emp group by manager_id order by manager_id;

在排序时,空值被看出最大。

显示所有平均工资超过5000的部门编号和平均工资

select dept_id,avg(salary) from s_emp where avg(salary) > 5000 group by dept_id; 错

分组函数不能出现在where子句中。

分组函数做查询的条件需要使用having子句。

select dept_id,avg(salary) from s_emp group by dept_id having avg(salary)>5000;

select dept_id,avg(salary) from s_emp group by dept_id having avg(salary)>5000 order by avg(salary);

having理论上可以取代where,但having效率较低,所以having只用于分组函数做查询条件时。

Oracle数据库之二的更多相关文章

  1. asp.net中membership使用oracle数据库(二)

    需要安装的东西都准备好了,继续生成后台表.过程.函数.触发器等.ps/sql中 @@E:\oracle\product\11.2.0\client_1\ASP.NET\SQL\InstallAllOr ...

  2. Oracle数据库(二)

    指令来练习 1.password,修改密码输入旧命令,在输入新的命令 2.查询当前用户 show user: 2.查询用户下的所有对象,使用tab表,tab是每一个用户都有的 select *from ...

  3. 数据库 Oracle数据库对象二

    视图 --视图是对表逻辑抽象 --视图的好处:简化查询 --视图是一种虚表 --视图建立在已有表的基础上,视图赖以建立的这些吧称为基表. --向视图提供数据内容的语句为select语句,可以将视图理解 ...

  4. 利用zabbix监控oracle数据库

    一.概述 zabbix是一款非常强大,同时也是应用最为广泛的开源监控软件,本文将给大家介绍如何利用zabbix监控oracle数据库. 二.环境介绍 以下是我安装的环境,实际部署时并不需要跟我的环境一 ...

  5. oracle数据库的安装与连接关键点

    一.window xp系统上安装Oracle Database 10G 解锁Scott.Hr账号并重置口令 远程连接数oracle数据库地址 二.在Mac系统上使用Navicat远程连接oracle数 ...

  6. MYSQL数据库迁移到ORACLE数据库

    一.环境和需求1.环境 MySQL数据库服务器: OS version:Linux 5.3 for 64 bit mysql Server version: 5.0.45 Oracle数据库服务器: ...

  7. 细说Oracle数据库与操作系统存储管理二三事

    在上大学的时候,学习操作系统感觉特别枯燥,都是些条条框框的知识点,感觉和实际应用的关联不大.发现越是工作以后,在工作中越想深入了解,发现操作系统知识越发重要.在实践中结合理论还是不错的一种学习方法.自 ...

  8. Oracle数据库基础入门《二》Oracle内存结构

    Oracle数据库基础入门<二>Oracle内存结构 Oracle 的内存由系统全局区(System Global Area,简称 SGA)和程序全局区(Program Global Ar ...

  9. oracle直接读写ms sqlserver数据库(二)配置透明网关

    环境说明: 数据库版本:11gR2 透明网关版本:11g 操作系统Windows Server2008_64位 ORACLE_HOME目录:D:\app\Administrator\product\1 ...

随机推荐

  1. Sencha Touch xtype对应的class

    Sencha Touch 2的有效xtype xtype Class ----------------- --------------------- actionsheet Ext.ActionShe ...

  2. extern关键字的使用

    A.置于变量或者函数前,以标示变量或者函数的定义在别处,提示编译器遇到此变量和函数时在其他地方寻找其定义. B.可用来进行链接指定. 1.使用extern声明外部变量 1.1在一个文件内声明外部变量 ...

  3. MYSQL导入导出.sql文件(转)

    一.MYSQL的命令行模式的设置: 桌面->我的电脑->属性->环境变量->新建-> PATH=“:path\mysql\bin;”其中path为MYSQL的安装路径. ...

  4. HDU 5014Number Sequence

    思路: 对于一个二进制100011: 尽量将填满:填成111111: 然后有一个很好算的方法 gets(n)表示二进制下N有多少位,N^X=(111111)2 X=111111^N; 其实答案可以直接 ...

  5. OpenLayers3 online build

    openlayers3使用了一个比较复杂的build工具,从github上下载下来的代码中并没有build之后的版本,要配置build环境又比较繁琐,好在官方的example中提供了在线的版本,下面就 ...

  6. √新技能Get - 教你发空白朋友圈

    今天下午都被空白朋友圈刷屏了.空白朋友圈也即是在朋友圈里面发空消息,没有图片也没有文字,朋友圈动态是空空的.这是谁在恶搞呢?怎么实现呢? 怎么发空消息啊?其实这是为了帮助大家识别身边用iOS的小伙伴的 ...

  7. Delphi中@,^,#,$特殊符号意义

    概述:   ^: 指针   @: 取址   #: 十进制符   $: 十六进制符   @:取址运算符; var   int:integer;   p:^integer; begin   new(P); ...

  8. awk处理之案例四:sort加awk来过滤文本

    编译环境 本系列文章所提供的算法均在以下环境下编译通过. [脚本编译环境]Federa 8,linux 2.6.35.6-45.fc14.i686 [处理器] Intel(R) Core(TM)2 Q ...

  9. hdu 3853 LOOPS(基础DP求期望)

    题目大意 有一个人被困在一个 R*C(2<=R,C<=1000) 的迷宫中,起初他在 (1,1) 这个点,迷宫的出口是 (R,C).在迷宫的每一个格子中,他能花费 2 个魔法值开启传送通道 ...

  10. hashmap理解总结

    1.hashmap是通过存放对象的hash算法进行对象的存储的,其查询,put,get方法均是. 所以将对象存储进hashmap,set啥时候,要重写hashcode方法. 2.hash算法存储,查询 ...