1单表
1.1表空间tablespace(1.创建 create 2.删除 drop)
1.1.1 create tablespace 表空间
default 默认路径
size 大小
autoextend on
next 自增长的大小
1.1.2 Drop tablespace 表空间
1.2用户(1.创建 2. 授权(grant),3解锁用户(scott),撤销???)
1.2.1 create user 用户
identified by 密码
default tablespace 表空间
1.2.2
grant connect/resource/dba to 用户名
1.2.3 解锁和修改密码
alter user 账户 account unlock
alter user 账户 identified by 密码
1.3表结构(1.创建 2.增删改(alter))
1.3.1 create table 表名{
变量名 数据类型
}
1.3.2增加列
alter table 表名 add (变量名 数据类型)
1.3.3修改列名称/列数据类型
alter table 表名 rename column 列名 to 新列名
alter table 表名 modify 列名 数据类型
1.3.4删除列
alter table 表名 drop column 列名
1.4表数据(1.增(insert+commit)删(delete)改(update+commit))
1.3.1增
insert into 表名(列名1 列名2)values(数值1,数值2)
INSERT INTO person (pid pname) VALUES (1,'小明');
COMMIT;
1.3.2改
update 表名 set 列名 where 条件
UPDATE person SET pname = '小马' WHERE pid = 1;
COMMIT;
1.3.3改
delete from 表名;
drop table 表名;
TRUNCATE TABLE 表名;
1.5序列(不属于任何表,作为逻辑和表做绑定,默认从一开始一次递增,给主键赋值用,虚表,补全语法,没有任何意义)
create sequence 序列
select 序列.nextval from dual
select 序列.currval from dual
例子:添加一条记录
insert into person (pid,pname)values (s_person.nextval,'小明');
commit;
1.6函数
---字符函数
SELECT UPPER('yes') FROM DUAL;--YES
SELECT LOWER('YES') FROM DUAL;--yes
----数值函数
SELECT ROUND(56.16, -2) FROM DUAL;---四舍五入,后面的参数表示保留的位数
SELECT trunc(56.16, -1) FROM DUAL;---直接截取,不在看后面位数的数字是否大于5.
SELECT MOD(10, 3) FROM DUAL;---求余数
----日期函数
----查询出emp表中所有员工入职距离现在几天。
SELECT SYSDATE-e.hiredate FROM emp e;
----算出明天此刻
SELECT SYSDATE+1 FROM DUAL;
----查询出emp表中所有员工入职距离现在几月。
SELECT months_between(SYSDATE,e.hiredate) FROM emp e;
months_between()
----查询出emp表中所有员工入职距离现在几年。
SELECT months_between(SYSDATE,e.hiredate)/12 FROM emp e;
months_between/12
----查询出emp表中所有员工入职距离现在几周。
SELECT ROUND((SYSDATE-e.hiredate)/7) FROM emp e;
ROUND(()/7)
----转换函数
---日期转字符串
SELECT to_char(SYSDATE, 'fm yyyy-mm-dd hh24:mi:ss') FROM DUAL;
---字符串转日期
SELECT to_date('2018-6-7 16:39:50', 'fm yyyy-mm-dd hh24:mi:ss') FROM DUAL;
----通用函数
---算出emp表中所有员工的年薪
----奖金里面有null值,如果null值和任意数字做算术运算,结果都是null。
SELECT e.sal*12+nvl(e.comm, 0) FROM emp e;
1.7条件表达式(mysql和oracle的
通用写法和Oracle的专门写法)(等值表达式和条件表达式)
SELECT e.ename,
CASE e.ename
WHEN 'SMITH' THEN '曹贼'
WHEN 'ALLEN' THEN '大耳贼'
WHEN 'WARD' THEN '诸葛小儿'
--else '无名'
END
FROM emp e;等值判断
---判断emp表中员工工资,如果高于3000显示高收入,如果高于1500低于3000显示中等收入,
-----其余显示低收入
SELECT e.sal,
CASE
WHEN e.sal>3000 THEN '高收入'
WHEN e.sal>1500 THEN '中等收入'
ELSE '低收入'
END
FROM emp e;
----oracle中除了起别名,都用单引号。
----oracle专用条件表达式
SELECT e.ename,
DECODE(e.ename,
'SMITH', '曹贼',
'ALLEN', '大耳贼',
'WARD', '诸葛小儿',
'无名') "中文名"
FROM emp e;
decode(e.namee
a,b
c,d
)"中文名"一般使用通用表达式
1.8聚合函数
SELECT COUNT(1) FROM emp;---查询总数量
SELECT SUM(sal) FROM emp;---工资总和
SELECT MAX(sal) FROM emp;---最大工资
SELECT MIN(sal) FROM emp;---最低工资
SELECT AVG(sal) FROM emp;---平均工资
1.9分组查询
---查询出每个部门工资高于800的员工的平均工资
---然后再查询出平均工资高于2000的部门
SELECT e.deptno, AVG(e.sal) asal
FROM emp e
WHERE e.sal>800
GROUP BY e.deptno
HAVING AVG(e.sal)>2000;
2.0多表查询
---笛卡尔积
SELECT *
FROM emp e, dept d;
---等值连接
SELECT *
FROM emp e, dept d
WHERE e.deptno=d.deptno;
---内连接
SELECT *
FROM emp e INNER JOIN dept d
ON e.deptno = d.deptno;
---查询出所有部门,以及部门下的员工信息。【外连接】
SELECT *
FROM emp e RIGHT JOIN dept d
ON e.deptno=d.deptno;
---查询所有员工信息,以及员工所属部门
SELECT *
FROM emp e LEFT JOIN dept d
ON e.deptno=d.deptno;
---oracle中专用外连接
SELECT *
FROM emp e, dept d
WHERE e.deptno(+) = d.deptno;
SELECT * FROM emp;
---查询出员工姓名,员工领导姓名
---自连接:自连接其实就是站在不同的角度把一张表看成多张表。
SELECT e1.ename, e2.ename
FROM emp e1, emp e2
WHERE e1.mgr = e2.empno;
2.1子查询返回一个值和返回一个集合都建议用in
---子查询返回一个集合
---查询出工资和10号部门任意员工一样的员工信息
SELECT * FROM emp WHERE sal IN
(SELECT sal FROM emp WHERE deptno = 10);
2.2排序---rownum行号:当我们做select操作的时候,--每查询出一行记录,就会在该行上加上一个行号,--行号从1开始,依次递增,不能跳着走。
SELECT rownum, e.* FROM emp e ORDER BY e.sal DESC
SELECT rownum e.* FROM emp e ORDER BY e.sal DESC
----如果涉及到排序,但是还要使用rownum的话,我们可以再次嵌套查询。
SELECT rownum, t.* FROM(
SELECT rownum, e.* FROM emp e ORDER BY e.sal DESC) t;
----emp表工资倒叙排列后,每页五条记录,查询第二页。
----rownum行号不能写上大于一个正数。
SELECT * FROM(
SELECT rownum rn, tt.* FROM(
SELECT * FROM emp ORDER BY sal DESC
) tt WHERE rownum<11
) WHERE rn>5