• Oracle笔记1


    1.口令管理的界面

    超级管理员账户: sys-change_on_install;
    普通管理员: system-manager;
    [解锁]普通用户: scott-tiger; 
    [解锁]大数据用户: sh-sh
    

    2.如果要进行oracle的卸载需要三步

    a.执行Oracle提供的卸载程序;
    b.进入注册表(regedit.exe),然后删除掉与Oracle有关的配置项;
    c.重启电脑,进入安全模式,删除所有Oracle文件
    

    3.安装完成之后,关闭开机自启

    在计算机管理中将Oracle的服务全部改成[手动]启动,共有八个,有两个是禁用的
    OracleVssWriterMLDN、OracleDBConsolemldn、OracleMTSRecoveryService
    OracleOraDb11g_home1ClrAgent、OracleOraDb11g_home1TNSListener、OracleServiceMLDN
    

    4.简化输入:在dos窗口,输入sqlplus scott/tiger

    如果想要知道当前的登录账户是哪一位:show user;
    切换账户:conn 用户名[/密码][AS SYSDBA];
    如果使用超级管理员则必须追加"AS SYSDBA"
    切换到system账户:conn system/manager;
    切换到sys账户:conn sys/change_on_install AS SYSDBA;
    清屏:clear scr
    设置每行显示的数据长度:set linesize 每行长度(300);
    设置每页显示的数据长度:set pagesize 每行长度(30);
    如果没有图形界面,可以这样执行SQL语句;edit xx(生成一个xx.sql的文件)
    接着@xx,即可执行编写的语句.也可以这样执行@绝对路径xx,
    调用本机命令:host copy d:a.sql d:.sql
    

    5.SQL语法标准

    DML(数据操作语言):数据库的具体操作,四个形式CRUD,最常用的是查询操作;
    DDL(数据定义语言):定义数据库对象、表、用户、索引;
    DCL(数据控制语言):用户的授权管理
    

    6.scott用户数据表

    查看数据表用select * from tab;
    查看每一张表的结构desc 表名;
    四张表:部门表(dept)、雇员表(emp)、工资等级表(salgrade)、工资表(bonus)
    Oracle的日期是有时间的,MySQL就只有日期
    数据表结构-emp(雇员表)
    EMPNO     NUMBER(4)     雇员编号
    ENAME     VARCHAR2(10)  雇员姓名
    JOB       VARCHAR2(9)   雇员职位
    MGR       NUMBER(4)     雇员的领导编号
    HIREDATE  DATE          雇用日期
    SAL       NUMBER(7,2)   基本工资
    COMM      NUMBER(7,2)   佣金,只有销售才有佣金
    DEPTNO    NUMBER(2)     所在部门编号
    

    7.编码习惯:固定的语法用大写字母,可更换部分用小写字母.

    SELECT [DISTINCT] *|列名称[别名]
    DISTINCT:消除重复数据行的显示
    查看员工的年薪,但这样的显示--sal*12不好看,可以设置别名
    SELECT empno,ename,job,sal*15+(200+100)*12 FROM emp;
    SELECT empno,ename,job,sal*12 income FROM emp;
    DISTINCT:进行重复数据消除时,所有的数据列重复时才允许消除
    SELECT DISTINCT job FROM emp;
    常量查询:SELECT '雇员信息',10,ename FROM emp;
    如果是字符串则一定要使用单引号声明;
    如果是数字则可以直接编写
    字符串靠左对齐,数字靠右对齐
    
    字符串连接:||相当于加号,一旦连接,就只有一列数据返回
    SELECT '雇员姓名:' || ename ||',职位:' || job FROM emp;
    SELECT '雇员姓名:' || ename ||',职位:' || job info FROM emp;
    
    简单查询:
    FROM子句优先于SELECT子句执行,以确定数据的来源
    

    8.简单查询是控制行,限定查询是控制列

    WHERE子句中常用的判断符:>、>=、<、<=、=、<>、!=、in
    查询工资在1000~1500范围内的非销售人员的empno,ename,job,sal
    SELECT empno,ename,job,sal FROM emp WHERE sal>=1000 AND sal<=1500 AND job!='SALESMAN';
    

    9.范围查询:BETWEEN...AND

    a.带有边界值的范围查询
    b.可以使用在各种数据类型上
    范例:查询所有在1981年雇佣的雇员信息
    1981年雇佣:1981-01-01('01-1月-1981')~1981-12-31('31-12月-1981')
    SELECT * FROM emp WHERE hiredate BETWEEN '01-JAN-1981' AND '31-DEC-1981';
    

    10.空判断:IS NULL、IS NOTNULL

    在数据库中称之为一个不确定的内容,如果使用null,任何计算结果都为null
    范例:查询所有不领取雇佣金的雇员信息
    SELECT * FROM emp WHERE comm IS NULL;
    

    11.模糊查询:LIKE

    使用LIKE可以实现关键字的检索,而后提供两个运算匹配符:
    "_":表示匹配任意一位字符;
    "%":表示匹配任意的0位、1位、多位字符.
    范例:查询雇员姓名以A开头的所有员工信息
    SELECT * FROM emp WHERE ename LIKE 'A%';
    范例:查询雇员姓名中第二个字母为A的员工信息
    SELECT * FROM emp WHERE ename LIKE '_A%';
    取代之前的BETWEEN...AND
    SELECT * FROM emp WHERE hiredate LIKE '%-81';
    

    12.范围查询:IN、NOT IN

    范例:查询出雇员编号为7369、7566、7788、9999的雇员信息
    SELECT * FROM emp WHERE empno IN (7369,7566,7839,9999);
    如果NOT IN中出现有null肯定是程序问题,如果发现有null,就不进行查询了,也不返回任何数据
    SELECT * FROM emp WHERE empno NOT IN (7369,7566,7839,NULL);
    

    13.查询排序

    ③SELECT [DISTINCT] * | 列名称 [别名] , 列名称 [别名] ,... | 数据计算
    ①FROM 数据表 [别名] 
    ②[WHERE 限定条件(s)]
    ④[ORDER BY 排序字段 [ASC | DESC],排序字段 [ASC | DESC],.....];
    SELECT子句在WHERE子句之后执行,所以WHERE子句无法使用SELECT子句定义的别名.
    ASC:升序,默认为此模式;      DESC:降序
    SELECT * FROM emp ORDER BY sal DESC;
    范例:查询所有雇员的信息,要求按照工资由高到低排序,如果工资相同则按照雇用日期由早到晚排序
    SELECT * FROM emp ORDER BY sal DESC , hiredate ASC;
    查询雇员部门是10和20的信息,...
    SELECT * FROM emp WHERE deptno IN (10,20) ORDER BY sal DESC,hiredate ASC;
    ORDER BY用SELECT的别名
    SELECT empno,ename,sal*12 income FROM emp ORDER BY income DESC ;
    

    14.单行函数

    字符串函数:转大写UPPER、转小写LOWER
    SELECT * FROM emp WHERE ename=UPPER('&inputname');
    SELECT LOWER(ename) FROM emp;
    首字母大写:字符串 INITCAP(数据|列)
    SELECT INITCAP(ename) FROM emp;
    计算字符串长度:数字 LENTH(数据|列)
    SELECT * FROM emp WHERE LENGTH(ename)=5;
    字符串截取:字符串 SUBSTR(数据|列)
    设置指定索引和截取长度
    SELECT SUBSTR('helloworld',6,2) FROM dual;
    索引设置为0,跟默认索引从1开始,是一样的;也可以设置为负数
    范例:要求截取每一个雇员姓名的前三个和后三个字母
    SELECT ename,SUBSTR(ename,1,3),SUBSTR(ename,-3) FROM emp;
    字符串替换:字符串 REPLACE(数据|列,要替换的数据,替换数据)
    SELECT REPLACE('helloworld','l','_') FROM dual;
    直接使用一张实体表进行查询没有意义,可以使用虚拟表--dual
    
    数值函数
    ROUND(数据|列[,保留小数位]):四舍五入
    TRUNC(数据|列[,保留小数位]):数据截取,不四舍五入,直接将小数截取掉
    SELECT ename,job,TRUNC(sal/30) FROM emp;
    MOD(数据|列):求余数
    日期函数(避免闰年问题)、转换函数、通用函数
    SELECT SYSDATE FROM dual;
    SELECT ADD_MONTHS(SYSDATE,4) FROM dual;
    用于计算date1和date2之间有几个月,如果date1比date2晚,那么就返回一个正数.
    MONTHS_BETWEEN (date1, date2)
    转换日期格式
    SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd') FROM dual;
    NVL():第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第一个参数本来的值.
    SELECT ename,sal,NVL(comm,0),(sal+NVL(comm,0))*12 income FROM emp;
    DECODE():将查询结果翻译成其他值
    

    15.多表查询慎用,得消除笛卡尔积

    本质:写好条件之后,去另一张表找只与自己有关的数据.
    SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno;
    SELECT * FROM emp e, dept d WHERE e.deptno=d.deptno;
    使用这两张表sales、costs进行多表查询,由于数据量大,导致时间很长
    范例:查询每个雇员的编号、姓名、工资、部门名称
    SELECT e.empno,e.ename,e.job,e.sal,d.dname FROM emp e,dept d WHERE e.deptno=d.deptno;
    范例:查询每个雇员的编号、姓名、工资、工资等级
    SELECT e.empno,e.ename,e.sal,s.grade
    FROM emp e,salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal;
    范例:查询每个雇员的编号、姓名、工资、工资等级、部门名称
    SELECT e.empno,e.ename,e.job,e.sal,s.grade,d.dname,d.loc
    FROM emp e , salgrade s,dept d
    WHERE e.sal BETWEEN s.losal AND s.hisal AND e.deptno=d.deptno;
    

    16.两种表连接

    内连接:等值连接
    示例:在emp中创建一个没有部门的员工
    INSERT INTO emp(empno,ename) VALUES (9999,'HELLO');
    此时进行连接查询
    SELECT e.empno,e.ename,d.deptno,d.dname FROM emp e,dept d
    WHERE e.deptno=d.deptno;
    e.deptno=d.deptno(内连接)凡是不满足于此条件的,都不会显示
    
    外连接:数据表记录的全部显示,左外连接、右外连接、全外连接
    左外连接(字段=字段(+)):左表的数据要求全部显示
    右外连接(字段(+)=字段):右表的数据要求全部显示
    自身连接:数据表自己关联自己
    范例:查询每个雇员的编号、姓名、职位、领导姓名
    SELECT e.ename,e.job,m.ename FROM emp e, emp m WHERE e.mgr=m.empno;
    显示左表全部内容
    SELECT e.ename,e.job,m.ename FROM emp e, emp m WHERE e.mgr=m.empno(+);
    

    17.SQL1999语法

    交叉连接:CROSS JOIN,简单的将数据表关联在一起,产生笛卡尔积.
    SELECT * FROM emp CROSS JOIN dept ;
    自然连接:NATURAL JOIN,内连接,自动找到同名的字段采用内连接消除笛卡尔积.
    SELECT * FROM emp NATURAL JOIN dept ;
    USING子句:设置要进行关联的字段
    SELECT * FROM emp JOIN dept USING(deptno);
    ON子句:设置关联条件
    SELECT * FROM emp e JOIN dept d ON(e.deptno=d.deptno);
    左外连接、右外连接、全外连接(用得少)
    SELECT * FROM emp e LEFT OUTER JOIN dept d ON(e.deptno=d.deptno);
    SELECT * FROM emp e RIGHT OUTER JOIN dept d ON(e.deptno=d.deptno);
    SELECT * FROM emp e FULL OUTER JOIN dept d ON(e.deptno=d.deptno);
    

    18.集合处理

    [UNION | UNION ALL | MINUS | INTERSECT]
    UNION:将集合结果整合在一起,但相同的部分不显示
    SELECT empno,ename,job FROM emp WHERE deptno=10 
    UNION SELECT empno,ename,job FROM emp ;
    UNION ALL:重复的部分也显示
    MINUS:差集运算,大集合减小集合
    INTERSECT:交集运算,返回相同部分
    

    19.统计

    COUNT():统计表的行数,如果没有数据则返回0,而不是空
    COUNT(*)、COUNT(字段)、COUNT(DISTINCT)
    如果某一个列上的数据没有null,则COUNT(*)和COUNT(字段)返回的结果一样;
    如果有null,则COUNT(字段)不统计空数据.
    SELECT COUNT(*),COUNT(mgr) FROM emp;
    如果某一列上有重复的数据,统计的时候不想重复,则使用COUNT(DISTINCT)
    SELECT COUNT(*),COUNT(DISTINCT job) FROM emp;
    SUM()、AVG()、MIN()、MAX()
    

    20.分组查询

    根据某字段分完组之后,SELECT子句中只能用一些统计函数
    SELECT deptno,COUNT(*),AVG(sal) FROM emp GROUP BY deptno;
    # 范例:查询每个部门的名称、人数、平均工资
    SELECT d.dname,COUNT(empno),AVG(sal) FROM dept d,emp e
    WHERE d.deptno=e.deptno(+) GROUP BY d.dname ;
    # 范例:查询雇员的工资等级、编号、工资
    SELECT s.grade,e.empno,e.sal
    FROM salgrade s,emp e WHERE e.sal BETWEEN s.losal AND s.hisal;
    # 范例:在列上有重复时,可以进行分组,查询每个工资等级有多少人,最高工资
    SELECT s.grade,COUNT(e.empno),MAX(e.sal) FROM salgrade s,emp e 
    WHERE e.sal BETWEEN s.losal AND s.hisal GROUP BY s.grade;
    # 范例:查询部门编号、名字、位置、雇员编号、工资
    SELECT d.deptno,d.dname,d.loc,e.empno,e.sal
    FROM dept d,emp e WHERE d.deptno=e.deptno(+) ;
    现在是三列一起重复,可以进行三个列的统一分组操作,
    只有GROUP BY中出现的字段才能在SELECT中出现
    # 范例:多表查询和分组统计,查询部门编号、名字、位置、人数、平均工资
    SELECT d.deptno,d.dname,d.loc,COUNT(e.empno),AVG(e.sal)
    FROM dept d,emp e WHERE d.deptno=e.deptno(+)
    GROUP BY d.deptno,d.dname,d.loc;
    

    21.HAVING子句

    分组后的过滤统计要求在HAVING子句中实现
    SELECT job,COUNT(*),AVG(sal)
    FROM emp GROUP BY job HAVING AVG(sal)>1200;
    HAVING与WHERE区别
    WHERE:在GROUP BY分组前使用,对要进行分组的数据进行筛选,不允许使用统计函数
    HAVING:在GROUP BY分组后使用,允许使用统计函数,针对分组后的数据进行筛选
    
    ⑤SELECT [DISTINCT] 分组字段 | 统计函数
    ①FROM 数据表1 [别名] ,数据表2 [别名] , ...
    ②[WHERE 限定条件(s)]
    ③[GROUP BY 分组字段,分组字段,...]
    ④[HAVING 分组后过滤]
    ⑥[ORDER BY 排序字段 [ASC | DESC],排序字段 [ASC | DESC],.....];
    

    22.分组统计案例

    # 案例一:查询所有非销售人员的工资总和,并且要求同一工作的雇员的工资总和大于5000,
    显示的结果按照工资的总和由高到低排序
    SELECT job,SUM(sal) sum
    FROM emp WHERE job!='SALESMAN'
    GROUP BY job HAVING SUM(sal)>5000 ORDER BY sum DESC;
    
    # 案例二:统计出所有领取佣金和不领取佣金的雇员人数、平均工资
    SELECT '领取佣金' info, COUNT(*),AVG(sal) FROM emp WHERE comm IS NOT NULL 
    	UNION
    SELECT '不领取佣金' info, COUNT(*),AVG(sal) FROM emp WHERE comm IS NULL ;
    

    23.子查询

    子查询指的是在一个完整查询语句中嵌入N个内部查询得来的查询结果
    
    常用:子查询返回单行单列、单行多列、多行单列时,一般出现在WHERE子句
    范例:查询工资最低的雇员信息(单行单列)
    SELECT * FROM emp WHERE sal=(SELECT MIN(sal) FROM emp);
    范例:查询和scott职位、工资一样的雇员信息(单行多列)
    SELECT * FROM emp
    WHERE (job,sal)=(
    	SELECT job,sal FROM emp WHERE ename='SCOTT') 
    	AND ename<>'SCOTT';
    子查询返回多行单列的数据,返回的内容就是一个范围,有三种操作形式:IN、ANY、ALL
    SELECT * FROM emp 
    WHERE sal IN (SELECT sal FROM emp WHERE job='MANAGER') ;
    
    ANY操作有三种使用形式:
    =ANY:与IN操作一样
    >ANY:比最小的值大的数据
    <ANY:比最大的值小的数据
    
    ALL操作有两种使用形式:
    >ALL:比最大的值大的数据
    <ALL:比最小的值小的数据
    
    常用:子查询返回多行多列数据(表)可以在FROM子句出现,按照表的方式处理
    案例:查询出每个部门的编号、名称、人数、平均工资
    第一步:出现了一个多行多列的数据,可以将其当做一个临时表
    SELECT deptno,COUNT(empno),AVG(sal) FROM emp GROUP BY deptno;
    第二步:dept表与temp临时表进行关联,
    SELECT d.deptno,d.dname,d.loc,temp.count,temp.avg
    FROM dept d , (
    	SELECT deptno dno,COUNT(empno) count,AVG(sal) avg
    	FROM emp
    	GROUP BY deptno) temp
    WHERE d.deptno=temp.dno(+) ;
    # FROM子查询的效率比多表查询高,因为参与的数据量少了很多
    
    不常用:子查询返回单行单列并且需要进行统计操作时,一般出现在HAVING子句
    范例:查询出所有高于公司平均工资的职位名称、职位人数、平均工资
    SELECT job,COUNT(empno),AVG(sal)
    FROM emp GROUP BY job
    HAVING AVG(sal)>(SELECT AVG(sal) FROM emp) ;
    
    不常用:子查询返回单行单列可以出现在SELECT子句
    SELECT e.empno,e.ename,e.job,
    	(SELECT d.dname FROM dept d WHERE d.deptno=e.deptno) dname,
    	(SELECT s.grade FROM salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal) grade
    FROM emp e;
    
    EXISTS:根据子查询是否有数据来判断条件是否成立的运算符
    IN与EXISTS的区别
    IN需要明确的进行数据的判断,子查询返回的数据需要参与运算;
    EXISTS不需要参考具体的返回内容,根据是否有数据返回,来确定条件是否成立.
    
  • 相关阅读:
    HDU4385Moving Bricks【状压DP】
    用位运算实现加减法
    hdu 1874(最短路 Dilkstra +优先队列优化+spfa)
    codeforces 782B The Meeting Place Cannot Be Changed+hdu 4355+hdu 2438 (三分)
    hdu 1542(线段树+扫描线 求矩形相交面积)
    hdu 2602(经典01背包)
    hdu 1698(线段树区间更新)
    hdu 1754(单点更新 ,区间最大值)
    NYOJ 寻找最大数
    hdu 2222(AC自动机模版题)
  • 原文地址:https://www.cnblogs.com/fawaikuangtu123/p/11753941.html
Copyright © 2020-2023  润新知