7.26实习培训日志-Oracle SQL(二)
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 定义的链接类型:
- 等于链接
- 不等链接
- 外连接(可细分为左外连接、右外连接)
- 自连接
工业标准定义(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 的“等于链接”
隐式内连接
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语句
- 写出表名+列名
- 仅写出表名
- 从其他表拷贝一行
- 使用子查询作为插入目标
update语句
- 更新符合条件的行中某些列为具体的值
- 使用子查询的结果作为更新后的值
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 动作:
- 数据定义语句被执行的时候,比如新建一张表:Create Table
- 数据控制语句被执行的时候,比如赋权 GRANT …( 或者 DENY)
- 正常退出 iSQL*Plus 或者PLSQL DEVELOPER, 而没有显式的执行 COMMIT 或者 ROLLBACK 语句 。
当如下事件发生时,会隐式执行Rollback 动作:
- 非正常退出 iSQL*Plus , PLSQL DEVELOPER, 或者发生系统错误
读一致性: 对于有人正在修改过程中的一批数据,在其位提交前,其他用户读到的是
一致的内容。
锁
Select … from TableA Where … For UPDATE NoWait:显示加锁,如果另一session在更新数据未提交,我们也更新数据,会造成死锁,但是我们不知情,只知道更新数据一直执行,但是用此语句可以得知是否死锁,会提醒我们有锁。
我们更新语句时最好用select语句查一下
某用户对某一批数据进行更改,而未提交之前,Oracle 会隐式的进行加锁。
MySQL的autocommit(自动提交)默认是开启,Oracle默认关闭
表
表的命名要求和表中列的命名要求:
- 必须以字母开头
- 长度不能超过30 个字符
- 只能包含 A–Z, a–z, 0–9, _, $, and #
- 不能与数据库中的已有对象重名
- 不能使用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区别
- 没有Rollback 机会
- 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,…);
外键约束类型:
- REFERENCES: 表示列中的值必须在父表中存在
- ON DELETE CASCADE: 当父表记录删除的时候自动删除子表中的相应记录.
- 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(二)的更多相关文章
- 7.27实习培训日志-Oracle SQL(三)
Oracle SQL(三) 视图 特性 简单视图 复杂视图 关联的表数量 1个 1个或多个 查询中包含函数 否 是 查询中包含分组数据 否 是 允许对视图进行DML操作 是 否 CREATE [OR ...
- 7.25实习培训日志-Oracle SQL(一)
Oracle SQL(一) 重点 尽量避免select *,影响性能,不直观. 慎用Distinct,会排序,影响性能,用exists 排序尽量利用索引,索引有序 索引列不要加函数,会使索引失效 外连 ...
- 7.31实习培训日志-docker sql
docker mysql docker问题 今天问了老师有关docker的问题,entrypoint和cmd的区别,两者同时存在cmd的执行结果会被当做参数传入entrypoint. dockerfi ...
- 7.29实习培训日志-Oracle题目
总结 这周主要学习了SQL,oracle中的SQL基础,以前学习的是SQLserver的SQL,和oracle的还是有略微不同,所以重新去学习了一段时间,然后对于oracle中的各种函数有了初步了解, ...
- 7.30实习培训日志-SQL优化
总结 今天早上考试,下午主要是老师引导我们学习SQL优化,晚上主要是同学的技术分享,杨松柏同学主要给我们分享了java的io的一些东西,c10k问题,bio(同步阻塞IO),NIO(同步非阻塞IO), ...
- 7.24实习培训日志-Docker-Compose
Docker-Compose 对于昨天的考试,需要 项目根目录下需要docker/mysql/Dockerfile 文件用于构建mysql镜像 项目根目录下需要docker/java/Dockerfi ...
- 7.23实习培训日志-JDBC
总结 今天下午考试,JDBC,这个本身很简单,但是需要我们Dockerfile+Docker Compose运行,这个东西就很复杂.原来学习时没有怎么看,这一次就很懵,完全不知道怎么弄,反正环境都没有 ...
- 7.10实习培训日志-markdown Git
父模块github地址 一. markdown 1. markdown列表 html是一种发布的格式,markdown是一种书写的格式 区块引用 列表 图片 表格 html 标题 记笔记 写博客 2. ...
- 7.21实习培训日志-JDBC JSP Servlet
JDBC JSP Servlet 总结 今天早上的考试主要考Java的网络,HttpClient的get,post方法,Socket的文件传输和Xml和Json文件的解析,对于HttpCLient很简 ...
随机推荐
- 20145229吴姗珊 《Java程序设计》第7周学习总结
20145229吴姗珊 <Java程序设计>第7周学习总结 教材学习内容总结 第13章时间与日期 即使标注为GMT(格林威治时间),实际上谈到的的是UTC(Unix时间)时间. 秒的单位定 ...
- hd acm 1297
问题:n个人排队,要求女生不能单独站,可以全是男生,可以全是女生. 例子:n=7,FFFF,FFMM,FFFM,MFFF,MMFF,MMMM,MFFM(F代表女生,M代表男生). 代码:(来自 蓝飞技 ...
- EntityFramework 学习 一 Model Browser
我们已经为School表创建第一个实体数据模型,可视化的EDM设计器不显示所有的实体,而是显示和数据库中对应的表和视图 Model Browser为你提供关于所有对象和函数的信息, Diagrams ...
- LUA学习之一 初次接触
对于一个开源工程,开始学习它的第一步自然是编译工程. 使用vc编译lua,在网上已有许多介绍,但“纸上得来终觉浅”,自己走一遍还是有必要的. 步骤如下: 1.下载源代码,从lua.org下载最新源代码 ...
- jQuery查找子元素与后代元素
1. 子元素: $().children('选择器') 如选择type为file的子元素 $(this).children("input[type=file]") 或者 $(& ...
- 分享知识-快乐自己:Mybatis 基础动态语句
目录: User: package mlq.bean; /** * 用户实体类 */ public class User { private Integer uId; private String u ...
- 十九 Django框架,发送邮件
全局配置settings.py EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' #发送邮件引擎 EMAIL_USE_TLS ...
- ES doc_values的来源,field data——就是doc->terms的正向索引啊,不过它是在查询阶段通过读取倒排索引loading segments放在内存而得到的?
Support in the Wild: My Biggest Elasticsearch Problem at Scale Java Heap Pressure Elasticsearch has ...
- 源码安装postgres10 in centos6.4
文件夹路径 程序目录 /usr/pgsql 数据目录/usr/local/pgdata 准备工作 获得源码 mkdir /opt/soft_bak cd /opt/soft_bak wget http ...
- 关于对H264码流的TS的封装的相关代码实现
1 写在开始之前 在前段时间有分享一个H264封装ps流到相关文章的,这次和大家分享下将H264封装成TS流到相关实现,其实也是工作工作需要.依照上篇一样,分段说明每个数据头的封装情况,当然,一样也会 ...