数据库笔记

1 第一天oracle数据库学习

1.1 Oracle自带账户

1.1.1 system:系统账户(给系统管理员用的

1.1.2 SYS :超级账户(给oracle 工程师用的)

1.1.3 忘记sys 或者system的密码解决方法

ALTER USER SYSTEM/SYS IDENTIFIED BY 新的密码

1.1.4 oracle新建用户(必须以system的用户登录才具备创建用户的功能,若system不具备权限,可以登录sysdba,赋予sysdba权限给system

create user 用户名 idendified by 密码

1.1.5 给用户赋予权限

 -- 赋予数据库链接权限
    GRANT CONNECT TO scott;
    -- 赋予资源操作权限
    GRANT RESOURCE TO scott;

1.1.6 oracle 忘记密码

     sqlplus /nolog
     conn /AS SYSDBA
     ALTER USER 用户名(要修改密码的用户名) IDENTIFIED BY 新的密码
     注意:sqlplus 不是内部命令的错误。是oracle 环境变量的问题

1.1.7 sql语言的分类

作用:       DQL(数据查询语言)
            DDL(数据定义语言)
            DCL(数据控制语言)
            DTL(事务控制语言)
      使用:
           通过sql语句进行数据库中的数据管理
             数据的读取
                    单表查询
                    多表查询
                    子查询
             数据的存储
                    增加
                        增加一条数据
                        增加一张表
                     删除
                        删除数据
                        删除表
                     修改
                        修改数据
                        修改表结构
            通过sql 语句管理用户
                      创建用户
                      修改用户
                      删除用户
            通过sql语句管理事务

1.2 单表的查询语句

1.2.1 基础查询

-- 查询表的所有数据  select * from 表名;
 SELECT * FROM emp;
--查询表中指定字段的值 select 字段名1,字段名2 from 表名
SELECT empno,ename FROM emp; 
--给查询结果中的字段使用别名,最规范的是 as "别名",别名中没有特殊字符双引号可以不写
SELECT empno 员工编号,ename "员工姓名",job AS 工作,mgr AS "领导编号"  FROM emp;
--连接符    ||''    字段名||'字符1'||字段名
     注意: 一个拼接好的链接在结果集中是作为一个新的字段显示,可以使用别名优化
SELECT empno||'的姓名是'||ename AS ename,job FROM emp;
-- 去重,使用distinct  select distinct 字段名,字段名 from  表名
     注意: 去除重复的规则是按照行进行去重的。多行数据完全相同取其一
            多字段去重是去掉多字段完全一样的数据
   SELECT DISTINCT job,mgr FROM emp;
   SELECT JOB,MGR FROM EMP;
-- 排序 单字段
         --desc 降序排序,asc 升序排序,默认升序
        -- 多字段排序(先按照第一个字段排序,第一个字段相同的情况下再按照第二个字段排序)
   SELECT * FROM emp ORDER BY empno ASC;
   SELECT * FROM emp ORDER BY empno,ename;
-- 字段的逻辑运算
     注意:字段必须是数值类型
 SELECT empno,ename,job,sal*2+1000,sal+comm FROM emp;

1.2.2 使用where 子句筛选查询

-- 查询所有的员工的工资信息
   SELECT empno,ename,sal+comm AS 薪资 FROM emp;
         -- 查询SMITH的个人信息
   SELECT * FROM emp WHERE ename='SMITH';
         -- 查询SMITH的工资信息
   SELECT empno,ename,sal+comm AS 薪资 FROM emp WHERE ename='SMITH';
        -- 查询工资大于1000的员工信息
   SELECT * FROM emp WHERE sal>1000;
        -- 查询工资不等于3000的员工信息
   SELECT * FROM emp WHERE sal<>3000 ORDER BY sal;
        -- 查询入职日期在81年之后的员工信息
            oracle 默认的日期格式为日月年
   SELECT * FROM emp WHERE hiredate>='01-1月-1981' ORDER BY hiredate;
   SELECT * FROM emp WHERE hiredate>=to_date('1981/01/01','yyyy/MM/dd') ORDER BY hiredate;
   -- 多条件筛选(where子句)
        -- 查询工资在2000-3000之间的工资
            SELECT * FROM emp WHERE sal>=2000 AND sal<3000;
               使用 BETWEEN AND 进行两头筛选
            SELECT * FROM emp WHERE sal BETWEEN 2000 AND 3000;
        -- 查询工作为salesman,anlyst,manager的员工信息
            --  or关键字,进行条件的删选
            --  in 关键字
        SELECT * FROM emp WHERE job='SALESMAN' OR JOB='ANALYST' OR JOB='MANAGER' ORDER BY JOB
        SELECT * FROM emp WHERE job in('SALESMAN','ANALYST','MANAGER') ORDER BY JOB
        -- 查询姓名中包含s的,以s开头的 ,以s 结尾的,第二个字符为A的
             -- 包含s的
             SELECT * FROM emp WHERE ename LIKE '%S%';
             -- 以s 开头的
             SELECT * FROM emp WHERE ename LIKE 'S%';
             -- 以s 结尾的
             SELECT * FROM emp WHERE ename LIKE '%S';
             -- 第二个字符为A的(_是任意一个字符的意思,%是任意多个字符的意思)
             SELECT * FROM emp WHERE ename LIKE '_A%';
             -- 名字中带有_的(使用转义字符 ecsape,escape 可以把普通字符转换为转移字符,转移字符可以把特使字符变为普通字符 )
             SELECT * FROM emp WHERE ename LIKE '%/_%' ESCAPE '/';
        -- 查询有津贴的员工信息
        -- and 关键字,筛选的是符合所有条件的数据
    SELECT * FROM emp WHERE comm IS NOT NULL AND comm>0;

2 第二天oracle数据库学习

2.1 ORACLE 函数学习(单行函数,多行函数,转换函数,其他函数)

2.1.1 单行函数(字符函数,日期函数 )

-- 字符函数(lower,upper,initcap,ltrim,rtrim,translate,replace,insetr,substr,concat)
      --  查询所有员工信息,员工姓名小写显示。
      SELECT LOWER(ename) AS ename,e.* FROM emp e 
       --  查询所有员工信息,员工姓名首字母大写显示。
      SELECT INITCAP(ename) AS 首字母大写的名字 FROM emp; 
      SELECT Lower('Adadsfdas') AS 小写,UPPER('adwerwr') AS 大写,LTRIM('xyszddd','xy') AS 左截取,RTRIM('adsdsdadd','add') AS 右截取,translate('jack','abcd','1234') AS 翻译,REPLACE('jack and jue','j','bl') 替换,Instr('worldwide','d') 所在位置,CONCAT('Hello','World') FROM dual;
      
          --数值函数
          SELECT ABS(-15) AS 绝对值, CEIL(44.778) AS 向上取整,SIN(1.571),COS(0),FLOOR(100.2) AS 向下取整,POWER(4,2) AS 幂次,MOD(10,3) AS 取余,ROUND(100.256,2) AS 四舍五入,Trunc(100.256,2) AS 阶段,SQRT(4) AS 平方 FROM dual;
          -- 日期函数
          SELECT months_between('04-11月-05''11-1月-01') AS 月份区间,add_months('06-1月-2019','13') AS 几个月后, next_day('01-1月-2020''星期四') AS 最近的下个星期,last_day ('16-4月-2020') AS 当月最后一天,ROUND(to_date('01-6月-03'),'YEAR') AS 按月,ROUND(to_date('01-6月-03'),'MONTH') AS 按日,ROUND(to_date('01-6月-03'),'DAY') AS 按星期,trunc(to_date('06-2月-03'),'YEAR') AS 截取年,trunc(to_date('06-2月-03'),'MONTH') AS 截取月,trunc(to_date('06-2月-03'),'DAY') AS 截取日 FROM dual;

2.1.2 多行函数(max,min,avg,sum,count)

多行函数不能和字段混合使用,除非分组,多行函数不能和单行函数混合使用,除非分组
-- 对查询的数据进行统计
            -- 查询员工的最高工资
            SELECT MAX(sal) FROM emp;
            SELECT * FROM emp WHERE sal=(SELECT MAX(sal) FROM emp);
            -- 查询员工的最低工资
            SELECT * FROM emp WHERE sal=(SELECT min(sal) FROM emp);
            -- 查询员工的平均工资
            SELECT AVG(sal) FROM emp;
            -- 查看员工的所有工资之和
            SELECT SUM(sal) FROM emp
            -- 查询公司的员工数量
            SELECT COUNT(*) FROM emp 
            -- 查询有津贴的员工人数(值为null count不会计数)
            SELECT COUNT(comm) FROM emp;
            -- 查询公司有多少工作种类 
            SELECT COUNT(DISTINCT job) FROM emp;

2.1.3 转换函数(to_number,to_char,to_date)

-- 字符转化为数字char-------->number
            SELECT to_number('123')+2 FROM dual;
            -- 数字转字符number--->char
               -- 指定显示格式
                   -- 9表示位置占位,例如999,999,999 会将数字按照三个一组使用都好隔开
                   -- L表示人名币符号,$表示美元符号
                   -- 其中0也可进行占位分组,但是如果真实数据位数不足,会使用0进行补位
            SELECT to_char(123456789,'$999,999,999') FROM dual;
            SELECT to_char(123456789,'L999,999,999') FROM dual;
            -- 查询工作大于2000的员工信息
              -- 数值和字符之间的转换是可以隐式的
            SELECT * FROM emp WHERE sal>to_number('2000');
            -- 日期和字符的互转】
            -- 字符转换为日期
                      CHAR------>date
                       TO——date('','日期格式')
                       1 字符必须符合日期格式
                       2 oracle 默认的转换格式为日月年
                       3 常用日期格式yyyy/mm/dd yyyy-mm-dd
                      -- 查询员工入职日期在82年后的信息
                      SELECT * FROM emp WHERE hiredate>to_date('1982-01-01','yyyy/mm/dd');
             -- 日期转换为字符
             一般是新增数据使用to_data,查询数据使用to_char
               -- 使用to_char('要转换的日期')
               1 如果不指定转换格式,则使用默认格式日月年
               SELECT TO_char(hiredate) FROM emp; -- 使用默认格式将日期转换为字符
               SELECT TO_char(hiredate,'yyyy/mm/dd') FROM emp;

2.1.4 其他函数(NVL NVL2,DECODE)

               NVL()  :NVL(字段名,) 
                      --- 如果字段名不为null,则返回字段名的值,否则返回值的值
               NVL2() :NVL2(字段名,处理一,处理二)
               如果字段名不为null,则返回处理一的值,否则返回处理二的值
               DECODE() DECODE(字段名,1,处理1,2,处理2,3,处理3,公共处理)
                如果字段名的值和条件值相同,则执行对象的处理,如果没有则执行公共处理
               -- 查询员工的工资信息
               SELECT ename,job,sal FROM emp
               -- 查询员工的薪水信息
               SELECT ename,job,sal+NVL(comm,0) FROM emp;
               SELECT ename,job,NVL2(comm,sal+comm,sal) FROM emp;
               -- 显示员工的职称
               SELECT ename,job,DECODE(job,'MANAGER','经理','PRESIDENT','董事长','SALESMAN','普通员工','其他员工') FROM emp;

2.2 分组查询学习

 GROUP BY 分组字段名
                  注意:使用分组后,在select 语句只允许出现分组字段和多行函数
                        如果是多字段分组,则先按照第一字段分组,然后每个小组继续按照第二字段继续分组
                        在where子句中不允许出现多行
                        分组筛选使用having,HAVING 中可以使用多行函数
                        HAVING 针对分组进行分组后的筛选,允许使用多行函数
                        HAVING 必须和分组一起使用,不允许单独使用
                        WHERE 和having 的比较:
                            WHERE 子句不允许出现多行函数,having可以
                            WHERE 子句和having 子句都可以通过字段直接筛选,但是where的执行效率更高
                            WHERE 执行顺序  from,WHERE,GROUP BY,SELECT,order by
                            HAVING 书信  FROM,GROUP by,SELECT,HAVING,ORDER BY
                       结论: 在分组语句中,使用where 进行字段级别的筛选,使用having 进行多行函数的筛选
             查询不同部门的最高工资
             SELECT * FROM emp ORDER BY deptno,sal;
             SELECT deptno,MAX(sal),COUNT(*) FROM emp GROUP BY deptno;
             查询不同岗位的员工数
             SELECT job,COUNT(*) FROM emp GROUP BY job;
             查询不同部门的不同工作岗位数
             SELECT deptno,job,COUNT(*) FROM emp GROUP BY deptno,job;
             查询不同部门的不同岗位的且人数大于1的信息
             SELECT deptno,job, FROM emp GROUP BY deptno,job HAVING COUNT(*)>1;
             查询部门号大于10的不同部门的不同工作的不同岗位的人数
             SELECT deptno,job,COUNT(*) FROM emp GROUP BY deptno,job HAVING deptno>10 ORDER BY deptno;
             查询不同部门的不同工作岗位的人数
             SELECT deptno,job,COUNT(*) FROM emp GROUP BY deptno,job HAVING COUNT(*)>1 ORDER BY deptno;

2.3 数据库的增删改

注意:增加,删除,修改的数据不会立马进入数据库的写入,还需手动对数据进行提交,如果数据有问题可以回滚
               --增加数据
               INSERT INTO 表名(字段名1,字段名2,,)VALUES(1,值2,值3,值4);
               注意: 主键必须有值,允许字段为空的字段可以不给值
                       插入的值和字段必须一一对应
                       如果是全字段插入,则可以省略字段名
                       INSERT INTO dept VALUES('','','',);
                  -- 在部门表中新增一个部门信息,内容为:编号 50,名称 LOL学院,地址 北京
               -- 主键:非空的唯一的字段可以设置为主键
                     -- 在一张表中,某个字段的值是非空唯一的,将此字段设置为主键
                     -- 主键的作用是唯一的标识一条数据
                     INSERT INTO dept(deptno,dname,loc) VALUES(50,'LOL学员','北京');
                     INSERT INTO dept(deptno,dname,loc) VALUES(70,'吃鸡学员','');
               SELECT * FROM dept;
                   -- 删除数据
                      --delete from 表名;  删除表中的所有数据
                      -- delete from 表名 where 删除筛选;删除指定数据
                      truncat TABLE 表名,删除表中的所有数据,执行效率高于delete;
                      DELETE FROM dept WHERE deptno=50;
                      truncat TABLE dept;
                    -- 跟新数据
                       UPDATE 表名 SET 字段名=新的值,字段名=新的值 字段的值全部改为新的值
                       UPDATE 表名 SET 字段名=新的值,字段名=新的值 WHERE 条件  符合条件的值改为新的值
                       UPDATE dept SET dname='java学院',loc='上海' WHERE deptno=50; 

2.4 数据的备份

-- 表级别备份
                          -- 全部备份 create table 表名 as select * from 备份表名,
                              注意: 只会备份表的结构和表的数据,约束不会备份
                         CREATE TABLE deptBak AS SELECT * FROM dept; -- 全部备份
                         SELECT * FROM deptBak;
                         -- 部分备份
                     -- 数据整体插入
                        INSERT INTO 表名 SELECT * FROM 表名
                           注意: 查询语句结果的字段必须和插入表名的字段数数量和类型一致
                            CREATE TABLE 新表 AS SELECT 字段名1,字段名2 FROM 备份表
                           DELETE FROM deptBak;
                           CREATE TABLE deptBak2 AS SELECT deptno,dname FROM dept;
                           INSERT INTO deptBak SELECT * FROM dept;
                           SELECT * FROM deptBak;

3 第三天oracle数据库学习

3.1 多表联合查询

当需要获取的数据分布在多张表中,考虑使用联合查询
     -- sql92
        -- 笛卡尔积
          SELECT * FROM emp,dept;
          结果的数量为所用表的数量的乘积
           -- 等值链接 
             --先做表的笛卡尔积,再筛选,筛选条件为等值筛选
            -- 查询员工姓名,工作,薪资,部门名称
              注意:如果是公共字段,则需要声明表名
                    可以给表名使用别名   
           SELECT ename,job,sal,dname FROM emp,dept WHERE emp.deptno=dept.deptno
           SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno
           SELECT e.ename,e.job,e.sal,e.ename FROM emp e,dept d WHERE e.deptno=d.deptno
           -- 不等值链接
                查询员工姓名,工作,工资,工资等级
                SELECT e.ename,e.job,e.sal,s.grade FROM emp e,salgrade s WHERE e.sal>=s.losal AND e.sal <=s.hisal;
                SELECT * FROM salgrade FOR UPDATE;
           -- 自链接
                查询员工姓名,工作,工资,上级领导
                SELECT e1.ename,e1.job,e1.mgr,e2.ename FROM emp e1,emp e2 WHERE e1.mgr=e2.empno;
           -- 外链接
              -- 左外链接(加在右边,显示对左边字段没有值的数据)
                查询员工姓名,工作,工资,部门名称及没有部门的员工信息
                SELECT * FROM emp e,dept d WHERE e.deptno=d.deptno(+);
              -- 右外链接
                查询员工姓名,工作,工资,部门名称及没有部门的员工信息
                SELECT * FROM emp e,dept d WHERE e.deptno(+)=d.deptno;
     -- sql99
           注意: 依然可以给表添加别名
                  如果使用on 或者using 关键字进行结果筛选
                  OUT 关键字可以不写
                  依然可以使用having 排序,分组等
          -- 笛卡尔积:使用 cross join 关键字
             SELECT * FROM emp CROSS JOIN dept; 
             查询员工姓名,工作,薪资,部门名称 
          -- 筛选
                -- 自然链接 关键字 Natural join
                   -- 1底层先笛卡尔积,然后按照所有同名同值字段自动筛选
                     缺点: 如果想按照字段名不同,值相同进行筛选怎么办
                            如果想按照部分字段进行筛选怎么办
                   SELECT * FROM emp NATURAL JOIN dept
                   --解决1 使用using 关键字  inner join   useing()
                       作用:指明使用指定的字段对联合查询的结果进行等值筛选,指明的字段必须是两表的同名同值
                   SELECT * FROM emp INNER JOIN dept USING(deptno,ename);
                   -- 解决2 使用关键字 on 
                       注意:普通筛选条件使用where ,好处:SQL 语句的阅读性变强
                   SELECT * FROM emp e INNER JOIN dept d ON e.deptno=d.deptno WHERE sal>2000;
        -- 外连接
          左外连接(LEFT)
              --  查询员工姓名,工作,工资,部门名称及没有部门的员工信息
                 SELECT * FROM emp e LEFT 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 FULL OUTER JOIN dept d ON e.deptno=e.deptno
           -- 自链接 
           查询员工姓名,工作,工资,上级领导
           SELECT * FROM emp e1 INNER JOIN emp e2 ON e1.mgr=e2.empno
-------------------------------------------------------------------------
         三表联合查询
           --创建city表
                 SELECT * FROM city;
           -- 给city 表增加数据
           INSERT INTO city VALUES(1,'商丘','历史文明的古都');
           INSERT INTO city VALUES(2,'邯郸','历史文明的古都');
           INSERT INTO city VALUES(3,'洛阳','历史文明的古都');
           INSERT INTO city VALUES(4,'开封','历史文明的古都');
           -- 将部门表中的loc 字段设置为城市表的城市编号
           SELECT * FROM dept;
           UPDATE dept SET loc='1' WHERE deptno=50;
           UPDATE dept SET loc='2' WHERE deptno=40;
           UPDATE dept SET loc='3' WHERE deptno=30;
           UPDATE dept SET loc='4' WHERE deptno=20;
           UPDATE dept SET loc='4' WHERE deptno=10;
           -- 完成三表联合查询
           sql92实现
              特点 :易于书写,难于阅读
              -- 缺点  92的sql 语句结构不清
                 用法  SELECT 内容
                        FROM 表名1,表名2
                        WHERE  条件(普通条件,链接条件)
                        GROUP BY
                          HAVING  多行函数筛选
                          ORDER BY 
              查询员工信息及部门名称及所在城市信息并且员工的工资大于2000或者有奖金
              SELECT * FROM emp e,dept d,city c WHERE (e.deptno=d.deptno AND d.loc=c.cid AND e.sal>2000) OR (e.deptno=d.deptno AND d.loc=c.cid AND e.comm IS NOT NULL);
              
           sql95 实现
           查询员工信息及部门名称及所在城市信息并且员工的工资大于2000或者有奖金
            特点:难于编写,易于阅读
            使用 SELECT * FROM  表名1
              INNER JOIN 表名2 ON
                链接条件1
                INNER JOIN 表名3  ON
                链接条件2
                WHERE 普通条件
                GROUP BY
                HAVING
                ORDER BY
          SELECT *
             FROM EMP E
            INNER JOIN DEPT D
               ON E.DEPTNO = D.DEPTNO
            INNER JOIN CITY C
               ON D.LOC = C.CID
            WHERE e.sal>2000 OR e.comm IS NOT NULL
            ORDER BY e.ename
-- 多行子查询
    -- 使用:子查询的结果至于一个字段但是字段有n个值,考虑使用子查询其实就是关键字
      -- 关键字:1 any 任意
      --           2 ALL 所有
      --           3  in  任意存在 not in 没有一个存在               
 -- 查询工资高于任意一个clerk的所有员工信息
  SELECT * FROM emp WHERE sal>(SELECT MAX(sal) FROM emp WHERE job='CLERK');
  SELECT * FROM emp WHERE sal> ANY (SELECT sal FROM emp WHERE job='CLERK');
 -- 查询工资高于所有salesman的员工信心
  SELECT * FROM emp WHERE sal>ALL (SELECT SAL FROM emp WHERE job='CLERK')
 -- 查询部门20中的同部门10的雇员工作一样的雇员信息
 SELECT * FROM emp WHERE job IN (SELECT job FROM emp WHERE deptno=10) AND deptno=20;

4 第四天oracle数据库学习

4.1 数据库表约束理解

--二维表创建的约束学习
   -- 问题1:学号重复依然会添加 
      INSERT INTO student VALUES (1,'关晓彤',18,'女','拍电影',to_date('2020-01-01','yyyy-mm-dd'),'2222222222');
      INSERT INTO student VALUES (1,'关晓彤',18,'女','拍电影',to_date('2020-01-01','yyyy-mm-dd'),'2222222222');
   --问题2:竟然可以没有名字
      INSERT INTO student VALUES (1,'',18,'女','拍电影',to_date('2020-01-01','yyyy-mm-dd'),'2222222222');
   --问题3:年龄竟然可以超过200岁
       INSERT INTO student VALUES (1,'',200,'女','拍电影',to_date('2020-01-01','yyyy-mm-dd'),'2222222222');
   --问题4:性别竟然可以为任意字符       
       INSERT INTO student VALUES (1,'',200,'哈哈','拍电影',to_date('2020-01-01','yyyy-mm-dd'),'2222222222');
   --问题5:qq 号竟然可以重复
       INSERT INTO student VALUES (1,'',200,'哈哈','拍电影',to_date('2020-01-01','yyyy-mm-dd'),'2222222222');
   -- 解决
          CREATE TABLE student(
        sno NUMBER(10) , --PRIMARY KEY
        sname VARCHAR(100), --not null 
        sage NUMBER(3),  -- check(sage<150 and sage>0)
        ssex CHAR(4),-- check(ssex='男' or ssex='女')
        sfav VARCHAR2(500),
        sbirth DATE,
        sqq VARCHAR2(30), --unique
        -- CONSTRAINT pk_student_sno PRIMARY KEY(sno)
        -- CONSTRAINT ck_student_sname check(sname is not null)
        -- CONSTRAINT ck_student_sage check(sage<150 and sage>0)
        -- CONSTRAINT ck_student_sage check(ssex='男' or ssex='女')
        --CONSTRAINT un_student_sqq unique(sqq)
      )
      -- 主键约束
      -- 非空约束
      -- 检查约束
      -- 唯一约束
      -- 问题1:添加主键 主键特点:非空唯一
         -- 使用:直接在创建表的字段后使用 primary key 
         --       在创建表语句最后面使用  CONSTRAINT pk_表名_字段名 PRIMARY KEY(字段名)
         --      在表创建完成之后使用   alert table 表名 add CONSTRAINT pk_表名_字段名 PRIMARY KEY(字段名)
         --      删除主键约束约束    alert table 表名 add CONSTRAINT pk_表名_字段名 PRIMARY KEY(字段名)
      -- 问题2:添加非空约束
           -- 使用:直接在创建表的字段后使用  not null
           --       在创建表语句最后面使用 CONSTRAINT ck_student_sname check(sname is not null)    
           --       在表创建完成之后使用 alter table add CONSTRAINT ck_student_sname check(sname is not null)
           --      删除主键约束约束  alter table drop CONSTRAINT ck_student_sname check(sname is not null)
      -- 问题3:添加检查约束
           -- 使用:直接在创建表的字段后使用  check(sage<150 and sage>0)
           --       在创建表语句最后面使用 CONSTRAINT ck_student_sage check(sage<150 and sage>0)    
           --       在表创建完成之后使用 alter table add CONSTRAINT ck_student_sage check(sage<150 and sage>0)
           --      删除主键约束约束  alter table drop CONSTRAINT ck_student_sname check(sage<150 and sage>0)
      -- 问题4:添加检查约束
           -- 使用:直接在创建表的字段后使用  check(ssex='男' or ssex='女')
           --       在创建表语句最后面使用 CONSTRAINT ck_student_ssex check(ssex='男' or ssex='女')    
           --       在表创建完成之后使用 alter table add CONSTRAINT ck_student_ssex  check(ssex='男' or ssex='女')
           --      删除主键约束约束  alter table drop CONSTRAINT ck_student_ssex check(ssex='男' or ssex='女')
      -- 问题5:添加唯一约束
           -- 使用:直接在创建表的字段后使用  unique
           --       在创建表语句最后面使用 CONSTRAINT un_student_sqq unique(sqq)   
           --       在表创建完成之后使用 alter table add CONSTRAINT un_student_sqq  unique(sqq)
           --      删除主键约束约束  alter table drop CONSTRAINT un_student_sqq unique(sqq)
-- 外键约束
      -- 创建学生表
      CREATE TABLE student(
        sno NUMBER(10) PRIMARY KEY,
        sname VARCHAR2(100) NOT NULL,
        sage NUMBER(3) CHECK(sage>0 AND sage<150),
        ssex CHAR(4) CHECK(ssex ='男' OR ssex ='女'),
        sfav VARCHAR2(500),
        sqq VARCHAR2(30) UNIQUE,
        cno NUMBER(10) --REFERENCES clazz(cno)
        --constraints fk_student_cno foreign key (con) references clazz(con)
      );
      DROP TABLE student
      
      INSERT INTO student VALUES(1,'张三001',18,'男','唱歌',65789000,1);
      INSERT INTO student VALUES(2,'张三002',18,'男','唱歌',65789001,1);
      INSERT INTO student VALUES(3,'李四001',18,'男','唱歌',65789003,1);
      INSERT INTO student VALUES(4,'李四002',18,'男','唱歌',65789004,1);
      -- 问题:竟然可以在学生表中插入一个不存在的班级
      INSERT INTO student VALUES(5,'李四003',18,'男','唱歌',65789005,3);
      SELECT * FROM student;
      -- 创建班级
      CREATE TABLE clazz(
      cno NUMBER(10) PRIMARY KEY,
      cname VARCHAR2(100) NOT NULL,
      cdesc VARCHAR2(300)
      )
      INSERT INTO clazz VALUES(1,'java高级就业班','6666');
      INSERT INTO clazz VALUES(2,'python高级就业班','33333');
      ALTER TABLE clazz RENAME COLUMN con TO cno;
      -- 查询学生及其班级信息
      SELECT * FROM student s ,clazz c WHERE s.cno=c.con
      -- 解决:添加外键约束\
            --作用:在子表中插入的数据在父表中不存在,则会自动报错
            --概念:当一张表中的某个字段的值需要依赖另外一张表的某个字段的值,需要外键约束
            --      其中主动依赖的表称为子表,被依赖的表称为父表,外键加在子表中
            -- 使用:
            --         --在子表的字段后直接使用   references 父表名(父表的字段名)
            --         -- 在创建表语句的最后面使用  constraints fk_student_cno foreign key (con) references clazz(con)
            --         -- 在创建表完成之后使用  alter table student add constraints fk_student_cno foreign key (con) references clazz(con)
            --         -- 删除外键约束  alter table student drop constraints fk_student_cno foreign key (con) references clazz(con)\
            --时机:一般选取父表的主键做为子表的外键
            -- 缺点:
               --1 无法直接删除父表的数据,除非级联删除
                  -- 级联删除:在添加外键约束时,使用关键字 on delete cascade
                     --当删除父表语句时,自动删除子表相关的所有数据
                     缺点 :无法保留子表的历史数据 
                              使用关键字on delete SET NULL
                              使用级联删除时,将子表中的依赖字段的值设置为 NULL
                              -- 注意:子表依赖字段不能添加非空约束
                   删除班级1的信息
                   DELETE FROM clazz WHERE cno=1;

4.2 二维表的维护

--添加新的字段
      ALTER TABLE student ADD sphone NUMBER(11);
      ALTER TABLE 表名 ADD 字段名 字段类型
       SELECT * FROM student;
   --修改原有的字段
       --修改字段名
           ALTER TABLE student RENAME COLUMN  sphone TO phone
           ALTER TABLE 表名 RENAME COLUMN 旧的字段名 TO 新的字段名
       --修改字段类型
           ALTER TABLE student MODIFY sphone VARCHAR2(11)
           ALTER TABLE 表名 MODIFY 字段名 字段类型 
       -- 删除字段
           ALTER TABLE student DROP COLUMN phone
           ALTER TABLE 表名 DROP COLUMN 字段名
   -- 删除表
      DROP TABLE student
      DROP TABLE 表名
    -- 修改表名
      remane 表名1 TO 表名2

4.3 ORACLE的其他知识

-oracle 的序列,视图,索引
   --Oracle 的分页查询
   --oracle 的数据库的备份
   --oracle 的图形化界面操作
   ------------------------------------
   --oracle 的序列学习
      --创建序列
        --使用: create sequence 序列名
           CREATE SEQUENCE cc;
           SELECT cc.currval FROM dual;
           SELECT cc.nextval FROM dual;
          --特点1:默认开始是没有值的,也就是指针指在了没有值的位置
          --特点2:序列名.nextval每次执行都会自增一次,默认步长为1
          --特点3:序列名.currval 查看当前序列的值。开始是没有的
          --作用:作为主键使用,动态的获取主键的值,这样新增数据的时候极大的避免了主角按冲突的问题
          --创建自定义序列
           CREATE SEQUENCE aa START WITH 5 INCREMENT BY 2 MAXVALUE 1000 CACHE 10
            -- 创建测试表
              CREATE TABLE teacher(
              tid NUMBER(10) PRIMARY KEY,
              tname VARCHAR(100) NOT NULL
              )
              INSERT INTO teacher VALUES(cc.nextval,'张三');
        -- 删除序列
        DROP SEQUENCE 序列名 
--------------------------------------------------------------------------------
--使用索引
     --作用:提升查询效率
     --使用索引:create index 索引名 on 表名(字段名)
     CREATE INDEX index_teacher_tid ON teacher(tid)
     --特点显示的创建,隐式的创建
     --注意:oracle 会自动给表的主键创建索引
-- 删除索引
        DROP INDEX 索引名 
---------------------------------------------------------------------------------
-- 视图
    --使用视图
      -- 创建视图:
         -- 注意:视图的创建必须拥有dba 权限
          CREATE VIEW stu AS SELECT sno,sname,sage FROM student
          CREATE VIEW 视图名 AS SELECT 内容
    --视图的特点
        --1 保护真实表,隐藏重要的字段的数据,保护数据
        --2 在视图中的操作必会映射到真实表中
        --3 可以收手动开启只读模式
           CREATE VIEW stu2 AS SELECT sno,sname,sage FROM studen WITH  READ ONLY
      --删除视图: drop view 视图名
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值