子查询 -- 就是在一个查询中包含多个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);

转载于:https://www.cnblogs.com/marshhu/p/3266763.html

Oracle数据库之三相关推荐

  1. 考oracle ocm,Oracle数据库OCM考试系列教程与总结_OCM考试实验笔记

    oracle数据库OCM考试系列教程与总结_OCM考试实验笔记 以下包括OCM考试系列的文章,在以下各章节中基本的内容都已经涉及到,在这些文章中,将对之前的OCM考试系列文章进行汇总,对一些之前没提到 ...

  2. oracle数据库日期格式的运算,修改oracle数据库日期格式

    ORACLE SQL Developer日期显示格式设置 原文:ORACLE SQL Developer日期显示格式设置 ORACLE的SQL Developer工具默认的日期格式DD-MON-RR, ...

  3. oracle数据库字符6,oracle 数据库字符编码

    理解ORACLE 字符集[转] 一.引言 ORACLE数据库字符集,即Oracle全球化支持(Globalization Support),或即国家语言支持(NLS)其作用是用本国语言和格式来存储.处 ...

  4. Oracle数据库导入导出命令!

    oracle数据库导入导出命令! 转自:http://www.cnblogs.com/fjfzhkb/archive/2007/09/03/879807.html Oracle数据导入导出imp/ex ...

  5. oracle数据库 export,转:Oracle数据库的备份方法——使用export作为备份

    5.使用export作为备份策略 5.1 export的命令选项说明 Oracle数据库的exp工具提供tables.users.full database.tablespace四种级别的导出方式,把 ...

  6. kettle读取不到oracle,kettle链接Oracle数据库,百试不爽!

    今天关于kettle在新建oracle数据连接失败的原因及处理办法在此给大家进行详细解析.(此文档有图片,有详细图片的word文档点击此处下载) 具体:工具-向导-创建数据连接向导-输入数据库连接名称 ...

  7. java oracle数据库高效分页查询_oracle高效分页查询总结

    探索查询语句: --分页参数:size = 20 page = 2 --没有order by的查询 -- 嵌套子查询,两次筛选(推荐使用) --SELECT * -- FROM (SELECT ROW ...

  8. 在oracle的安全策略中,Oracle数据库的安全策略(转)

    Oracle数据库的安全策略(转)[@more@]Oracle是关系型数据库管理系统,它功能强大.性能卓越,在当今大型数据库管理系统中占有重要地位.在我们开发的一MIS系统中,选用了Oracle7.3 ...

  9. oracle实例包括用户进程吗,ORACLE实例和ORACLE数据库详解(三)

    e.PMON:负责在一个Oracle进程失败时清理资源. 主要用于清除失效的用户进程,释放用户进程所用的资源.如PMON将回滚未提交的工作,释放锁,释放分配给失败进程的SGA资源. f.CKPT 同步 ...

最新文章

  1. 使用 fastlane 实现 iOS 持续集成(二)
  2. 全流程攻略:如何构建人工智能产品?
  3. MATLAB从入门到精通系列之几个实用小技巧
  4. java 常量表达式_JavaSwitch语句:常量表达式是必需的,但它是常量
  5. python 如何匹配列表中某个单词_Python中部分指定单词的最佳匹配项
  6. newsinglethreadexecutor使用场景_java中Future的使用
  7. 懒加载方式下的单例模式
  8. Java 算法 约数个数
  9. 读取文件卡顿_CPU占用100%,电脑卡顿原来可以这样解决!多任务操作也运行如飞...
  10. 三维点云学习(5)4-实现Deeplearning-PointNet-1-数据集的批量读取
  11. Windows下编译扩展OpenCV 3.1.0 + opencv_contrib
  12. pythonlinux安装 pandas_linux pandas安装
  13. 先进先出队列,优先级队列以及后进先出队列
  14. win7配置计算机失败怎么办,Win7配置失败还原更新怎么回事 Win7配置update失败的解决办法...
  15. In-Class Essay结构范文分享
  16. 全球打工人的抗争!谷歌员工希望更公平,国内只求告别996
  17. IDA Pro与x64dbg联动调试记录
  18. 基于数据库实现微服务动态路由
  19. IOS开发-Nsstring中搜索方法rangeOfString
  20. python|图片生成视频MP4

热门文章

  1. U-Boot移植(8)u-boot的流程
  2. 申请加入了sharepoint团队
  3. android视频录制无图像,Android开发拍摄视频在图库不显示问题
  4. (105)FPGA面试题-查找程序中的代码错误
  5. 5 呼吸灯verilog与Systemverilog编码
  6. 正则表达式2-测试代码
  7. 关于EXCEL相关类的一些函数解释
  8. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之总线设备驱动模型
  9. STM32学习——GPIO的操作
  10. Nginx基本数据结构之ngx_list_t