Oracle数据库之三
子查询 -- 就是在一个查询中包含多个select语句(一般就2个)
select id,first_name,dept_id from s_emp;
想查询和Ben一个部门的员工的id,first_name,dept_id,salary信息
select dept_id from s_emp where first_name = 'Ben';
select id,first_name,dept_id,salary from s_emp
where dept_id = 上面的值;
select id,first_name,dept_id,salary from s_emp
where dept_id =(select dept_id from s_emp where first_name = 'Ben');
使用子查询时,外面的查询叫主查询,用()括起来的叫子查询。
子查询先于主查询运行,子查询必须用()括起来。子查询一般放在条件运算符的右边。
经验:
如果''中包括'(单引号,需要把''中的'换成''(写2次)
练习:
查询所有工资超过Ben的员工信息,包括:id,first_name,salary
select id,first_namesalary from s_emp
where salary >(select salary from s_emp where first_name = 'Ben');
显示工资高于平均工资的员工信息,包括:id,first_name,salary
select id,first_name,salary from s_emp
where salary >(select avg(salary) from s_emp );
显示工资高于部门id=43的平均工资的员工信息,包括:id,first_name,salary
select id,first_name,salary from s_emp
where salary >(select avg(salary) from s_emp where dept_id = 43);
select id,first_name,salary from s_emp
where salary >(select avg(salary) from s_emp where dept_id = 43 group by dept_id);
查询的一般执行次序:
1 from 子句
2 如果有join on的话,先on
3 如果是outer join,加入on之外的有效数据
4 where 子句
5 group by子句
6 having子句
7 select选择
8 order by 子句
显示所有工资等于部门43任意员工的员工信息,包括:id,first_name,salary
select id,first_name,salary from s_emp
where salary =(select salary from s_emp where dept_id = 43);错
如果子查询返回超过一个值,能使用的运算符只有in和not in。
select id,first_name,salary from s_emp
where salary in(select salary from s_emp where dept_id = 43);
练习:
返回管理者(id号in manager_id)的信息。
select id,first_name,salary from s_emp
where id in(select distinct manager_id from s_emp);
返回非管理者(id号not in manager_id)的信息。
select id,first_name,salary from s_emp
where id not in(select distinct nvl(manager_id ,0)from s_emp);
如果结果中包括空值,可能需要使用nvl函数。
显示所有工资大于部门43所有员工的员工信息,包括:id,first_name,salary
select id,first_name,salary from s_emp
where salary >(select min(salary) from s_emp where dept_id = 43);
select id,first_name,salary from s_emp
where salary >all(select salary from s_emp where dept_id = 43);
select id,first_name,salary from s_emp
where salary =any(select salary from s_emp where dept_id = 43);
如果子查询返回多个结果,可以用all或者any修饰,就可以用其他运算符连接。
all代表所有,any代表任意一个
显示平均工资比部门33高的部门ID和平均工资
select dept_id,avg(salary) from s_emp
group by dept_id
having avg(salary)>(select avg(salary) from s_emp where dept_id = 33);
结论:条件中包括分组函数使用having,否则where。
建表和约束(DDL语句)
表明加后缀 ,防止名称冲突
实际表明_地区拼音缩写1306_教室标号学号
SQL标识符的规则:
必须字母开头
可以包含字母、数字、_、$、#
同一用户下,不能重名(表、视图、序列等)
不能是ORACLE关键字
长度1-30
Oracle表明 必须符合标识符
建表的SQL语法:
CREATE TABLE [用户.] 表名
(字段名 字段类型 [默认值] [字段约束],
...
[表约束]
);
字段类型:number/char/varchar2/date
create table test
(
id number(7),
name varchar2(20)
);
这种方式建表,只能建一张空表。
删除表:
drop table 表名;
drop table test;
练习:
建立一个student表,包括字段:学号id,姓名,性别,入学日期
create table student
(
id number(10),
name varchar2(20),
sex varchar2(4),
joindate date
);
oracle的字段类型
字符串类型:
char--定长字符串,不足部分补空格。
varchar2-- 变长字符串,长度和数据一致
char的效率比varchar2稍高,但大多数情况下,首选varchar2
数值类型:
整型和浮点
int/number(n) int就是number(38)
number(n,m)
Oracle的日期类型包括:
世纪、年、月、日、小时、分、秒 7个部分
两个日期相等 意味着这7个部分都相等。
日期类型的显示 受数据库语言的影响
比如:英文环境显示月份用英文单词缩写,中午环境显示中午月份
因此,对于日期的操作必须解决语言带来的问题。
to_char()和to_date() 解决日期问题。
to_char(日期,显示格式)
显示格式:‘特殊字符’,特殊字符包括:
y- 1位年 yyyy- 4位年
m- 1为月 mm- 2位日
d- 1为日 dd- 2为日
h- 小时 hh24- 24小时制的2位小时
mi- 分 mi- 分
s- 秒 ss- 2位秒
注:日期类型的字面值需要用''扩起来
select sysdate from dual;
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
练习:
显示员工信息,包括id,first_name,入职时间
入职时间要求显示年月日即可,要求to_char.
select id,first_name,to_char(start_date,'yyyy-mm-dd') start_date from s_emp;
插入数据使用insert语句,语法:
insert into 表名[(字段名...)] values (值...)
insert into 之后,只有自己的窗口界面可以看到,并没有真正插入数据库,只有commit之后才真正插入数据库。
select * from student;
insert into student values(1,'zhangfei','man',sysdate);
commit;
insert into student values(2,'guanyu','man',sysdate-1);
commit;
insert into student values(3,'liubei','man','1-AUG-13');
to_date() 可以实现插入各种语言的数据库
to_date(字符串形式的日期,格式)
select to_date('2008-08-08','yyyy-mm-dd') from dual;
insert into student values(4,'xiaoqiao','girl',to_date('1999-11-15','yyyy-mm-dd'));
to_char() 多用于查询日期类型
to_date() 多用于插入日期类型的字段
重点掌握:建表、删除表、插入数据、两个函数
字段类型:
CLOB:字符串型的大数据(4G)
BLOB:非文本型的大数据(4G)
光建表,插入的数据有可能是无效数据
主键约束 -- 主键字段 非空并且唯一,数据库记录的唯一标识。个别时候可以使用多个字段做联合主键
非空约束 --非空字段 值不能为NULL
唯一约束 -- 不允许出现重复值(可以为NULL)
外键约束(主外键)--字段的数据来自另外一个表的主键
check约束--额外加一些条件
最常用的约束:主键约束、非空约束、外键约束
Oracle可视化工具:PL SQL TOAD
约束可以写在字段后面或者写在表中所有字段定义后面,直接写作字段后面的叫字段级约束,写在表的最后的叫表级约束。
大多数情况下没什么区别,非空约束只能使用字段级约束,联合主键只能用表级约束。
主键约束语法--
字段级:
字段名 字段类型 [constraint 约束名] primary key,
约束名可以省略,系统会自动起。
表级:
,[constraint 约束名] primary key(id)
非空约束语法--
字段级:
字段名 字段类型 [constraint 约束名] not null
没有表级的非空约束
带约束建表:
drop table student;
create table student
(
id number(10) constraint student_id_pk primary key,
name varchar2(20) not null,
sex varchar2(4),
joindate date
);
经验:
约束名组成方式:表明_字段名_约束名
create table class(
c_id number(10) primary key,
c_name varchar2(20) not null,
conmment varchar2(100)
);
有些表的数据存在内在的关系,比如:学生表和班级表存在关系,学生应该隶属于某个班级。
外键约束就是体现表和表之间的关系的,如果a属于b,会在a表中加入一个外键字段,
其值来自于b表主键字段。
外键约束也叫主外键关联
外键表级约束语法:
..., constranit 约束名 foreign key(外键字段) references 关联表名(主键字段名)
注:约束写在a表,关联表名就是b表。a表叫子表,b表叫父表
外键字段允许空,但是不能是一个b表关联主键不存在的值。
写一个学生表和班级表,用外键体现关系。
drop table student;
create table student
(
id number(10) constraint student_id_pk primary key,
name varchar2(20) not null,
sex varchar2(4),
joindate date,
class_id number(10),
constraint student_id_fk
foreign key(class_id) references class(c_id)
);
insert into class values(1,'csd1306','guangzhou-csd1306');
insert into student values(1,'xiaoqiao','girl',to_date('1999-11-15','yyyy-mm-dd'),1);
insert into student values(2,'liubei','man',to_date('1999-01-10','yyyy-mm-dd'),2);错 班级2不在class表中
练习:
设计两张表 员工表emp和部门表dept,
员工表字段:id/name/salary/joindate/position
部门表字段:d_id/d_name/comments
提示:需要加约束(主键、非空、外键)
插入3条部门数据和5条员工数据。
create table dept(
d_id number(11) constraint dept_pk primary key,
d_name varchar(20) not null,
comments varchar(100)
);
create table emp(
id number(11) constraint emp_pk primary key,
name varchar(20) not null,
salary number(10,4),
joindate date,
position varchar(15),
dept_id number(10),
constraint emp_fk
foreign key(dept_id)
references dept(d_id)
);
插入数据,先父表,后子表
insert into dept values(1,'sales',NULL);
insert into dept values(2,'teach',NULL);
insert into dept values(3,'admin',NULL);
insert into emp values(1,'zhangfei',12000.0,sysdate,'jiangjun',3);
insert into emp values(2,'guanyu',15000.0,sysdate,'jiangjun',3);
insert into emp values(3,'guojia',17000.0,sysdate,'junshi',2);
insert into emp values(4,'zhouyu',18000.0,sysdate,'dudu',2);
Oracle数据库之三的更多相关文章
- Oracle数据库类型
Oracle数据库类型 字符类型char[(length)] 定长字符 最长2000字节varchar2[(length)] 可变长度的字符数据类型,最长4000字节NCHAR[(length)] 固 ...
- 使用Zabbix监控Oracle数据库
Orabbix介绍 监控Oracle数据库我们需要安装第三方提供的Zabbix插件,我们先测试比较有名的Orabbix,http://www.smartmarmot.com/product/orabb ...
- Oracle 数据库知识汇总篇
Oracle 数据库知识汇总篇(更新中..) 1.安装部署篇 2.管理维护篇 3.数据迁移篇 4.故障处理篇 5.性能调优篇 6.SQL PL/SQL篇 7.考试认证篇 8.原理体系篇 9.架构设计篇 ...
- Oracle数据库该如何着手优化一个SQL
这是个终极问题,因为优化本身的复杂性实在是难以总结的,很多时候优化的方法并不是用到了什么高深莫测的技术,而只是一个思想意识层面的差异,而这些都很可能连带导致性能表现上的巨大差异. 所以有时候我们应该先 ...
- Oracle 数据库语句大全
Oracle数据库语句大全 ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CH ...
- Oracle数据库升级(10.2.0.4->11.2.0.4)
环境: RHEL5.4 + Oracle 10.2.0.4 目的: 在本机将数据库升级到11.2.0.4 之前总结的Oracle数据库异机升级:http://www.cnblogs.com/jyzha ...
- 混合框架中Oracle数据库的还原处理操作
在较早期的随笔<Oracle如何实现创建数据库.备份数据库及数据导出导入的一条龙操作>粗略介绍了Oracle数据库的备份还原操作,本文想从开发框架的基础上介绍Oracle数据库的脚本或者还 ...
- Oracle数据库的链接数目超标
测试场景:Oracle数据库的链接数目超标,iServer是否自动连接. 测试步骤:(1)设置了最大连接数为85,oracle后台进程有83:(2)开启3台iserver(A,B,C)A,B发布tes ...
- 将Oracle数据库中的数据写入Excel
将Oracle数据库中的数据写入Excel 1.准备工作 Oracle数据库"TBYZB_FIELD_PRESSURE"表中数据如图: Excel模板(201512.xls): 2 ...
随机推荐
- redis提示Could not get a resource from the pool(jedis连接池配置)
起初在JedisPool中配置了50个活动连接,但是程序还是经常报错:Could not get a resource from the pool 连接池刚开始是这样配置的: JedisPoolCon ...
- C++中static的全部作用
要理解static,就必须要先理解另一个与之相对的关键字,很多人可能都还不知道有这个关键字,那就是auto,其实我们通常声明的不用static修饰的变量,都是auto的,因为它是默认的,就象short ...
- 停止使用循环 教你用underscore优雅的写代码
你一天(一周)内写了多少个循环了? var i; for(i = 0; i < someArray.length; i++) { var someThing = someArray[i]; ...
- 使用行为树(Behavior Tree)实现网游奖励掉落系统
原地址:http://blog.csdn.net/akara/article/details/6165421 [原创]使用行为树(Behavior Tree)实现网游奖励掉落系统by AKara 20 ...
- explicit构造函数的作用
explicit构造函数是用来防止隐式转换的.请看下面的代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ...
- 7 天玩转 ASP.NET MVC — 第 5 天
目录 第 1 天 第 2 天 第 3 天 第 4 天 第 5 天 第 6 天 第 7 天 0. 前言 欢迎来到第五天的学习.希望第一天到第四天的学习,你都是开心的. 1. Lab 22 - 增加 Fo ...
- POJ 3335 Rotating Scoreboard(半平面交求多边形核)
题目链接 题意 : 给你一个多边形,问你在多边形内部是否存在这样的点,使得这个点能够看到任何在多边形边界上的点. 思路 : 半平面交求多边形内核. 半平面交资料 关于求多边形内核的算法 什么是多边形的 ...
- mysql之select(二)
union 联合 作用: 把2次或多次查询结果合并起来. 要求:两次查询的列数一致.推荐:查询的每一列,相对应得列类型也一样. 可以来自于多张表.多次sql语句取出的列名可以不一致,此时,以第1个sq ...
- php截取字符串中的关键字,并高亮显示
<?php $str = "hahaceshi测试一下关键字高亮显示,以及长字符串截取的问题!"; $key = "关键字"; $r = sub_key_ ...
- 数学+dp HDOJ 5317 RGCDQ
题目传送门 /* 题意:给一个区间,问任意两个数的素数因子的GCD最大 数学+dp:预处理出f[i],发现f[i] <= 7,那么用dp[i][j] 记录前i个f[]个数为j的数有几个, dp[ ...