网站开发设计工程师工作前景,西安高校定制网站建设,市场调研的重要性,附近的计算机培训班1、基本概念oracle数据库是一个物理概念#xff0c;oracle实例是数据库在内存中的镜像#xff0c;属于一种逻辑概念。oracle数据库与oracle实例至少是一对一的关系#xff0c;也可能是一对多关系#xff08;oracle集群#xff1a;RAC real application cluster#xff09…1、基本概念oracle数据库是一个物理概念oracle实例是数据库在内存中的镜像属于一种逻辑概念。oracle数据库与oracle实例至少是一对一的关系也可能是一对多关系oracle集群RAC real application cluster。集群的优点load balance 负载平衡fail over 失败迁移数据文件是一种物理概念用来存储数据用的后缀为.dbf的文件表空间表空间是一种逻辑概念表空间有多个数据文件组成数据文件只能属于一个表空间。2、基本查询命令中oracle的基本操作清屏sql 操作数据库 sql tab就是当前用户的数据字典可以查看当前用户的表和视图。基本SQL select 语句查询所有员工信息sql SQL优化数据库的优化尽量使用列名数据库在解析*号时需要耗时。 尽量不要使用 集合运算 符号。 where 解析的顺序问题 where 解析的顺序是从右往左解析 所以当一个子条件为假时and 符号左侧的条件就不再判断 若Where子句和Having子句中都可以使用的条件从语句的执行效率来看最好写在Where子句中(where 先过滤再分组having 先分组再过滤)select查询语句查询中的空值null问题查询员工的年收入其中年收入月薪*12奖金select 下面的查询结果显然错误没有奖金的员工居然没有年薪奖金为空实际上表示奖金为零。SQL中的null值问题 空值是无效的未指定的不可预知的值空值并不是空格或0 包含null的表达式都为null null值永远null如果集合中含有null 不能使用not in但可以使用 in组函数多行函数自动滤空;可以嵌套滤空函数 来屏蔽他的滤空功能select 6. null排序 ——降序排列时nulls last 语句将空值显示再查询结果的最后oracle中null值最大oracle中的通用函数滤空函数:nvl(a,b) 与 nvl2(expr1expr2expr3)nvl 查询奖金为null空的员工-- 该语句无法查询出奖金为空的员工因为nullnull
列的别名列的别名紧跟在列名之后也可在列名和别名之间加入关键字“AS”别名使用双引号以便在别名中包含空格或特殊字符、数字等AS 关键字可以省略 列的别名的区别员工号与姓名这两个列名之间没有区别 姓名与月薪两个别名之间有区别当别名中存在关键字、数字或者特殊符号空格等必须要添加双引号。distinct关键字——去除重复记录-- 查询员工的部门号不同员工属于同一部门部门有重复
distinct 关键字 作用与select 后的所有列。distinct关键字保证所有的列组合起来是不相同的。连接符1、 把列与列列于字符连接起来2、用“||“表示 3、可以用来”合成“列-- 可以使用concat()函数将两个字符串连接起来,oracle中提供dual伪表供使用select 伪表dual表 dual表在Oracle中是非常特殊的一张表它存在的意义就是来满足sql99的语法格式select后必须要有from子句存在字符和日期注意 日期和字符只能在单引号中出现即单引号中出现的可以是字符也可以是日期双引号中出现的是列的别名 默认的日期格式DD-Mon-RR-- 查看日期格式
3、过滤和排序比较运算符注意% 表示任意长度的任意字符串“_”表示任意的一个字符模糊查询中可以使用 escape 标识符 选择“%”“_”符号即escape起到了 转义字符的功能-- 查询薪水在1000~2000之间的员工
逻辑运算符注意-- 下面两条sql语句是否一样 这两条语句完全不同仅仅是这两条sql语句执行结果一致
排序order by 列名/表达式/别名/序号 排序方式asc 升序 desc 降序-- 查询员工信息按照月薪排序2、order by 多个列的排序-- 查询员工信息按照月薪排序
desc 只作用于离他最近的列select order by 子句应当再where子句之后参考资料 SQL语句的语法顺序和执行顺序_tree_ifconfig的博客-CSDN博客_sql语句顺序blog.csdn.net4、单行函数定义操作数据对象接受参数并返回一个结果仅对一行进行变换每行返回一个结果字符函数 1、lower()函数、upper()函数与initcap()函数-- 字符大小写转换 2、substr()求字串函数 -- substr(a,b) 从a串中第b位置为开始取后面所有字符 3、instr()查找字符串函数-- instr(a,b) 在a字符串中查找b字符串如果找到返回下标如果没找到返回0 4、length()字符数 lenghthb()字节数sql 5、lpad()左填充 rpad()右填充-- lpad(被填充的字串,填充几位,用什么字符填充)6、trim()函数-- trim(被去除字符from字符串)去除前后指定的字符7、replace()函数-- replace(字符串,待替换字符,替换字符)替换函数
数字函数 1、四舍五入 round()select 2、截断函数 trunc()select 3、注意 round()与trunc()函数不仅仅是数字函数也可以对日期进行操作日期oracle中的日期类型只有date类型不同于mysql中有date与datetime两种。在oracle中date日期时间-- 查询当前时间
两个日期相减返回日期之间相差的天数-- 时间差
日期处理函数数据转换函数 1、 隐式数据类型转换 oracle数据库自动完成数据类型间的转换 2、显示数据类型转换-- to_char(date,格式)
to_char()函数常用的数字格式通用函数通用函数中参数适用于任何类型数据同时也适用于空值null条件表达式在sql中完成if-then-else的逻辑-- 不同级别员工涨不同的钱
select 5、分组函数分组函数作用于一组函数并对一组数据返回一个值。组函数多行函数自动滤空常用的组函数-- sum()函数 求和函数
统计函数count(*) 统计不重复的次数时使用distinct关键字select 分组数据group by 子句--求每个部门的平均工资
将上面问题抽象化select oracle中的规定所有包含于select列表中而未包含于组函数中的列都必须在group by语句中group by 语句中出现的列未必要在select语句中出现select 多个列的分组 -- 按照不同部门的不同工种进行分组计算工资
过滤分组数据 having 子句 1、行已经被分组 2、使用了组函数 3、满足having子句中条件的分组将被显示-- 求出平均工资大于2000的部门
having 子句与where 子句的理解 1、where后面不能使用多行函数聚合函数例如max、min等 2、where 与having 的执行顺序不同 where的搜索条件是在执行分组之前应用 having的搜索条件是在分组条件后执行的 如果where和having一起用时where会先执行having后执行3、Where关键字作用是过滤选取符合条件的记录而Having关键字作用则是为聚合结果指定条件!4、Where 子句是用来指定 行 的条件的而Having 子句是指定 “组” 的条件 Where 子句 指定行所对应的条件 Having 子句 指定组所对应的条件 5、若Where子句和Having子句中都可以使用的条件从语句的执行效率来看最好写在Where子句中。where 先过滤再分组having 先分组再过滤where 与 having 可以通用的情况-- 查询10号部门的平均工资
group by 语句 增强-- 按照部门统计各部门不同工种的工资情况
6、多表查询笛卡尔积问题在多表连接查询问题中连接查询会产生笛卡尔积的问题产生很多错误的数据记录。笛卡尔积就是求出多个表的乘积例如 emp 表与 dept 表连接那么笛卡尔积就是 emp*dept。上图中红框中的记录数据明显是由笛卡尔积计算而产生的错误数据。 那么多表查询产生这样的结果并不是我们想要的那么怎么去除重复的不想要的记录呢当然是通过条件过滤。通常要查询的多个表之间都存在关联关系那么就通过关联关系去除笛卡尔积。 设置表与表之间的连接条件将多张表连接起来。-- 连接条件 等值连接通过连接条件对多张表的笛卡尔积进行过滤--查询员工信息 员工号 姓名 月薪 部门名称
注意在where子句中写入连接条件在表中有相同名称的列需要在列名之前加上前缀以区别是那一张表的列。连接n张表至少需要n-1个连接条件例如连接3张表就需要2个连接条件。 多个连接条件需要使用 and 关键字加以合并。不等值连接连接多张表的连接条件并不是 等值 条件--查询员工信息 员工号 姓名 月薪 工资级别 外连接 ([outer] join on)参考资料:Oracle的连接详解左连接、右连接、全连接... - 无时无刻 - 博客园www.cnblogs.comOracle连接查询彻底搞懂外连接左外连接右外连接_ljinxin的博客-CSDN博客_oracle左连接查询blog.csdn.netMySQL数据库的内连接左外连接和右外连接查询_SpiderLi的博客-CSDN博客_数据库内连接查询示例blog.csdn.netOracle中的连接查询讲解www.jianshu.com外连接结果是内连接结果的超集在左连接和右连接时都会以一张表作为基表该表的内容会全部的显示然后加上两张表匹配的内容。 下面例子的SQL明显错误由于emp表中不包含40号部门dept表中却存在所以在做连接查询的时候40号部门并不能满足 “where e.deptnod.deptno” 条件所以等值连接查询无法查出该部门-- 按部门统计员工人数部门号 部门名称 人数 1、左外连接 (left [outer] join on)结果包括左表出现在JOIN子句最左边中的所有行不包括右表中的不匹配行 对于外连接在Oracle中可以使用()来表示On子句外连接的表之间连接条件 不使用WHERE而是使用ON。将连接的条件放在on子句中而且每个on子句只能指定一个连接条件。如果需要连接N个表则需要有N-1个join-on对。 左连接是先查询出左表即以左表为主然后查询右表右表中满足条件的显示出来不满足条件的显示NULL。 希望 对于某些不成立的记录任然希望包含在最后的结果中 左外连接当where e.deptnod.deptno不成立的时候等号左边的表任然被包含 写法:where d.deptnoe.deptno() 右外连接当where e.deptnod.deptno不成立的时候等号右边的表任然被包含 写法: where e.deptno()d.deptno-- 按部门统计员工人数部门号 部门名称 人数
2、 右边外连接 (right [outer] join on)结果包括右表出现在JOIN子句最右边中的所有行不包括左表中的不匹配行 -- 按部门统计员工人数部门号 部门名称 人数
3、全外连接full [outer] join结果包括左、右两个表的所有行不论他们是否匹配即不管在另一边表中是否存在于他们匹配的行 左外连接返回包括左表中的所有记录和右表中联结字段相等的记录 右外连接返回包括右表中的所有记录和左表中联结字段相等的记录 全外连接 查询结果等于左外连接和右外连接的和 -- 按部门统计员工人数部门号 部门名称 人数 内连接[inner] join on 外连接结果是内连接结果的超集 内联接结果为两个联接表中的匹配行的联接 即 只连接两张表的匹配行 inner join连接作为一种等值连接其操作相当于where中的等值连接。 等值连接 的语法并不是标准的SQL99语法,属于数据库的方言, inner join 是SQL99标准的实现方式--查询员工信息 员工号 姓名 月薪 部门名称 自然连接natural join连接查询会产生无用笛卡尔积我们通常使用主外键关系等式(等值连接条件)来去除它。而自然连接无需你去给出主外键等式它会自动找到这一等式 自然连接是在广义笛卡尔积R×S中选出同名属性上符合相等条件元组再进行投影去掉重复的同名属性组成新的关系。即自然连接是在两张表中寻找那些数据类型和列名都相同的字段然后自动地将他们连接起来并返回所有符合条件按的结果。例emp和dept表都存在deptno列并且类型一致所以会被自然连接找到Using子句用于显示指定两个表中的同名列并将其作为连接条件。假设两个表中有超过一列的同名列如果使用自然连接(natural join),则会把所有的同名列当成连接条件使用using子句就可以显示指定那些同名列作为连接条件。 即,using 子句可以在有多个满足条件的连接列时, 进行自主的选择-- 按部门统计员工人数部门号 部门名称 人数
自然连接的注意事项 如果做自然连接的两个表中有多个字段都满足有相同名称和类型那么他们都会被作为连接的条件。 如果自然两个表中仅字段名称相同但是数据类型不同时此时会返回一个错误。 自然连接不要用表的别名自连接 通过表的别名将同一张表视为多张表即 自己与自己的等值连接-- 查询每个员工对应的老板编号员工的上司
自连接操作过程中会产生 笛卡尔积 查询结果即 表的记录的平方行记录故自连接不适合操作大表。 层次查询connect by 与 start withOracle层次化查询是Oracle特有的功能实现,主要用于返回一个数据集,这个数据集存在树的关系(数据集中存在一个Pid记录着当前数据集某一条记录的Id) 层次化查询主要包含两个子句,一个start with另一个是connect by 。start with:这个子句一般用于指定层次化查询的开始节点(也就是树的最顶级节点),找到最顶级节点,然后按照一定的规则开始查找其剩余的子节点。connect by:这个子句就是上面所说的规则,用于查找剩余子节点的规则。-- 查询每个员工的上司的员工编号
具有层次关系的查询可以考虑层次查询。根节点的定义比较灵活,但是(connect by)遍历子节点的规则,比较固定基本都是判断父节点和子节点的ID的参考资料 oracle 层次查询_qq_38743952的博客-CSDN博客_oracle 地区层次查询blog.csdn.net 交叉查询cross join交叉联接结果包括两个联接表中所有可能的行组合。 即笛卡尔积连接是两个或多个表间的无条件连接 。 交叉连接结果是其他连接结果的超集外连接结果是内连接结果的超集 select 7、集合操作常见的集合操作共有union与union all并集、intersect交集与minus差集。union与union all 并集union与union all的作用都是合并结果集。 将是把多个select语句的查询结果合并到一起 。union与union all的区别在于UNION去除重复记录例如SELECT * FROM t1 UNION SELECT * FROM t2UNION ALL不去除重复记录例如SELECT * FROM t1 UNION ALL SELECT * FROM t2。-- 查询10和20号部门的员工
集合运算注意点 参与运算的各个集合必须列数相同且类型一致当列数不同时需要添加列若类型不同时需要转换 列数不足时补充NULL并根据需要做相应类型转换。-- 按照部门统计各部门不同工种的工资情况 采用第一个集合作为最后的表头。order by 永远在最后。括号可以集合运算的先后顺序。intersect 交集intersect 运算返回同时属于两个集合的记录图中黄色部分。-- 显示薪水同时位于级别1700~1300和 级别21201~1400的员工信息
minus 差集minus返回属于第一个集合但不属于第二个集合的记录-- 显示薪水同时位于级别1 700~1300但不属于级别21201~1400的员工
Mysql数据库中的集合运算参考资料 MySQL 并集、交集、差集_三中故人的学习笔记-CSDN博客_mysql 并集blog.csdn.netmysql数据库中只有union与union all结果集合并运算符而没有intersect交集与minus差集运算符。但是可以通过表之间的内外连接等运算达到同样的效果。现在有如下两张表表object_a 表object_b 交集实现intersect-- 使用 内连接 inner join 实现 交集运算
差集实现minus-- 使用 左外连接 实现差集运算 获取a - b 表
补集-- 使用 左外连接 实现补集运算
8、子查询To be continued......