ORA-27101: shared memory realm does not exist解决方法:
1、用CMD进入命令行
2、sqlplus /nolog
3、conn / as sysdba
4、startup
首先介绍一下SQL92/99标准的四大分类
DML(数据操纵语言):
select,insert,update,delete
DDL(数据定义语言):
create table,alert table,drop table,truncate table
DCL(数据控制语言):
grant 权限 to scott,revoke 权限 from scott
TCL(事务控制语言):
commit,rollback,
下面会分别用类似的需求体现mysql和Oracle的区别
mysql创建数据库:
create database xxx;
在Oracle中是创建表空间
create tablespace xxx;
--指定存放空间
datafile 'C:xxx.dbf'
--指定大小
size 100m
--大小满了自动增长
autoextend on
--每次自动增长的大小
next 10m
创建表mysql和oracle是一样的
create table 表名{
字段名 类型(长度) [约束],
.....
.....
}
但是他们的类型各不相同:
mysql:
varchar(n) 字符串
int 整型
double 浮点
date 时间
oracle:
char:固定长度的字符类型,最多存储2000个字节
varchar2:可变长度的字符类型,最多存储4000字节
LONG:大文本类型,最大可以存储2个G
number:数值类型
number(5) 最大可以存99999
number(5,2) 最大可以存999.99
date:日期时间,精确到秒
mysql修改表结构
alter table category add 'desc' varchar(20);
代表给category这个表添加一个字符串长度为20的名为desc的字段
Oracle修改表结构
alter table category add (desc varchar2(20));
同上
mysql修改字段
alter table category change 'desc' description varchar(30);
将desc这一列的字段的字符长度改为30
Oracle修改字段
alter table category modify(desc varchar2(30));
同上
mysql删除字段
alter table category drop desc;
删除category表中desc这列
Oracle删除字段
alter table category drop column desc;
同上
mysql和Oracle的增删改SQL语句都一样
插入记录(insert)
insert into category(cid,cname) values(1,'xxx');
代表向category表中的cname列插入xxx数据
修改数据(update)
update category set cname = yyy where id =1;
代表将category表中id为1的cname字段改为yyy
删除数据(delete)
delete from category where id = 1;
代表删除category表中的id为一的字段数据
mysql和Oracle的jdbc连接
首先是Oracle
Oracle导入一个ojdbc14.jar的包
反射加载驱动为:oracle.jdbc.driver.OracleDriver
获取连接:jdbc:oracle:thin:@192.168.80.10:1521:orcl
下面是mysql
反射加载驱动为:com.mysql.jdbc.Driver
获取连接:jdbc:mysql://localhost:3306/test
下面是mysql和Oracle共有的属性,主要是查询语句
这里使用的是Scott用户在Oracle中示范
基本查询:(单表查询)
查询emp表的所有内容
select * from emp;
查询emp表的不重复的工作
select distinct job from emp;
查询员工的编号,姓名,月薪,年薪
select empno,ename,sal,sal*12 from emp;
使用where语句查询:
查询emp表中20号部门的员工信息
select * from emp where deptno = 20;
查询姓名是SMITH的员工,字符串使用'',内容大小写敏感
select * from emp where ename = 'SMITH';
范围查询:
查询工资大于1500的员工
select * from emp where sal > 1500;
查询薪水在1300到1600之间的员工,包括1300和1600
select * from emp where sal between 1300 and 1600;
查询不是20号或30号部门的员工
select * from emp where deptno not in (30,20);
like关键字:
查询姓名以大写字母N结束的员工
select * from emp where ename like '%N';
空值查询:
查询佣金为null的员工
select * from emp where comm is null;
and和or使用:
查询无佣金且工资大于1500的员工
select * from emp where(comm is null) and (sal > 1500);
查询职位是"MANAGER"或职位不是"ANALYST"的员工
select * from emp where (job='MANAGER') or (job<>'ANALYST');
排序查询和order by使用
查询员工信息(编号,姓名,月薪,年薪),按月薪升序排序,默认升序,如果月薪相同,按oracle内置的校验规则排序
select empno,ename,sal,sal*12 from emp order by sal asc;
查询员工信息(编号,姓名,月薪,年薪),按月薪降序排序
select empno,ename,sal,sal*12 from emp order by sal desc;
聚合统计
统计工资最高的人
select max(sal) from emp;
统计工资最低的人
select min(sal) from emp;
根据工号统计所有人数
select count(deptno) from emp;
分组后的条件查询
查询部门平均工资大于2000元的部门
select deptno "部门编号",trunc(avg(sal),0) "部门平均工资" from emp group by deptno having trunc(avg(sal),0) > 2000 order by 2 desc;
这里的2代表的是第二个条件,也就是部门平均工资
需要注意的是:
where是行过滤器,针对原始记录,跟在from后面,先执行
having是组过滤器,针对分组后的记录,跟在group by后面,后执行
下面是多表查询:
连接查询:
内连接查询:只能查询出符合条件的记录
外连接查询:既能查询出符合条件的记录,也能根据一方强行将另一方查询出来
多表外连接查询:(左外连接)
按部门10,20,30,40号,统计各部门员工人数,要求显示部门号,部门名,人数
首先是sql99:
select dept.deptno "部门号",dept.dname "部门名",count(emp.empno) "人数" from dept left join emp on dept.deptno = emp.deptno group by dept.deptno,dept.dname;
下面是Oracle专用语句:
select dept.deptno "部门号",dept.dname "部门名",count(emp.empno) "人数" from dept,emp where dept.deptno = emp.deptno(+) group by dept.deptno,dept.dname;
右外连接
首先是sql99:
select dept.deptno "部门号",dept.dname "部门名",count(emp.empno) "人数" from emp left join dept on emp.deptno = dept.deptno group by dept.deptno,dept.dname;
下面是Oracle专用语句:
select dept.deptno "部门号",dept.dname "部门名",count(emp.empno) "人数" from dept,emp where emp.deptno(+) = dept.deptno group by dept.deptno,dept.dname;
自连接查询:
显示"SMITH的上级是FORD"
select users.ename || '的上级是' ||boss.ename from emp users,emp boss where users.mgr = boss.empno;
子查询:
查询条件未知的事务
查询工资比WARD高的员工信息
select * from emp where sal > (select sal from emp where ename = 'WARD');