oracle初试、函数、增删改查、多表查询

安装oracle后的测试以及解锁账户                 

 1 安装后打开命令行,输入     sqlplus
 2 回车后会提示输入用户名,输入   sys或者system
 3 回车后输入密码,密码为安装oracle时设置的口令
 4 
 5 登录后命令行会出现    SQL>>    表示登录成功,接着就可以写SQL命令了
 6 这时登录的是sys用户或者system用户,如果需要使用scott用户需要解锁,解锁命令如下:
 7 
 8 解锁scott用户
 9 alter user scott identified by tiger account unlock;
10 
11 解锁hr用户
12 alter user  hr  identified by  hr  account unlock;
13 
14 
15 其中scott / tiger ,hr / hr 是用户名密码。
View Code

几个ORACLE常用的命令                              

 1 ORACLE常用命令不需要分号
 2 
 3 1. 不使用密码登录oracle
 4     CONN/AS SYSDBA
 5 
 6 2. 给用户设置密码,将sys的密码设置成admin
 7     ALTER USER SYS IDENTIFIED BY ADMIN
 8 
 9 3. 登录后,需要更换登录的用户
10     CONN SYS/ADMIN AS SYSDBA
11     CONN 用户名/密码
12 
13 4. 显示当前登录用户
14     SHOW USER
15 
16 5. 账户锁定和解锁
17     ALTER USER 用户名 ACCOUNT LOCK; 锁定
18     ALTER USER 用户名 ACCOUNT UNLOCK; 解锁
View Code

 

函数                                                               

普通函数

 1 首字母大写INITCAP(字段)
 2     SELECT INITCAP(ENAME) FROM EMP;
 3 
 4 转大小写LOWER(),UPPER()
 5     SELECT LOWER('JOB') FROM EMP;    -- 转小写
 6     SELECT UPPER("hell o") FROM DUAL;
 7     SELECT UPPER(ENAME) FROM EMP;   -- 将ENAME列的内容转为大写
 8 
 9 去掉左右空格 TRIM()
10     SELECT TRIM(' h e ll o ') FROM DUAL;
11 
12 字符串长度 LENGTH()
13     SELECT LENGTH(ENAME) FROM EMP;
14 
15     -- 先去掉字段的空格然后计算长度
16     -- 知识点:函数可以嵌套调用
17     SELECT LENGTH(TRIM(' h e ll o')) FROM EMP;
18 
19 左剪裁 LTRIM()
20     -- 从左边裁掉HE
21     -- 第一个参数是要裁剪的字段,第二个参数是要裁剪的内容
22     SELECT LTRIM('HELLO', 'HE') FROM DUAL;
23 
24 右剪裁RTRIM()
25     SELECT RTRIM('HELLO', 'HEL') FROM DUAL;
26    
27 替换REPLACE()
28     -- 第一个参数是要替换的字段
29     -- 第二个参数是被替换的内容
30     -- 第三个参数是替换的内容
31     SELECT REPLACE('HELLOWORD', 'O', '你好') FROM DUAL;
32 
33 查找字符串的位置 INSTR()
34     -- 要查找的字段, 查找的内容   没有返回0
35     SELECT INSTR('HELLOWORD', 'O') FROM DUAL;
36 
37 字符串截取SUBSTR()
38     -- 第一个参数是要截取的字段
39     -- 第二个参数是截取的位置
40     -- 第三个参数是截取的长度
41     
42     -- 从1开始截掉两位
43     SELECT SUBSTR("HELLOWORD", 2) FROM DUAL;
44     -- 从2开始截取4位
45     SELECT SUBSTR('HELLOWORD', 24) FROM DUAL;
46 
47 字符串连接CONCAT()
48     SELECT CONCAT('HELLO', 'WWWW') FROM DUAL;
49     -- 使用||也可以将这两个字符串连接起来
50     SELECT 'HELLO'||'WWWW' FROM DUAL;

数值型函数

 1 绝对值 ABS()
 2     SELECT ABS(-15) FROM DUAL;
 3 
 4 向上取整 CELL()
 5     SELECT CELL(10.0001) FROM DUAL;
 6 
 7 向下取整FLOOR()
 8     SELECT FLOOR(10.9999) FROM DUAL;
 9 
10 次方次幂 POWER()
11     SELECT POWER(2, 3) FROM DUAL;
12 
13 四舍五入ROUND()
14     -- 参数一要操作的字段
15     -- 保留的位数
16     SELECR ROUND(34.785858, 5) FROM DUAL;
17 
18 开平方 SQRT()
19     SELECT SQRT(9) FROM DUAL;

日期型函数

 1 系统当前时间 SYSDATE
 2     SELECT SYSDATE FROM DUAL;
 3 
 4 两个日期之间的月份差 MONTHS_BETWEEN(当前系统时间, 指定日期)
 5     SELECT MONTHS_BETWEEN(SYSDATE, '01-1月-18') FROM DUAL;
 6 
 7 返回指定月数后的日期 ADD_MONTHS(当前日期, 指定的月份)
 8     -- 当前时间开始几个月之后的日期
 9     SELECT ADD_MONTHS(SYSDATE, 2) FROM DUAL; 
10 
11 返回当前日期的下一周某一天的日期 NEXT_DAY(当前日期, 下一周的星期数)
12     SELECT NEXT_DAY(SYSDATE, '星期五') FROM DUAL;
13 
14 返回指定月份的最后一天 LAST_DAY(SYSDATE)
15     SELECT LAST_DAY(SYSDATE) FROM DUAL;

转换函数

 1 将日期转为字符串 TO_CHAR
 2     SELECT TO_CHAR(SYSDATE, 'yyyy-MM-DD') FROM DAUL;
 3 
 4 将数字转为字符串
 5     -- 9代表一位数字,如果该位没有数字不显示,但是小数点后面的仍会强制显示
 6     -- 100.1000
 7     SELECT TO_CHAR(100.10, '9999,9999.9999') FROM DUAL;
 8     -- 0代表一位数字,没有也会显示
 9     -- 00000100.1000
10     SELECT TO_CHAR(100.10'0000,0000.0000') FROM DUAL;
11 
12 将字符串转为日期型 TO_DATE
13     SELECT TO_DATE('2018-01-01', 'yyyy-MM-DD') FROM DUAL;
14 
15 将字符串转为数值型 TO_NUMBER
16     -- 前后数字位数要一致
17     SELECT TO_NUMBER('1234.99', '9999.99') FROM DUAL;

多行函数

顾名思义,多行函数就是一个函数能够操作多行数据的函数,一般是操作数据表的某一列数值

 1  -- 对一组数据进行运算,针对一组数据只返回一个结果,也成分组函数,聚合函数
 2 
 3 /*
 4     SUM: 求和   
 5     AVG(): 求平均值   
 6     MAX:求最大值   
 7     MIN: 求最小值   
 8     COUNT: 求总个数
 9 */
10  
11 SELECT SUM(SAL) AS 工资总和,
12 AVG(SAL) AS 平均工资,
13 MAX(SAL) 最高工资,
14 MIN(SAL) 最低工资,
15 COUNT(*) 总人数
16 FROM EMP;
17 
18 /*
19     SUM:求和  AVG:平均值   适用于数值型
20 
21     MAX MIN COUNT适用于任何数据类型
22  
23     COUNT不会对空值进行计算
24 
25 */

其他函数

1 -- 相当于if..else..
2 
3 NVL(EXP1, EXP2)  如果exp1的值为null,则返回exp2的值,否则返回exp1
4     -- exp1 与 exp2类型要一致
5     SELECT EMPON,ENAME,SAL+NVL(COMM, 0) FROM DUAL;

分组

 1 -- group by: 分组, 将表中的数据分成若干小组
 2 
 3 /*
 4     语法
 5 
 6     SELECT 列名, 分组函数(要分的列)
 7 
 8     FROM 表名
 9 
10     [WHERE 条件]
11 
12     [GROUP BY 被分组项]
13 
14     [ORDER BY 排序项]
15  
16 */
17 -- 统计每个DEPTNO的人数
18 -- 统计每个部门的人数
19     SELECT DEPTNO, COUNT(*) FROM EMP GROUP BY DEPTNO;   
20 
21 -- 每个DEPTNO的不同JOB分组,计算平均值
22 -- 每个部门的不同工种分组,计算平均值
23    SELECT JOB, DEPTNO, AVG(SAL) FROM EMP GROUP BY JOB, DEPTNO;
24 
25 
26 -- 对分组之后的结果进行条件筛选使用having句子
27 -- 分组 排序 WHERE HAVING出现的顺序
28     SELECT ... FROM ... [WHERE] ... [GROUP BY] ... [HAVING] ... [ORDER BY]
29 
30 -- 按照不同的部门的不同职位分组
31 -- 求平均值
32 -- 将平均值1500的选出来(这里不能用WHERE选,因为WHERE不能在GROUP BY后面出现)
33 -- 并对平均值排序
34     SELECT JOB, DEPTNO, AVG(SAL)
35     FROM EMP
36     GROUP BY JOB, DEPTNO
37     HAVING AVG(SAL) > 1500
38     ORDER BY AVG(SAL);

 ORACLE数据库之增删改查                 

单行数据操作

 1 -- INSERT INTO 表名(列名1, 列名2....) VALUES (值1, 值2);
 2 
 3 -- 一次插入一行(条)数据
 4     INSERT INTO DEPT(DEPTNO, DNAME, LOC) VALUES (50, '教育部', '北京');
 5     
 6     /*
 7         注意事项:
 8           要求数值类型完全一致,结果为受影响的行数
 9           在oracle中对表中数据的和进行操作后,需要回滚(rollback)或者提交(commit)
10     */
11     ROLLBACK;  // 执行回滚会回退到上一步
12     COMMIT;    // 执行提交会将数据保存到数据库
13 
14 -- 向表中全部列插入数据, 列名可省略,但要求值的顺序必须和表中列一致
15     INSERT INTO DEPT VALUES (60, '城管', '上海');
16 
17 -- 向表中部分插入数据,要求非空列必须插入值,注意部分列的时候,列名必须写
18     INSERT INTO DEPT(DNAME, DEPTNO) VALUES('aaa', 'bbb');
增 单行数据操作

对整个表操作

  新表不存在

 1 -- 备份一个表
 2     CREATE TABLE EMP1 
 3     AS 
 4     SELECT * FROM EMP; 
 5 
 6 -- 只要表结构,不要内容
 7     CREATE TABLE EMP2
 8     AS
 9     SELECT * FROM EMP
10     WHERE 1 > 2;
11     -- 当条件不成立的时候,只复制表结构
12 
13 -- 创建表emp3,只需要两个列,列名从EMP表中来
14     CREATE TABLE EMP3(编号, 姓名)
15     AS
16     SELECT EMPTNO, ENAME FROM EMP;
增 新表不存在

   新表存在

1 -- 新表存在的情况下直接向已经存在的表EMP2中插入数据就可以了
2 
3 INSERT INTO EMP2 SELECT * FROM EMP;  -- 可以执行多次,数据叠加
增 新表存在

删分为对表进行删除和对表内数据进行删除

  对表内数据进行删除

 1 -- DELETE [FROM]  表名...[WHERE];
 2 
 3 DELETE EMP2;   -- 无条件的删除
 4 
 5 
 6 DELETE DEPT
 7 WHERE DEPTNO=50;   -- 带条件的删除
 8 
 9 -- 注意 delete后面只能跟表名,不许跟列名,一次删除一整行数据,而不是某一列
10 
11 
12 
13 -- TRUNCAT
14 
15 TRUNCAT TABLE EMP;  -- 不能回退的删除表中数据
删 对表内数据删除

  对表进行删除

1 -- DROP TABLE 表名
2 
3 DROP TABLE EMP1;
4 
5 DROP TABLE EMP2;
删 对表删除

1 -- UPDATE 表名 set 列名1='值', 列名2='值2'.........[WHERE]
2 
3 UPDATE DEPT SET LOC='北京';  -- 无条件修改
4 
5 
6 UPDATE DEPT SET DNAME='教育部', LOC='上海'
7 WHERE DEPTNO = 50;          -- 有条件的更改

 1 -- 在查询结果中使用空值   is null
 2 -- 查询COMM是空的列
 3     SELECT * FROM TABLE_NAME WHERE COMM IS NULL;
 4 -- 查询COMM不是空的列
 5     SELECT * FROM TABLE_NAME WHERE COMM IS NOT NULL;
 6 
 7 -- 在查询结果中使用常量
 8     SELECT ENAME, SAL, '潭州' 工作单位 FROM EMP;
 9     -- 工作单位是列名
10     -- '潭州'是值
11 
12 -- 查询限制行数  rownum叫做伪列
13     -- 拿取表中前5条数据
14     SELECT * FROM EMP WHERE ROWNUM <= 5;
15 
16 -- 给表命名   使用空格(省略了AS)
17     -- E就是给EMP重新赋值的名字
18     SELECT ROWNUM, E.EMPNO FROM EMP E WHERE ROWNUM<=5;
19 
20 -- 查询工资大于1500的员工的信息,对他们年龄进行排序
21     -- 判断条件必须加在order by前面
22     SELECT * FROM EMP WHERE SAL>1500 ORDER BY AGE DESC;
23 
24 -- 使用别名进行排序
25     SELECT EMPNO, SAL*12 年薪 FROM EMP ORDER BY 年薪;
26 
27 /*
28     模糊查询,like  between in (查询结果不确定)
29 
30         通配符:%   代表任意多个字符,可以是0个可以是多个
31 
32             _    下划线代表一个任意字符
33 */
34     
35     -- like通常是和字符型一起使用
36         -- 查询以S开头的员工
37         SELECT * FROM EMP WHERE ENAME LIKE 'S%';  
38       
39         -- between ... and代表一个范围,和数值型一起使用(>=and<=)
40         --  使用(>= <=)
41         SELECT * FROM EMP WHERE SAL >=1500 AND SAL<=3000;
42         -- 使用between and,效果同上 
43         SELECT * FROM EMP WHERE SAL BETWEEN 1500 AND 3000;
44         
45         -- 01-1月-81    日-月-年
46         SELECT * 
47         FROM EMP 
48         WHERE DATE BETWEEN '01-1月-81' AND '31-1月-87';   
49 
50 -- 连接运算符 ||    效果同CONCAT()函数
51     SELECT EMPNO || "的员工的姓名是" || ENAME 
52     AS 员工 
53     FROM EMP;
54 
55 -- 去掉重复项  Distinct
56     SELECT DISTINCT DEPTNO FROM EMP;

 补:模糊查询IN

1 -- in 在指定的值中进行匹配  相当于或者
2     SELECT * FROM EMP WHERE SAL IN(1266, 1500, 3000, 3600);
3     -- SAL 将会在1266 1500 3000 3600这四个值中进行匹配

 多表查询                            

  笛卡尔积现象                 

1 SELECT * FROM EMP;   -- EMP中有4条数据
2 SELECT * FROM DEPT;  -- DEPT中有14条数据
3 
4 -- 将EMP和DEPT联合起来查会出现56条数据
5     SELECT * FROM EMP, DEPT; -- 56条数据  14*4
6 
7 -- 这就是笛卡尔积现象

  92标准下的多表查询    

等值查询      

 1 -- 查询名称为SMITH的员工编号,姓名,部门名称
 2     SELECT EMPNO,ENAME,DNAME
 3     FROM EMP, DEPT
 4     WHERE ENAME = 'SMITH'
 5     AND EMP.DEPTNO = DEPT.DEPTNO;
 6 
 7 -- 查询部门编号为10的员工的姓名,员工的工资,部门所在地并对工资排序
 8     SELECT E.ENAME, E.SAL, D.LOC
 9     FROM EMP E, DEPT D
10     WHERE E.DEPTNO = 10
11     AND E.DEPTNO = D.DEPTNO
12     ORDER BY E.SAL DESC;
等值

非等值查询  

1 -- 查询SMITH的工资等级
2     SELECT E.EMPNO, E.ENAME, E.SAL, S.LOSAL, S.HISAL
3     FROM EMP E, SALGRADE S
4     WHERE E.ENAME = 'SMITH'
5     AND E.SAL >= S.LOSAL
6     AND E.SAL <= S.HISAL;
7 -- 通过区间查询
8 
9 -- 等值查询与非等值查询中的两张表是平级关系
非等值

外连查询     

左外连接

1 -- 以'='左边的表为主表  将显示左边表的全部信息(包括等值的,不等值的),哪个表后面跟了(+)谁就是辅助表
2     SELECT E.EMONO, E.ENAME, D.DNAME, D.DEPTNO
3     FROM EMP E, DEPT D
4     WHERE E.DEPTNO(+) = D.DEPTNO;

右外连接

1 SELECT E.EMONO, E.ENAME, D.DNAME, D.DEPTNO
2 FROM EMP E, DEPT D
3 WHERE E.DEPTNO = D.DEPTNO(+);

自连接(一个表当两个表用, 自己连接自己)

1 SELECT E.EMPNO, E,ENAME, M.ENAME
2 FROM EMP E, EMP M
3 WHERE E.MGR = M.EMPNO;

  92标准与99标准                                   

92语法规则缺点   

  语句的过滤条件和连接条件都放到了where语句中

  当条件过多时,连接条件多,过滤条件多,就容易造成混淆

sql99标准           

  修正了整个缺点,把连接条件和过滤条件分开,连接使用on,过滤条件使用where

99语法                

交叉连接(CROSS JOIN)

1 SELECT * FROM EMP, DEPT;  -- 92
2 SELECT * FROM EMP CROSS JOIN DEPT;  -- 99

自然连接(NATURAL JOIN)(类似等值连接)

 1 SELECT E.ENAME, E.EMPNO, D.DNAME
 2 FEOM EMP E, DEPT D
 3 WHERE E.DEPTNO = D.DEPTNO;   -- 92
 4   
 5 -- 不需要写E.DEPTNO = D.DEPTNO,会自动寻找同名列
 6 SELECT E.ENAME, E.EMPNO, D.DNAME
 7 FEOM EMP E NATURAL JOIN DEPT D;   -- 99
 8 
 9 
10 -- 99中使用WHERE条件
11 SELECT E.ENAME, E.EMPNO, D.DNAME
12 FEOM EMP E NATURAL JOIN DEPT D   
13 WHERE DEPTNO = 10;                 -- 99

当两个表中出现多个同名列后,自然连接无法满足要求,因为它不知道究竟应该让两个表的哪一个同名列进行关联,于是可以用一下方式解决

  using子句:当相连的表中出现很多同名列,自然连接无法满足要求,可以在连接时使用using子句来设置用于等值连接名  

1 SELECT E.ENAME, E.EMPNO, D.DNAME
2 FEOM EMP E NATURAL JOIN DEPT D
3 USING(DEPTNO)    -- 指定要使用哪一个同名列进行连接
4 WHERE DEPTNO = 10;

  内连接INNER JOIN配合on子句使用(INNER可以省略)  

1 -- 查询部门编号为10的员工编号,姓名,部门名称
2 SELECT E.EMPNO, E.ENAME, D.DNAME
3 FROM EMP E INNER JOIN DEPT D
4 ON E.DEPTNO = D.DEPTNO   -- 做连接条件
5 WHERE D.DEPTNO = 10;

使用内连接还可以进行多表连接

1 -- 三表连接
2     SELECT E.ENAME, D.DNAME, C.CNAME
3     FROM EMP E 
4     INNER JOIN DMP D               -- 连接第一、第二张表
5     ON E.ENPTNO = D.ENPTNO   -- 连接条件
6     INNER JOIN CMP C               -- 继续连接第三张表
7     ON D.DEPTNO = C.CEPTNO   -- 连接条件
8     WHERE E.NAME = 'ALEX';

  外连接,也需要配合ON子句使用                                        

左外连接  LEFT JOIN  以左边的表为准

1 SELECT E.EMPNO, E.ENAME, D.DNAME, D.DEPTNO
2 FROM EMP E LEFT JOIN DEPT D
3 ON E.DEPTNO = D.DEPTNO;

右外连接  以右边的表为准

1 SELECT E.EMPNO, E.ENAME, D.DNAME, D.DEPTNO
2 FROM EMP E RIGHT JOIN DEPT D
3 ON E.DEPTNO = D.DEPTNO;

全外连接  不分主次,会将两个表中的数据全部拿出来

1 SELECT E.EMPNO, E.ENAME, D.DNAME, D.DEPTNO
2 FROM EMP E FULL JOIN DEPT D
3 ON E.DEPTNO = D.DEPTNO;

 

posted @ 2018-03-18 11:57  Jin同学  阅读(790)  评论(0)    收藏  举报