Oracle SQL(二)

条件表达式

CASE 语句 或者DECODE 函数,两者均可实现 IF-THEN-ELSE 的逻辑,相比较而言,DECODE 更加简洁

SELECT last_name
,job_id
,salary
,CASE job_id
WHEN 'IT_PROG' THEN
1.10 * salary
WHEN 'ST_CLERK' THEN
1.15 * salary
WHEN 'SA_REP' THEN
1.20 * salary
ELSE
salary
END as "REVISED_SALARY"
FROM employees; DECODE(col|expression, search1, result1 [, search2, result2,...,]
[, default]) SELECT last_name
,job_id
,salary
,decode(job_id
, 'IT_PROG'
, 1.10 * salary , 'ST_CLERK'
, 1.15 * salary , 'SA_REP'
, 1.20 * salary
, salary) revised_salary
FROM employees;

多表关联

在执行多表查询时,若未指定链接条件,则结果返回是个笛卡尔乘积

--左外连接 :左表不加限制,保留左表的数据,匹配右表,右表没有匹配到的行中的列显示为null。
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column = table2.column(+);
--右外连接 右表不加限制,保留右表的数据。匹配左表,左表没有匹配到的行中列显示为null。
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column(+) = table2.column;

Oracle 定义的链接类型:

  1. 等于链接
  2. 不等链接
  3. 外连接(可细分为左外连接、右外连接)
  4. 自连接

工业标准定义(SQL 1999) 的链接类型

交叉连接

select * from book as a cross join stu as b order by a.id

相当于没有连接条件的多表关联查询,结果是个笛卡尔乘积

自然链接

自然链接:相当于Oracle 的“等于连接”,只不过是让系统自己去找两张表中字段名相同的字段作为) “等于连接”条件;(注意如果两个表中有相同的列名,但字段类型不一样,这会引发一个错误)

Using 子句

Using 子句可开着是 自然连接 的一种补充功能,我们知道自然连接会让系统自动查找两张表中的段 所有列名相同的字段,并试图建立“等于连接”;但有的时候我们不期望这么做,而只是期望某个特定的字段用 作为“等于连接”的条件,这种情况下可以使用Using 子句来做限制。

select emptno,ename,sal,deptno,dname from emp e inner join dept d using(deptno);

oracle使用using关键字

内连接

相当于Oracle 的“等于链接”

隐式内连接

select a.id,b.name from a,b where a.id=b.pid

显示内连接

select a.id,b.name from a inner join b on a.id=b.pid

显示内连接比隐式内连接相同情况下更快。on是连接条件的限定

实际上一回事情了。只是内连接是由SQL 1999规则定的书写方式。

外连接(全外连接、左外连接、右外连接)

select * from book as a left join stu as b on a.sutid = b.stuid

左连接:是以左表为基准,将a.stuid = b.stuid的数据进行连接,然后将左表没有的对应项显示,右表的列为NULL

分组计算函数和Group By子句

分组函数

函数 功能
sum 求和
avg 求平均值
count 计数
stddev 求标准差
variance 求方差
max 求最大值
min 求最小值

MIN, MAX 可用于任何数据类型,但AVG , SUM ,STDDEV, VARIANCE 仅适用于数值型字段

函数 功能
COUNT(*) 返回满足选择条件的所有行的行数,包括值为空的行和重复的行
COUNT(expr) 返回满足选择条件的且表达式不为空行数。
COUNT(DISTINCT expr) 返回满足选择条件的且表达式不为空,且不重复的行数。

group by

Group By可以按照某一个字段分组,也可以按照多个字段的组合进行分组

SELECT 查询语句中同时选择分组计算函数表达式和其他独立字段时 ,其他字段必须出现在Group By 子

句中,否则不合法

SELECT department_id, count(last_name) FROM employees
GROUP BY department_id;--没有group by要报错

不能在Where 条件中使用分组计算函数表达式,当出现这样的需求的时候,使用Having 子句。

SELECT department_id, AVG(salary) FROM employees
GROUP BY department_id
HAVING AVG(salary) > 8000;

子查询

单行比较必须对应单行子查询(返回单一结果值的查询); 比如= , >

多行比较必须对应多行子查询(返回一个数据集合的查询);比如 IN , > ANY, > ALL 等

DML语句

DML: Data Manipulation Language , 数据操纵语言;简单的说就是SQL 中的增、删、改 等语句。

insert语句

  1. 写出表名+列名
  2. 仅写出表名
  3. 从其他表拷贝一行
  4. 使用子查询作为插入目标

update语句

  1. 更新符合条件的行中某些列为具体的值
  2. 使用子查询的结果作为更新后的值

delete语句

有约束可能删除失败

TRUNCATE TABLE copy_emp --TRUNCATE 语句无法回滚

merge语句

MERGE 语句: 比较整合语句

MERGE INTO table_name table_alias
USING (table|view|sub_query) alias
ON (join condition)
WHEN MATCHED THEN
UPDATE SET
col1 = col_val1,
col2 = col2_val
WHEN NOT MATCHED THEN
INSERT (column_list)
VALUES (column_values); MERGE INTO copy_emp c
USING employees e
ON (c.employee_id = e.employee_id)
WHEN MATCHED THEN
UPDATE SET
c.first_name = e.first_name,
c.last_name = e.last_name,
...
c.department_id = e.department_id
WHEN NOT MATCHED THEN
INSERT VALUES(e.employee_id, e.first_name, e.last_name,
e.email, e.phone_number, e.hire_date, e.job_id,
e.salary, e.commission_pct, e.manager_id,
e.department_id);

事务控制

当如下事件发生是,会隐式的执行Commit 动作:

  1. 数据定义语句被执行的时候,比如新建一张表:Create Table
  2. 数据控制语句被执行的时候,比如赋权 GRANT …( 或者 DENY)
  3. 正常退出 iSQL*Plus 或者PLSQL DEVELOPER, 而没有显式的执行 COMMIT 或者 ROLLBACK 语句 。

当如下事件发生时,会隐式执行Rollback 动作:

  1. 非正常退出 iSQL*Plus , PLSQL DEVELOPER, 或者发生系统错误

读一致性: 对于有人正在修改过程中的一批数据,在其位提交前,其他用户读到的是

一致的内容。

Select … from TableA Where … For UPDATE NoWait:显示加锁,如果另一session在更新数据未提交,我们也更新数据,会造成死锁,但是我们不知情,只知道更新数据一直执行,但是用此语句可以得知是否死锁,会提醒我们有锁。

我们更新语句时最好用select语句查一下

某用户对某一批数据进行更改,而未提交之前,Oracle 会隐式的进行加锁。

MySQL的autocommit(自动提交)默认是开启,Oracle默认关闭

表的命名要求和表中列的命名要求:

  1. 必须以字母开头
  2. 长度不能超过30 个字符
  3. 只能包含 A–Z, a–z, 0–9, _, $, and #
  4. 不能与数据库中的已有对象重名
  5. 不能使用Oracle 数据库的保留字
数据类型 描述
VARCHAR2(size) 可变长字符串
CHAR(size) 定长字符串
NUMBER(p,s) 可变长数值
DATE 日期时间
LONG 可变长大字符串,最大可到2G
CLOB 可变长大字符串数据,最大可到4G
RAW and LONG RAW 二进制数据
BLOB 大二进制数据,最大可到4G
BFILE 存储于外部文件的二进制数据,最大可到4G
ROWID 64进制18位长度的数据,用以标识行的地址
TIMESTAMP 精确到分秒级的日期类型(9i以后提供的增强数据类型)
INTERVAL YEAR TO MONTH 表示几年几个月的间隔(9i以后提供的增强数据类型-极其少见)
INTERVAL DAY TO SECOND 表示几天几小时几分几秒的间隔(9i以后提供的增强数据类型-极其
少见)

CLOB:CLOB包含要进行字符集转换的信息。这种数据类型很适合存储纯文本信息。

BLOB:BLOB包含不需要进行字符集转换的“二进制“数据,如果要存储电子表格、字处理文档、图像文件等就很适合采用

创建表和普通的相同

从子查询快速建表

CREATE TABLEA as select * from tablename;--常用于复制表
CREATE TABLEA as select * from tablename where 1=2 --保留表结构,不复制数据 --添加列:
ALTER TABLE table
ADD (column datatype [DEFAULT expr]
[, column datatype]...); --更改列
ALTER TABLE table
MODIFY (column datatype [DEFAULT expr]
[, column datatype]...); --删除列:
ALTER TABLE table
DROP (column); --删除表:表被删 除后,任何依赖于这张表的视图、Package等数据库对象都自动变为无效:
DROP TABLE tableName; --更改 表名:
RENAME oldtablename to newtableName; --一次性清空一张表中的所有内容,但保留表结构:
TRUNCATE TABLE tableName;

注意TRUNCATE 与DELETE FROM table区别

  1. 没有Rollback 机会
  2. HWM 标记复位

约束

约束类型 中文名
NOT NULL (非空约束)
UNIQUE (唯一性约束)
PRIMARY KEY (主键约束)
FOREIGN KEY (外键约束)
CHECK (自定义约束)

在创建表的时候同时创建 约束语法:CONSTRAINT emp_emp_id_pk PRIMARY KEY (EMPLOYEE_ID))HIRE_DATE DATE CONSTRAINT emp_hire_date_nn NOT NULL

单独创建约束 语法:

ALTER TABLE tablename ADD CONSTRAINT constraintname

constrainttype (column1,…);

外键约束类型:

  1. REFERENCES: 表示列中的值必须在父表中存在
  2. ON DELETE CASCADE: 当父表记录删除的时候自动删除子表中的相应记录.
  3. ON DELETE SET NULL: 当父表记录删除的时候自动把子表中相应记录的值设为NULL
--删除约束
ALTER TABLE tablename DROP CONSTRAINT constraintname;
--失效约束
ALTER TABLE tablename disable CONSTRAINT constraintname;
--生效约束
ALTER TABLE tablename enable CONSTRAINT constraintname;
--级联删除
ALTER TABLE test1 DROP (pk) CASCADE CONSTRAINTS;
--查询约束
SELECT * FROM user_constraints WHERE table_name = 'employees';

7.26实习培训日志-Oracle SQL(二)的更多相关文章

  1. 7.27实习培训日志-Oracle SQL(三)

    Oracle SQL(三) 视图 特性 简单视图 复杂视图 关联的表数量 1个 1个或多个 查询中包含函数 否 是 查询中包含分组数据 否 是 允许对视图进行DML操作 是 否 CREATE [OR ...

  2. 7.25实习培训日志-Oracle SQL(一)

    Oracle SQL(一) 重点 尽量避免select *,影响性能,不直观. 慎用Distinct,会排序,影响性能,用exists 排序尽量利用索引,索引有序 索引列不要加函数,会使索引失效 外连 ...

  3. 7.31实习培训日志-docker sql

    docker mysql docker问题 今天问了老师有关docker的问题,entrypoint和cmd的区别,两者同时存在cmd的执行结果会被当做参数传入entrypoint. dockerfi ...

  4. 7.29实习培训日志-Oracle题目

    总结 这周主要学习了SQL,oracle中的SQL基础,以前学习的是SQLserver的SQL,和oracle的还是有略微不同,所以重新去学习了一段时间,然后对于oracle中的各种函数有了初步了解, ...

  5. 7.30实习培训日志-SQL优化

    总结 今天早上考试,下午主要是老师引导我们学习SQL优化,晚上主要是同学的技术分享,杨松柏同学主要给我们分享了java的io的一些东西,c10k问题,bio(同步阻塞IO),NIO(同步非阻塞IO), ...

  6. 7.24实习培训日志-Docker-Compose

    Docker-Compose 对于昨天的考试,需要 项目根目录下需要docker/mysql/Dockerfile 文件用于构建mysql镜像 项目根目录下需要docker/java/Dockerfi ...

  7. 7.23实习培训日志-JDBC

    总结 今天下午考试,JDBC,这个本身很简单,但是需要我们Dockerfile+Docker Compose运行,这个东西就很复杂.原来学习时没有怎么看,这一次就很懵,完全不知道怎么弄,反正环境都没有 ...

  8. 7.10实习培训日志-markdown Git

    父模块github地址 一. markdown 1. markdown列表 html是一种发布的格式,markdown是一种书写的格式 区块引用 列表 图片 表格 html 标题 记笔记 写博客 2. ...

  9. 7.21实习培训日志-JDBC JSP Servlet

    JDBC JSP Servlet 总结 今天早上的考试主要考Java的网络,HttpClient的get,post方法,Socket的文件传输和Xml和Json文件的解析,对于HttpCLient很简 ...

随机推荐

  1. hbase shell-namespace(命名空间指令)

    hbase shell命名空间namespace篇: 1. alter_namespace (一般用于添加删除一个属性,很少使用) hbase(main)::> help 'alter_name ...

  2. expr 数字操作

    expr 可以用于计算 [root@rhel6 script]# * * [root@rhel6 script]# 使用expr来判断输入的变量是否为整数, 注意这里的&表示  安静模式(没有 ...

  3. Delphi 函数的重载和作用域

    1.在delphi 中,我们可以使用相同的函数名来调用不同的函数,我们称这个函数为重载,函数的参数类型和参数的个数可以不同,用到的关键字overload:格式如下: function addInt(x ...

  4. 仿新浪游戏频道js多栏目全屏下拉菜单导航条

    仿新浪游戏频道js多栏目全屏下拉菜单导航条,新浪,游戏频道,js组件,多栏目,全屏下拉,下拉菜单,导航条.代码下载地址:http://www.huiyi8.com/sc/26765.html更多请访问 ...

  5. Http请求和响应

    Http请求和响应 Http协议对浏览器发出的Request格式以及对Web服务器发出的Response格式有具体的规定. 请求部分由三部分组成: Requset line:请求行,位于第一行 Req ...

  6. 分享知识-快乐自己:zookeeper 伪集群搭建

    1):单一 zookeeper  搭建步骤 2):zookeeper 伪集群搭建 1):新建一个集群目录 [root@zoodubbo opt]# mkdir zookeeper_cluster 2) ...

  7. node.js redis对事务的控制

    redis对事务的支持还是比较差的,就是把所有的执行命令方到队列中一个一个执行 multi开启一个事务,exec执行事务集合中的命令 代码: var redisClient; redisClient. ...

  8. Mysql总结_03_mysql常用命令

    一.MySQL服务的启动和停止 net stop mysql net start mysql 二.登陆mysql mysql -u用户名 -p用户密码 键入命令mysql -uroot -p, 回车后 ...

  9. png8 png24 png32

    解释 PNG8 : 8位的PNG最多支持256(2的8次方)种颜色,8位的PNG支持不透明.索引透明.alpha透明. PNG24 : 支持2的24次方种颜色,表现为不透明.PS导出PNG24是会根据 ...

  10. 【遍历二叉树】09判断二叉树是否关于自己镜像对称【Symmetric Tree】

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 给定一个二叉树,判断是否他自己的镜 ...