zoukankan      html  css  js  c++  java
  • 数据库常见的sql

    1.如何只显示重复数据,或不显示重复数据

    显示重复:select * from tablename group by id having count(*)>1
    不显示重复:select * from tablename group by id having count(*)=1
    

     2.写分页有哪些方法,你一般用什么方法?用SQL语句写一个分页?

    sqlserver——使用TOP:
       select top 20,n.* from tablename n minus select top 10,m.* from tablename m
    oracle-----使用分析函数:
        select * from
       (select n.*,row_number() over(order by columnname) num  from tablename n)
        where num>=10 and num <=20;
       select * from tb (select rownum rn,* from tb where rn<=40) where rn>30;
    mysql:
        select * from table WHERE … LIMIT 10;   #返回前10行 
        select * from table WHERE … LIMIT 0,10; #返回前10行 
        select * from table WHERE … LIMIT 10,20; #返回第10-20行数据
    

     3.ORACLE中左连接与右连接

    左连接:LEFT JOIN  右连接:RIGHT JOIN
       select n.column,m.column from tablename1 n left join tablename2 m
       on n.columnname=m.columnname
    用WHERE实现:
       select n.column,m.column from tablename1 n, tablename2 m
       where n.columnname(+)=m.columnname
    

     4.Oracle中字符串用什么符号链接?

    Oracle中使用 || 这个符号连接字符串 如 ‘abc’ || ‘d’;mysql 使用concat("name",ename)

    5.Oralce怎样存储文件,能够存储哪些文件?

    Oracle 能存储 clob、nclob、 blob、 bfile
    Clob  可变长度的字符型数据,也就是其他数据库中提到的文本型数据类型
    Nclob 可变字符类型的数据,不过其存储的是Unicode字符集的字符数据
    Blob  可变长度的二进制数据
    Bfile  数据库外面存储的可变二进制数据

    6.创建视图

    create view 视图名 as select 列名 [别名]  …  from 表 [unio [all] select … ] ]
    好处:
    1. 可以简单的将视图理解为sql查询语句,视图最大的好处是不占系统空间
    2. 一些安全性很高的系统,不会公布系统的表结构,可能会使用视图将一些敏感信息过虑或者重命名后公布结构
    3. 简化查询
    可以控制权限的,在使用的时候需要将视图的使用权限grant给用户

    7.怎样创建一个触发器, 触发器的定义, 触发器的游标怎样定义

    CREATE [OR REPLACE] TIGGER触发器名 触发时间 触发事件
     ON表名
     [FOR EACH ROW]
     BEGIN
      pl/sql语句
        CURSOR  游标名 is  SELECT * FROM 表名 (定义游标)
      END
     其中:
     触发器名:触发器对象的名称。
     由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。
    触发时间:指明触发器何时执行,该值可取:
    before---表示在数据库动作之前触发器执行;
    after---表示在数据库动作之后出发器执行。
    触发事件:指明哪些数据库动作会触发此触发器:                      
       insert:数据库插入会触发此触发器; 

    CREATE TABLE emp_his AS SELECT * FROM EMP WHERE 1=2; 
    CREATE OR REPLACE TRIGGER tr_del_emp 
       BEFORE DELETE --指定触发时机为删除操作前触发
       ON scott.emp 
       FOR EACH ROW   --说明创建的是行级触发器 
    BEGIN
       --将修改前数据插入到日志记录表 del_emp ,以供监督使用。
       INSERT INTO emp_his(deptno , empno, ename , job ,mgr , sal , comm , hiredate )
           VALUES( :old.deptno, :old.empno, :old.ename , :old.job,:old.mgr, :old.sal, :old.comm, :old.hiredate );
    END;
    DELETE emp WHERE empno=7788;
    DROP TABLE emp_his;
    DROP TRIGGER del_emp;
    
    CREATE OR REPLACE TRIGGER tr_dept_time
    BEFORE INSERT OR DELETE OR UPDATE 
    ON departments
    BEGIN
     IF (TO_CHAR(sysdate,'DAY') IN ('星期六', '星期日')) OR (TO_CHAR(sysdate, 'HH24:MI') NOT BETWEEN '08:30' AND '18:00') THEN
         RAISE_APPLICATION_ERROR(-20001, '不是上班时间,不能修改departments表');
     END IF;
    END;
    

     限定只对部门号为80的记录进行行触发器操作。

    CREATE OR REPLACE TRIGGER tr_emp_sal_comm
    BEFORE UPDATE OF salary, commission_pct
           OR DELETE
    ON HR.employees
    FOR EACH ROW
    WHEN (old.department_id = 80)
    BEGIN
     CASE
         WHEN UPDATING ('salary') THEN
            IF :NEW.salary < :old.salary THEN
    
               RAISE_APPLICATION_ERROR(-20001, '部门80的人员的工资不能降');
            END IF;
         WHEN UPDATING ('commission_pct') THEN
    
            IF :NEW.commission_pct < :old.commission_pct THEN
               RAISE_APPLICATION_ERROR(-20002, '部门80的人员的奖金不能降');
            END IF;
         WHEN DELETING THEN
              RAISE_APPLICATION_ERROR(-20003, '不能删除部门80的人员记录');
         END CASE;
    END; 
    
    /*
    实例:
    UPDATE employees SET salary = 8000 WHERE employee_id = 177;
    DELETE FROM employees WHERE employee_id in (177,170);
    */
    

     构建主键

    1.建立序列

    create sequence BAR_CODE_SEQUENCE  
    minvalue 1  
    maxvalue 999999999999999999999999999  
    start with 1  
    increment by 1  
    cache 20;  
    

    备注:

    minvalue 1          -----最小值
    maxvalue 9999999999999999999999999999 ------最大值
    increment by 1     -----每次加几个
    start with 1           -----从几开始
    cache 20             -----缓存值多少
    noorder               -----一直累加,不排序
    nocycle ;              --一直累加不循环

    2.创建触发器

    CREATE OR REPLACE TRIGGER  BAR_CODE_TG   
    before insert on SJK_BAR_CODE for each row   
    begin   
      select BAR_CODE_SEQUENCE.nextval into :new.ID from dual;   
    end;
    
  • 相关阅读:
    甩掉DataList,Repeater,列表数据显示得灵活
    拟将《汉字速查》更名为《汉文博士》,诸位有何高见?
    新一版的汉文博士(0.5.2.1210)已经发布
    新一版的汉文博士(0.5.1.1070)已经发布
    EditPlus 3.5 版已经发布
    如何在计算机和汉字速查界面上显示七万个汉字
    使用汉字构形检索疑难字
    软件使用方法及界面截图
    Unihan 里的笔画数据有问题?
    循序渐进制作我的词典数据库(一)
  • 原文地址:https://www.cnblogs.com/zyzg/p/7655238.html
Copyright © 2011-2022 走看看