网络小鼠的博客

做人的态度决定程序员的生涯

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

create [unique][cluster] index <索引名> on <表名>(<列名>[<次序>][,<列名>[<次序>]...);
每个<列名>后面还可以用<次序>指定索引值的排列次序,可选ASC或DESC
unique表明此索引的每一个索引值只对应唯一的数据记录
cluster表示要建立的索引是聚簇索引,所谓聚簇索引是指索引项的顺序与表中记录的物理顺序一致的索引组织。
drop index<索引名>  //删除索引

select [ all | distinct]<目标列表达式>[,<目标列表达式>]...
from <表名或视图名>[,<表名或视图名>]...
[where <条件表达式>]
[group by <列名1>[having <条件表达式>]]
[order by <列名2>[asc | desc]];

删除重复的记录,记录数保留一个
select distinct * into #Tmp from tableName
drop table tableName
select * into table from #Tmp
drop table #Tmp

查询条件                        谓词

 比较                   =,>,<,>=,<=,<>,!>,!<,NOT +上述比较运算符

确定范围               between and  ,not between and

字符匹配               like ,not like

确定集合               in,not in

 空值                  is null,is not null

多重条件               and ,or

使用集函数:为了进一步方便用户,增强检索功能,SQL提供了许多集函数,主要有:
count([distinct | all]*)           统计元组个数
count([distinct | all]<列名>)      统计一列中值的个数
sum([distinct | all]<列名>)        计算一列值的总和(此列必须是数值型)
avg([distinct | all]<列名>)        计算一列值的平均值(此列必须是数值型)
max([distinct | all]<列名>)        求一列值中的最大值
min([distinct | all]<列名>)        求一列值中的最小值


连接查询:
包括:等值连接,自然连接,非等值连接查询,自身连接查询,外连接查询和复合条件连接查询。
一。等值与非等值连接查询
连接查询中用来连接两个表的条件称为连接条件或连接谓词,其一般格式为:
[<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2>
其中比较运算符主要有:=、>,<,>=,<=,!=
此外连接谓词还可以使用下面形式:
[<表名1>.]<列名1> between [<表名2>.]<列名2> and [<表名3>.]<列名3>
当连接运算符为=时,称为等值连接,使用其运算符称为非等值连接
二。自身连接
同一表中自身连接
三。外连接
如果两个表中,在一个表中没有相应的元组,但是有时我们想以前一个表为主体列出第个学生的基本情况及其选课情况,若某个学生没有选课,只输出其基本情况信息,其选课信息为空值即可。
四。复合条件连接
where子句中可以有多个连接条件,称为复合条件连接

嵌套查询:
将一个查询块嵌套在另一个查询块的where子句或having 短语的条件中的查询称为嵌套查询
select Sname from Student where Sno in (select Sno from SC where Cno='2'(不能使用order by子句))

查询其它系中比信息系某一学生年龄小的学生姓名和年龄
select Sname ,Sage from Student where Sage < any (select Sage from Student where Sdept='IS') and Sdept<> 'IS'
或 select Sname,Sage from Student where Sage<(select max(Sage) from Student where Sdept='IS') and Sdept<> 'IS'

any ,all 谓词与集函数及in谓词的等价转换关系


        =        <>或!=       <           <=             >       >=

any     in        -          <max         <=max         >min     >=min
 
all     -        not in      <min         <=min         >max      >=max

带有Exists谓词的子查询
查询所有选修了1号课程的学生姓名
select Sname from Student where exists (select * from SC where Sno=Student.Sno and Cno='1');

集合查询:
select 语句的查询结果是元组的集合,所以多个select 语句的结果可进行集合操作。集合操作主要包括并操作union .交操作intersect 和差操作minus
 
查询计算机科学系的学生及年龄不大于19岁的学生
select * from Student where Sdept='CS' union select * from Student where Sage<=19;
本查询实际上是求计算机科学系的所有学生与年龄不大于19岁的学生的并集。

select [all | distinct ]<目标列表达式>[别名][,<目标列表达式>[别名]]...
from <表名或视图名>[别名][,<表名或视图名>[别名]]...
[where<条件表达式>)]
[group by <列名1>[having <条件表达式>]]
[order by <列名2>[asc | desc]];
目标列表达式有以下可选格式:
1. *
2. <表名>.*
3  count([distinct | all]*)
4.  [<表名>.]<属性列名表达式>[,[<表名>.]<属性列名表达式>]...
其中<属性列名表达式>可以是由属性列.作用于属性列的聚集函数和常量的任意算术运算(+,-,*,/)组成的运算公式。
集函数的一般格式为:
count sum avg max min


插入数据
insert into <表名>[(属性列1>[,<属性列2>...)] values(<常量1>[,<常量2>]...);

插入子查询结果
insert into Deptage(Sdept, Avgage) select Sdept,Avg(Sage) from Student group by Sdept;


视图:
create view <视图名>[(<列名>[,<列名>]...)]
as <子查询> [with check option];
子查询通常不允许含有order by 子句和distinct短语
with check option表示对视图进行update ,insert和delete操作时要保证更新 插入或删除的行满足视图定义中的谓词(即子查询中的条件表达式) 也就是在以后对该视图进行插入 修改和删除操作时,DBMS会自动加上条件的

where 子句中是不能用集函数作为条件表达式的。
可以用group by ..having 集函数

授权:将对指定操作对象的指定操作权限授予指定的用户
grant <权限>[,<权限>]...
[on <对象类型><对象名>]
to <用户>[,<用户>]...
[with grant option];

[wiht grant option]子名,则获得某种权限的用户还可以把这种权限再授予其它用户.

把查询Student 表的权限授给用户U1
grant select on table Student to U1
把对Student 表和Course表的全部操作权限授予用户U2和U3
grant all privileges on table Student,Course to U2,U3
把对表SC的查询权限授予所有用户
grant select on table SC to public
把查询Student 表和修改学生学号的权限授给用户U4
grant update(Sno),select on table Student to U4
DBA把在数据库S_C中建立表的权限授予用户U8
grant createtab on database S_C to U8

收回权限
revoke <权限>[,<权限>]..
[on <对象类型><对象名>]
from <用户>[,<用户>]..

把用户U4修改学生学号的权限收回
revoke update(Sno) on table Student from U4

嵌入式SQL的一般形式


查询优化的一般准则
1.选择运算应尽可能先做.在
2在执行连接前对关系适当地预处理,预处理方法主要有两种,在连接属性上建立索引和对关系排序,然后执行连接
3.把投影运算和选择运算同时进行.
4.把投影同其前或其后的双目运算结合起来,没有必要为了去年某些字段而扫描一遍关系
5.把某些选择同在它前面要执行的
6找出公共子表达式.

事务:(transaction)
begin transcation
commit
rollback
四个特性:原子性 一致性 隔离性  持续性
begin transaction;
if(条件) then
{
rollback;
}
else
{
commit;
}


create table Student (Sno number(8),Sname varchar(20),Sage number(20),
constraint PK_SNO primary key (Sno));

create Table SC (Sno number(8),Sname varchar(20),Sage number(20),
constraint PK_SC primary key (Sno,Cno));

create table EMP
(Empno number(4),Ename varchar(9),Mgr number(4),Sal number(7,2),Deptno number(2),
constrint PK_DEPTNO foreigh key (Deptno) references DEPT(Deptno));
//references子句指明这些外码相应于哪个表的主码
//on delete cascade子句指明在删除被参照关系的元组时,同时删除参照关系中相应的元组
constraint U1 unique表示约束名为U1,该约束要求列值唯一

数据库触发器:
create trigger update_SAL
before insert or update of Sal,pos on Teacher for each row
when


left join:在查询结果中包含join左侧表中的所有记录,以及join右侧表中匹配的记录。
right join:在查询结果中包含join右侧表中的所有记录,以及join左侧表中匹配的记录。
full join:在查询结果中包含join两侧所有的匹配和不匹配的记录。
内连接        只连接匹配的行
左外连接        包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行
右外连接        包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
全外连接        包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。

jion 语句有三种,inner join, left outer join 和 right outer join 都可以简写,分别为jion,left join,right jion。 jion语句可以用来组合两个表中的记录,只要在公共字段之中有相符的值即可,该语句联合两个表查询得到的结果是可以添加新的数据,可以把它看成将两个具有相关内容的表联接在一起新生成的表,而一般的select 语句没有这个功能。1)      内连接,inner join ... on    语句格式:
    FROM (((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号) INNER JOIN 表X ON Member.字段号=表X.字段号

     例子:

    SELECT *

    FROM (((Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort) INNER JOIN MemberLevel ON Member.MemberLevel=MemberLevel.MemberLevel) INNER JOIN MemberIdentity ON Member.MemberIdentity=MemberIdentity.MemberIdentity) INNER JOIN Wedlock ON Member.Wedlock=Wedlock.Wedlock

    ORDER BY MemberDate DESC

     内连接的功能是,把两个表相关联的记录列出来,必须是相关联的记录。

   2)      左外连接,left outer join ... on

    语句格式:

      FROM [表名1] LEFT JOIN [表名2]

      ON [表名1.字段A] 〈关系运算符〉[表名2.字段B]

    其实LEFT JOIN 的功能就是将LEFT左边的表名1中的所有记录全部保留,而将右边的表名2中的字段B与表名1.字段A相对应的记录显示出来(当使用SELECT * 时)。而RIGHT JOIN 和LEFT JOIN 相反。

     外连接的功能是,把LEFT左边的表中的所有记录保留,而右边表只保留相关联的记录,也就是先执行一次INNER JOIN,然后把LEFT左边的表中的与右边表没有任何关联的记录也保留,而右边表的字段为null.

3)      右外连接,right outer join ... on

    与 left join左右相反。

4)      全连接,full join ... on(不常使用,只能用于outer)

     功能结合了以上三种联军,先执行一次inner join,然后把两个表的多余字段都保留,但连接的对应字段为null.

如果想将几个表联接起来,在JOIN操作中我们可以进行嵌套操作,有三个表:表1、表2、表3,现在将三个表联接起来:

      FROM (表1 INNER JOIN 表2 ON 表1.序号=表2.序号)

       INNER JOIN 表3 ON 表1.序号=表3.序号

=====================

在一个正规化的数据库环境中, 我们常会碰到这款情形: 所需的资料并不是放在同一个资料表中, 在这个时候, 你就要用到 Join
当然 Join 如何将不同的数据库的资料结合, 还要看你如何使用它, 一共有四种不同的 Join 的方式, 在这篇文章中我们将为你介绍 Inner Join 及 Outer Join 以及其应用
Inner Join
Inner Join 应该是最常用的 Join 方式, 它只会传回符合 Join 规则的纪录, 还是先来看看语法
Select <要选择的字段> From <主要资料表>
<Join 方式> <次要资料表> [On <Join 规则>]
现在我们利用 MS SQL 内建的北风数据库来实际练习一下! 想多了解 MS SQL 的内建数据库, 你可以看看 SQL Server 的内建数据库 这篇文章
请打开 QA (Query Analyzer), 为了使用北风数据库, 请先执行 Use Northwind, 然后执行
Select ProductId, ProductName, SupplierId From Products
从 Products 产品资料表中取出三个字段, 分别是产品代码, 产品名称, 供货商代码, 但查询出来的结果保证让你的老板很不满意, 因为供货商代码对于人类实在是无虾米意义, 这个时候 Join 就可以帮上忙了, 藉由 Join Suppliers 这个资料表我们便可以查询到供货商名称
Select ProductId, ProductName, Suppliers.SupplierId
From Products
Inner Join Suppliers
Products.Suppliers = Suppliers.SupplierId
这款的查询结果是不是卡清楚呢! Inner Join 的主要精神就是 exclusive , 叫它做排他性吧! 就是讲 Join 规则不相符的资料就会被排除掉, 譬如讲在 Product 中有一项产品的供货商代码 (SupplierId), 没有出现在 Suppliers 资料表中, 那么这笔记录便会被排除掉
Outer Join
这款的 Join 方式是一般人比较少用到的, 甚至有些 SQL 的管理者也从未用过, 这真是一件悲哀的代志, 因为善用 Outer Join 是可以简化一些查询的工作的, 先来看看 Outer Join 的语法
Select <要查询的字段> From <Left 资料表>
<Left | Right> [Outer] Join <Right 资料表> On <Join 规则>
语法中的 Outer 是可以省略的, 例如你可以用 Left Join 或是 Right Join, 在本质上, Outer Join 是 inclusive, 叫它做包容性吧! 不同于 Inner Join 的排他性, 因此在 Left Outer Join 的查询结果会包含所有 Left 资料表的资料, 颠倒过来讲, Right Outer Join 的查询就会包含所有 Right 资料表的资料, 接下来我们还是来做些实际操作, 仍然是使用北风数据库, 但要先做一些小小的修改, 才能达到我们要的结果
首先要拿掉 Products 资料表的 Foreign Key, 否则没有法度在 Products 资料表新增一笔 SupplierId 没有对映到 Suppliers 资料表的纪录, 要知影一个资料表的 Constraint 你可以执行 SQL 内建的 sp_helpconstraint , 在 QA 执行
sp_helpconstraint Products
接下来删除 FK_Products_Suppliers 这个 Foreign Key
Alter Table Products
Drop Constraint FK_Products_Suppliers
再来新增一笔纪录于 Products 资料表, SupplierId 使用 50 是因为它并没有对映到 Suppliers 资料表中的记录
Insert Into Products (ProductName,SupplierId,CategoryId)
values ('Test Product','50','1')
现在我们再执行头前的查询, 只是将 Inner Join 改为 Left Outer Join
Select ProductId, ProductName, Suppliers.SupplierId
From Products
Left Outer Join Suppliers
Products.Suppliers = Suppliers.SupplierId
比较一下两种 Join 方式的查询结果, 你应该就会知影其中的差别!
再来看看 Right Outer Join, 请新增下底这笔记录
Insert Into Suppliers (CompanyName)
values ('LearnASP')
现在请使用 Right Out Join 来作查询, 比较看看查询的结果和 Inner Join 有什么不同!
寻找不相符纪录
这里我们来看看如何使用 Out Join 来找不相符纪录, 可能是有子纪录却没有父纪录或是颠倒过来
Select Suppliers.CompanyName From Products
Right Join Suppliers
On Products.SupplierId = Suppliers.SupplierId
Where Products.SupplierId is Null
执行结果你会找到一笔资料为 LearnASP, 该笔供货商资料存在, 但基本上已经没有产品是来自这个供货商, 想象一下如果不用 Outer Join 你要怎么以一个 SQL 指令完成同一查询结果! 知道 Outer Join 的好用了吧! 再执行
Select Products.ProductName
From Products
Left Join Suppliers
On Products.SupplierId = Suppliers.SupplierId
Where Suppliers.SupplierId is Null
这个查询结果你会发现 Test Product 这项产品竟然找不到供货商的资料!


identity标识符

objectproperty函数可用于确定一个表是具有identity列,columnproperty函数可用于确定identity列的名称.
在设置identity属性后,可以使用$identity关键字在选择列表中引用该列,还可以通过名称引用该列


ON UPDATE CASCADE 和 ON DELETE CASCADE 子句都定义于外部键上。 ON UPDATE CASCADE 子句的含义是:如果用户的标识符(CustId)在用户表中更新,此更新将通过顺序表级联。各个含有相应用户标识符值的顺序随着新值自动更新。 ON DELETE CASCADE 子句的含义是:如果一个用户被从用户表中删除,顺序表中所有包含同样用户标识符值的位序也会被删除。

TEXTIMAGE_ON   [PRIMARY]说明当表中有text、ntext或image列时,将text、ntext或image列的内容放在哪个文件组.如果都是primary那就是放在同一个文件组里.  


 

posted on 2008-02-08 17:48  网络小鼠  阅读(424)  评论(0编辑  收藏  举报