数据库常见的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;

 

posted @ 2017-10-12 11:17  zmoony  阅读(282)  评论(0编辑  收藏  举报