zoukankan      html  css  js  c++  java
  • Oracle数据库之三

    子查询 -- 就是在一个查询中包含多个select语句(一般就2个)

     

    select id,first_name,dept_id from s_emp;

     

    想查询和Ben一个部门的员工的idfirst_name,dept_id,salary信息

     

    select dept_id from s_emp where first_name = 'Ben';

     

    select id,first_name,dept_id,salary from s_emp

    where dept_id = 上面的值;

     

    select id,first_name,dept_id,salary from s_emp

    where dept_id =(select dept_id from s_emp where first_name = 'Ben');

     

    使用子查询时,外面的查询叫主查询,用()括起来的叫子查询。

    子查询先于主查询运行,子查询必须用()括起来。子查询一般放在条件运算符的右边。

    经验:

      如果''中包括'(单引号,需要把''中的'换成''(2)

    练习:

      查询所有工资超过Ben的员工信息,包括:id,first_namesalary

    select id,first_namesalary from s_emp

    where salary >(select salary from s_emp where first_name = 'Ben');

     

    显示工资高于平均工资的员工信息,包括:id,first_name,salary

    select id,first_name,salary from s_emp

    where salary >(select avg(salary) from s_emp );

     

    显示工资高于部门id=43的平均工资的员工信息,包括:id,first_namesalary

     

    select id,first_name,salary from s_emp

    where salary >(select avg(salary) from s_emp where dept_id = 43);

     

    select id,first_name,salary from s_emp

    where salary >(select avg(salary) from s_emp where dept_id = 43 group by dept_id);

     

    查询的一般执行次序:

    1 from 子句

    如果有join on的话,先on

    如果是outer join,加入on之外的有效数据

    4 where 子句

    5 group by子句

    6 having子句

    7 select选择

    8 order by 子句

     

    显示所有工资等于部门43任意员工的员工信息,包括:id,first_namesalary

     

    select id,first_name,salary from s_emp

    where salary =(select salary from s_emp where dept_id = 43);

    如果子查询返回超过一个值,能使用的运算符只有innot in

     

    select id,first_name,salary from s_emp

    where salary in(select salary from s_emp where dept_id = 43);

     

    练习:

    返回管理者(idin manager_id)的信息。

    select id,first_name,salary from s_emp

    where id in(select distinct manager_id from s_emp);

     

    返回非管理者(idnot in manager_id)的信息。

    select id,first_name,salary from s_emp

    where id not in(select distinct nvl(manager_id ,0)from s_emp);

     

    如果结果中包括空值,可能需要使用nvl函数。

     

    显示所有工资大于部门43所有员工的员工信息,包括:id,first_namesalary

    select id,first_name,salary from s_emp

    where salary >(select min(salary) from s_emp where dept_id = 43);

     

    select id,first_name,salary from s_emp

    where salary >all(select salary from s_emp where dept_id = 43);

     

    select id,first_name,salary from s_emp

    where salary =any(select salary from s_emp where dept_id = 43);

    如果子查询返回多个结果,可以用all或者any修饰,就可以用其他运算符连接。

    all代表所有,any代表任意一个

     

    显示平均工资比部门33高的部门ID和平均工资

    select dept_id,avg(salary) from s_emp

    group by dept_id

    having avg(salary)>(select avg(salary) from s_emp where dept_id = 33);

     

    结论:条件中包括分组函数使用having,否则where

     

    建表和约束(DDL语句)

    表明加后缀 ,防止名称冲突

     

    实际表明_地区拼音缩写1306_教室标号学号

     

    SQL标识符的规则:

     必须字母开头

     可以包含字母、数字、_$#

     同一用户下,不能重名(表、视图、序列等)

     不能是ORACLE关键字

     长度1-30

    Oracle表明 必须符合标识符

    建表的SQL语法:

    CREATE TABLE [用户.] 表名

    (字段名 字段类型 [默认值] [字段约束],

    ...

    [表约束]

    );

    字段类型:number/char/varchar2/date

     

    create table test

    (

      id number(7),

      name varchar2(20)

    );

    这种方式建表,只能建一张空表。

    删除表:

    drop table 表名;

    drop table test;

    练习:

    建立一个student表,包括字段:学号id,姓名,性别,入学日期

    create table student

    (

      id       number(10),

      name     varchar2(20),

      sex      varchar2(4),

      joindate date

    );

     

    oracle的字段类型

    字符串类型:

     char--定长字符串,不足部分补空格。

     varchar2-- 变长字符串,长度和数据一致

     char的效率比varchar2稍高,但大多数情况下,首选varchar2

    数值类型:

     整型和浮点

     int/number(n)   int就是number(38)

     number(n,m)

    Oracle的日期类型包括:

    世纪、年、月、日、小时、分、秒 7个部分

    两个日期相等 意味着这7个部分都相等。

    日期类型的显示 受数据库语言的影响

    比如:英文环境显示月份用英文单词缩写,中午环境显示中午月份

    因此,对于日期的操作必须解决语言带来的问题。

    to_char()to_date() 解决日期问题。

    to_char(日期,显示格式)

    显示格式:‘特殊字符’,特殊字符包括:

    y- 1位年  yyyy- 4位年

    m- 1为月  mm- 2位日

    d- 1为日  dd- 2为日

    h- 小时   hh24- 24小时制的2位小时

    mi- 分    mi- 

    s- 秒     ss- 2位秒

    注:日期类型的字面值需要用''扩起来

    select sysdate from dual;

     

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

     

    练习:

     显示员工信息,包括idfirst_name,入职时间

     入职时间要求显示年月日即可,要求to_char.

     

    select id,first_name,to_char(start_date,'yyyy-mm-dd') start_date from s_emp;

     

    插入数据使用insert语句,语法:

    insert into 表名[(字段名...)] values (值...

     

    insert into 之后,只有自己的窗口界面可以看到,并没有真正插入数据库,只有commit之后才真正插入数据库。

     

    select * from student;

     

    insert into student values(1,'zhangfei','man',sysdate);

    commit;

    insert into student values(2,'guanyu','man',sysdate-1);

    commit;

     

    insert into student values(3,'liubei','man','1-AUG-13');

     

    to_date() 可以实现插入各种语言的数据库

    to_date(字符串形式的日期,格式)

    select to_date('2008-08-08','yyyy-mm-dd') from dual;

     

    insert into student values(4,'xiaoqiao','girl',to_date('1999-11-15','yyyy-mm-dd'));

     

    to_char() 多用于查询日期类型

    to_date() 多用于插入日期类型的字段

     

    重点掌握:建表、删除表、插入数据、两个函数

     

    字段类型:

     CLOB:字符串型的大数据(4G

     BLOB:非文本型的大数据(4G

     

    光建表,插入的数据有可能是无效数据

    主键约束 -- 主键字段 非空并且唯一,数据库记录的唯一标识。个别时候可以使用多个字段做联合主键

     

    非空约束 --非空字段 值不能为NULL

    唯一约束 -- 不允许出现重复值(可以为NULL

    外键约束(主外键)--字段的数据来自另外一个表的主键

    check约束--额外加一些条件

     

    最常用的约束:主键约束、非空约束、外键约束

     

    Oracle可视化工具:PL SQL TOAD

     

    约束可以写在字段后面或者写在表中所有字段定义后面,直接写作字段后面的叫字段级约束,写在表的最后的叫表级约束。

    大多数情况下没什么区别,非空约束只能使用字段级约束,联合主键只能用表级约束。

     

    主键约束语法--

     字段级:

       字段名  字段类型 [constraint 约束名] primary key,

       约束名可以省略,系统会自动起。

     表级:

        ,[constraint 约束名] primary key(id)

     

    非空约束语法--

    字段级:

     字段名 字段类型 [constraint 约束名] not null

    没有表级的非空约束

     

    带约束建表:

    drop table student;

    create table student

    (

      id          number(10) constraint student_id_pk primary key,

      name     varchar2(20) not null,

      sex       varchar2(4),

      joindate date

    );

     

    经验:

    约束名组成方式:表明_字段名_约束名

     

    create table class(

      c_id number(10) primary key,

      c_name varchar2(20) not null,

      conmment varchar2(100)

    );

     

    有些表的数据存在内在的关系,比如:学生表和班级表存在关系,学生应该隶属于某个班级。

    外键约束就是体现表和表之间的关系的,如果a属于b,会在a表中加入一个外键字段,

    其值来自于b表主键字段。

    外键约束也叫主外键关联

     

    外键表级约束语法:

    ..., constranit 约束名 foreign key(外键字段) references 关联表名(主键字段名)

     

    注:约束写在a表,关联表名就是b表。a表叫子表,b表叫父表

    外键字段允许空,但是不能是一个b表关联主键不存在的值。

    写一个学生表和班级表,用外键体现关系。

    drop table student;

    create table student

    (

      id       number(10) constraint student_id_pk primary key,

      name     varchar2(20) not null,

      sex      varchar2(4),

      joindate date,

      class_id number(10),

      constraint student_id_fk

      foreign key(class_id) references class(c_id)

    );

     

    insert into class values(1,'csd1306','guangzhou-csd1306');

    insert into student values(1,'xiaoqiao','girl',to_date('1999-11-15','yyyy-mm-dd'),1);

    insert into student values(2,'liubei','man',to_date('1999-01-10','yyyy-mm-dd'),2);错  班级2不在class表中

     

    练习:

       设计两张表 员工表emp和部门表dept,

       员工表字段:id/name/salary/joindate/position

       部门表字段:d_id/d_name/comments

       提示:需要加约束(主键、非空、外键)

       插入3条部门数据和5条员工数据。

     

    create table dept(

      d_id number(11) constraint dept_pk primary key,

      d_name varchar(20) not null,

      comments varchar(100)

    );

     

    create table emp(

      id  number(11) constraint emp_pk primary key,

      name varchar(20) not null,

      salary number(10,4),

      joindate date,

      position varchar(15),

      dept_id number(10),

      constraint emp_fk 

      foreign key(dept_id) 

      references dept(d_id)

    );

     

    插入数据,先父表,后子表

    insert into dept values(1,'sales',NULL);

    insert into dept values(2,'teach',NULL);

    insert into dept values(3,'admin',NULL);

     

    insert into emp values(1,'zhangfei',12000.0,sysdate,'jiangjun',3);

    insert into emp values(2,'guanyu',15000.0,sysdate,'jiangjun',3);

    insert into emp values(3,'guojia',17000.0,sysdate,'junshi',2);

    insert into emp values(4,'zhouyu',18000.0,sysdate,'dudu',2);

  • 相关阅读:
    [BJWC2010]外星联络
    [NOI2015]品酒大会
    工艺 /【模板】最小表示法
    [NOI2016]优秀的拆分
    [HEOI2016/TJOI2016]字符串
    [SDOI2016]生成魔咒
    【模板】后缀自动机 (SAM)【SA解法】
    [湖南集训]图森
    [USACO17DEC]Standing Out from the Herd P
    Annihilate
  • 原文地址:https://www.cnblogs.com/marshhu/p/3266763.html
Copyright © 2011-2022 走看看