一、Oracle安装

  Oracle是数据库管理系统,全球应用最广的,Top100有80家使用此数据库。

  目前数据库技术:

   SQLServer,MySQL,DB2,Oracle

 1.口令要求

  长度:8位+

  规则:必须包含大写、小写英文字母、数字,如Disen666

 2.安装路径

 必须英文路径,且不带空格

 3.安装要求

  4g,20g硬盘  

二、用户管理

 1.链接Oracle

  1)管理员sysdba

     a)sqlplus / as sysdba;

     b)conn /as sysdba;

     c)conn sys/ Disen666;

     d)sqlplus sys/Disen666;

  2)sqlplus hr/hr;

  3)conn hr/hr

 2.创建用户

   创建用户名:create user用户名 identified by 口令;

    CMD> sqlplus/as user

    SQL>show user 

    SQL>create user disen identified by disen;

   授权的语法:

     grant 权限 to 用户名;

     grant create table to disen;

     grant create session to disen;

     disen用户链接Oracle数据库:

    SQL>conn Disen666 /Disen666;

 3.修改用户口令

   SQL> alter user disen identified by d666;

 4.锁定用户

  SQL>alter user disen account lock;

 5.用户解锁

  SQL>alter user disen account unlock;

 练习

 1.给hr用户进行解锁

  SQL>alter user hr account unlock;

 2.修改hr的口令为hr

  SQL>alter user hr identified by hr;

 3.查看hr下所有的表

 SQL>conn hr/hr;

 SQL>select table_name from user_tables;

三、表查询

 1.查看表结构

  SQL>desc employees;

 2.number数值类型

  NUMBER(6)长度为6位的整数

  NUMBER(8,2)长度为8位,小数点保留两位

  VARCHAR(20)可变长度字符类型,根据内容决定

 3.查看当前系统时间

  SQL>select sysdate from dual

  SQL>select to_char(sysdate,'yyyy-MM-dd hh24:mi:ss')from dual;

 4.查看所有员工的ID,姓名,工龄,岗位,部门,工资,按工龄的高低排序

  select EMPLOYEE_ID,FIRST_NAME,((sysdate-hire_date)/365)"工龄",JOB_ID,DEPARTMENT_ID,SALARY from employees

  order by hire_date;

 5.查询的语法

  select column1[[as]"别名"],column2[[as]"别名"],……

  from table_name[表别名]

  where查询条件

  group by 分组字段

  having 分组字段的条件

  order by排序字段ASC|DESC

 6.查询练习1

  1)查询80部门中工资大于6000的员工id,姓名,工资,入职时间

    SQL>select employee_id "员工编号",first_name||'-'||last_name"姓名",salary,hire_date from employees

        where department_id=80 and salary>=9000;

   扩展

   SQL>set line 1000//当前行显示多少个字符

   SQL>set wrap off//是否换行显示,off不换行

  2)查询80部门中最高工资、最低工资、平均工资、部门人数

    提示:max(),min(),avg(),count()

     SQL>select max(salary)"最高工资",min(salary)"最低工资",avg(salary)"平均工资,count(department_id) as 部门人数 

         from employees where department_id=80;

  3)查询80部门中最高工资的员工id,姓名,工资,入职时间

     select employee_id,first_name||' '||last_name "姓名",salary,hire_date from employees where department_id=80

     and salary=(select max(salary) from employees where department_id=80);

  4)查看所有员工的姓名,工资,奖金,入职年限,岗位,按照工资的高低排序

  提示:nvl(cl,value)判断cl是否为空,若为空则返回value值

    SQL>select first_name,salary,round(salary*nvl(commission_pct,0),2)"奖金",round((sysdate-hire_date)/365)"入职年限",job_id

        from employees

        order by salary desc;

7.多表查询

  1)等值条件

  有n个表连接,必须存在n-1个等子条件

  1—1)查询所有人的ID,姓名,岗位,部门名称

  提示:employees,departments,jobs

     SQL>select employee_id,first_name,job_id,department_name from employees e,departments d where e.department_id=d.department_id;

  1-2)查询110部门的人员ID,姓名,岗位描述,工资,部门名称

    select employee_id,first_name,job_title,salary,department_name from employees e,departments d,jobs

    where e.department_id=d.department_id

    and e.job_id=jobs.job_id

    and e.department_id=110;

  2)自连接查询

 一张表中存在两个字段,其中一个字段的取值来源于另外一个字段。

  employees:employees_id,manager_id

   2-1)查询所有员工的ID,姓名,工资,主管id,主管姓名,主管工资,主管入职时间

   SQL>select e.employee_id,e.first_name,e.salary,e.hire_date,

       m.employee_id,m.first_name,m.salary,m.hire_date

       from employees e,employees m

       where e.manager_id=m.employee_id;

四、多表查询之join

   语法:

   select 表1,字段1,表2,字段2

   from 表1 join 表2

   on (等值条件)

   where条件

   order by 字段...

   1.查询70部门员工的id,姓名,工资,部门名称,且按部门排序

   SQL>select employee_id,first_name,salary,department_name

       from employees e

       join departments d

       on(e.department_id=d.department_id)

       where e.department_id=70;

       order by department_name;

   2.查询所有员工的id姓名,salary,部门名称,包含没有部门的员工

   没有部门员工:SQL> select employee_id,first_name

                      from employees

                      where department_id is null;



       SQL>select employee_id,first_name,salary,department_name

           from employees e

           left outer join departments d

           on(e.department_id=d.department_id)

           order by department_name;

   3.查询所有部门的员工id,姓名,salary,部门名称,包含没有员工的部门

     SQL>select rownum,employee_id,first_name,salary,d.department_id,department_name

         from employees e

         right outer join departments d

         on(e.department_id=d.department_id)

         order by department_id;



   4.查询所有部门的员工的id,姓名,工资,部门名称,包含所有部门和员工

     SQL>select rownum,employee_id,first_name,salary,d.department_id,department_name

         from employees e

         full outer join departments d

         on (e.department_id=d.department_id)

         order by department_id;

五、常用函数

  1.字符函数

    length(s)

    substr(s,n,len)截取字符,从n位置开始截取len长度的字符

    concat(s1,s2)链接s1和s2两个字符,类似

    lower(s)小写字符转换

    upper(s)大写字符转换

    initcap(s)首字符大写

    instr(s,s1,n,m)从s的位置开始查找s1在s中第m次出现的位置

    replace(s,s1,s2)将s中s1部分替换成s2

   SQL>select length('abcdef') "Len" from dual;

   SQL>select substr('Disen hi',2,2) "Result" from dual;

   SQL>select upper(concat('hi','disn')) "rssult" from dual;

   SQL>select instr('abcdefabcbbcabcddfadc','abc',1,4) "Result" from dual;

   SQL>select replace('hi,disen','hi','hello') "Result" from dual;

   1-1)查询50部门的员工id,姓名,要求姓名全大写显示

     SQL>select employee_id,upper(first_name)

         from employees

         where department_id=50;

   1-2)查询岗位为SA_REP的员工姓名,工资,部门名称

     SQL>select first_name,salary,department_name

         from employees e join departments d

         on (e.department_id=d.department_id)

         where job_id=upper('sa_rep');//'SA_REP';

   1-3)查询姓名中包含'la'的所有员工的id,姓名,工资,岗位

    提示:模糊查询->字段 like'%la%'     ‘_la’,通配符:% 任意长度的任意字符,_一个任意字符

      SQL>select employee_id,first_name,salary,job_id

          from employees

          where lower(fisrt_name) like '%la%';

   1-4)查询姓名中的第二个字符是'l'的所有员工的ID,姓名,工资,岗位

      SQL>select employee_id,first_name,salary,job_id

          from employees

          where lower(first_name) like'_l%';   

   1-5)查询姓名以'al'开头的员工姓名,工资,岗位,同时将'al'替换成'Di'进行显示

      SQL>select replace(lower(first_name),'al','Di'),salary,job_id

          from employees 

          where lower(first_name) like 'al%';

  2.数值函数

    数值->字符 转换  to_char(99,[format])

    字符->数值 转换  to_number('99.85',[format])

    9:任意数字,指定位置不存在数值时,则不显示

    0:任意数字,指定位置不存在数值时,则显示为0

    ,: 千位符号

    .: 小数点

    $: 美元符号

    L: 本地货币符号

    SQL>select to_char(1998.56,'L9,999.0') "Result" from dual;

    SQL>select to_char(11998.56,'L99,999.0') "Result" from dual;

   2-1)将'1,998.6'转成数值,在增加20000

     SQL>select to_number('¥1,998.6','L9,999.0')+2000 "Result" from dual;

     SQL>select '¥1,998.6'+2000 "Result" from dual;--错误,必须对数值的字符转换为数值再计算

   2-2)查询所有员工id,姓名,岗位,且工资要求格式化输出,同时按工资高低排序

    SQL>select employee_id,first_name,to_char(salary,'L99,999.00') "Salary",job_id

        from employees

        order by salary desc;

   3.日期函数

     日期->字符 to_char(date,[format]);

     字符->日期 to_date('',[format]);

     format:

     yyyy-MM-dd  年-月-日

     dd 月中的日

     dddd年中的日

     day 星期几

     hh12 12小时制

     hh24 24小时制

     mi 分钟

     ss 秒

    SQL->select to_char(sysdate,'yyyy-MM-dd hh24:mi:ss day ddd') "Result" from dual;

         add_months(date,n) 给指定的时间增加六个月,返回六个月后的日期

       next_day(date,'星期一')返回下个星期几

       last_day(date)返回指定时间月的最后一天的日期

          SQL->select last_day(sysdate) from dual;

     3-1)查询2015年10月的最后一天的日期

      SQL->select last_day(to_date('2015-10','yyyy/mm')) "Result" from dual;

      SQL->select last_day('01-10月-15') "Result" from dual;

      注意:如果字符日期格式与系统的日期格式相同,则会自动转换成日期类型

     扩展:

          修改系统的日期格式,默认系统时间日期格式:dd-Month-yy

      SQL->alter session set nls_date_format='yyyy-MM-dd';

      SQL->alter session set nls_date_format='yyyy-Month-dd';

      SQL->select sysdate from dual;

      SQL->select add_months(sysdate,2)"实现小目标" from dual;

      SQL->select add_months(sysdate,2)"实现小目标",to_char(1300,'L9,999.0') "小目标" from dual;

   4.通用函数

     nvl(s1,s2)若s1不为空,返回s1,反之返回s2

     nvl(s1,s2,s3...)返回第一个不为空的字符

     case  分支

     case 列|表达式 when 条件1 then 值1

               when 条件2 then 值2

   when 条件3 then 值3

   else 值4

   end "别名"

     4-1)目标1300,如果收入500,返回"不满意",收入800,返回"尚可",收入1300,返回"满意",

         收入2000,返回"高兴",收入10000,返回"意外",其他收入,返回"不可能"

       SQL->select to_char(10000,'L99,999.0')"收入",

            case 3000 when 500 then '不满意'

            when 800 then '尚可'

    when 1300 then '高兴'

    when 10000 then '意外'

    else '不可能'

            end"结果"

            from dual;



        decode(列|表达式,条件1,值1,条件2,值2,条件3,值3)别名

        SQL->select to_char(800,'L99,999.0')"收入"

             decode(800,500,'不满意',800,'尚可',1300,'满意',2000,'高兴',10000,'意外','不可能') "结果"

             from dual;

    4-2)查询岗位SA-REP、IT_PROG,ST_MAN,HR_REP的员工id,工资,岗位,奖金

        并对SA-REP岗位的奖金增加5%,对IT_PROG岗位的奖金增加10%,对ST_MAN岗位的奖金增加12%,其他岗位不变

        SQL->select employee_id,salary,job_id,salary*nvl(commission_pct,0) "奖金"

        from employees

        where upper(job_id) in('SA_REP','IT_PROG','ST_MAN','HR_REP');

        SQL->select employee_id,salary,job_id,

             decode(job_id,'SA_REP',salary*(nvl(commission_pct,0)+0.05),

              'IT_PROG',salary*(nvl(commission_pct,0)+.1),

  'ST_MAN',salary*(nvl(commission_pct,0)+.12),salary *nvl(commission_pct,0)) "奖金"

  from employees

  where upper(job_id) in ('SA_REP','IT_PROG','ST_MAN','HR_REP');

六、子查询

    子查询即可以作为表达式或数据来源在查询语句中使用

    1)查询大于80部门最高工资的员工id,姓名,工资,岗位,部门id

      SQL->select employee_id,first_name,salary,job_id,department_id

           from employees

           where salary > (select max(salary) from employees where department_id=80);

    2)查询80部门工资最高的员工id,姓名,工资,岗位

      SQL->select employee_id,first_name,salary,job_id

           from employees

           where salary = (select max(salary) from employees where department_id=80)

           and department_id=80;

   

   

   

   

   

   

    3)查询工龄大于12年的所有员工的id,姓名,工资,岗位,工资要求格式化输出

      SQL->select e.employee_id,first_name,to_char(salary,'$99,999.0'),y.years "工龄",job_id

           from employees e

           join (select employee_id,round((sysdate-hire_date)/365) "YEARS"

           from employees order by hire_date) y 

           on(e.employee_id=y.employee_id)

           where y.years>12;

      SQL->select employee_id,first_name,salary,round((sysdate-hire_date)/365) "YEARS"

           from employees

           where employee_id in 

          (select employee_id

          from

          (select employee_id,round((sysdate-hire_date)/365) "YEARS"

          from employees order by hire_date)

          where years>12);

    4)查询工资在80部门的最高工资和90部门的最高工资之间的员工id,工资,入职时间,岗位

      SQL->select employee_id,salary,to_char(hire_date,'yyyy-MM-dd hh24:mi:ss')"HIRE_DATE",job_id

           from employees

           where salary between(select max(salary) from employees where department_id=80)

           and (select max(salary) from employees where department_id=90);

七、增加(插入)、更新(修改)、删除及事务处理

   1.插入语句

    语法1:insert into 表名[(字段1,字段2,...)]

     value(字段1值,字段2值,...);

    语法2:insert into 目的表名[(字段1,字段2,...)]

     select 字段1,字段2,... from 源表名 where...

    1-1)插入一位员工到120部门,员工的姓名为"disen",编号666,邮箱8888@qq.com,入职时间为当天,岗位为IT_PROG

       SQL->insert into employees(employee_id,last_name,email,hire_date,job_id,department_id)

            values(666,'disen','8888@qq.com',sysdate,upper('it_prog'),120);

       SQL->select employee_id,last_name,email,hire_date,job_id from employees where department_id=120;

   2.事务

     commit 提交事务,之前进行的DML操作都生效

     rollback 回滚事务,之前进行的DML操作都无效

     savepoint 还原点名,在DML操作后,定义一个回滚的事件点

     rollback to 还原点名,回滚事务到还原点名之后,还原点名之前的DML不受影响

    扩展:在以下事件发生时,系统会自动提交事务

     1)当执行DDL或DCL时

     2)会话session(窗口)关闭时

     3)执行commit时

     4)执行trunk截断表时

   3.插入三位员工,使用sql脚本方式

     在d:\insert_emps.txt->insert_emps.sql

     SQL->start d:\insert_emps.sql 开始执行

   4.删除语句

    语法:

     delete from 表名

     where 条件;

     4-1)删除姓名(last_name)是disen的员工

      SQL->select last_name from employees where last_name='disen';

      SQL->delete from employees where last_name='disen';

      SQL->savepoint delDisen;

   5.修改语句

    语法:

    update 表名

    set 字段1=value1,字段value2,...

    where 条件

    5-1)将120部门的员工工资改成12000,绩效百分比市值为10%

    SQL->update employees set salary=12000,commission_pct=.1

         where department_id=120;

    5-2)查询120部门员工的id,姓名,工资,奖金,实际工资

     SQL->select employee_id,last_name,salary,commission_pct*salary"奖金",salary*(1+commission_pct) "实际工资"

          from employees

          where department_id=120;

    5-3)将zxp的奖金的百分比提升到15%,工资增加200

     SQL->savepoint updateSY;

     SQL->update employees

          set commission_pct=.15,salary=salary+200

          where first_name='zxp';

    5-4)将120部门员工的奖金小于1200的员工的奖金增加200

       SQL->savepoint up Salary;

       SQL->update employees 

            set commission_pct=round((salary*commission_pct+200)/salary,2)

            where department_id=120

            and(salary*commission_pct)<=1200;

    5-5)将入职年限超过12年的员工工资增加1000,且岗位是FI_MGR

       SQL->update employees

            set salary=salary+1000

            where(sysdate-hire_date)/365>=12

            and job_id='FI_MGR';

       SQL->select employee_id,last_name,salary,hire_date

            from employees

            where(sysdate-hire_date)/365>=12

            and job_id='FI_MGR';

八、五种约束

    1.主键 primary key,表示主键的值不能为空,且是唯一的

    2.外键 foreign key references,外键字段值的来源于references引用主表的主键

    3.非空 not null,非空字段的值不能为null

    4.唯一 unique,唯一列值在整个表中就唯一的

    5.检查 check,列值必须符合check的条件

   约束的数据字典:

    user_constraints

    user_cons_columns;

   1)查询employees表的所有约束的名称,表名,字段名,类型

     SQL->desc user_constraints;

     SQL->select c.constraint_name,c.table_name,cc.column_name,c.constraint_type

          from user_constraints c join user_cons_columns cc

          on(c.constraint_name=cc.constraint_name)

          where c.table_name=upper('employees');

    扩展:

    设置列的显示宽度

      col 列名 format a20; 20代表列宽

      SQL->col column_name format a15;

      SQL->col constraint_name format a20;

   2)将120部门的所有员工的主管id改为555,操作是否成功,为什么?

    SQL->update employees

         set manager_id=555

         where department_id=120;  

    第 1 行出现错误:

    ORA-02291: 违反完整约束条件 (HR.EMP_MANAGER_FK) - 未找到父项关键字

    解决方法

    禁用EMP_MANAGER_FK约束

     SQL->alter table employees

          disabled constraint emp_manager_fk;



     SQL->select c.constraint_name,c.status,cc.column_name,c.constraint_type

          from user_constraints c join user_cons_columns cc

          on(c.constraint_name=cc.constraint_name)

          where c.table_name=upper('employees');

 

   3)查询主管id为555的员工的id,工资,姓名,邮箱

    SQL->select employee_id,salary,last_name,email

         from employees

         where manager_id=666;

  4)将主管id为555的员工的主管id设置为空

    SQL->update employees

         set manager_id=null

         where manager_id=666;

   SQL->commit;

   SQL->alter table employees

        disabled constraint emp_manager_fk;

九、DML

   1.创建表

      oracle数据类型:

  varchar2(len) 可变数据类型

  char(len) 固定长度的字符类型

  date

  number(m,n) 带小数点的数值类型

  number(m) 整型数值

语法:

  create table 表名(column1 datetype(len)[约束][默认值],

                       (column2 datetype(len)[约束][默认值],

                       (column3  datetype(len)[约束][默认值],...)

[as 子查询]

     1-1)创建emp_high表,此表用于保存每个部门最高薪资的员工id,姓名,工资,入职时间,岗位

      SQL->create table emp_high(employee_id number(6),name varchar2(20),salary number(8,2),hire_date date,job_id varchar2(10));

1-2)修改emp_high表的salary数据长度为8位,小数点保留两位

SQL->alter table emp_high

modify(salary number(8,2));

SQL->select * from emp_high;

          SQL->insert into emp_high

               select employee_id,last_name,salary,hire_date,job_id

       from employees e

       join (select department_id,max(salary) "MAXSALARY" from employees group by department_id) eh 

               on(e.department_id=eh.department_id)

          where e.salary=eh.maxsalary;

     1-3)修改emp_high表中name列名为employee_name

        SQL> alter table emp_high

             rename column name to employee_name;

    1-4)将emp_high表中的employee_id的列名改成id,类型长度改为3位

       修改列类型语法:

       alter table 表名

       modify(列名 datetype[约束][默认值]);

     修改列名的语法:

       alter table 表名

   rename column 旧列名 to 新列名;

   SQL->alter table emp_high

        modify (employee_id number(8));//如果数据类型的长度比之前要小时,此列是空列。

   SQL->alter table emp_high

   rename column employee_id to id;

1-5)查询emp_high中每个员工所在部门名称,岗位,姓名

  SQL->select department_name,e.job_id,employee_name

       from employees e,departments d,emp_high n

   where e.employee_id=n.id

       and e.department_id=d.department_id;

SQL->select department_name,e.job_id,employee_name

      from emp_high eh join employees e

  on(eh.id=e.employee_id)

  join departments d

          on(e.department_id=d.department_id);

    1-6)将emp_high表中的job_id和salary两个字段删除

     删除列的语法:

       alter table 表名

       drop column 列名;

SQL->alter table emp_high

      drop column job_id;

SQL->alter table emp_high

      drop column salary;

1-7)删除emp_high表

      删除表的语法:

       drop table 表名;

     SQL->drop table emp_high;

  2.表和约束

    2-1)创建班级表、学生表、课程表、成绩表

班级表 t_cls(id,title)

学生表 t_stu(id,name,age,sex,tel,cls_id)

课程表 t_course(id,title,pct)  pct学分

成绩表 t_score(id,stu_id,course_id,score)

SQL->start d:/chuangjian.sql

2-2)查询所有的学生的姓名,成绩,班级名

SQL->select s.name,cs.title,c.title,sc.score

from t_stu s join t_cls cs

on (s.cls_id=cs.id)

join t_score sc on(s.id=stu_id)

join t_course c on(sc.course_id=c.id)

order by s.name;

2-3)向学生表添加组长ID列(mgr_id),取值为学生id

语法:

alter table 表名

add (列名 datetype(length)[约束][默认值]);

    SQL->alter table t_stu

     add mgr_id number(12) unique;

SQL->update t_stu

     set mgr_id='201503063240'

where id='201503063240';

十、View视图

  1.创建视图的语法:

create view 视图名[(列名1,列名2,...)]

as 子查询;

删除视图:

drop view 视图名;

   1-1)查询80部门员工id,姓名,工资,岗位和部门名称,并将查询结果以视图的方式保存。

    SQL->create view depart_80 as

     select employee_id,last_name,salary,job_id,department_name

from employees e join departments d

on (e.department_id=d.department_id)

where e.department_id=80;

SQL->select * from depart_80;

SQL->create or replace view depart_80(id,name,salary,job_id,d_name)

     as

     select employee_id,last_name,salary,job_id,department_name

from employees e join departments d

on (e.department_id=d.department_id)

where e.department_id=80;

    1-2)查询SA_REP岗位员工的id,姓名,入职时间,工资,奖金,实发工资和部门名称,

    按照入职时间早晚排序,并将查询结果以视图的方式保存。    

     SQL->create or replace view v_sa_rep

      as

  select employee_id,first_name,to_char(hire_date,'yyyy-MM-dd') "HIRE_DATE",

  to_char(salary,'L99,999.0')"SALARY",

  salary*nvl(commission_pct,0) "COMMISSON",

  salary*(1+nvl(commission_pct,0)) "RSALARY",department_name

  from employees e join departments d

          on(e.department_id=d.department_id)

  where job_id=upper('sa_rep')

          order by hire_date;

SQL-> drop view v_sa_rep;   



  2.on delete cascade /on delete set null 主外键级应用

    2-1)创建用户表和用户日志表,并设置用户表和日志表主外键关系,同时考虑级联删除。

用户表:t_user(id,name,passwd,nick_name,u_level,u_roles)

日志表:t_log(id,content,user_id,log_date,log_ip)

  SQL->create table t_user

       (id number(8) primary key,

   name varchar2(20) not null,

   passwd varchar(20) not null,

    nick_name varchar2(20),

u_level number(2) default 1,

u_roles varchar2(10) default 'comm',

constraint user_name_un unique(name)

);

  SQL->create table t_log

(id number(8) primary key,

content varchar2(200),

user_id number(6) references t_user(id) on delete casecade,

log_date date default sysdate,

log_ip varchar2(20)

);

--on delete casecade 当user_id的记录从t_user删除时,那么t_log表中的所有user_id的记录会被全部删除

--on delete set null 当user_id的记录从t_user删除时,那么t_log表中的所有user_id的记录会被全部设置为null。

SQL->alter table t_log

     drop constraint SYS_C0011176;--删除t_表的SYS_C0011175约束

SQL->alter table t_log

modify(user_id number(6) references t_user(id) on delete casecade);

2-2)查询t_log表的所有约束的名称,类型,表名,列名,状态

  提示:user_constraints(table_name,constraint_name,type,status),

        user_cons_columns(table_name,constraint_name,column_name)

  SQL->create or replace view v_log_cons as

       select c.constraint_name,c.constraint_type,c.table_name,cc.column_name,c.status

   from user_constraints c join user_cons_columns cc

   on (c.constraint_name=cc.constraint_name)

   where c.table_name=upper('t_log');

   

SQL->col column_name format a20;

SQL->select * from v_log_cons;

2-3)添加用户(1,'disen','888'),添加日志(1,'login',1),(2,'query goods',1),(3,'add goods',1)

   SQL->insert into t_user(id,name,passwd) values(1,'disen','888');

        insert into t_log(id,content,user_id) values(1,'login',1);

insert into t_log(id,content,user_id) values(2,'query goods',1);

insert into t_log(id,content,user_id) values(3,'add goods',1);

    SQL->select name,content,log_date from t_user u join t_log l on(u.id=l.user_id);

SQL->delete from t_user where id=1;

SQL->alter table t_log

drop constraint SYS_C0011176;--删除t_log表的SYS_C0011176约束

SQL->alter table t_log

     modify(user_id number(10) references t_user(id) on delete set null);

 

  3.序列

      创建序列的语法:

       create sequence 序列名

       increment by 步长

       start with 起始值

       maxvalue 最大值

       minvalue 最小值

       cycle|nocycle

       cache n|nocache;

       使用序列:

      在插入语句中:序列名.nextval

      序列的数据字典:user_sequences

        SQL->select sequence_name,increment_by,min_value,to_char(max_value),last_number

from user_sequences;

3-1)为t_user表和t_表创建自增序列,起始位1,步长1,最大值999999

SQL->create sequence user_seq

     increment by 1

start with 1

maxvalue 999999

nocycle

nocache;

3-2)使用user_seq序列作为user的id,向用户表插入两条记录。

   SQL->insert into t_user(id,name,passwd) values(user_seq.nextval,'disen','888');

        insert into t_user(id,name,passwd) values(user_seq.nextval,'sy','666');

注意:当DML事务回退时,序列不回退。

4.复习java

    1)数据类型

字符:char,String

数值:

   整数: bype,short,int,long

   精度:float,double

   布尔:boolean(true,false)

2)数据类型的引用类

  char-> Character

  byte->Byte

  int->Integer

  long->Long

  float->Float

  double->Double

3)Java命名规范:驼峰命名

a)类名:首字母大写,随后的每个词组的第一个字母大写。

b)属性(成员变量/字段)名:首字母小写,随后的每一个字母大写。

c)方法名:同属性命名方式。

eg.将"123"转成数值后加上100,打印结果

核心代码:

String ns="123";

int number=Integer.parseInt(ns);

number=number+100;//number+=100;

System.out.println("number="+number);

4)Java类

a)静态块

b)构造方法

c)成员变量

d)成员方法

使用类中的成员时,必须先实例化。

5)集合ArrayList,Arrays排序

Collection(List->ArrayList,Set->HashSet) Map->HashMap,TreeMap

在bean包下:alt+[insert]->Class->User:

  ID

          PASSWD

          NICK_NAME

          U_LEVEL

          U_ROLSE

  ->生成setter和getter方法

  ->生成构造方法

  ->生成实例化方法(单例模式)

二、java

1.数据类型

"123.56"->int :Integer.parseInt("123");

"123.56"->float :Float.parseFloat("123.56");

67.78->String :String.valueOf(67.78); "67.78"

2.语法

class,method,访问类型(public,default,proteted,private)

if-elseif-else

int a=100;

switch(a){

case 90:

System.out.println("a");

case 99:

System.out.println("c");

case 100:

System.out.println("d");

default:

System.out.println("e");

}

结果:d

      e

成绩>=60及格,>=80良,>=90优,switch语句实现

switch(score){

case 60:

case 70:

System.out.println("及格");break;

case 80:

System.out.println("良");break;

case 90:

case 100:

System.out.println("优");break;

default:

System.out.println("差");break;

}

while,do-while

for(int i=0,i<=10;i++){

}

3.数组,初始化

int[] numbers={2,34,5,6,7};

int[] n2=new int[4];

int len=n2.length;

change(n2);

System.out.println(int[] abc){

abc=12;//当前执行的位置

}

4.类对象

三大特性:封装,继承,多态

多态:

1)父类的引用指向子类的对象

2)子类->父类:自动转换

  父类->子类:强制转换  instanceof

 class User{

private String name;

public User(){

this.name="disen"

}

public void setName(String name){

 

}

public void getName(){

return this.name;

}

 }

 public static void main(String[] args){

 User user=new User();

 User u2=new User("SY");

 changName(u2);

 System.out.println(user.getName());

 System.out.println(u2.getName());

 }

 public static void changeName(User user);

  user.setName("YanYan");

 }

  











开库

root

1.su - oracle//使用oracle

2.//打开监听器

3.sqlplus / as sysdba

4.sql>startup

5.alter system register

6.!lsnrctl status

7.vi /etc/hosts//修改ip





clear//清屏

su - oracle

sqlplus  / as sysdba

create user zhang identified by zhang;

conn zhang/zhang;

conn / as sysdba

grant create session to zhang;

sqlplus zhang/zhang;

select *from tab;

grant create table to zhang;

create table t(id int,name char(10));

grant select on emp to zhang;

revoke select onemp form zhang;



delclare 

integer

char

varchar2



oerr ora 12899//查错



select nullif(1,0) from dual;//1

select nullif(0,0) from dual;//null



date

timestamp

exception

begin 

exception

end;







关系型数据库

*数据是以二维表的形式来存储

*列不可再分

coll coll2 coll3 coll4

coll.1

coll.2

第一范式:

*只要建立了列不可再分的二维表,就属于第一范式。

第二范式:

*二维表中存在一列,该列的值没有重复,可以唯一地区分每一行记录。

第三范式:

*在符合第二范式

SQL

select * from emp where empno=7788

optimizer





*简单查询

数据来源一个表

*复杂查询

数据来源于多个表,或者包含多个查询

*多表连接查询

*复合查询

union,intersect,minus

*多表连接查询

*非关联子查询

select * from emp where sal>(select from emp where ename="jones");



select ename,a.deptno,sal,avgsal from emp a,(select deptno,AVG(sal) avgsal from emp group by deptno) b where a.deptno=b.deptno and sal>avgsal;

关联子查询

select ename,o.deptno,sal from emp o where sal>(select avg(sal) from emp 1 where i.deptno=o.deptno);