网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 交易代码 > SQL语法 > 正文

SQL基础(1)

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务
select
    Projection:投影,竖向查询
    selection:横向查询
    join:联合,印象查询速度
    select*formtable;
    select标志那些列
    from标志那些表
    1.sql语句大小写不敏感(关键字大写)
    2.sql语句可以写一行也可以多行
    3.关键字不能缩写,也不能跨行
    4.字句(clause)单独分异行
    5.以分号结尾
    6.字符型左对齐,数字型右对齐(缺省),列头大写
    arithmeticexpresstions(+-*/)
    字符串类型智能+-
    ()可以提高+-的优先级
    NULL
    是一种不可见,无分配,不知道,不可用的状态
    null不等于0,也不是空格
    null与数字结果还是null
    null与字符串结果还是字符串
    SQL>selectlast_name,12*salary*commission_pct
    2fromemployees;
    列别名columnalias
    可以用于表达式的计算
    如果包含空格或特殊字符或需要保持大小写敏感,则需要“”
    一般用AS或空格
    连接操作符conncatenationoperator
    ||
    SQL>selectlast_name||job_idas"Employees"
    2fromemployees;
    literalcharacterstring用单引号
    SQL>selectlast_name||''||job_idas"Employees"
    2fromemployees;
    用q'<>[]'实现转义字符
    SQL>selectdepartment_name||q'['sManagerId:]'||manager_idas"DandM"
    2fromdepartments;
    DandM
    --------------------------------------------------------------------------------
    Administration'sManagerId:200
    SQL>l
    1selectdepartment_name||q'<'sManagerId:>'||manager_idas"DandM"
    2*fromdepartments
    重复列Duplicaterows
    DISTINCT消除重复列
    SQL>selectdistinctdepartment_id
    2fromemployees;
    显示表结构
    desc-->describe//并不太详细,可以下载PL/SQL的包,更加详细
    SQL>descemployees;
    NameNull?Type
    -----------------------------------------------------------------------------
    EMPLOYEE_IDNOTNULLNUMBER(6)
    FIRST_NAMEVARCHAR2(20)
    LAST_NAMENOTNULLVARCHAR2(25)
    EMAILNOTNULLVARCHAR2(25)
    PHONE_NUMBERVARCHAR2(20)
    =====
    select*|{[DISTINCT]column|expression[alias],...}
    fromtable;
    |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
    限制和排序数据(RestrictingandSortingData)
    1.where
    select*|{[DISTINCT]column|expression[alias],...}
    fromtable
    [wherecondition(s)];
    where字句不能使用别名
    SQL>selectemployee_id,last_name,job_id,department_id
    2fromemployees
    3wheredepartment_id=90;
    EMPLOYEE_IDLAST_NAMEJOB_IDDEPARTMENT_ID
    -----------------------------------------------------------
    100KingAD_PRES90
    101KochharAD_VP90
    102DeHaanAD_VP90
    不能使用别名:
    SQL>l
    1selectemployee_id,last_name,job_id,department_idDID
    2fromemployees
    3*whereDID=90
    SQL>/
    whereDID=90
    *
    ERRORatline3:
    ORA-00904:"DID":invalididentifier
    数值型
    字符串,日期型需要单引号
    ------大小写敏感!!
    ------可以使用大小写转换函数
    SQL>l
    1selectemployee_id,last_name,job_id,department_idDID
    2fromemployees
    3*wherelast_name='whalen'
    SQL>/
    norowsselected
    ——————————————————————
    SQL>l
    1selectemployee_id,last_name,job_id,department_idDID
    2fromemployees
    3*wherelast_name='Whalen'
    SQL>/
    EMPLOYEE_IDLAST_NAMEJOB_IDDID
    --------------------------------------------------------
    200WhalenAD_ASST10
    ————————————————————————
    SQL>l
    1selectemployee_id,last_name,job_id,department_idDID
    2fromemployees
    3*whereupper(last_name)='WHALEN'
    SQL>/
    EMPLOYEE_IDLAST_NAMEJOB_IDDID
    --------------------------------------------------------
    200WhalenAD_ASST10
    日期
    日月年(DD—MON-RR)
    ComparisonOperators
    =>...
    **********
    Between--and--
    ______
    SQL>l
    1selectlast_name,salary
    2fromemployees
    3wheresalarybetween2500and3500
    4*
    *********
    IN(SET)速度不是很快,但是逻辑思维很清楚
    _________
    SQL>selectemployee_id,last_name,salary,manager_id
    2fromemployees
    3wheremanager_idIN(100,101,201);
    EMPLOYEE_IDLAST_NAMESALARYMANAGER_ID
    --------------------------------------------------------
    201Hartstein13000100
    SQL>l
    1selectemployee_id,last_name,salary,manager_id
    2fromemployees
    3*wherelast_namein('Hartstein','Vargas')
    SQL>/
    EMPLOYEE_IDLAST_NAMESALARYMANAGER_ID
    --------------------------------------------------------
    201Hartstein13000100
    144Vargas2500124
    ***********
    LIKEpatternmatching模式匹配
    %匹配0个或多个字符串
    _匹配1个字符
    使用escape'\'来定义\为转移字符
    SQL>l
    1selectfirst_name
    2fromemployees
    3*wherefirst_namelike'S%'
    SQL>/
    FIRST_NAME
    --------------------
    Sundar
    Shelli
    Sarah
    SQL>selectemployee_id,last_name,job_id
    2fromemployees
    3wherejob_idlike'%SA\_%'escape'\';
    EMPLOYEE_IDLAST_NAMEJOB_ID
    ----------------------------------------------
    145RussellSA_MAN
    146PartnersSA_MAN
    ********
    ISnull
    SQL>selectlast_name,manager_id
    2fromemployees
    3wheremanager_idisnull;
    LAST_NAMEMANAGER_ID
    -----------------------------------
    King
    逻辑运算符
    与AND
    或OR
    非NOT
    AND
    SQL>selectemployee_id,last_name,job_id,salary
    2fromemployees
    3wheresalary>=1000
    4andjob_idlike'%MAN%';
    EMPLOYEE_IDLAST_NAMEJOB_IDSALARY
    --------------------------------------------------------
    201HartsteinMK_MAN13000
    114RaphaelyPU_MAN11000
    120WeissST_MAN8000
    121FrippST_MAN8200
    分组:ORDERby
    ASC默认的
    DESC
    放在最后
    可以使用别名
    SQL>l
    1selectlast_name,job_id,department_id,hire_date
    2fromemployees
    3*orderbyhire_datedesc
    SQL>/
    LAST_NAMEJOB_IDDEPARTMENT_IDHIRE_DATE
    ------------------------------------------------------------
    BandaSA_REP8021-APR-00
    KumarSA_REP8021-APR-00
    AndeSA_REP8024-MAR-00
    MarkleST_CLERK5008-MAR-00
    使用别名排序
    SQL>selectemployee_id,last_name,salary*12annsal
    2fromemployees
    3orderbyannsal;
    EMPLOYEE_IDLAST_NAMEANNSAL
    ----------------------------------------------
    132Olson25200
    136Philtanker26400
    128Markle26400
    多个列进行排序
    SQL>selectlast_name,department_id,salary
    2fromemployees
    3orderbydepartment_id,salaryDESC;
    LAST_NAMEDEPARTMENT_IDSALARY
    ------------------------------------------------
    Whalen104400
    替换变量SubstitutionVariables
    客户端的概念功能
    &;/&;&;+变量名
    SQL>selectemployee_id,last_name,salary,department_id
    2fromemployees
    3whereemployee_id=&;employee_num;
    Entervalueforemployee_num:100
    old3:whereemployee_id=&;employee_num
    new3:whereemployee_id=100
    EMPLOYEE_IDLAST_NAMESALARYDEPARTMENT_ID
    -----------------------------------------------------------
    100King2400090
    做不同的查询,很方便。
    如果是字符串和日期的话必须加‘’
    SQL>selectlast_name,department_id,salary*12
    2fromemployees
    3wherejob_id='&;job_title';
    Entervalueforjob_title:IT_PROG
    old3:wherejob_id='&;job_title'
    new3:wherejob_id='IT_PROG'
    LAST_NAMEDEPARTMENT_IDSALARY*12
    ------------------------------------------------
    Hunold60108000
    Ernst6072000
    Austin6057600
    Pataballa6057600
    Lorentz6050400
    关于&;/&;&;的区别
    SQL>selectemployee_id,last_name,job_id,&;column_name
    2fromemployees
    3orderby&;column_name;
    Entervalueforcolumn_name:department_id
    old1:selectemployee_id,last_name,job_id,&;column_name
    new1:selectemployee_id,last_name,job_id,department_id
    Entervalueforcolumn_name:department_id
    old3:orderby&;column_name
    new3:orderbydepartment_id
    EMPLOYEE_IDLAST_NAMEJOB_IDDEPARTMENT_ID
    -----------------------------------------------------------
    200WhalenAD_ASST10
    变量使用多次,则可以使用&;&;
    SQL>l
    1selectemployee_id,last_name,job_id,&;&;column_name
    2fromemployees
    3*orderby&;column_name
    SQL>/
    Entervalueforcolumn_name:department_id
    old1:selectemployee_id,last_name,job_id,&;&;column_name
    new1:selectemployee_id,last_name,job_id,department_id
    old3:orderby&;column_name
    new3:orderbydepartment_id
    EMPLOYEE_IDLAST_NAMEJOB_IDDEPARTMENT_ID
    -----------------------------------------------------------
    200WhalenAD_ASST10
    201HartsteinMK_MAN20
    202FayMK_REP20
    Define
    使用定义命令来定义一个变量
    undefine取消该变量
    verify
    setverifyon/off
    设置old/new的开关
    |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
    UsingSingle-Rowfunciton
    sigle-rowfuncitons
    输入一个输出一个//对一行进行操作
    multiple-rowfunctions
    输入多个输出一个//对很多行进行操作
    单行函数:
    对每一行进行操作
    对每一行返回一个结果
    可以嵌套函数
    输入参数可以是列名可以是表达式和常值
    类型:
    通用:
    字符型
    数字
    日期
    转换
    字符串函数
    1.case-conversionfunctions
    lower
    SQL>selectemployee_id,last_name,department_id
    2fromemployees
    3wherelower(last_name)='higgins';
    EMPLOYEE_IDLAST_NAMEDEPARTMENT_ID
    -------------------------------------------------
    205Higgins110
    upper
    initcap(首字母大写,其余小写)
    SQL>selectinitcap('sdlcoUse')
    2fromdual;
    INITCAP('
    ---------
    SdlCouse
    2.charater-manipulationfunctions(字符串操作函数)
    concat//拼接函数
    substr//剪切函数字符串,起始位置,字符串长度
    length//读取字符串的长度
    instr//定位子字符串字符串,首次出现的子字符串
    lpad//左填充列名,总长度,填充内容(‘’引起来)
    rpad//右填充同上
    repalce//替换指定内容
    trim//去掉空格,去掉制定字符‘H’form‘**’
    colnamefromata10
    instr
    1SELECTemployee_id,CONCAT(first_name,last_name)NAME,
    2job_id,LENGTH(last_name),
    3INSTR(last_name,'a')"Contains'a'?"
    4FROMemployees
    5*WHERESUBSTR(job_id,4)='REP'
    数字函数
    NumberFunctions
    ROUND四舍五入
    TRUNC截取固定
    MOD取余叔
    参数:小数点后数正值
    小数点前数负值
    SQL>SELECTROUND(45.923,2),ROUND(45.923,0),ROUND(45.923,-1)
    2FROMdual;
    ROUND(45.923,2)ROUND(45.923,0)ROUND(45.923,-1)
    ----------------------------------------------
    45.924650
    SQL>L
    1SELECTTRUNC(45.923,2),TRUNC(45,923),TRUNC(45.923,-1)
    2*FROMDUAL
    SQL>/
    TRUNC(45.923,2)TRUNC(45,923)TRUNC(45.923,-1)
    --------------------------------------------
    45.924540
    日期函数
    默认显示格式:DD-MON—RR
    YY当前世纪+年
    内部存储4位,显示2位
    SYSDATE
    返回当前系统时间
    日期函数数学操作
    MONTHS_BETWEEN
    ADD_MONTHS
    NEXT_DAY
    LAST_DAY
    ROUND
    TRUNC
    SQL>SELECTlast_name,hire_date
    2FROMemployees
    3WHEREhire_date<'01-FEB-88';
    LAST_NAMEHIRE_DATE
    -------------------------------------
    Whalen17-SEP-87
    King17-JUN-87
    查询部门编号为90的人呆了多少周
    :
    SQL>SELECTlast_name,(SYSDATE-hire_date)/7asWEEKS
    2FROMemployees
    3WHEREdepartment_id=90;
    LAST_NAMEWEEKS
    -----------------------------------
    King1297.67634
    Kochhar1179.53348
    DeHaan1006.67634
    ||||||||||||||||||||||||||||||||||||||||||
    conversionfunctionandconditonalexperssion
    两种数据类型转换
    Implicit:隐试转换
    Explicit:显示转换,使用函数指定转换结果
    组函数:countmaxminsumavg
    分组:groupby
    再过滤:having
    不能在where语句里面使用组函数
    1.先执行where
    2.执行groupby
    3.执行组函数
    having
    先分组
    执行组函数
    再次进行限制过滤
    4.having
    +++++++++++++++++
    equiljoin:基于两者相等,进行连接
    oracle:
    SQL>l
    1SELECTemployees.employee_id,employees.last_name,
    2employees.department_id,departments.department_id,
    3departments.location_id
    4FROMemployees,departments
    5*WHEREemployees.department_id=departments.department_id
    SQL>/
    表别名:
    fromemployeese,departmentsd
    国际标准加as
    如果定义了表名,则只能使用表名,不能使用原名
    sql国际标准三中连接
    自然连接:
    找到相同列名,并且列的数据类型相同
    寻找两张表中,值相同的行进行连接
    1SELECT*
    2FROMdepartments
    3*NATURALJOINLOCATIONS
    using名字相同,数据类型不同
    字句的列不用加表前缀
    onON(e.department_id=d.department_id)and
    ()
    三层join
    oracle:
    SELECTemployee_id,city,department_name
    FORMemployeese,departmentsd,locationl
    WHEREe.department_id=d.department_idANDd.location_id=l.location_id
    SQL:
    SELECTemployee_id,city,department_name
    FROMemployeese
    JOINdepartmentsd
    ONd.partment_id=e.department_id
    JOINlocationsl
    ONd.location_id=l.location_id;
    使用AND或WHERE来再过滤
    SELECTe.last_name,d.department_name,l.city
    FROMemployeese,departmentsd,locationsl
    WHEREe.department_id=d.department_id
    ANDd.location_id=l.location_id;
    //ANDd.department_idIN(20.50);
    自连接:
    sql:
    SELECTworker.last_nameemp,manager.last_namemgr
    FROMemployeesworkerJOINemployeesmanager
    ON(worker.manager_id=manager.employee_id);
    oracle:
    SELECTworker.last_name||'worksfor'||manager.last_name
    FROMemployeesworker,employeesmanager
    WHEREworker.manager_id=manager.employee_id;
    ================================
    Nonequijoins
    oracle:
    SELECTe.last_name,e.salary,j.grade_level
    FROMemployeese,job_gradesj
    WHEREe.salary
    BETWEENj.lowest_salANDj.highest_sal
    ==================================
    outerjoin
    =inerjoin+没有匹配的
    leftouterjoin
    -------显示左边没有匹配的项
    sql:
    SELECTe.last_name,e.department_id,d.department_name
    FROMemployeeseLEFTOUTERJOINdepartmentsd
    ON(e.department_id=d.department_id);
    rightouterjoin
    fullouterjoin
    oracle
    SELECTtable1.column,table2.column
    FROMtable1,table2
    WHEREtable1.column(+)=table2.column;
    左边连接+写在右边
    右连接+写在左边
    但是不支持左右都写full连接
    SELECTe.last_name,e.department_id,d.department_name
    FROMemployeese,departmentsd
    WHEREe.department_id(+)=d.department_id;
    =============================
    笛卡尔乘积M*N
    1.连接条件被忽略或无效则产生
    2.故意产生的,用来产生大量数据
    -
    sql
    使用corssjoin来产生笛卡尔乘积
    SELELCTlast_name,department_name
    FROMemployees
    CROSSJOINdepartments;
    oracle
    不需要写连接条件
    |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
    usingsubqueriestosolvequeries
    字句放在fromwherehaving三个关键字后面
    子查询先执行
    子查询结果被主查询使用
    SELECTlast_name,salary
    FROMemployees
    WHEREsalary>
    (SELECTsalary
    FROMemployees
    WHERElast_name='Abel');
    子查询要包含在括号内。
    将子查询放在比较条件的右侧。
    除非进行Top-N分析,否则不要在子查询中使用ORDERBY子句。
    单行操作符对应单行子查询,多行操作符对应多行子查询。
    单行子查询:
    只返回一行。
    使用单行比较操作符。
    操作符
    =
    >
    >=
    <
    <=
    <>//不等于
    SELECTlast_name,job_id,salary
    FROMemployees
    WHEREjob_id=
    (SELECTjob_id
    FROMemployees
    WHEREemployee_id=141)
    ANDsalary>
    (SELECTsalary
    FROMemployees
    WHEREemployee_id=143);
    在子查询中使用组函数
    SELECTlast_name,job_id,salary
    FROMemployees
    WHEREsalary=
    (SELECTMIN(salary)
    FROMemployees);
    子查询中的HAVING子句
    首先执行子查询。
    向主查询中的HAVING子句返回结果。
    SELECTdepartment_id,MIN(salary)
    FROMemployees
    GROUPBYdepartment_id
    HAVINGMIN(salary)>
    (SELECTMIN(salary)
    FROMemployees
    WHEREdepartment_id=50);
    SELECTjob_id,AVG(salary)
    FROMemployees
    GROUPBYjob_id
    HAVINGAVG(salary)=
    (SELECTMIN(AVG(salary))
    FROMemployees
    GROUPBYjob_id);
    IN可以解决多行问题
    子查询中的空值问题
    SELECTlast_name,job_id
    FROMemployees
    WHEREjob_id=
    (SELECTjob_id
    FROMemployees
    WHERElast_name='Haas');
    =算数表达式。当一个结果包含null的时候,整个结果都是null
    SELECTlast_name,job_id
    FROMemployees
    WHEREdepartment_idISNULL
    多行子查询
    返回多行。
    使用多行比较操作符。
    操作符
    IN//列表中的任何一个
    ANY//子查询中的任何一个
    ALL//子查询中所有值
    any返回空值的时候执行为false
    all返回控制的时候执行为true
    SELECTemployee_id,last_name,job_id,salary
    FROMemployees
    WHEREsalary    (SELECTsalary
    FROMemployees
    WHEREjob_id='IT_PROG')
    ANDjob_id<>'IT_PROG';
        >any>any里面的最小值
    =anyIN
    SELECTemployee_id,last_name,job_id,salary
    FROMemployees
    WHEREsalary    (SELECTsalary
    FROMemployees
    WHEREjob_id='IT_PROG')
    ANDjob_id<>'IT_PROG';
        >all>all里面的最大值
    =allnorowsselected
    子查询中的空值问题
    SELECTemp.last_name
    FROMemployeesemp
    WHEREemp.employee_idNOTIN
    (SELECTmgr.manager_id
    FROMemployeesmgr);
    norowsselected
    //查询没有上司的哥们名字
    NOTIN<>all有空值返回异常
    IN=any有空值正常
    |||||||||||||||||||||||||||||||||||||||||||||||
    usingthesetoperators
    1.了解set操作符那些类型
    2.使用set操作符将多个查询合并成一个查询
    3.如何控制返回结果的显示次序
    先交集后并集
    UNION
    INTERSECT交集
    MINUS在A里面,但是不再B里面
    列的数量数据类型要一样
    ORACLE自动消除重复的升序排列
    UNION
    取并集(去掉了重复行)
    SELECTemployee_id,job_id
    FROMemployees
    UNION
    SELECTemployee_id,job_id
    FROMjob_history;
    UNIONALL操作符返回两个查询的结果集的并集以及两个结果集的重复部分(不去重)
    SELECTemployee_id,job_id,department_id
    FROMemployees
    UNIONALL
    SELECTemployee_id,job_id,department_id
    FROMjob_history
    ORDERBYemployee_id;
    不自动排序。
    ORDERBY是对整个集合之后进行排序
    INTERSECTOpertot
    操作符返回两个结果集的交集
    并不忽略NULL值
    SELECTemployee_id,job_id
    FROMemployees
    INTERSECT
    SELECTemployee_id,job_id
    FROMjob_history;
    MINUS操作符返回两个结果集的补集
    SELECTemployee_id,job_id
    FROMemployees
    MINUS
    SELECTemployee_id,job_id
    FROMjob_history;
    从来没有换过工作的人
    规范化:
    SELECTdepartment_id,TO_NUMBER(null)
    location,hire_date
    FROMemployees
    UNION
    SELECTdepartment_id,location_id,TO_DATE(null)
    FROMdepartments;
    SELECTemployee_id,job_id,salary
    FROMemployees
    UNION
    SELECTemployee_id,job_id,0
    FROMjob_history;
    ORDERBY字句
    1.只能出现一次,并且出现在复合查询的最后
    2.他只能用于认识第一列查询的名字
    3.缺省情况第一个查询的第一列升序排序
    |||||||||||||||||||||||||||||||||||||||||||||||||||||||
    处理数据
    使用DML语句
    向表中插入数据
    更新表中数据
    从表中删除数据
    将表中数据和并
    控制事务
    DML可以在下列条件下执行:
    向表中插入数据
    INSERTINTOtable[(column[,column...])]
    VALUES(value[,value...]);
    使用这种语法一次只能向表中插入一条数据。
    INSERTINTOdepartments(department_id,department_name,
    manager_id,location_id)
    VALUES(70,'PublicRelations',100,1700);
    //如果每一列都有值,可以简写。
    //主键,外键,非空,等等约束,不能够违反这些条件
    //插入特殊值,用函数代替该值
    INSERTINTOemployees(employee_id,
    first_name,last_name,
    email,phone_number,
    hire_date,job_id,salary,
    commission_pct,manager_id,
    department_id)
    VALUES(113,
    'Louis','Popp',
    'LPOPP','515.124.4567',
    SYSDATE,'AC_ACCOUNT',6900,
    NULL,205,100);
    //&;替换变量
    INSERTINTOdepartments
    (department_id,department_name,location_id)
    VALUES(&;department_id,'&;department_name',&;location);
    //从其他表中筛选数据批量插入
    INSERTINTOsales_reps(id,name,salary,commission_pct)
    SELECTemployee_id,last_name,salary,commission_pct
    FROMemployees
    WHEREjob_idLIKE'%REP%';
    更新现存数据
    UPDATEtable
    SETcolumn=value[,column=value,...]
    [WHEREcondition];
    //更新多少记录,取决于where字句
    UPDATEcopy_emp
    SETdepartment_id=110;
    使用子查询:
    Syntax
    UPDATEtable
    SETcolumn=
    (SELECTcolumn
    FROMtable
    WHEREcondition)
    [,
    column=
    (SELECTcolumn
    FROMtable
    WHEREcondition)]
    [WHEREcondition];
    Note:Ifnorowsareupdated,amessage“0rowsupdated.”isreturned.
    删除现存数据
    DELETE[FROM]table
    [WHEREcondition];
    TRUNCATE清空表,并且不能回滚
    事务是由完成若干项工作的DML,DDL,DCL语句组成的。
    以第一个DML语句的执行作为开始
    以下面的其中之一作为结束:
    COMMIT或ROLLBACK语句
    DDL或DCL语句(自动提交)
    用户会话正常结束
    系统异常终了
    使用COMMIT和ROLLBACK语句,我们可以:
    确保数据完整性。
    数据改变被提交之前预览。
    将逻辑上相关的操作分组。
    ----DDL语言
    执行前commit
    执行后commit
    ----DCL语言
    DML语句不提交,其他用户看不到结果
    在DML语句中使用WITHCHECKOPTION关键字
    使用子查询表示DML语句中使用的表
    WITHCHECKOPTION关键字避免修改子查询范围外的数据
    使用DEFAULT关键字表示默认值
    可以使用显示默认值控制默认值的使用
    显示默认值可以在INSERT和UPDATE语句中使用
    ||||||||||||||||||||||||||||||||||||||||
    使用DDL创建和管理表
    知道数据库对象的类型
    了解表的结构
    了解每一列容许的数据类型
    创建表
    如何添加约束
    了解schma对象如何工作
    数据库对象
    表//存储在表空间中,
    视图//一般只读,
    序列//产生不重复的列
    索引//提高某些查询的效率
    同义词//对一个对象棋别名方便引用
    表起名规则:
    1.必须以字母开头
    2.小于30字符
    3.字母+数字_$#
    4.在一个用户的模式下,所拥有的对象不要重名,类型不同可以同名
    5.不能包含ORACLE的包含关键字
    USER_OBJECTS
    创建表
    必须具备:
    CREATETABLE权限
    存储空间
    CREATETABLE[schema.]table
    (columndatatype[DEFAULTexpr][,...]);
    必须指定:
    表名
    列名,数据类型,尺寸
    创建表后,oracle会自动更新相关数据字典
    DEFAULT选项
    插入时为一个列指定默认值
    ...namechar(10)DEFAULT'ABC',hire_dateDATEDEFAULTSYSDATE,...
    字符串,表达式,或SQL函数都是合法的
    其它列的列名和伪列是非法的
    默认值必须满足列的数据类型定义
    创建约束可以起名,也可以被oracle自动赋值为SYS_Cn
    一个约束可以在列级别,也可以在表级别
    CREATETABLE[schema.]table
    (columndatatype[DEFAULTexpr]
    [column_constraint],
    ...
    [table_constraint][,...]);
    列级别
    column[CONSTRAINTconstraint_name]constraint_type,
    表级别
    column,...
    [CONSTRAINTconstraint_name]constraint_type
    (column,...),
    NOTNULL约束
    只能定义在列级别
    CREATETABLEemployees(
    employee_idNUMBER(6),
    last_nameVARCHAR2(25)NOTNULL,
    salaryNUMBER(8,2),
    commission_pctNUMBER(2,2),
    hire_dateDATE
    CONSTRAINTemp_hire_date_nn
    NOTNULL,
    )
    UNIQUE约束
    既可以定义在列级别,也可以定在表级别
    null是无法比较的,不违反UNIQUE的规则
    CREATETABLEemployees(
    employee_idNUMBER(6),
    last_nameVARCHAR2(25)NOTNULL,
    emailVARCHAR2(25),
    salaryNUMBER(8,2),
    commission_pctNUMBER(2,2),
    hire_dateDATENOTNULL,
    ...
    CONSTRAINTemp_email_ukUNIQUE(email));
    PRIMARYKEY约束
    可以定义在表级或列级
    一个表最多有一个主键
    CREATETABLEdepartments(
    department_idNUMBER(4),//PRIMARYKEY
    department_nameVARCHAR2(30)
    CONSTRAINTdept_name_nnNOTNULL,
    manager_idNUMBER(6),
    location_idNUMBER(4),
    CONSTRAINTdept_id_pkPRIMARYKEY(department_id));
    FOREIGNKEY约束
    可以定义在表级或列级
    CREATETABLEemployees(
    employee_idNUMBER(6),
    last_nameVARCHAR2(25)NOTNULL,
    emailVARCHAR2(25),
    salaryNUMBER(8,2),
    commission_pctNUMBER(2,2),
    hire_dateDATENOTNULL,
    ...
    department_idNUMBER(4),
    CONSTRAINTemp_dept_fkFOREIGNKEY(department_id)
    REFERENCESdepartments(department_id)
    ONDELETESETNULL,
    CONSTRAINTemp_email_ukUNIQUE(email));
    FOREIGNKEY:在表级指定子表中的列
    REFERENCES:标示在父表中的列
    ONDELETECASCADE:当父表中的列被删除时,子表中相对应的列也被删除
    ONDELETESETNULL:子表中相应的列置空
    ____________针对数据类型固定
    ————————————CHECK约束,自定义约束
    定义每一行必须满足的条件
    以下的表达式是不允许的:
    出现CURRVAL,NEXTVAL,LEVEL,和ROWNUM伪列
    使用SYSDATE,UID,USER,和USERENV函数
    在查询中涉及到其它列的值
    使用子查询创建表
    CREATETABLEtable
    [(column,column)]
    ASsubquery;
    指定列名别名默认值
    只传递NULL/NOTNULL约束,其余的不传递
    子查询中含有表达式则新建表必须指定列名,或子查询加列明
    CREATETABLEdept80
    AS
    SELECTemployee_id,last_name,
    salary*12ANNSAL,
    hire_date
    FROMemployees
    WHEREdepartmentid=80;
    只创建对应表结构,而不添加原有数据
    CREATETABLEmyjobASSELECT*FROMuser_objectsWHERE1=0;
    ALTERTABLE改变表
    增加删除重命名列
    改变读写状态
    READONLY
    READWRITE
    但是不会妨碍删除表
    DROP表之后将其放入recyclebin
    同时会删除一些视图索引等等
    |||||||||||||||||||||||||||||||||||||||||||||||||||
    创建其他东东
    创建视图
    创建索引
    创建管理序列
    创建管理同义词
    使用视图:
    控制数据访问
    简化查询
    数据独立性
    避免重复访问相同的数据
    *****视图创建视图???
    使用子查询创建视图
    约束并不会继承,重新添加,设置只读
    CREATE[ORREPLACE][FORCE|NOFORCE]VIEWview
    [(alias[,alias]...)]
    ASsubquery
    [WITHCHECKOPTION[CONSTRAINTconstraint]]
    [WITHREADONLY[CONSTRAINTconstraint]];
    示例:
    创建别名:子查询添加别名或view后面添加列明
    CREATEVIEWempvu80
    ASSELECTemployee_id,last_name,salary
    FROMemployees
    WHEREdepartment_id=80;
    修改视图
    简单视图:一一对应于基表
    复杂视图:使用了groupdistinct等不能增删改
    视图中使用DML的规定
    当视图定义中包含以下元素之一时不能使用update:
    组函数
    GROUPBY子句
    DISTINCT关键字
    ROWNUM伪列
    列的定义为表达式
    当视图定义中包含以下元素之一时不能使用insert:
    组函数
    GROUPBY子句
    DISTINCT关键字
    ROWNUM伪列
    列的定义为表达式
    表中非空的列在视图定义中未包括(有缺省值例外)
    withcheckoptionconstraint
    拒绝修改和where字句有冲突的字段
    使用WITHCHECKOPTION子句确保DML只能在特定的范围内执行
    CREATEORREPLACEVIEWempvu20
    ASSELECT*
    FROMemployees
    WHEREdepartment_id=20
    WITHCHECKOPTIONCONSTRAINTempvu20_ck;
    Viewcreated.
    任何违反WITHCHECKOPTION约束的请求都会失败
    删除视图
    删除视图只是删除视图的定义,并不会删除基表的数据
    DROPVIEWview;
    序列:
    自动提供唯一的数值
    共享对象
    主要用于提供主键值
    代替应用代码
    将序列值装入内存可以提高访问效率
    语法:
    CREATESEQUENCEsequence
    [INCREMENTBYn]
    [STARTWITHn]
    [{MAXVALUEn|NOMAXVALUE}]//10+27
    [{MINVALUEn|NOMINVALUE}]//10-26
    [{CYCLE|NOCYCLE}]
    [{CACHEn|NOCACHE}];
    NEXTVAL和CURRVAL伪列
    NEXTVAL返回序列中下一个有效的值,任何用户都可以引用
    CURRVAL中存放序列的当前值
    NEXTVAL应在CURRVAL之前指定,二者应同时有效
    INSERTINTOdepartments(department_id,
    department_name,location_id)
    VALUES(dept_deptid_seq.NEXTVAL,
    'Support',2500);
    序列DEPT_DEPTID_SEQ的当前值
    SELECTdept_deptid_seq.CURRVAL
    FROMdual;
    将序列值装入内存可提高访问效率
    序列在下列情况下出现裂缝:
    回滚
    系统异常
    多个表同时使用同一序列
    如果不讲序列的值装入内存(NOCACHE),可使用表USER_SEQUENCES查看序列当前的有效值
    修改序列的增量,最大值,最小值,循环选项,或是否装入内存
    ALTERSEQUENCEdept_deptid_seq
    INCREMENTBY20
    MAXVALUE999999
    NOCACHE
    NOCYCLE;
    修改sequence的注意事项:
    必须是序列的拥有者或对序列有ALTER权限
    只有将来的序列值会被改变
    改变序列的初始值只能通过删除序列之后重建序列的方法实现
    其它的一些限制使用DROPSEQUENCE语句删除序列
    删除之后,序列不能再次被引用
    DROPSEQUENCEdept_deptid_seq;
    索引(indexes)
    一种数据库对象
    通过指针加速Oracle服务器的查询速度
    通过快速定位数据的方法,减少磁盘I/O
    索引与表相互独立
    Oracle服务器自动使用和维护索引
    索引创建
    自动创建:在定义PRIMARYKEY或UNIQUE约束后系统自动在相应的列上创建唯一性索引
    手动创建:用户可以在其它列上创建非唯一的索引,以加速查询
    在一个或多个列上创建索引
    CREATE[UNIQUE][BITMAP]INDEXindex
    ONtable(column[,column]...);
    在表EMPLOYEES的列LAST_NAME上创建索引
    CREATEINDEXemp_last_name_idx
    ONemployees(last_name);
    以下情况可以创建索引:
    列中数据值分布范围很广
    列中包含大量空值
    列经常在WHERE子句或连接条件中出现
    表经常被访问而且数据量很大,访问的数据大概占数据总量的2%到4%
    下列情况不要创建索引:
    表很小
    列不经常作为连接条件或出现在WHERE子句中
    查询的数据大于2%到4%
    表经常更新
    加索引的列包含在表达式中
    使用DROPINDEX命令删除索引
    DROPINDEXindex;
    删除索引UPPER_LAST_NAME_IDX
    DROPINDEXupper_last_name_idx;
    只有索引的拥有者或拥有DROPANYINDEX权限的用户才可以删除索引
    同义词:
    方便访问其它用户的对象
    缩短对象名字的长度
    CREATE[PUBLIC]SYNONYMsynonym
    FORobject;
    存在于公用的地方,
    为视图DEPT_SUM_VU创建同义词
    CREATESYNONYMd_sum
    FORdept_sum_vu;
    删除同义词
    DROPSYNONYMd_sum;
    
  • 上一篇资讯: SQL基础(2)
  • 下一篇资讯: SQL图片
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师