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. Android系统Recovery工作原理之使用update.zip升级过程分析(三)【转】

    本文转载自:http://blog.csdn.net/mu0206mu/article/details/7464699 以下的篇幅开始分析我们在上两个篇幅中生成的update.zip包在具体更新中所经 ...

  2. vim 的复制粘贴命令,以及使用寄存器来存放要复制的内容;

    一,y(yanks)复制,p(paste)粘贴: yy 复制当前行,2yy,复制2行: Y  复制整行:Y=yy; p 粘贴到光标后: P 粘贴到光标前: 注意vim会知道你复制内容的是整行还是一个矩 ...

  3. poj3984《迷宫问题》暑假集训-搜索进阶

    K - 迷宫问题 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65536KB     64bit ...

  4. UVA 1493 Draw a Mess(并查集+set)

    这题我一直觉得使用了set这个大杀器就可以很快的过了,但是网上居然有更好的解法,orz... 题意:给你一个最大200行50000列的墙,初始化上面没有颜色,接着在上面可能涂四种类型的形状(填充):  ...

  5. jquery侧边折叠导航栏制作,两行代码搞定

    jquery侧边折叠导航栏制作,两行代码搞定 //CSS*{margin: 0;padding: 0} ul{list-style: none} .menu li ul{display: none} ...

  6. PHP继承中$this的问题

    在父类中的构造函数中使用$this , 这是$this指的是正在实例化的子类对象,不管是parent还是继承调用父类的构造函数. 如: class CompanyController extends ...

  7. Java丨jsoup网络爬虫模拟登录思路解析

    直奔主题: 本篇文章是给有jsoup抓包基础的人看的...... 今天小编给大家写一篇对于jsoup抓包时需要输入验证码的解决方法之一.大神就绕道,嘿嘿~ 任何抓包的基础都是基于Http协议来进行这个 ...

  8. conda 里的 jupyter

    1. 安装conda https://mirrors.tuna.tsinghua.edu.cn/anaconda/ 下载并安装. 2. 安装jupyter (1)在ananconda主环境安装:pip ...

  9. 《java编程思想》:散列的原理

    以实现一个简单的HashMap为例,详细讲解在code之中. 简单解释散列原理: 1.map中内建固定大小数组,但是数组并不保存key值本身,而是保存标识key的信息 2.通过key生成数组角标,对应 ...

  10. JavaWEB - JSP及隐含对象

    ---------------------------------------------------------------------------------------------------- ...