Mysql部分:html
Mysql 查询语句大全 \1.两表之间的查询,例如:查询员工表中部门号与部门表中部门号相等 select * from tb_emp ,tb_dept where tb_emp.deptno=tb_dept.deptno; (这是同时显示两张表中相等的depton 全部字段)(tb_emp ,tb_dept这都是表名) 2.select tb_e.deptno from tb_e, tb_d where tb_e.deptno=tb_d.deptno; (这是只显示员工表中的tb_e.deptno,而且条件是员工表中部门号与部门表中部门号相等) 3.给字段取别名 select product_price*12 totsl_product_price from productinfo; 等价select product_price*12 from productinfo; 也能够这样写 select product_price*12 " totsl product_price" from productinfo; 有特殊的字符时用双引号的方法,(特殊字符是:中文,日文,分号等)(totsl product_price是 product_price*12) ****** 0 和空 还有空格不是一个概念 例如: select * from emp where description is null; select * from emp where description =0; select * from emp where description ='空格'; 查询的结果都市不同的。 distinct 关键字能够查询结果中清除重复的行,他的做用范围是后面的全部字段的组合; 例如: select distinct deptno ,deptname from emp where deptno=23; totsl_product_price是product_price的别名; select ename, sal*12 as '年薪'from emp; 别名的做用是 让查询出来的结果可让别人(外行)看了一目了然的做用 上面是针对产品价格计算出总金额,价格*12,也就是对字段值进行加减乘除, *****任何含有空值的表达式计算后的值都是空值。( 空值+20=空值,等等) 不等值查询(mysql二者都支持) select * from productinfo where product_id!=33; oracl的不等值查询 select * from productinfo where product_id<>'33'; 小于查询 select * from productinfo where product_id<'33'; 大于查询 select * from productinfo where product_id>'33'; 等于查询 select * from productinfo where product_id='33'; 在必定值范围内查询 例如 1000--5000的查询 select ename, sal as '月薪'from emp where sal>=1000 and sal<=5000; 在两个值之间的查询 between...... and (包含最小值和最大值) select ename, sal as '月薪'from emp where sal between 1000 and 5000; in 查询 在什么里面 示例 :在emp表中查询部门编号为25 25 20 这三个值中的 某些字段 select ename, sal,deptno from emp where deptno in (25,26,20); not in 恰好与上面的相反 like 是作模糊查询使用 and 表示要知足全部条件 例如: select ename, sal,deptno from emp where ename like '%ff' and deptname='市场部'; or 查询 表示只要知足其中一个条件就行,例如 select ename, sal,deptno from emp where ename like '%ff' or deptname='市场部'; not in 取反的意思 表示不包含 优先级 级别 (能够用括号提升优先级别) 排序 用的是 order by 降序 desc 默认是升序 注意 排序时 排序的字段只能是int 类型 不然排序的效果会出现不理想的结果 */*****能够在这样作 sal是varchar 对sal排序时: select ename as '姓名', sal as'月薪' from emp order by sal+0; 例如:本身建表的时候,把一个字段类型建立为varchar(2) ,其实应该建为int(2)的。由于我只容许输出数字。这原本也没什么,无非就是占点空间,懒得改了。可是今天在后台发现排序有问题。因而,没办法,改之。下面简单说一下MySQL的varchar排序问题,引觉得戒。 下面,我从数据库里面以server_id排一下序,你们来看一下排序后的结果: select server_id from cardserver where game_id = 1 order by server_id desc limit 10; +-----------+ | server_id | +-----------+ | 8 | | 7 | | 6 | | 5 | | 4 | | 3 | | 2 | | 10 | | 1 | +-----------+ 很明显,我想要的结果应该是 10,8,7,6,5 这样的。可是这个10排在了2的后面。按照字符串来排的。其实我是想把它当作数值来排。 手动转换类型: 用下面的方法就能够了,使server_id+0以后再排序,问题解决了。 select server_id from cardserver where game_id = 1 order by server_id+0 desc limit 10; +-----------+ | server_id | +-----------+ | 10 | | 8 | | 7 | | 6 | | 5 | | 4 | | 3 | | 2 | | 1 | +-----------+ 使用MySQL函数CAST/CONVERT: mysql为咱们提供了两个类型转换函数:CAST和CONVERT,现成的东西咱们怎能放过? CAST() 和CONVERT() 函数可用来获取一个类型的值,并产生另外一个类型的值。 这个类型 能够是如下值其中的 一个: BINARY[(N)] CHAR[(N)] DATE DATETIME DECIMAL SIGNED [INTEGER] TIME UNSIGNED [INTEGER] 因此咱们也能够用CAST解决问题: select server_id from cardserver where game_id = 1 order by CAST(server_id as SIGNED) desc limit 10; 也可使用CONVERT来搞定此问题: select server_id from cardserver where game_id = 1 order by CONVERT(server_id,SIGNED) desc limit 10; 在productinfo表中查询 update_time ,create_time这两个字段,条件是product_id='33'; select update_time ,create_time from productinfo where product_id='33'; 在两个值之间的查询 between...... and select ename, sal as '月薪'from emp where sal between 1000 and 5000; 插入数据时必定要注意字段的类型 int型不用加单引号,varchar 型的要加上单引号 例如: insert into emp (deptno,ename ,sex, eemail ,deptname ,sal) values (30,'luo1','nan','123456','开发部','3000'); auto_increment 自动增加 description 描述, 修改列的类型 alter table 表名 modify 列名 列类型 修改列名 alter table 表名 change 旧列名 新列名 列类型 alter table emp change name ename varchar(20); 增长列 alter table 表名 add column 字段名(列名) 列类型 (column 能够有和无 标准的应该有 column ) alter table emp add column moblie int (11); alter table 表名 add column 字段名(列名) 列类型 after/befor 列名(字段名) 删除列 把上面的add改成drop就好了; 修改表名 alter table 表名 rename 新表名; alter table emp rename tb_emp; rename table 表名 to新表名 rename table tb_emp to emp; 删除 表中的某一个字段 (注意 删除此字段时 此字段一低昂要是不关联的字段,不然删除失败,删除成功 数据也伴随着删除了) 语法是: alter table 表名 drop 字段名; alter table emp drop eemail; **** 删除表中的莫一条记录用的时候 delete 语句 例如 :delete from emp where id =40; ****** 更新某一条记录的数据时用 update语句 update ...set 例如; update emp set ename='kkkk22' where id=20; 更新多个字段的值 update emp set ename ='222255',sex='女'where id=10; 约束。 check 约束在mysql中不起做用; >= ,=< ,= >xAND<x(不等于x的查询) where 的条件 Incorrect integer value: '' for column 'sal' at row 10 函数,单行函数 ,字段值的函数 单行函数: concat(str1,str2,....) 链接函数 字段值的函数 select now(); 插入 时间数据 insert into emp (birth) values ( now()); 插入时间 能够用时间函数,也能够手动插入, 手动插入: insert into emp (birth,birthday,hierday)values('1999-02-06','1998-03-02','2001-05-26');插入的时间要在单引号内。 insert into emp (birth,birthday,hierday)values('19990206','19980302','20010526');这样也行。 insert into emp (birth,birthday,hierday)value('1999/02/06','1998/05/02','2001/05/06');这也行 **** 注意 函数后面要紧跟着括号 ,不能有空格号; 经常使用的数据类型是 int ,char ,varchar, 时间的是:date,datetime,等 聚合函数是对一组值进行计算,并返回单个值,也叫组合函数,除了count()之外,聚合函数都会忽略null值。 下列是聚合函数(五个:avg,sum,max,min,count) select avg(sal) from emp; 对emp表中的sal求平均值。 select sum(sal) from emp; 求和 select count(sal) from emp; 求总共的行数 select max(sal) from emp; select min(sal) from emp; select avg(sal) as '工资平均值',max(sal) as '最高工资',min(sal) as'最低工资',sum(sal) as'工资总和', count(sal) as '总共的记录' from emp; ****** count 不统计null,统计的事记录数; select count(*) from emp; 星号是统计全部的记录。 ifnull(sal,0)是若是有值就取第一个sal,不然就取零。 例如: select avg(ifnull(sal,0)) from emp; 分组统计:Group by 子句是真正做用在于与各类聚合函数配合使用。它是用来查询出来的数据进行分组。 分组的含义是:把该列具备相同值的多条记录当成一条记录处理,最后只输出一条记录。分组函数忽略空值。 若是须要排序在用order by 子句。 当查询时必定要注意 select deptno, avg(ifnull(sal,0)) from emp; 这个语句是错误的,由于deptno没有出如今聚合函数中,也没有出如今 Group by子句中,后面应该跟 Group by 子句; select deptno, avg(sal) from emp group by deptno; 查询每个部门的平均工资。 select deptno, count(*) from emp group by deptno; 查询每个部门的总数 select deptno, avg(sal) as '工资平均值',max(sal) as '最高工资',min(sal) as'最低工资',sum(sal) as'工资总和', count(sal) as '总共的记录' from emp group by deptno;这是查询每个部门的工资具体状况。 where 子句中部能使用分组函数,所以用 having 来代替 where; 例如: select deptno, avg(sal) as '工资平均值',max(sal) as '最高工资',min(sal) as'最低工资',sum(sal) as'工资总和', count(sal) as '总共的记录' from emp where avg(sal)>300 group by deptno;(错误语句) select deptno, avg(sal) as '工资平均值',max(sal) as '最高工资',min(sal) as'最低工资',sum(sal) as'工资总和', count(sal) as '总共的记录' from emp group by deptno having avg(sal)>3000;******* having 语句只能在Group by 后面。 分组 加条件 只能用having, where 是在分组前进行条件过滤,where子句中部能使用聚合函数 having是在分组后进行条件过滤。 select deptno, avg(sal) as '工资平均值',max(sal) as '最高工资',min(sal) as'最低工资',sum(sal) as'工资总和', count(sal) as '总共的记录' from emp group by deptno having avg(sal)>3000 order by avg(sal) asc; order by 通常是都在最后; limit 用来限制显示的行数,他经常使用来分页。 select * from emp limit 5; 这是查询前五条记录 select * from emp limit 5,10;查询的是6——16条数据,10这个参数 表示要查10调记录,五表明偏移量为五。 limit 语句 还在 order by 的后面。limit 是mysql特有的。 语法: limit 偏移量 ,行数; 例如:select * from emp limit 4,2; 取出的数据是 第5,6条记录, 取第一条数据:select * from emp limit 0,1; limit 的偏移量是从零开始的,因此取出的数据时从偏移量加上1开始取限制的行数。 select id,deptno,sex from emp limit 3,5; 取出的事从第四条记录开始取5条记录。 *****多表链接查询: 1.使用单个select语句从多个表中取出相关的数据。经过多表之间的关系,构建相关数据查询据。 2.多表链接一般是创建在相互关系的父子表上的。父子表示有关系的表。关系是经过外键造成的。 3.标准语法:select....from join_table JOIN_TYPE join_table on join_condition WHERE where_condition; *join_table 参与链接的表 *JOIN_TYPE 链接的类型:内链接,外链接,交叉链接,自链接 *join_condition 链接条件 *where_condition where过滤条件 第一个;交叉链接/笛卡尔链接 select * from emp,dept;(在实际中此链接基本不用) select count(*) from emp;//是17条记录 select count(*) from dept;//是4条记录 select count( *) from emp,dept;//是68=4*17; select * from emp,dept; 返回的是两张表的交叉乘积 标准语法:select * from emp cross join dept; 第二 内链接 链接条件就是主外键关联 1.等值链接:select * from emp,dept where emp.deptno=dept.deptno; select * from emp e , dept d where e.deptno=d.deptno;和上面的同样,只是省略了as select * from emp as e , dept as d where e.deptno=d.deptno; 其中给了表取别名 emp as e。 标准写法是: select * from emp inner join dept on emp.deptno=dept.deptno; 第三:外链接:在外链接当中,某些building知足条件的列也会显示出来,也就是说,只限制其中一个表的行,而不限制另外一个表的行 1.左外链接 标准语法 select * from dept left join emp on dept.deptno=emp.deptno; 这里部门表(dept)做为主表,或者说左边的表为主表,左边的记录会所有显示,若是没有找到记录就补null; select * from dept left join emp on emp.deptno=dept.deptno;同样的效果 select * from dept left join emp on emp.deptno=dept.deptno;这就不同了 左表(主表)发生该变了。 在Oracle中能够这样写;select * from emp,dept where emp.deptno=dept.deptno(+); 2.右外链接 select * from dept right join emp on emp.deptno=dept.deptno; 方法与左外链接同样,只是把left该为right就好了 3.自链接 :参与链接的表都是同一张表(经过给表取别名虚拟出) 第四 子查询:所查新出来的结果为主表提供查询的条件。 需求:查询工资比luoa高的全部员工, 第一步:select sal from emp where ename ='luoa'; 查出的结果是luoa的 sal为300 第二步: select * from emp where sal >300; select * from emp where sal >(select sal from emp where ename = 'luoa');这里要求select sal from emp where ename = 'luoa'查出来的结果必须惟一。 查询和luoa同一个部门的员工 1.select deptno from emp where ename = 'luoa'; 查出的结果是luoa的deptno为35 2. select * from emp where deptno=35; select * from emp where sal >(select deptno from emp where ename = 'luoa'); 查询月薪工资最高的员工名字 select max(sal) from emp; 查出的max(sal)为65120 select ename from emp where sal='65120'; select ename from emp where sal=(select max(sal) from emp ); ****单行只查询不能返回多个结果,若是子查询为空时,不会报错,查出的结果为空。
Oracle查询语句:mysql
Oracle SQL语句大全 1.desc(描述) emp 描述emp这张表 2.desc dept 部门表 3.desc salgrade 薪水等级 4.select *from table 查找表中的元素 5.dual 是系统中的一张空表 6.select *from dual 7.select sysdate from dual 取出系统时间 8.select ename,sal*12 "annul sal"(取的别名) from emp; 查找用户姓名和用户的年薪 9.任何含有空值的数学表达式的值都是空值 select ename,sal*12+comm from emp; 10.select ename||sal from emp 其中的||至关于将sal所有转化为字符串 11.表示字符串的方法 select ename ||'ajjf' from emp; 12.若是其中有一个单引号就用2个单引号来代替他 select ename||'sakj' 'lds'from emp; 13.select distinct deptno from emp (去除部门字段中重复的部分,关键字distinct) 14.select distinct deptno,job from emp;(去除这2个字段中重复的组合) 15.select *from dept where deptno=10; 取出条件(取出部门编号为10的记录) 16.select * from emp where ename='CLIRK'; 取出部门中姓名为clirk的记录(注意取出过程当中ename用单引号隔开) 17.select ename,sal from emp where sal>1500; 取出部门中薪水大于1500的人的姓名 18.select ename,sal,deptno from emp where deptno<> 10 取出部门中的部门号不等于10的 19.select ename,sal,deptno from emp where ename>'CBA' 取出部门中员工名字大于CBA的员工(实际比较的是ACIIS码) 20.select ename,sal from emp where sal between 800 and 1500 select ename,sal from emp where sal>=800 and sal<=1500; (取出800和1500之间的数) 21.select ename,sal,comm from emp where comm is null (选出其中的空值) select enmae,sal,comm from emp where comm is not null(选出其中的非空值) 22.select ename,sal,comm from emp where sal in (800,1500,2000);取出这3者之中的 select ename,sal,comm from emp where ename in('simth'); 23.select ename,sal,hiredate from emp where hiredata>'3-04月-81';宣传符合条件的日期 24.select ename,sal,from emp where sal>1000 or deptno=10; 找出工资薪水大于1000或者部门号等于10的员工 25.select ename,sal from emp where sal not in(500,1000); 查找薪水不在500到1000的员工姓名和月薪 26.select ename,sal from emp where ename like '%ALL%'; select ename,sal from emp where ename like '_%A%'; 查找姓名中含有ALL的客户信息,一个横线表明一个通配符 27.select ename,sal from emp where ename like '_%$%%' escape '$'; 本身指定转易字符 select ename,sal from emp where ename like '_%\%%'; 查找中间含有%相匹配的客户信息,运用转易字符 28.select * from dept order by deptno 对表中元素按部门号排序 select *from dept order by deptno desc 默认为升序,能够用desc按降序 29.select ename,sal from emp where sal <>1000 order by sal desc 按照查询条件来查询,并排序(asc升序排列) 30.select ename,sal*12 from emp where ename not like '_%A%' and sal>800 order by sal desc 31.select lower(ename) from emp 将ename都转化为小写 lower是函数能将字母转化为小写 32.select ename from emp where lower(ename) like '_%a%'; 找出ename 中全部的含有a的字符 33.select substr(ename,2,3) form emp 从第2个字符开始截取3个字符 34.select chr(65) from dual; 将65转化为字符 35.select ascii('A') from dual 将ACSII码转化为字符串 36.select round(23.565)from dual 四舍五入 36.select round(23,4565,2)from dual 四舍五入到第二位 37.select to_char(sal,'$99.999.9999') from emp 按指定格式输出 select to_char(sal,'L99,999,9999') form emp L表明本地字符 38.select hiredate from emp select to_char(hiredate,'YYYY-MM-DD HH:MI:SS) from emp; 时间格式的显示 select to_char(sysdate,'YYYY-MM-DD HH:MI:ss) from dual; 十二小时制显示系统时间 select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS) from dual 二四小时制显示系统时间 39.select ename,hiredate from emp where hiredate > to_date('2005-2-3 12:32:23','YYYY-MM-DD HH:MI:SS'); 40 select sal from emp where sal>to_number('$1,250.00','$9,999.99'); 取出比它大的一切字符串(把特定格式的数字转化成字符) 41 select ename,sal+nvl(comm,0) from emp; 讲comm值为空的用0来替换,单行函数(以一条记录为条件)一条对一条 42.select Max(sal) from emp; select Min(sal) from emp; select avg(sal) from emp; select sum(sal) from emp; select count(*) from emp; 查看表中一共有多少条记录 select count(*) from emp where deptno=10; 查找部门10一共有多少人; 43.select avg(sal),deptno from emp group by deptno; 按部门号进行分组 select deptno,job,max(sal) from emp group by job,deptno; 按工做和部门号进行分组; 44.select ename from emp where sal=(select max(sal) from emp); 子查询,查找部门中薪水最高的员工姓名 45.group by 注意:出如今select列表中的字段,若是没有出如今组函数中必须出如今group by子句中 46.select avg(sal),deptno from emp group by deptno having avg(sal)>2000; 选出部门中平均薪水大于2000的部门, 47.select * from emp where sal>100 group by deptno having ..........order by........ 先取数据--过滤数据------分组----对分组限制-------排序 48.select avg(sal) from emp where sal>2000 group by deptno having avg(sal)>1500 order by avg(sal) desc; 查找部门中平均薪水打印2000的员工并按部门号进行排序,查询分组后的平均薪水必须大于1500,查询结果按平均薪水从低到高排列 49.select ename from emp where sal>(select avg(sal) from emp); 查找出员工中薪水位于部门平均薪水之上的全部员工 50.select ename,sal from emp join(select max(sal) max_sal from emp group by deptno) t on(emp.sal=t,max_sal and emp.deptno=t.deptno); 查找每一个部门中薪水最高的 51.select e1.ename,e2.ename from emp e1,emp e2 where e1.mgr=e2.empno; 表的自链接 52.select dname,ename from emp cross join dept 交叉链接,笛卡尔 SQL99中的新语法 53.select ename,dname from emp join dept on(emp.deptno=dept.deptno); 54.select ename,dname from emp join dept using(deptno); 查找emp和dept表中deptno相同的部分。 55.select ename,dname,grade from emp e join dept d on(e.deptno=d.depno) join salgrade s(e.sal between s.losal and s.hisal) (三表查找) where ename not like '_%A%'; 56.select e1.ename,e2.ename from emp e1 join emp e2 on(e1.mgr=e2.deptno); 表的自链接 57.select e1.ename,e2.ename from emp e1 left join emp e2 on(e1.mgr=e2.deptno) 左外表链接 select ename,dname from emp e right join dept d on(e.deptno=d.deptno)右外链接 select ename,dname from emp e full join dept d on(e.deptno=d.deptno)全链接 58.求部门中薪水最高的 select ename,sal from emp join (select max(sal) max_sal, deptno from emp group by deptno) t on (emp.sal=t.max_sal and emp.deptno=t.deptno); 59.求部门中薪水等级的平均值 select deptno,avg(grade) from(select deptno,ename,grade,from emp join salgrade s on(emp.sal between s.losal and s.hisal))t group by deptno; 60.查找雇员中哪些是经理人 select ename from emp where empno in(select mgr from emp); 61.select distinct e1.sal from emp e1 join emp e2 on(e1.sal<e2.sal); 自链接(不用组函数求出最高薪水) select distinct sal from emp where not in (select ename from e1.sal from emp e1 join emp e2 on(e1.sal<e2.sal)); 62.select deptno from (select avg(sal) max_sal deptno from emp group by deptno) where max_sal=(select max(avg_sal) from (select avg(sal) avg_sal deptno from emp group by deptno)); 查找部门中部门薪水最大的部门号 63.求平均薪水最大的部门的部门编号 select deptno,avg_sal from(select avg(sal) avg_sal,deptno from emp group by deptno)where avg_sal=(select max(avg(sal)) from emp group by deptno); DML语句:更、删、改、查 建立权限, conn sys/admin as sysdba grant create table,create view to scott; 首先在C:下面建个文件夹备份文件 1.createNewUser方法 1.--backup scott exp 2.create user(建立用户)用超级管理员模式进入 create user yun identified by kang1234 default tablespace users quota 10M on users; grant create session,create table,create view to kafei(给kafei这个用户授予权限) 3.import the data(导入备份数据) imp 2.insert insert into dept values (50,'game','bj') 插入一条记录 insert into dept2 (deptno,dname) values (78,'games'); 插入指定的几条记录 insert into dept2 select *from dept 插入指定的表(表结构要同样) rollback; 回退 create table emp2 as select * from emp; 建立数据库表2来备份emp这张表 3.update emp2 set sal=sal*12 where deptno=10; update的用法 4.delete from dept2 where deptno<25 ; 删除语句的用法 DDL语言 1.建立表:create table t(a varchar2(10)); 2.drop table t 删除表 3.commit 全部的提交,全部修改都结束了。对于rollback无效,一个事务开始于第1条DML语句 碰到执行DDL DCL语句事务自动提交 对于rollback无效 建表语句 建学生信息表: create table stu (id number(6), name varchar2(20) constraint stu_name_nn not null, sex number(1), age number(3), sdate date, grade number(2) default 1, class number(4), email varchar2(50) unique (惟一约束) ); 非空 惟一 主键 外键 chick create table stu (id number(6) primary key,(主键约束) name varchar2(20) constraint stu_name_nn not null,(非空约束) sex number(1), age number(3), sdate date, grade number(2) default 1, class number(4), email varchar2(50), constraint stu_name_uui unique(email,name) 组合性约束 ); 主键约束方法二 create table stu (id number(6), name varchar2(20) constraint stu_name_nn not null,(非空约束) sex number(1), age number(3), sdate date, grade number(2) default 1, class number(4) references class(id),(参考class 这张表,参考字段) email varchar2(50), constraint stu_id_pk primary key(id), constraint stu_name_uui unique(email,name) 组合性约束 ); 外键约束 create table class (id number(4) primary key,(id为被参考字段,被参考的字段必须是主键) name varchar2(20) not null ) create table stu ( id number(6), name varchar2(20) constraint stu_name_nn not null,(非空约束) sex number(1), age number(3), sdate date, grade number(2) default 1, class number(4) email varchar2(50), constraint stu_class_fk foreign key(class) references class(id), constraint stu_id_pk primary key(id), constraint stu_name_uui unique(email,name) 组合性约束 ); 像外键中插入关键字, 1.insert into class values(1000,'c1'); 2.insert into stu(id,name,class,email) values(1,'a',1000,'a'); 3.alter table stu add(addr varchar(20));添加表的结构 4.alter table stu drop(addr); 删除表结构 5.alter table stu modify(addr varchar2(150));修改精度 6.alter table stu drop constraint stu_class_fk; 删除约束条件 7.alter table stu add constraint stu_class_fk forengn key(class) references class(id),添加约束条件 查找当前用户下有哪些表和哪些视图及哪些约束 8.select table_name from user_names 9.select view_name from view_names 10.select constraint_name,table_name from user_constraints; desc dictionary数据字典表 desc user_tables当前用户下面有多少张表 select table_name from user_tables; 查找当前用户有多少张表 索引: 建立索引 create index idx_stu_email on stu(email); drop index idx_stu_email; 查找索引 select index_name from user_indexes; 索引读的速度快了,插入速度变慢 view 视图 视图赠加了维护的量 序列: create table arcticle (id number, title varchar2(1024), cont long ); 序列的建立sequence产生独一无二的序列,并且是oracle独有的 create sequence seq; select seq.nextval from dual; 查找序列号 insert into arcticle values(seq.nextval,'a','b');往表中插入序列 数据库设计的3范式 第一范式: 设计任何表都要有主键,列不可分 第二范式: 若是有2个主键的话,不能存在部分依赖 第三范式, 不能存在传递依赖 PL-sql 例子1: SQL> set serveroutput on; SQL> begin(必要的--程序开始执行) 2 dbms_output.put_line('hello world'); 3 end;(结束) 4 / 例子2: SQL> declare 2 v_name varchar2(20); 3 begin 4 v_name:='myname'; 5 dbms_output.put_line(v_name); 6 end; 7 / myname 例子3: SQL> declare 2 v_num number:=0; 3 begin 4 v_num:=2/v_num; 5 dbms_output.put_line(v_num); 6 end; 7 / declare * ERROR 位于第 1 行: ORA-01476: 除数为 0 ORA-06512: 在line 4 例子4: declare v_num number:=0; begin v_num:=2/v_num; dbms_output.put_line(v_num); exception when others then dbms_output.put_line('error'); end; / 变量声明的规则 1.变量名不可以使用保留字,如from,select等 2.第一字符必须是字母。 3.变量名最多包含30个字符 4.不要与数据库的表或者列同名 5.每一行只能声明一个变量 经常使用变量类型 1. binary_interger,整数,主要用来计数,而不是用来表示字段类型 2. number 数字类型 3. char 定长字符串 4. varchar2 变长字符串 5. date 日期 6.long 长字符串,最长2GB 7.boolean 布尔类型,能够取true false 和null的值 例5: declare v_temp number(1); v_count binary_integer:=0; v_sal number(7,2):=4000.00; v_date date:=sysdate; v_pi constant number(3,2):=3.14; v_valid boolean:=false; v_name varchar2(20) not null:='myname'; begin dbms_output.put_line('v_temp value:'||v_temp); end; 用--能够注释一行 例6: declare v_empno number(4); v_empno2 emp.empno%type; v_empno3 v_empno2%type; begin dbms_output.put_line('test'); end; 例7 table变量类型 set serveroutput on; declare type type_table_emp_empno is table of emp.empno%type index by binary_integer; v_empnos type_table_emp_empno; begin v_empnos(0):=7369; v_empnos(2):=7869; v_empnos(-1):=9999; dbms_output.put_line(v_empnos(-1)); end; 例8 Record 变量类型 set serveroutput on; declare type type_record_dept is record ( deptno dept.deptno%type, dname dept.dname%type, loc dept.loc%type ); v_temp type_record_dept; begin v_temp.deptno:=50; v_temp.loc:='aaaa'; v_temp.loc:='bj'; dbms_output.put_line(v_temp.deptno||' '||v_temp.dname); end; 例9: 使用%rowtype声明record变量(表结构的变化同时也能代理储存过程的变化) set serveroutput on; declare v_temp dept%rowtype; begin v_temp.deptno:=50; v_temp.loc:='aaaa'; v_temp.loc:='bj'; dbms_output.put_line(v_temp.deptno||' '||v_temp.dname); end; 例10; declare v_name emp.ename%type; v_sal emp.sal%type; begin select ename,sal into v_name,v_sal from emp where empno=7369;(将ename和sal的值放在v_name和v_sal里面) 例11: declare v_name emp.ename%type; v_sal emp.sal%type; begin select ename,sal into v_name,v_sal from emp where empno=7369; dbms_output.put_line(v_name||' '||v_sal); end; dbms_output.put_line(v_name||' '||v_sal); end; 例12: declare v_deptno dept.deptno%type:=50; v_dname dept.dname%type:='aaaa'; v_loc dept.loc%type:='bj'; begin insert into dept2 values(v_deptno,v_dname,v_loc); commit; end; 例13: declare v_deptno emp2.deptno%type:=50; v_count number; begin update emp2 set sal=sal/2 where deptno=v_deptno; dbms_output.put_line(sql%rowcount ||'条记录被影响');(sql为关键字,表明上一条语句 commit; end; / 例14: declare v_deptno emp2.deptno%type:=50; v_count number; begin --update emp2 set sal=sal/2 where deptno=v_deptno; select deptno into v_deptno from emp2 where empno=7369; dbms_output.put_line(sql%rowcount ||'条记录被影响');(sql为关键字,表明上一条语句 commit; end; / 例15 declare v_deptno emp2.deptno%type:=50; v_count number; begin --update emp2 set sal=sal/2 where deptno=v_deptno; --select deptno into v_deptno from emp2 where empno=7369; select count(*) into v_count from emp2; (select必须和into一块儿使用) dbms_output.put_line(sql%rowcount ||'条记录被影响'); commit; end; / PL/SQL里面执行DDL语句 begin execute immediate 'create table T(nnn varchar2(20) default ''aaa'')'; end; PL/SQL的分支语句: declare v_sal emp.sal%type; begin select sal into v_sal from emp where empno=7369; if(v_sal<1200) then dbms_output.put_line('low'); elsif(v_sal<2000) then dbms_output.put_line('middle'); else dbms_output.put_line('high'); end if; end; pL/Sql循环 declare i binary_integer:=1; begin loop dbms_output.put_line(i); i:=i+1; exit when(i>=11); end loop; end; PL/SQL for循环 begin for k in 1..10 loop dbms_output.put_line(k); end loop; for k in reverse 1..10 loop dbms_output.put_line(k); end loop; end; exception 捕获异常 declare v_temp number(4); begin select empno into v_temp from emp where deptno=10; exception when too_many_rows then dbms_output.put_line('太多记录了'); when others then dbms_output.put_line('error'); end; 没有数据错误 declare v_temp number(4); begin select empno into v_temp from emp where deptno=2222; exception when no_data_found then dbms_output.put_line('没数据'); when others then dbms_output.put_line('error'); end; / 错误处理 create table errorlog ( id number primary key, errcode number, errmsg varchar2(1024), errdate date ); create sequence seq_errorlog_id start with 1 increment by 1; declare v_deptno dept.deptno%type:=10; v_errcode number; v_errmsg varchar2(1024); begin delete from dept where deptno=v_deptno; exception when others then rollback; v_errcode:=SQLCODE; v_errmsg:=SQLERRN; insert into errorlog values(seq_errorlog_id.nextval,v_errcode,v_errmsg,sysdate); commit; end; 游标 declare cursor c is select * from emp; v_emp c%rowtype; begin open c; fetch c into v_emp; --(取游标的第一个值插入v_emp,在不断的循环) dbms_output.put_line(v_emp.ename); close c; end; 例子 declare cursor c is select * from emp; v_emp c%rowtype; begin open c; loop fetch c into v_emp; exit when(c%notfound); dbms_output.put_line(v_emp.ename); end loop; close c; end; declare cursor c is select * from emp; v_emp c%rowtype; begin open c; fetch c into v_emp; while(c%found) loop dbms_output.put_line(v_emp.ename); fetch c into v_emp; end loop; close c; end; declare cursor c is select * from emp; begin for v_emp in c loop dbms_output.put_line(v_emp.ename); end loop; end; 带参数的游标 declare cursor c(v_deptno emp.deptno%type,v_job emp.job%type) is select ename,sal from emp where deptno=v_deptno and job=v_job; begin for v_temp in c(30,'chick') loop dbms_output.put_line(v_temp.ename); end loop; end; 可更新的游标 存储过程 create or replace procedure p is cursor c is select * from emp2 for update; begin for v_emp in c loop if (v_emp.deptno=10) then update emp2 set sal=sal+10 where current of c; elsif(v_emp.deptno=20) then update emp2 set sal=sal+20 where current of c; else update emp2 set sal=sal+50 where current of c; end if; end loop; commit; end; exec p执行存储过程 begin p: end; 带参数的存储过程 create or replace procedure p (v_a in number,v_b number,v_ret out number, v_temp in out number) is begin if(v_a>v_b) then v_ret:=v_a; else v_ret:=v_b; end if; v_temp:=v_temp+1; end; 调用存储过程 declare v_a number:=3; v_b number:=4; v_ret number; v_temp number:=5; begin p(v_a,v_b,v_ret,v_temp); dbms_output.put_line(v_ret); dbms_output.put_line(v_temp); end; show error返回错误信息 删除存储过程 存储过程当中的函数 create or replace function sal_tax (v_sal number) return number is begin if(v_sal<2000) then return 0.10; elsif(v_sal<2750) then return 0.5; else return 0.20; end if; end; / 触发器 create or replace trigger trig after update on dept for each row begin update emp set deptno=:NEW.deptno where deptno=:OLD.deptno; end; /
经典SQLSERVER语句大全:sql
1、基础 一、说明:建立数据库 CREATE DATABASE database-name 二、说明:删除数据库 drop database dbname 三、说明:备份sql server --- 建立 备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' --- 开始 备份 BACKUP DATABASE test TO testBack 四、说明:建立新表 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 根据已有的表建立新表: A:create table tab_new like tab_old (使用旧表建立新表) B:create table tab_new as select col1,col2… from tab_old definition only 五、说明:删除新表 drop table tabname 六、说明:增长一个列 Alter table tabname add column col type 注:列增长后将不能删除。DB2中列加上后数据类型也不能改变,惟一能改变的是增长varchar类型的长度。 七、说明:添加主键: Alter table tabname add primary key(col) 说明:删除主键: Alter table tabname drop primary key(col) 八、说明:建立索引:create [unique] index idxname on tabname(col….) 删除索引:drop index idxname 注:索引是不可更改的,想更改必须删除从新建。 九、说明:建立视图:create view viewname as select statement 删除视图:drop view viewname 十、说明:几个简单的基本的sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1 where 范围 更新:update table1 set field1=value1 where 范围 查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料! 排序:select * from table1 order by field1,field2 [desc] 总数:select count as totalcount from table1 求和:select sum(field1) as sumvalue from table1 平均:select avg(field1) as avgvalue from table1 最大:select max(field1) as maxvalue from table1 最小:select min(field1) as minvalue from table1 十一、说明:几个高级查询运算词 A: UNION 运算符 UNION 运算符经过组合其余两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一块儿使用时(即 UNION ALL),不消除重复行。两种状况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 --union 只是将二个表中的数据联合起来一块儿显示 select id from tb_user union select id from tb_book B: EXCEPT 运算符 EXCEPT 运算符经过包括全部在 TABLE1 中但不在 TABLE2 中的行并消除全部重复行而派生出一个结果表。当 ALL 随 EXCEPT 一块儿使用时 (EXCEPT ALL),不消除重复行。 C: INTERSECT 运算符 INTERSECT 运算符经过只包括 TABLE1 和 TABLE2 中都有的行并消除全部重复行而派生出一个结果表。当 ALL 随 INTERSECT 一块儿使用时 (INTERSECT ALL),不消除重复行。 注:使用运算词的几个查询结果行必须是一致的。 十二、说明:使用外链接 A、left (outer) join: 左外链接(左链接):结果集几包括链接表的匹配行,也包括左链接表的全部行。 SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c B:right (outer) join: 右外链接(右链接):结果集既包括链接表的匹配链接行,也包括右链接表的全部行。 C:full/cross (outer) join: 全外链接:不只包括符号链接表的匹配行,还包括两个链接表中的全部记录。 十二、分组:Group by: 一张表,一旦分组 完成后,查询后只能获得组相关的信息。 组相关的信息:(统计信息) count,sum,max,min,avg 分组的标准) 在SQLServer中分组时:不能以text,ntext,image类型的字段做为分组依据 在selecte统计函数中的字段,不能和普通的字段放在一块儿; 1三、对数据库进行操做: 分离数据库: sp_detach_db; 附加数据库:sp_attach_db 后接代表,附加须要完整的路径名 14.如何修改数据库的名称: sp_renamedb 'old_name', 'new_name' 2、提高 一、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) 法一:select * into b from a where 1<>1(仅用于SQlServer) 法二:select top 0 * into b from a 二、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) insert into b(a, b, c) select d,e,f from b; 三、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件 例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. 四、说明:子查询(表名1:a 表名2:b) select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3) 五、说明:显示文章、提交人和最后回复时间 select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b 六、说明:外链接查询(表名1:a 表名2:b) select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c 七、说明:在线视图查询(表名1:a ) select * from (SELECT a,b,c FROM a) T where t.a > 1; 八、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 select * from table1 where time between time1 and time2 select a,b,c, from table1 where a not between 数值1 and 数值2 九、说明:in 的使用方法 select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’) 十、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) 十一、说明:四表联查问题: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where ..... 十二、说明:日程安排提早五分钟提醒 SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 1三、说明:一条sql 语句搞定数据库分页 select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 具体实现: 关于数据库分页: declare @start int,@end int @sql nvarchar(600) set @sql=’select top’+str(@end-@start+1)+’+from T where rid not in(select top’+str(@str-1)+’Rid from T where Rid>-1)’ exec sp_executesql @sql 注意:在top后不能直接跟一个变量,因此在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,若是top后还有具体的字段,这样作是很是有好处的。由于这样能够避免 top的字段若是是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时若是处在索引则首先查询索引) 1四、说明:前10条记录 select top 10 * form table1 where 范围 1五、说明:选择在每一组b值相同的数据中对应的a最大的记录的全部信息(相似这样的用法能够用于论坛每个月排行榜,每个月热销产品分析,按科目成绩排名,等等.) select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) 1六、说明:包括全部在 TableA 中但不在 TableB和TableC 中的行并消除全部重复行而派生出一个结果表 (select a from tableA ) except (select a from tableB) except (select a from tableC) 1七、说明:随机取出10条数据 select top 10 * from tablename order by newid() 1八、说明:随机选择记录 select newid() 1九、说明:删除重复记录 1),delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) 2),select distinct * into temp from tablename delete from tablename insert into tablename select * from temp 评价: 这种操做牵连大量的数据的移动,这种作法不适合大容量但数据操做 3),例如:在一个外部表中导入数据,因为某些缘由第一次只导入了一部分,但很难判断具体位置,这样只有在下一次所有导入,这样也就产生好多重复的字段,怎样删除重复字段 alter table tablename --添加一个自增列 add column_b int identity(1,1) delete from tablename where column_b not in( select max(column_b) from tablename group by column1,column2,...) alter table tablename drop column column_b 20、说明:列出数据库里全部的表名 select name from sysobjects where type='U' // U表明用户 2一、说明:列出表里的全部的列名 select name from syscolumns where id=object_id('TableName') 2二、说明:列示type、vender、pcs字段,以type字段排列,case能够方便地实现多重选择,相似select 中的case。 select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type 显示结果: type vender pcs 电脑 A 1 电脑 A 1 光盘 B 2 光盘 A 2 手机 B 3 手机 C 3 2三、说明:初始化表table1 TRUNCATE TABLE table1 2四、说明:选择从10到15的记录 select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc 3、技巧 一、1=1,1=2的使用,在SQL语句组合时用的较多 “where 1=1” 是表示选择所有 “where 1=2”所有不选, 如: if @strWhere !='' begin set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere end else begin set @strSQL = 'select count(*) as Total from [' + @tblName + ']' end 咱们能够直接写成 错误!未找到目录项。 set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere 二、收缩数据库 --重建索引 DBCC REINDEX DBCC INDEXDEFRAG --收缩数据和日志 DBCC SHRINKDB DBCC SHRINKFILE 三、压缩数据库 dbcc shrinkdatabase(dbname) 四、转移数据库给新用户以已存在用户权限 exec sp_change_users_login 'update_one','newname','oldname' go 五、检查备份集 RESTORE VERIFYONLY from disk='E:\dvbbs.bak' 六、修复数据库 ALTER DATABASE [dvbbs] SET SINGLE_USER GO DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK GO ALTER DATABASE [dvbbs] SET MULTI_USER GO 七、日志清除 SET NOCOUNT ON DECLARE @LogicalFileName sysname, @MaxMinutes INT, @NewSize INT USE tablename -- 要操做的数据库名 SELECT @LogicalFileName = 'tablename_log', -- 日志文件名 @MaxMinutes = 10, -- Limit on time allowed to wrap log. @NewSize = 1 -- 你想设定的日志文件的大小(M) Setup / initialize DECLARE @OriginalSize int SELECT @OriginalSize = size FROM sysfiles WHERE name = @LogicalFileName SELECT 'Original Size of ' + db_name() + ' LOG is ' + CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' FROM sysfiles WHERE name = @LogicalFileName CREATE TABLE DummyTrans (DummyColumn char (8000) not null) DECLARE @Counter INT, @StartTime DATETIME, @TruncLog VARCHAR(255) SELECT @StartTime = GETDATE(), @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' DBCC SHRINKFILE (@LogicalFileName, @NewSize) EXEC (@TruncLog) -- Wrap the log if necessary. WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) AND (@OriginalSize * 8 /1024) > @NewSize BEGIN -- Outer loop. SELECT @Counter = 0 WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) BEGIN -- update INSERT DummyTrans VALUES ('Fill Log') DELETE DummyTrans SELECT @Counter = @Counter + 1 END EXEC (@TruncLog) END SELECT 'Final Size of ' + db_name() + ' LOG is ' + CONVERT(VARCHAR(30),size) + ' 8K pages or ' + CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' FROM sysfiles WHERE name = @LogicalFileName DROP TABLE DummyTrans SET NOCOUNT OFF 八、说明:更改某个表 exec sp_changeobjectowner 'tablename','dbo' 九、存储更改所有表 CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch @OldOwner as NVARCHAR(128), @NewOwner as NVARCHAR(128) AS DECLARE @Name as NVARCHAR(128) DECLARE @Owner as NVARCHAR(128) DECLARE @OwnerName as NVARCHAR(128) DECLARE curObject CURSOR FOR select 'Name' = name, 'Owner' = user_name(uid) from sysobjects where user_name(uid)=@OldOwner order by name OPEN curObject FETCH NEXT FROM curObject INTO @Name, @Owner WHILE(@@FETCH_STATUS=0) BEGIN if @Owner=@OldOwner begin set @OwnerName = @OldOwner + '.' + rtrim(@Name) exec sp_changeobjectowner @OwnerName, @NewOwner end -- select @name,@NewOwner,@OldOwner FETCH NEXT FROM curObject INTO @Name, @Owner END close curObject deallocate curObject GO 十、SQL SERVER中直接循环写入数据 declare @i int set @i=1 while @i<30 begin insert into test (userid) values(@i) set @i=@i+1 end 案例: 有以下表,要求就裱中全部沒有及格的成績,在每次增長0.1的基礎上,使他們剛好及格: Name score Zhangshan 80 Lishi 59 Wangwu 50 Songquan 69 while((select min(score) from tb_table)<60) begin update tb_table set score =score*1.01 where score<60 if (select min(score) from tb_table)>60 break else continue end 数据开发-经典 1.按姓氏笔画排序: Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as //从少到多 2.数据库加密: select encrypt('原始密码') select pwdencrypt('原始密码') select pwdcompare('原始密码','加密后密码') = 1--相同;不然不相同 encrypt('原始密码') select pwdencrypt('原始密码') select pwdcompare('原始密码','加密后密码') = 1--相同;不然不相同 3.取回表中字段: declare @list varchar(1000), @sql nvarchar(1000) select @list=@list+','+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name='表A' set @sql='select '+right(@list,len(@list)-1)+' from 表A' exec (@sql) 4.查看硬盘分区: EXEC master..xp_fixeddrives 5.比较A,B表是否相等: if (select checksum_agg(binary_checksum(*)) from A) = (select checksum_agg(binary_checksum(*)) from B) print '相等' else print '不相等' 6.杀掉全部的事件探察器进程: DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid) FROM master.dbo.sysprocesses WHERE program_name IN('SQL profiler',N'SQL 事件探查器') EXEC sp_msforeach_worker '?' 7.记录搜索: 开头到N条记录 Select Top N * From 表 ------------------------------- N到M条记录(要有主索引ID) Select Top M-N * From 表 Where ID in (Select Top M ID From 表) Order by ID Desc ---------------------------------- N到结尾记录 Select Top N * From 表 Order by ID Desc 案例 例如1:一张表有一万多条记录,表的第一个字段 RecID 是自增加字段, 写一个SQL语句, 找出表的第31到第40个记录。 select top 10 recid from A where recid not in(select top 30 recid from A) 分析:若是这样写会产生某些问题,若是recid在表中存在逻辑索引。 select top 10 recid from A where……是从索引中查找,然后面的select top 30 recid from A则在数据表中查找,这样因为索引中的顺序有可能和数据表中的不一致,这样就致使查询到的不是原本的欲获得的数据。 解决方案 1,用order by select top 30 recid from A order by ricid 若是该字段不是自增加,就会出现问题 2,在那个子查询中也加条件:select top 30 recid from A where recid>-1 例2:查询表中的最后以条记录,并不知道这个表共有多少数据,以及表结构。 set @s = 'select top 1 * from T where pid not in (select top ' + str(@count-1) + ' pid from T)' print @s exec sp_executesql @s 9:获取当前数据库中的全部用户表 select Name from sysobjects where xtype='u' and status>=0 10:获取某一个表的全部字段 select name from syscolumns where id=object_id('表名') select name from syscolumns where id in (select id from sysobjects where type = 'u' and name = '表名') 两种方式的效果相同 11:查看与某一个表相关的视图、存储过程、函数 select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%表名%' 12:查看当前数据库中全部存储过程 select name as 存储过程名称 from sysobjects where xtype='P' 13:查询用户建立的全部数据库 select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa') 或者 select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01 14:查询某一个表的字段和数据类型 select column_name,data_type from information_schema.columns where table_name = '表名' 15:不一样服务器数据库之间的数据操做 --建立连接服务器 exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 ' --查询示例 select * from ITSV.数据库名.dbo.表名 --导入示例 select * into 表 from ITSV.数据库名.dbo.表名 --之后再也不使用时删除连接服务器 exec sp_dropserver 'ITSV ', 'droplogins ' --链接远程/局域网数据(openrowset/openquery/opendatasource) --一、openrowset --查询示例 select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) --生成本地表 select * into 表 from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) --把本地表导入远程表 insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) select *from 本地表 --更新本地表 update b set b.列A=a.列A from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join 本地表 b on a.column1=b.column1 --openquery用法须要建立一个链接 --首先建立一个链接建立连接服务器 exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' --查询 select * FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') --把本地表导入远程表 insert openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') select * from 本地表 --更新本地表 update b set b.列B=a.列B FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') as a inner join 本地表 b on a.列A=b.列A --三、opendatasource/openrowset SELECT * FROM opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登录名;Password=密码 ' ).test.dbo.roy_ta --把本地表导入远程表 insert opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登录名;Password=密码 ').数据库.dbo.表名 select * from 本地表 SQL Server基本函数 SQL Server基本函数 1.字符串函数 长度与分析用 1,datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格 2,substring(expression,start,length) 取子串,字符串的下标是从“1”,start为起始位置,length为字符串长度,实际应用中以len(expression)取得其长度 3,right(char_expr,int_expr) 返回字符串右边第int_expr个字符,还用left于之相反 4,isnull( check_expression , replacement_value )若是check_expression為空,則返回replacement_value的值,不為空,就返回check_expression字符操做类 5,Sp_addtype 自定義數據類型 例如:EXEC sp_addtype birthday, datetime, 'NULL' 6,set nocount {on|off} 使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息。若是存储过程当中包含的一些语句并不返回许多实际的数据,则该设置因为大量减小了网络流量,所以可显著提升性能。SET NOCOUNT 设置是在执行或运行时设置,而不是在分析时设置。 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。 SET NOCOUNT 为 OFF 时,返回计数 常识 在SQL查询中:from后最多能够跟多少张表或视图:256 在SQL语句中出现 Order by,查询时,先排序,后取 在SQL中,一个字段的最大容量是8000,而对于nvarchar(4000),因为nvarchar是Unicode码。 SQLServer2000同步复制技术实现步骤 1、 预备工做 1.发布服务器,订阅服务器都建立一个同名的windows用户,并设置相同的密码,作为发布快照文件夹的有效访问用户 --管理工具 --计算机管理 --用户和组 --右键用户 --新建用户 --创建一个隶属于administrator组的登录windows的用户(SynUser) 2.在发布服务器上,新建一个共享目录,作为发布的快照文件的存放目录,操做: 个人电脑--D:\ 新建一个目录,名为: PUB --右键这个新建的目录 --属性--共享 --选择"共享该文件夹" --经过"权限"按纽来设置具体的用户权限,保证第一步中建立的用户(SynUser) 具备对该文件夹的全部权限 --肯定 3.设置SQL代理(SQLSERVERAGENT)服务的启动用户(发布/订阅服务器均作此设置) 开始--程序--管理工具--服务 --右键SQLSERVERAGENT --属性--登录--选择"此帐户" --输入或者选择第一步中建立的windows登陆用户名(SynUser) --"密码"中输入该用户的密码 4.设置SQL Server身份验证模式,解决链接时的权限问题(发布/订阅服务器均作此设置) 企业管理器 --右键SQL实例--属性 --安全性--身份验证 --选择"SQL Server 和 Windows" --肯定 5.在发布服务器和订阅服务器上互相注册 企业管理器 --右键SQL Server组 --新建SQL Server注册... --下一步--可用的服务器中,输入你要注册的远程服务器名 --添加 --下一步--链接使用,选择第二个"SQL Server身份验证" --下一步--输入用户名和密码(SynUser) --下一步--选择SQL Server组,也能够建立一个新组 --下一步--完成 6.对于只能用IP,不能用计算机名的,为其注册服务器别名(此步在实施中没用到) (在链接端配置,好比,在订阅服务器上配置的话,服务器名称中输入的是发布服务器的IP) 开始--程序--Microsoft SQL Server--客户端网络实用工具 --别名--添加 --网络库选择"tcp/ip"--服务器别名输入SQL服务器名 --链接参数--服务器名称中输入SQL服务器ip地址 --若是你修改了SQL的端口,取消选择"动态决定端口",并输入对应的端口号 2、 正式配置 一、配置发布服务器 打开企业管理器,在发布服务器(B、C、D)上执行如下步骤: (1) 从[工具]下拉菜单的[复制]子菜单中选择[配置发布、订阅服务器和分发]出现配置发布和分发向导 (2) [下一步] 选择分发服务器 能够选择把发布服务器本身做为分发服务器或者其余sql的服务器(选择本身) (3) [下一步] 设置快照文件夹 采用默认\\servername\Pub (4) [下一步] 自定义配置 能够选择:是,让我设置分发数据库属性启用发布服务器或设置发布设置 否,使用下列默认设置(推荐) (5) [下一步] 设置分发数据库名称和位置 采用默认值 (6) [下一步] 启用发布服务器 选择做为发布的服务器 (7) [下一步] 选择须要发布的数据库和发布类型 (8) [下一步] 选择注册订阅服务器 (9) [下一步] 完成配置 二、建立出版物 发布服务器B、C、D上 (1)从[工具]菜单的[复制]子菜单中选择[建立和管理发布]命令 (2)选择要建立出版物的数据库,而后单击[建立发布] (3)在[建立发布向导]的提示对话框中单击[下一步]系统就会弹出一个对话框。对话框上的内容是复制的三个类型。咱们如今选第一个也就是默认的快照发布(其余两个你们能够去看看帮助) (4)单击[下一步]系统要求指定能够订阅该发布的数据库服务器类型, SQLSERVER容许在不一样的数据库如 orACLE或ACCESS之间进行数据复制。 可是在这里咱们选择运行"SQL SERVER 2000"的数据库服务器 (5)单击[下一步]系统就弹出一个定义文章的对话框也就是选择要出版的表 注意: 若是前面选择了事务发布 则再这一步中只能选择带有主键的表 (6)选择发布名称和描述 (7)自定义发布属性 向导提供的选择: 是 我将自定义数据筛选,启用匿名订阅和或其余自定义属性 否 根据指定方式建立发布 (建议采用自定义的方式) (8)[下一步] 选择筛选发布的方式 (9)[下一步] 能够选择是否容许匿名订阅 1)若是选择署名订阅,则须要在发布服务器上添加订阅服务器 方法: [工具]->[复制]->[配置发布、订阅服务器和分发的属性]->[订阅服务器] 中添加 不然在订阅服务器上请求订阅时会出现的提示:改发布不容许匿名订阅 若是仍然须要匿名订阅则用如下解决办法 [企业管理器]->[复制]->[发布内容]->[属性]->[订阅选项] 选择容许匿名请求订阅 2)若是选择匿名订阅,则配置订阅服务器时不会出现以上提示 (10)[下一步] 设置快照 代理程序调度 (11)[下一步] 完成配置 当完成出版物的建立后建立出版物的数据库也就变成了一个共享数据库 有数据 srv1.库名..author有字段:id,name,phone, srv2.库名..author有字段:id,name,telphone,adress 要求: srv1.库名..author增长记录则srv1.库名..author记录增长 srv1.库名..author的phone字段更新,则srv1.库名..author对应字段telphone更新 --*/ --大体的处理步骤 --1.在 srv1 上建立链接服务器,以便在 srv1 中操做 srv2,实现同步 exec sp_addlinkedserver 'srv2','','SQLOLEDB','srv2的sql实例名或ip' exec sp_addlinkedsrvlogin 'srv2','false',null,'用户名','密码' go --2.在 srv1 和 srv2 这两台电脑中,启动 msdtc(分布式事务处理服务),而且设置为自动启动 。个人电脑--控制面板--管理工具--服务--右键 Distributed Transaction Coordinator--属性--启动--并将启动类型设置为自动启动 go --而后建立一个做业定时调用上面的同步处理存储过程就好了 企业管理器 --管理 --SQL Server代理 --右键做业 --新建做业 --"常规"项中输入做业名称 --"步骤"项 --新建 --"步骤名"中输入步骤名 --"类型"中选择"Transact-SQL 脚本(TSQL)" --"数据库"选择执行命令的数据库 --"命令"中输入要执行的语句: exec p_process --肯定 --"调度"项 --新建调度 --"名称"中输入调度名称 --"调度类型"中选择你的做业执行安排 --若是选择"反复出现" --点"更改"来设置你的时间安排 而后将SQL Agent服务启动,并设置为自动启动,不然你的做业不会被执行 设置方法: 个人电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--肯定. --3.实现同步处理的方法2,定时同步 --在srv1中建立以下的同步处理存储过程 create proc p_process as --更新修改过的数据 update b set name=i.name,telphone=i.telphone from srv2.库名.dbo.author b,author i where b.id=i.id and (b.name <> i.name or b.telphone <> i.telphone) --插入新增的数据 insert srv2.库名.dbo.author(id,name,telphone) select id,name,telphone from author i where not exists( select * from srv2.库名.dbo.author where id=i.id) --删除已经删除的数据(若是须要的话) delete b from srv2.库名.dbo.author b where not exists( select * from author where id=b.id) go