数据库常见的sql
Posted zmoony
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库常见的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;
以上是关于数据库常见的sql的主要内容,如果未能解决你的问题,请参考以下文章