1,sql*plus(oracle的客户端)基本命令:
set linesize 140; 设置显示结果的行
set pagesize 140; 设置页的大小
set timing on/off ;on是显示每次操作的执行时间,off相反
set feedback on/off; on是显示每次操作所影响的行数,off相反
host cls; 清屏
desc 表名; 查看表的详细信息(每个字段的类型)
2,sql语句知识点补充:
null != null
任何表达式和null进行运算的结果都是空的
|| 为连接符,‘aaa’|| ‘bbb’可以将前后的字符连接起来。
where id in / not in (id0, id1, id2, ...) 注意候选式可以是null,注意是not in 的时候,结果永远是空的
当选择的列与from后面的表没有关系时,使用虚表会使结果集精简(会去掉重复的部分)。
先使用where过滤在分组比先分组在使用having过滤的效率高
select 如果没有where删选条件,删选的是from各表中笛卡尔积的连接结果,where后面的条件是对笛卡尔积的结果进行筛选
外连接技术的使用场景,就是把连接条件中,其中一个是null另一个不是null的数据也找出来。(+) =/= (+),那边没有加号就允许哪边的条件为null(oracle的语法)
对于子查询,要注意格式的书写,不要丢掉()
哪些地方可以加子查询,如下:
select a, b, c (select .....) //ok 但是在select后面的子查询,其子查询的结果必须的单行的
from tab1, tab2, (select **) //ok 因为表和select出来的内容都是集合
where (select....) //ok =,<,> 是单行比较操作符;in是多行比较操作符。
group by ... (select ...) //err
having ...(select ...) //ok
order by ...(select ...) //err
rownum是oracle中服务器返回结果集的固有属性,不会随着排序而变化,例题如下面的第5个标题
sql语言有三种,分别是ddl,dml,dcl三种。
delete和truncate都是删除表中的数据,区别在于,delete可以rollback而truncate不可以,delete可能产生碎片而truncate不会
事物是一条或多个dml语句的组合,要么都成功,要么都失败。
把表删除后会进入回收站,显示回收站的内容的命令,show recyclebin。查看回收站表的内容要使用表在回收站中的内容
视图是一个逻辑的概念,数据仍然来源于表,视图的作用是用于简化查询(不用重复的写sql语句),但是视图并不可以查询性能。视图的定义中,with check option的作用,通过视图插入数据时,必须满足视图创建时的where条件。因此,并不建议通过视图插入更新删除数据。with read only 只能通过视图来读取数据。
索引和表示单独存放的,删除索引不影响表。索引可以提高检索速度(按照索引列重新排序表的记录,这是可以使用算法的,当时具体实现是数据库管理系统内部实现的)一旦索引建立,系统会自动维护。
3, oracle和mysql中的事物机制
oracle中事物默认是打开的,其结束的标志是分为两种。显式的:显示的提交commit 隐式的:1)执行DDL语言 2)正常退出
oracle中的回滚是以事物为单位的,oracle中的执行回滚的方法有两种。显式的:显示的提交callback 隐式的:系统错误
mysql是自动提交的,只要写一条dml语句,mysql就会自动提交
4,sql和sql*plus的区别
SQL:一种语言, 关键字不可以缩写, 使用语句控制数据库中的表的定义信息和表中的数据; select,delete属于sql语句
SQL*PLUS:一种环境, 关键字可以缩写, 命令不能改变数据库中的数据的值;ed,set,col属于sql*plus的命令
5,sql语句经典例题
1) 找到员工表中工资最高的前三名(Top-N 问题,在oracle中,select出的每个集合都会有一个rownum 属性)
select rownum, empno, ename, sal from
(select empno, ename, sal
from emp
order by sal desc)
where rownum <= 3
2)oracle的分页问题,同样使用的是上一题中的top-N模型
比如每页4条数据,取出第二页的数据
select r, empno, ename, sal from //注意这里的r不能写成rownum,否则是第二层select出的结果集合的rownum,这里的r //是第一层select出的结果集合的rownum
from (
select rownum r, empno, ename, sal from
(select empno, ename, sal
from emp
order by sal desc)
where rownum <= 8
)
where r >= 5