第一篇:SQL学习基础篇
创建数据库:
CREATE DATABASE TEST_ABC;说明:(可以采用大写也可以采用小写,SQL语句本身不区分大小写,创建完毕之 后需要用英文分号;来结尾,TEST_ABC是数据库名字的代表)。
进入数据库:
use TEST_ABC;说明:只有当创建好数据库之后,进入数据库,才能创建table(表)。创建表:
create table food_list(food_name varchar(10),food_price int(5));
说明:(table代表的是表,table之后的就是表的名字,名字之后用括 号(英文格式括起来),然后穿件的就是表的列的名字如food_name和 food_price,varchar和int代表的是这两个的数据类型,其后括号里 面的数字表示的是可以接受的最大字符数,最后用分号结束整个表的创 建过程。)
检查表:
desc food_list;
说明:desc是describe的缩写。
删除表:
drop table food_list;
插入值:
insert into food_list(food_name,food_price)values('铁板鱿鱼','200');
说明:insert into表示插入,插入的某个数据库中的表中的相应的值,第一个括弧之内的为每一列的名字,但是可以只是部分列的名字,而相 应的第二个括弧之内的为第一个括弧之内的列相对应的值,不可多也不 可少。中间用values来连接。
查找:
select * from food_list;
select * from food_list where food_name='铁板鱿鱼';select food_name,food_price from food_list wherefood_name='红烧豆腐';
select food_name,food_price from food_list wherefood_name='红烧豆腐'and food_name='手抓羊肉' orfood_name='鸡腿排骨' or food_price<20;
select * from food_list where food_price between 5and 20;
select food_name from food_list where food_namein('碳烤鱼','铁板鱿鱼','红烧肉','辣子鸡丁','烤龙虾');
说明1: select是选择,from表示从指定的某一张table(表)中选,第一个查询语句用来显示整个表的记录情况,而第二个查询语句是普通 的查询方式,更为普遍,where后面表示条件,其后跟随的是列的名字,如food_name,用等号连接 后面为查询的对象,如铁板鱿鱼,但是要用 英文的引号引起来,然后用英文的分号结束整个查询语句即可。对于数 字类型的值可以加单引号也可以不加,而对于字符类型的值而言需要加 单引号,而且必须加单引号。说明2:对于第三个的格式,select后面是列的名字,表示选择了某列,而* 号表示将所有的列全选上,其他的地方和以上两个查询语句相同。说明3:对于第四种形式而言,最大的不同在于对and和or 关键字的 应用,and表示两个或者多个条件都要满足,而or表示只要满足其中的 一个条件就可以了。说明4:between是一个很有效的比较方式,和and连用,并且在第一 个between...and之后也可以接第二个between and。说明5:用in关键字可以代替连续使用多个or的情况,上述where子 句等同于where food_name='碳烤鱼' or food_name='铁板鱿鱼' orfood_name='红烧肉' or food_name='辣子鸡丁' or food_name='烤龙 虾';还有一种状况是not in作用和in 正好相反。
通配符:
select* from food_list where food_name like'_鸡'and food_name like '%肉’;
说明:配合关键字like使用,通配符有%,_,%是任意数量的未知字符的通配符,_是单个未知字符的通配符,如'%肉'可能表示红烧肉,可以表示手抓羊肉,也可 以表示孜然烤肉,总之,其表示以肉字为结尾的所有字符,而'肉%'表示以肉开头 所有字符。'_鸡',表示两个字符,所有以'鸡'为结尾的字符串。
删除数据:
delete from food_list where food_name='红烧肉';说明:delete后面直接跟from,from后面是某个表的名字where后面是条件,表示要删除的某个元组(行)。
更新数据:
update food_list
setfood_name=”清真黑熊掌,暴炒驴肝”
where food_price=300;
说明:update之后的是表的名称,set的是对指定的记录要更新的值,而一切的决定权就设在where子句之中,如果没有where子句,整个food_name都列被设置为 清真黑熊掌,暴炒驴肝。而且最后的where子 句之中也可以和and,or,in,not in,like等关键字组合使用。
第二篇:SQL基础语句总结
一.四种基本的SQL语句
1.查询
select * from table 2.更新
update table set field=value 3.插入
insert [into] table(field)values(value)4.删除
delete [from] table 二.语句的执行顺序
1.语法分析
分析语句中语法是否符合规范,衡量语句中各表达式的意义。
2.语义分析
检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限。
3.选择优化器
不同的数据库有不同的算法(这个涉及到数据结构),数据库会根据自己的理解(数据库本身)为 SQL语句选择不同的优化器,不同的优化器会选择不同的“执行计划”
4.运行“执行计划”
根据“执行计划”执行SQL语句。以上所述是数据执行时的大体路线。
5.select 语句的执行顺序
借用ItZik Ben-Gan、Lubor Kollar、Dejan Sarka所著的《Sql Server 2005 技术内幕:T-SQL查询》的一段话足以说明:
(8)select(9)distinct(11)
如果 from 子句中的表数目多余两个表,那么就将vt3和第三个表连接从而计算笛卡尔乘积,生成虚拟表,该过程就是一个重复1-3的步骤,最终得到一个新的虚拟表 vt3.第五步:where 应用where筛选器,对上一步生产的虚拟表引用where筛选器,生成虚拟表vt4,在这有个比较重要的细节不得不说一下,对于包含outer join子句的查询,就有一个让人感到困惑的问题,到底在on筛选器还是用where筛选器指定逻辑表达式呢?on和where的最大区别在于,如果在on应用逻辑表达式那么在第三步outer join中还可以把移除的行再次添加回来,而where的移除的最终的。第六步:group by 分组,生成虚拟表 vt4 第七步:having 对vt4应用having筛选器,生成虚拟表 vt5 第八步:select 处理select 列表,生成虚拟表vt6 第九步:distinct 将vt6 中重复的行去掉,生成虚拟表vt7 第十步:order by 将vt7中的行按order by 子句中的列列表排序,生成一个游标vc8 第十一步: top 从vc8的开始处选择指定数量或比例的行,生成虚拟表vt9,并返回给调用者 三.SQL语句扩展
1.select 1.1 选择性插入语句
1.1.1 Insert into table1(field1)Select field2 from table2 要求table1必须存在。
1.1.2 select field1 into table1 from table2 要求table1不存在,在运行时会自动创建表名为table1,字段名为field1的一个表。1.2打开其它数据源
/* OracleSvr为链接服务器名,本示例假定已经创建了一个名为 ORCLDB 的 Oracle 数据库别名。*/ EXEC sp_addlinkedserver 'OracleSvr',--链接服务器名OracleSvr,sysname类型
'MSDAORA',--provider_name数据源提供程序,此处为oracle 'ORCLDB'--数据源名称 GO Select * from OPENQUERY(OracleSvr, 'SELECT name, id FROM joe.titles')如果有多个sql server实例:
SELECT *FROM [servernameinstancename.]pubs.dbo.authors.注意:一个对象的完整名称包括四个标识符:服务器名称、数据库名称、所有者名称和对象名称。其格式如下: [ [ [ server.] [ database ].] [ owner_name ].] object_name 中间的名称可以省略,但是.不可以省略。如:server…object_name 2.update 2.1多表更新
Update table1 set table1.field 1=table2.field2 from table1,table2 /*猜测下连接方式全联接 FULL [OUTER] JOIN */ where table1.field3= table2.filed3 知识:SQL Server的update语句中from后可跟多个表,Oracle则不支持该用法 Oracle 中:Update table1 set table1.field1=(select table2.field2 from table2 where.field3= table2.filed3)3.insert 3.1 插入语句的规范问题
在sql server 2000,sql server 2005中
标准语句:insert into table(field)values(value)提示:在access中不正确,原因sql语句不规范,因此在书写sql语句的过程中一定要按正规的语法来写。
4.delete 4.1标准删除
标准语句:delete from table where condition 提示:同insert 4.2其它删除 4.2.1 truncate 语法:truncate table table_name 删除表中所有行,不记录单个行删除操作,不记录日志,,所有速度比Delete快。4.2.2 drop
语句: Drop table table_name 删除表及相关,有fk约束的不能删,先去年fk;系统表不能使用。
5.order by 功能:排序
技巧:order by newid()随机排序
四.动态SQL语句
4.1基本原则
4.1.1预编译问题
在EXECUTE执行之前,数据库不会编译 EXECUTE 语句内的语句,动态SQL语句就是放到存储过程中,它也不会预先编译。
4.1.2什么时候使用动态SQL语句
字段名,表名,数据库名作为变量时,必须用动态SQl语句
4.2.exec[ute] 4.2.1语法
exec(„select * from table_name where name=‟‟‟+@name+‟‟‟‟)--括号不能少 4.2.2传递参数
--假设存储过程test_sp中需要一个参数:类型nvarchar(50)名称 @parm Declare @parms nvarchar(50)Set @parms=‟测试变量‟
Exec test_sp [@parm=]@parms –方括号内的可以省略 如果是批处理中的第一句,则可以省略Exec 4.2.3输出参数
declare @num int, @field int, @sqls nvarchar(4000)Set @field=1 set @sqls='select @a=count(*)from table_name where field=@field' exec sp_executesql @sqls,N'@a int output,@field int',@num output ,@field select @num 4.3.sp_executesql 语法:exec[ute] sp_executesql N‟select * from table_name where field=@field‟,N‟@field int‟,@field=1 使用sp_exexutesql比使用exec更有效率.
第三篇:sql语句学习
一、选择题
1、SQL语言是()语言。——(SQL特点)(易)
A)层次数据库 B)网络数据库 C)关系数据库D)非数据库
答案:C2、SQL语言具有两种使用方式,分别称为交互式SQL和()。
——(SQL语言使用方式)(易)
A)提示式SQLB)多用户SQLC)嵌入式SQLD)解释式SQL
答案:C
3-4-5()包括数据库模式定义和数据库存储结构与存取方法定义。()实现对DB的操作,包括查询、插入、删除、修改数据库中的数据。()用于数据保护,包括数据的安全性,完整性,并发控制和恢复等。——(数据库语言DDLDMLDCL)(中)
A)数据控制子语言 B)数据定义子语言 C)数据操纵子语言 D)数据库语言
答案:B C A
6-7-8-9-
10、下列SQL语句中,实现数据检索的语句是(),修改表结构的是(),修改属性值的是(),删除表结构的是(),删除表记录的是()。
——(DROP TABLE, ALTER TABLE,UPDATE, DELETE,SELECT 语句)(易)
A)SELECTB)DROPC)UPDATED)ALTERE)DELETE
答案:A D C B E
二、用关系代数表达式及SQL语句描述关系查询
1、设有如下关系表R、S和T:——(易)R(BH,XM,XB,DWH)
S(DWH,DWM)
T(BH,XM,XB,DWH)
写出实现下列关系代数的SQL语句:
1)DWH'100'(R)σDWH=’100’(R)
2)XM,XB(R)∏xM,XB(R)
3)XM,DWH(
4)RS R∞S
5)XM,XB,DWH(
解:
1)SELECT * FROM R WHERE DWH=’100’;
2)SELECT XM,XB FROM R;
3)SELECT XM,DWH FROM R WHERE XB=’女’;
4)SELECT R.*,S.DWM FROM R, S WHERE R.DWH=S.DWH;
5)SELECT XM,XB,DWH FROM R,S WHERE R.DWH=S.DWH AND XB=’男’;XB'男'XB'女'(R))∏XM,DWH(σXB=’女’(R))(RS))∏XM,XB,DWH(σXB=’男’(R∞S))
2、设有如下三个关系:——(易-易)
A(A#,ANAME,WQTY,CITY): A#:商店代号;ANAME:商店名;WQTY:店员人数
B(B#,BNAME,PRICE):B#:商品号;BNAME:商品名称;
AB(A#,B#,QTY):QTY:商品数量
试用关系代数和SQL语言写出下列查询。
1)找出店员人数不超过100人或者在长沙市的所有商店的代号和商店名;
2)找出供应书包的商店名;
解:
1)A#,ANAME(WQTY100 CITY'长沙'(A))∏A#,ANAME(σWQTY<=100ⅤCITY=’长沙’(A))
SELECT A#,ANAME FROM A WHERE WQTY<=100 OR CITY=’长沙’;
2)ANAME((BNAME'书包'(B))ABA)∏ANAME((σBNAME=’书包’(B))∞AB∞(A))
SELECT ANAME FROM A,B,AB
WHERE BNAME=’书包’ AND B.B#=AB.B# AND AB.A#=A.A#;
3.设有如下关系模式:
student(NO, NAME , SEX ,BIRTHDAY, CLASS)
teacher(NO,NAME,SEX,BIRTHDAY,PROF,DEPART)PROF为职称,DEPART为系别
course(CNO, CNAME, TNO)
score(NO, CNO, DEGREE)DEGREE 为成绩
写出实现以下各题功能的SQL语句:
(1)查询至少有2名男生的班号;——(难)
(2)查询不姓“王”的同学记录;——(易)
(3)查询每个学生的姓名和年龄;——(难)
(4)查询学生中最大和最小的birthday日期值;——(中)
(5)查询学生表的全部记录并按班号和年龄从大到小的顺序;——(中)
(6)查询男教师及其所上的课程;——(中)
(7)查询最高分同学的学号,课程号和成绩;——(中)
(8)查询和“李军”同性别并同班的所有同学的姓名;——(中)
(9)查询选修“数据库系统概论”课程的男同学的成绩表;——(中)
(10)查询所有未讲课的教师的姓名和所在系别;——(难)
(11)查询“计算机系”教师所教课程的成绩表;——(难)
(12)查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录;——(难)
(13)查询最低分大于70,最高分小于90的学生的学号;——(中)
(14)查询成绩在60到80之间的所有记录;——(中)
(15)查询成绩比该课程平均成绩低的同学的成绩表;——(相关子查询)(难)
(16)查询所有女教师和女同学的姓名、性别和生日;——(中)
(17)查询“计算机系”和“无线电系”不同职称的教师的姓名和职称;——(中)
解:(1)SELECT CLASS FROM student WHERE SEX=‘男’
GROUP BY CLASS HAVING COUNT(*)>=2;
(2)SELECT * FROM student WHERE NAME NOT LIKE ‘王%’;
(3)SELECT NAME,year(date())-year(birthday)as age FROM student;
(4)SELECT MAX(BIRTHDAY), MIN(BIRTHDAY)FROM student;
(5)SELECT * FROM student ORDER BY CLASS,BIRTHDAY DESC;
(6)SELECT x.name, y.cname FROM teacher x, course y WHERE x.no=y.tno and x.sex=’男’;
(7)SELECT * FROM score WHERE degree=(SELECT max(degree)FROM score);
(8)SELECT name FROM student WHERE sex=(SELECT sex FROM student WHEREname=’
李军’)and class=(SELECT class FROM student WHERE name=’李军’);
(9)SELECT * FROM score WHERE no IN(SELECT no FROM student WHERE sex=‘男’)and
cno=(SELECT cno FROM course WHERE cname=‘数据库系统概论’);
(10)SELECT name, depart FROM teacher t WHERE NOT EXIST(SELECT * FROM course c
WHERE c.tno=t.no);
(11)SELECT * FROM score s, teacher t, course c WHERE t.depart=’计算机系’ and t.no=c.tno
and c.cno=score.cno;
(12)SELECT * FROM student s, score sc WHERE s.no=sc.no and cno=’3-105’ and
degree>(SELECT degree FROMsc WHERE no=’109’ and cno=’3-105’);
(13)SELECT no FROM score GROUP BY no HAVING min(degree)>70 and max(degree)<90;
(14)SELECT * FROM score WHERE degree BETWEEN 60 AND 80;
(15)SELECT * FROM score a WHERE degree <(SELECT avg(degree)FROM score b WHERE b.cno=a.cno group by b.cno);
(16)SELECT name, sex, birthday FROM teacher WHERE sex=‘女’UNION SELECT name, sex,birthday FROM student WHERE sex=‘女’;
(17)SELECT name, prof FROM teacher WHERE depart=’计算机系’ OR depart=’无线电系’
order by prof;
4、设有图书登记表TS,具有属性:BNO(图书编号),BC(图书类别),BNA(书名),AU(著者),PUB(出版社)。按下列要求用SQL语言进行设计。——(易)
1)按图书馆编号BNO建立TS表的索引ITS;
2)查询按出版社统计其出版图书总数。
3)删除索引。
解:1)CREATE INDEX ITSON TS(BNO);
2)SELECT PUB,COUNT(BNO)FROM TS GROUP BY PUB;
3)DROP INDEXITS;
5、已知三个关系R、S和T——(中)
R(A,B,C)S(A,D,E)T(D,F)
试用SQL语句实现如下操作:
1)R、S和T三个关系按关联属性建立一个视图R-S-T;
2)对视图R-S-T按属性A分组后,求属性C和E的平均值。
解:1)CREATE VIEW R-S-T(A,B,C,D,E,F)AS
SELECT R.A , B, C ,S.D, E, F FROM R, S, T
WHERE R.A=S.A AND S.D=T.D;
2)SELECT AVG(C), AVG(E)FROM R-S-T GOUPY BY A;
6、设有学生表S(SNO, SN)(SNO为学生号,SN为姓名)和学生选修课程表SC(SNO,CNO,CN,G)
(CNO为课程号,CN为课程名,G为成绩),试用SQL语言完成以下各题:——(易)
a)建立一个视图V-SSC(SNO, SN, CNO, CN, G);
b)从视图V-SSC上查询平均成绩在90分以上的SN, CN 和G。
解:
1)CREATE VIEW V-SSC(SNO , SN, CNO, CN, G)AS
SELECT S.SNO, SN, CNO, CN, GFROM S, SC WHERE S.SNO=SC.SNO
2)SELECT SN, CN, G FROM V-SSC GROUP BY SNO HAVING AVG(G)>907、设有关系模式: 其中SB表示供应商,SN为供应商号,SNAME为供应商名字,CITY
为供应商所在城市; PB(PN, PNAME, COLOR, WEIGHT)其中PB表示零件,PN为零件代号,PANME为零件名
字,COLOR为零件颜色,WEIGHT为零件重量; JB(JN, JNAME, CITY)其中JB表示工程,JN为工程编号,JNAME为工程名字,CITY为工
程所在城市;
SPJB()其中SPJB表示供应关系,QTY表示提供的零件数量。
写出实现以下各题功能的SQL语句:
(1)取出所有工程的全部细节;——(易)
(2)取出所在城市为上海的所有工程的全部细节;——(易)
(3)取出重量最轻的零件代号;——(难)
(4)取出为工程J1提供零件的供应商代号;——(易)
(5)取出为工程J1提供零件P1的供应商代号;——(易)
(6)取出由供应商S1提供零件的工程名称;——(易)
(7)取出供应商S1提供的零件的颜色;——(易)
(8)取出为工程J1或J2提供零件的供应商代号;——(中)
(9)取出为工程J1提供红色零件的供应商代号;——(易)
(10)取出为所在城市为上海的工程提供零件的供应商代号;——(易)
(11)取出为所在城市为上海或北京的工程提供红色零件的供应商代号;——(中)
(12)取出供应商与工程所在城市相同的供应商提供的零件代号;——(中)
(13)取出上海的供应商提供给上海的任一工程的零件的代号;——(难)
(14)取出至少有一个和工程不在同一城市的供应商提供零件的工程代号;——(难)
(15)取出上海供应商不提供任何零件的工程的代号;——(难)
(16)取出这样一些供应商代号,它们能够提供至少一种由红色零件的供应商提供的零件;
——(难)
(17)取出由供应商S1提供零件的工程的代号;——(易)
(18)取出所有这样的一些 市的工程提供零件;——(难) (19)取出所有这样的三元组 市的工程提供指定的零件;——(难) (20)重复(19)题,但不检索两个CITY值相同的三元组。——(难) 解: (1)SELECT * FROM JB; (2)SELECT * FROM JB WHERE CITY=‘上海’; (3)SELECT PN FROM PB WHERE WEIGHT=(SELECT MIN(WEIGHT)FROM PB); (4)SELECT SN FORM SPJB WHERE JN=‘J1’; (5)SELECT SN FORM SPJB WHERE JN=‘J1’AND PN=‘P1’; (6)SELECT JNAME FROM JB,SPJB WHERE SN=‘S1’AND SPJB.JN=JB.JN; (7)SELECT DISTINCT COLOR FROM PB,SPJB WHERE SN=‘S1’AND SPJB.JN=JB.JN' (8)SELECT SN FROM SPJB WHERE JN IN {J1, J2}; 或者 SELECT SN FROM SPJB WHERE JN=’J1’ OR JN=’J2’; (9)SELECT SN FROM SPJB,PB WHERE COLOR=‘红色’AND PB.PN=SPJB.PN AND JN=’J1’; (10)SELECT DISTINCT SN FROM SPJB,JB WHERE CITY=‘上海’AND JB.JN=SPJB.JN; (11)SELECT SN FROM PB, JB, SPJB WHERE COLOR=‘红色’AND CITY IN {‘上海’,‘北京’} AND PB.PN=SPJB.PN AND JB.JN=SPJB.JN; (12)SELECT PN FROM SB, JB , SPJB WEHRE SB.CITY=JB.CITY AND SB.SN=SPJB.SN AND JB.JN=SPJB.JN; (13)SELECT PN FROM SB, SPJB, JB WEHRE SB.CITY=‘上海’AND JB.CITY=‘上海’ AND SB.SN=SPJB.SN AND JB.JN=SPJB.JN; (14)SELECT JN FROM JB WHERE EXISTS(SELECT * FROM SB WHERE EXISTS(SELECT * FROM SPJB WHERE SB.CITY<>JB.CITY AND SPJB.SN= SB.SN AND SPJB.JN= JB.JN)); (15)SELECT DISTINCT JN FROM SPJB WHERE JN NOT IN(SELECT DISTINCT SPJB.JN FROM SB,SPJB WHERE SB.SN=SPJB.SN AND SB.CITY=‘上海’); (16)SELECT DISTINCT SPJB.SN FROM SB,SPJB WHERE SPJB.PN IN(SELECT SPJB.PN FROM SPJB,PB WHEREPB.PN=SPJB.PN AND PB.COLOR=‘红色’; (17)SELECTJN FROM SPJB WHERE SN=’S1’; (18)SELECT DINSINCT SB.CITY , JB.CITY FROM SB, JB, SPJB WHERE SB.SN=SPJB.SN AND JB.JN=SPJB.SN; (19)SELECT SB.CITY, SPJB.PN, JB.CITY FROM SB,JB,SPJB WHERE SB.SN=SPJB.SN AND JB.JN=SPJB.JN; (20)SELECT DISTINCT SB.CITY, SPJB.PN, JB.CITY FROM SB,JB,SPJB WHERE SB.SN=SPJB.SN AND JB.JN=SPJB.JN AND SB.CITY<>JB.CITY; 8、设有如下关系模式:——(中) 图书关系B(图书编号B#,图书名T,作者A,出版社P); 读者关系R(借书证号C#,读者名N,读者地址D); 借阅关系L(C#,B#,借书日期E,还书标志BZ); BZ=‘1’表示已还; BZ=‘0’ 表示未还; 写出实现以下各题功能的SQL语句: (1)查询“工业出版社”出版的图书名 (2)将书号为B5的图书的出版社改为“工业出版社” (3)查询99年12月31日以前借书未还的读者名与书名 (4)查所借的书包含借书证号为C1的读者借出未还的所有书的读者名与借书证号。 (5)删去“工业出版社”出版的所有图书及相关的借阅信息。 解: (1)SelectTfromBWhereP = ’工业出版社’ (2)UpdateBSetP=’工业出版社’ WhereB# = ’B5’ (3)SelectN , TFrom B, R , L WhereE <’99/12/31’ AND BZ=’0’ AND L.C#=R.C# AND L.B#=B.B# (4)select N,C# from R where not exists (select * from LL1 where L1.C#=’c1’ and BZ=‘0’ andnot exists (select * from L L2 where L2.c#=R.c# and L2.B#=L1.B#)) (6)Delete from LWhere B#IN(Select B#From B Where P=’工业出版社’); Delete from B Where P=’工业出版社’; sql学习心得:SQL SERVER 2005 sql学习心得:SQL SERVER 2005学习心得 一、数据库设计方面 1、字段类型。 varchar(max)nvarchar(max)类型的引入大大的提高了编程的效率,可以使用字符串函数对CLOB类型进行操 作,这是一个亮点。但是这就引发了对varchar和char效率讨论的老问题。到底如何分配varchar的数据,是否 会出现大规模的碎片?是否碎片会引发效率问题?这都是需要进一步探讨的东西。varbinary(max)代替image也让SQL Server的字段类型更加简洁统一。 XML字段类型更好的解决了XML数据的操作。XQuery确实不错,但是个人对其没好感。(CSDN的开发者应 该是相当的熟了!) 2、外键的级联更能扩展 可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。但是 再开发调试阶段和OLAP环境中,外键是可以建立的。新版本中加入了SET NULL 和 SET DEFAULT 属性,能够 提供能好的级联设置。 3、索引附加字段 这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了 很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。 4、计算字段的持久化 原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算 字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使 用。 5、分区表 分区表是个亮点!从分区表也能看出微软要做大作强SQL Server的信心。资料很多,这里不详细说。但是重点 了解的是:现在的SQL Server2005的表,都是默认为分区表的。因为它要支持滑动窗口的这个特性。这种特性 对历史数据和实时数据的处理是很有帮助的。 但是需要注意的一点,也是我使用过程中发现的一个问题。在建立 function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。如果你觉得我的非分区索引无法对起子分区,你可以提醒我一下呀!没有任何的提醒,直接就变成了非分区表。不知道这算不算一个bug。 大家也可以试试。 分区表效率问题肯定是大家关心的问题。在我的试验中,如果按照分区字段进行的查询(过滤)效率会高于未 分区表的相同语句。但是如果按照非分区字段进行查询,效率会低于未分区表的相同语句。但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右) 6、CLR类型 微软对CLR作了大篇幅的宣传,这是因为数据库产品终于融入.net体系中。最开始我们也是狂喜,感觉对象数 据库的一些概念可以实现了。但是作了些试验,发现使用CLR的存储过程或函数在达到一定的阀值的时候,系 统性能会呈指数级下滑!这是非常危险的!只使用几个可能没有问题,当一旦大规模使用会造成严重的系统性 能问题! 其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口 。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!还不是性能有问题 !否则面向对象的数据库早就实现了! 建议使用CLR的地方一般是和应用的复杂程度或操作系统环境有很高的耦合度的场景。如你想构建复杂的算法,并且用到了大量的指针和高级数据模型。或者是要和操作系统进行Socket通讯的场景。否则建议慎重! 7、索引视图 索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面 。还有一大堆的环境参数和种种限制都让人对它有点却步。 8、语句和事务快照 语句级快照和事务级快照终于为SQL Server的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务 级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的! 9、数据库快照 原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪 回技术还是细粒度不够。可惜! 10、Mirror Mirror可以算是SQL Server的Data guard了。但是能不能被大伙用起来就不知道了。 二、开发方面 1、Ranking函数集 其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQL Server2005的row_number比Oracle的更先进。因为它把Order by集成到了一起,不用像Oracle那样还要用子查询进行封装 。但是大家注意一点。如下面的例子: select ROW_NUMBER()OVER(order by aa) from tbl order by bb 会先执行aa的排序,然后再进行bb的排序。 可能有的朋友会抱怨集成的order by,其实如果使用ranking函数,Order by是少不了的。如果担心Order by会影响效率,可以为order by的字段建立聚集索引,查询计划会忽略order by 操作(因为本来就是排序的嘛)。 2、top 可以动态传入参数,省却了动态SQL的拼写。 3、Apply 对递归类的树遍历很有帮助。 4、CTE 个人感觉这个真是太棒了!阅读清晰,非常有时代感。 5、try/catch 代替了原来VB式的错误判断。比Oracle高级不少。 6、pivot/unpivot 个人感觉没有case直观。而且默认的第三字段(还可能更多)作为group by字段很容易造成新手的错误。 三、DBA管理方面 1、数据库级触发器 记得在最开始使用2k的时候就要用到这个功能,可惜2k没有,现在有了作解决方案的朋友会很高兴吧。 2、多加的系统视图和实时系统信息 这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。 3、优化器的改进 一直以来个人感觉SQL Server的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验 发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。) 4、profiler的新事件观察 这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能 启动profiler。否则点击没有反应。 5、sqlcmd 习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQL Server Management Studio的朋友 使用。 四、遗憾 1、登陆的控制 始终遗憾SQL Server的登陆无法分配CPU/内存占用等指标数。如果你的SQL Server给别人分配了一个只可以 读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。而SQL Server如果 能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。 2、数据库物理框架没有变动 undo和redo都放在数据库得transaction中,个人感觉是个败笔。如果说我们在设计数据库的时候考虑分多个 数据库,可能能在一定程度上避免I/O效率问题。但是同样会为索引视图等应用带来麻烦。看看行级和事务级的快照数据放在tempdb中,就能感觉到目前架构的尴尬。 3、还是没有逻辑备份 备份方面可能还是一个老大难的问题。不能单独备份几个表总是感觉不爽。灵活备份的问题不知道什么时候才 能解决。 4、SSIS(DTS)太复杂了 SQL Server的异构移植功能个人感觉最好了。(如果对比过SQL Server的链接服务器和Oracle的透明网关的朋友会发现SQL Server的sp_addlinkedserver(openquery)异构数据库系列比Oracle真是强太多了。) 以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多,但是总是让人感觉太麻烦。 sql语句学习 数据定义语言(DDL): 1)创建数据库(create):create database database-name; eg.create database test; 2)删除数据库:drop database dbname; eg.drop database test; 3)创建新表:create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..); eg.根据已有的表创建新表的例子:create table tab_new like tab_old;create table tab_new as select col1,col2… from tab_old definition only; 4)删除表:drop table tabname; 5)增加列:alter table tabname add column col type; 6)添加主键: alter table tabname add primary key(col); 7)删除主键:alter table tabname drop primary key(col); 8)创建索引:create [unique] index idxname on tabname(col….); 9)删除索引:drop index idxname;注:索引是不可更改的,想更改必须删除重新建; 10)创建视图:create view viewname as select statement; 2.数据操纵语言(DML) 1)查询语句(select) eg1.select * from table1 where field1 like '%value1%'; eg2.select * from table1 order by field1,field2 [desc]; eg3.select count as totalcount from table1; eg4.select sum(field1)as sumvalue from table1; eg5.select avg(field1)as avgvalue from table1; eg6.select max(field1)as maxvalue from table1; eg7.select min(field1)as minvalue from table1; eg8.select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c;(注:此为左外连接,结果集中包括连接表的匹配行,也包括左连接表的所有行) 2)插入语句(insert) insert into table1(field1,field2)values(value1,value2); 3)删除语句(delete) delete from table1 where 范围; 4)更新语句(update) update table1 set field1=value1 where 范围; 3.数据控制语言(DCL) 1)授予权限语句(GRANT) GRANT privileges(columns)ON what TO user IDENTIFIED BY “password” WITH GRANT OPTION; 其中:privileges可为如下限定符:ALTER 修改表和索引、CREATE(创建数据库和表)、DELETE(删除表中已有的记录)、DROP(删除数据库和表)、INDEX(创建或删除索引)、INSERT(向表中插入新行)、REFERENCE(未用)、SELECT(检索表中的记录)、UPDATE(修改现存表记录)、FILE(读或写服务器上的文件)、PROCESS(查看服务器中执行的线程信息或杀死线程)、RELOAD(重载授权表或清空日志、主机缓存或表缓存)、SHUTDOWN(关闭服务器)、ALL 所 有;ALL PRIVILEGES同义词、USAGE(特殊的“无权限”权限) columns:权限运用的列,它是可选的,并且你只能设置列特定的权限。如果命令有多于一个列,应该用逗号分开它们; what:权限运用的级别。权限可以是全局的(适用于所有数据库和所有表)、特定数据库(适用于一个数据库中的所有表)或特定表的。可以通过指定一个columns字句是权限是列特定的。 user :权限授予的用户,它由一个用户名和主机名组成。MySQL中的一个用户名就?悄懔臃衿魇敝付ǖ挠没?该名字不必与你的Unix登录名或Windows名联系起来。缺省地,如果你不明确指定一个名字,客户程序将使用 你的登录名作为MySQL用户名。这只是一个约定。你可以在授权表中将该名字改为nobody,然后以nobody连接 执行需要超级用户权限的操作。 password:赋予用户的口令,它是可选的。如果你对新用户没有指定IDENTIFIED BY子句,该用户不赋给口令(不安全)。对现有用户,任何你指定的口令将代替老口令。如果你不指定口令,老口令保持不变,当你用IDENTIFIED BY 时,口令字符串用改用口令的字面含义,GRANT将为你编码口令,不要象你用SET PASSWORD 那样使用password() 函数。 WITH GRANT OPTION子句是可选的。如果你包含它,用户可以授予权限通过GRANT语句授权给其它用户。你可以用该子句给与其它用户授权的能力。 用户名、口令、数据库和表名在授权表记录中是大小写敏感的,主机名和列名不是。 eg1.创建一个超级用户test1 grant all privilleges on *.* to test1@localhost identified by '123456' with grant option;eg2.创建一个只能查询的用户 test2 mysql> grant select on *.* to test2@localhost identified by '9876543'; 2)撤权并删除用户(revoke) 要取消一个用户的权限,使用REVOKE语句。REVOKE的语法非常类似于GRANT语句,除了TO用FROM取代并且没有INDETIFED BY和WITH GRANT OPTION子句: revoke privileges(columns)ON what FROM user user部分必须匹配原来GRANT语句的你想撤权的用户的user部分。privileges部分不需匹配,你可以用GRANT 语句授权,然后用REVOKE语句只撤销部分权限。REVOKE语句只删除权限,而不删除用户。即使你撤销了所有 权限,在user表中的用户记录依然保留,这意味着用户仍然可以连接服务器。要完全删除一个用户,你必须 用一条DELETE语句明确从user表中删除用户记录: #mysql-u root mysql DELETE FROM user WHERE User=“user_name” and Host=“host_name”; FLUSH PRIVILEGES; DELETE语句删除用户记录,而FLUSH语句告诉服务器重载授权表。(当你使用GRANT和REVOKE语句时,表自动重载,而你直接修改授权表时不是。) eg.删除用户test1 revoke all on *.* from; use mysql; delete from user where user='test' and host='localhost';flush privileges; 3)提交语句(commit) 4)回滚语句(rollback)第四篇:学习SQL必看
第五篇:sql语句学习_经典_推荐